mason-context 0.22.0 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mason.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/paths.ts","../src/utils/validation.ts","../src/utils/profile.ts","../src/utils/git-read.ts","../src/audit/types.ts","../src/utils/files.ts","../src/utils/storage.ts","../src/audit/inspection.ts","../src/decisions/anchors.ts","../src/utils/store-lock.ts","../src/snapshot/lock.ts","../src/snapshot/snapshot.ts","../src/context/lexical.ts","../src/context/trust.ts","../src/decisions/provenance.ts","../src/decisions/decisions.ts","../src/audit/inputs.ts","../src/audit/policy.ts","../src/audit/commands.ts","../src/audit/tree.ts","../src/audit/claims.ts","../src/audit/git.ts","../src/audit/docs.ts","../src/audit/scope.ts","../src/drift/drift.ts","../src/audit/checks/deleted-reference.ts","../src/audit/checks/new-module.ts","../src/audit/checks/stale-count.ts","../src/audit/checks/dead-command.ts","../src/audit/dependency-claims.ts","../src/audit/release-metadata.ts","../src/audit/checks/deps-changed.ts","../src/decisions/drift.ts","../src/audit/checks/decision-anchor.ts","../src/audit/checks/index.ts","../src/audit/findings.ts","../src/automation/stop-review.ts","../src/automation/notifications.ts","../src/automation/store.ts","../src/audit/advisory-review.ts","../src/audit/audit.ts","../src/audit/repair.ts","../src/automation/evidence.ts","../src/automation/config.ts","../src/automation/usefulness.ts","../src/automation/execution.ts","../src/decisions/pending.ts","../src/automation/runtime.ts","../src/automation/hook-root.ts","../src/hook/hook.ts","../src/setup/model.ts","../src/setup/launcher.ts","../src/setup/observations.ts","../src/automation/adapters.ts","../src/setup/files.ts","../src/setup/ownership.ts","../src/mcp/init.ts","../src/setup/config.ts","../src/automation/install.ts","../src/setup/teardown.ts","../src/setup/status.ts","../src/setup/setup.ts","../src/distribution/path.ts","../src/distribution/state.ts","../src/distribution/bundle.ts","../src/distribution/trust.ts","../src/distribution/runtime.ts","../src/distribution/sessions.ts","../src/distribution/install.ts","../src/distribution/updates.ts","../bin/mason.ts","../src/automation/cli.ts","../src/utils/progress.ts"],"sourcesContent":["import path from \"node:path\";\n\n/** One canonical representation for stored paths and decision anchors. */\nexport function normalizeRepoPath(value: string): string | null {\n const slash = value.replace(/\\\\/g, \"/\");\n if (!slash || slash.includes(\"\\0\") || path.posix.isAbsolute(slash) || /^[A-Za-z]:/.test(slash))\n return null;\n if (slash.split(\"/\").includes(\"..\")) return null;\n const normalized = path.posix.normalize(slash).replace(/\\/$/, \"\");\n return normalized === \".\" ? null : normalized;\n}\n\nexport function sanitizeRepoPaths(files: string[]): string[] {\n return [...new Set(files.map(normalizeRepoPath).filter((p): p is string => p !== null))];\n}\n\nexport function isWithinRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);\n}\n\nexport function anchorMatches(anchor: string, file: string): boolean {\n const a = normalizeRepoPath(anchor);\n const f = normalizeRepoPath(file);\n return a !== null && f !== null && (a === f || f.startsWith(`${a}/`));\n}\n\nexport function matchingPaths(anchors: string[], files: Iterable<string>): string[] {\n return [...new Set(files)].filter((file) =>\n anchors.some((anchor) => anchorMatches(anchor, file)),\n );\n}\n\n/** Match an inventory to every scope in one pass through its path components. */\nexport function indexMatchingPaths(\n scopes: readonly (readonly string[])[],\n files: Iterable<string>,\n): string[][] {\n interface Node {\n children: Map<string, Node>;\n scopes: Set<number>;\n }\n const node = (): Node => ({ children: new Map(), scopes: new Set() });\n const root = node();\n const matches: string[][] = scopes.map(() => []);\n scopes.forEach((anchors, index) => {\n for (const anchor of anchors) {\n const normalized = normalizeRepoPath(anchor);\n if (!normalized) continue;\n let current = root;\n for (const part of normalized.split(\"/\")) {\n if (!current.children.has(part)) current.children.set(part, node());\n current = current.children.get(part)!;\n }\n current.scopes.add(index);\n }\n });\n for (const file of new Set(files)) {\n const normalized = normalizeRepoPath(file);\n if (!normalized) continue;\n const selected = new Set<number>();\n let current: Node | undefined = root;\n for (const part of normalized.split(\"/\")) {\n current = current.children.get(part);\n if (!current) break;\n for (const index of current.scopes) selected.add(index);\n }\n for (const index of selected) matches[index].push(file);\n }\n return matches;\n}\n","/** Narrow external objects without allowing arrays or null to masquerade as records. */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item: unknown) => typeof item === \"string\");\n}\n\nexport function hasErrorCode(error: unknown, code: string): boolean {\n return isRecord(error) && error.code === code;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\ntype Timing = { calls: number; totalMs: number };\nconst profiles = new AsyncLocalStorage<Record<string, Timing>>();\n\n/** Opt-in, invocation-local timings. Labels are fixed in source; no repository data. */\nexport async function profilePhase<T>(label: string, run: () => Promise<T>): Promise<T> {\n const phases = profiles.getStore();\n if (!phases) return run();\n const start = performance.now();\n try {\n return await run();\n } finally {\n const timing = (phases[label] ??= { calls: 0, totalMs: 0 });\n timing.calls++;\n timing.totalMs += performance.now() - start;\n }\n}\n\nexport async function withProfile<T>(\n run: () => Promise<T>,\n emit: (json: string) => void,\n): Promise<T> {\n const phases: Record<string, Timing> = {};\n const start = performance.now();\n return profiles.run(phases, async () => {\n try {\n return await run();\n } finally {\n emit(\n JSON.stringify({\n kind: \"mason-profile\",\n version: 1,\n totalMs: performance.now() - start,\n phases,\n }),\n );\n }\n });\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { profilePhase } from \"./profile.js\";\n\nconst execute = promisify(execFile);\nconst commands = new Set([\n \"rev-parse\",\n \"symbolic-ref\",\n \"for-each-ref\",\n \"ls-files\",\n \"check-ignore\",\n \"status\",\n \"log\",\n \"diff\",\n \"ls-tree\",\n \"show\",\n \"merge-base\",\n]);\nexport interface GitReadOptions {\n cwd: string;\n maxBuffer?: number;\n timeout?: number;\n input?: string;\n}\n\n/** Fixed command labels only: profiling never includes arguments or repository paths. */\nexport function execGit(args: string[], options: GitReadOptions) {\n const command = args.find((arg) => !arg.startsWith(\"-\")) ?? \"other\";\n return profilePhase(\"git.\" + (commands.has(command) ? command : \"other\"), async () => {\n const { input, ...processOptions } = options;\n const operation = execute(\"git\", args, processOptions);\n if (input !== undefined) {\n operation.child.stdin!.on(\"error\", () => {\n /* The child exit reports a failed query. */\n });\n operation.child.stdin!.end(input);\n }\n return operation;\n });\n}\n","import type { decisionProvenance } from \"../decisions/provenance.js\";\n\nexport type IssueType = \"deleted-reference\" | \"new-module\" | \"stale-count\" | \"dead-command\";\n\nexport type AdvisoryType = \"deps-changed\" | \"decision-anchor-drift\" | IssueType;\n\nexport type CheckName = IssueType | AdvisoryType;\n\nexport const ALL_CHECKS: CheckName[] = [\n \"deleted-reference\",\n \"new-module\",\n \"stale-count\",\n \"dead-command\",\n \"deps-changed\",\n \"decision-anchor-drift\",\n];\n\n/**\n * \"certain\" — the claim is provably false (a tracked path is gone, a computed\n * count differs, a script is absent from a resolved manifest). \"likely\" is\n * retained for older reports. Inferred scope and speculative omissions are\n * advisory; even a certain mismatch needs semantic review before repair.\n */\nexport type Confidence = \"certain\" | \"likely\";\n\nexport interface CommitRef {\n hash: string;\n date: string;\n subject: string;\n}\n\nexport interface DocAnchor {\n /** Repo-relative doc path, e.g. \"CLAUDE.md\" or \".claude/CLAUDE.md\". */\n doc: string;\n /** 1-based line of the claim; null for doc-level issues (new-module). */\n line: number | null;\n /** The claim exactly as written, e.g. \"src/utils/logger.ts\". */\n excerpt: string | null;\n}\n\nexport interface ClaimScope {\n basis: \"repository\" | \"document\" | \"document-link\" | \"explicit\";\n directory: string;\n /** Exact repository-relative paths/manifests considered by the check. */\n candidates: string[];\n}\n\nexport type Evidence =\n | {\n kind: \"missing-path\";\n claimed: string;\n renamedTo: string | null;\n deletedInCommit: CommitRef | null;\n everTracked: boolean;\n parentDirExists: boolean;\n resolvedPath?: string;\n scope?: ClaimScope;\n }\n | {\n kind: \"unmentioned-dir\";\n dir: string;\n sourceFileCount: number;\n firstCommit: CommitRef | null;\n checkedDocs: string[];\n }\n | {\n kind: \"count-mismatch\";\n claimed: number;\n actual: number;\n unit: string;\n /** Where the actual count came from, e.g. \"package.json workspaces\". */\n countedFrom: string;\n members: string[];\n }\n | {\n kind: \"missing-script\";\n scriptName: string;\n invocation: string;\n manifestsChecked: string[];\n availableScripts: string[];\n scope?: ClaimScope;\n }\n | {\n kind: \"doc-behind-manifests\";\n docLastCommit: CommitRef;\n manifestCommits: Array<CommitRef & { files: string[] }>;\n totalCommits: number;\n matches?: import(\"./dependency-claims.js\").DependencyMatch[];\n matchingIncomplete?: boolean;\n }\n | {\n kind: \"decision-anchor\";\n provenance?: ReturnType<typeof decisionProvenance>;\n decisionId: string;\n title: string;\n changedFiles: string[];\n refreshedHash: string;\n };\n\nexport interface AuditIssue {\n type: IssueType;\n message: string;\n anchor: DocAnchor;\n confidence: Confidence;\n evidence: Evidence;\n}\n\n/**\n * Advisories require judgment and never drive the ordinary audit exit code.\n * Historical advisories require a separate review. Explicitly recheckable\n * candidates can cease to be detected without asserting semantic approval.\n */\nexport interface AuditAdvisory {\n type: AdvisoryType;\n message: string;\n anchor: DocAnchor;\n evidence: Evidence;\n resolution?: \"recheck\" | \"informational\";\n}\n\nexport interface AuditDocInfo {\n path: string;\n scope?: string;\n kind?: \"instructions\" | \"readme\" | \"guide\";\n lastCommit: CommitRef | null;\n /** Uncommitted edits present — deps-changed is suppressed for dirty docs. */\n dirty: boolean;\n lineCount: number;\n}\n\nexport interface AuditReport {\n /** Additive-only schema — this output is a CI contract. */\n version: 1;\n root: string;\n gitAvailable: boolean;\n /** Commit and exact check scope used by this run. */\n headHash?: string;\n checksRun?: CheckName[];\n docs: AuditDocInfo[];\n /** Whether .mason/decisions/ existed and was checked. */\n decisionsChecked: boolean;\n /** Drive exit code 1. */\n issues: AuditIssue[];\n /** Never drive the exit code. */\n advisories: AuditAdvisory[];\n /** Original committed evidence retained while local doc edits suppress reporting. */\n suppressedAdvisories?: AuditAdvisory[];\n skippedChecks: Array<{ check: string; reason: string; doc?: string }>;\n clean: boolean;\n excludedChecks?: Array<{ check: CheckName; doc: string }>;\n /** Additive assessment status; original advisory evidence remains intact. */\n advisoryReviews?: import(\"./advisory-review.js\").AdvisoryReviewSummary[];\n}\n\nexport interface PathClaim {\n path: string;\n line: number;\n excerpt: string;\n /** Markdown links resolve against the physical document directory. */\n relativeTo?: \"document\";\n}\n\nexport interface CountClaim {\n count: number;\n unit: string;\n line: number;\n excerpt: string;\n}\n\nexport interface CommandClaim {\n scriptName: string;\n invocation: string;\n line: number;\n excerpt: string;\n /** A literal cd/directory flag, relative to the document's assumed cwd. */\n directory?: string;\n scopeUnknown?: string;\n}\n\nexport interface DocClaims {\n paths: PathClaim[];\n counts: CountClaim[];\n commands: CommandClaim[];\n}\n","import { isRecord, isStringArray } from \"./validation.js\";\nimport { execGit } from \"./git-read.js\";\nimport fs from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport { isWithinRoot, normalizeRepoPath } from \"./paths.js\";\n\nexport const SOURCE_EXTENSIONS = [\n \"ts\",\n \"tsx\",\n \"js\",\n \"jsx\",\n \"mts\",\n \"cts\",\n \"mjs\",\n \"cjs\",\n \"vue\",\n \"svelte\",\n \"kt\",\n \"kts\",\n \"java\",\n \"py\",\n \"go\",\n \"rs\",\n \"swift\",\n \"rb\",\n \"cs\",\n \"cpp\",\n \"c\",\n \"h\",\n \"hpp\",\n \"dart\",\n \"php\",\n];\nexport const SOURCE_GLOB = `**/*.{${SOURCE_EXTENSIONS.join(\",\")}}`;\nexport const SOURCE_IGNORE = [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.gradle/**\",\n \"**/target/**\",\n \"**/.git/**\",\n \"**/.mason/**\",\n \"**/vendor/**\",\n \"**/__pycache__/**\",\n \"**/venv/**\",\n \"**/.venv/**\",\n \"**/*.min.*\",\n \"**/*.map\",\n \"**/*.lock\",\n \"**/generated/**\",\n \"**/*.generated.*\",\n \"**/R.java\",\n \"**/BuildConfig.java\",\n \"**/package-lock.json\",\n \"**/yarn.lock\",\n \"**/pnpm-lock.yaml\",\n];\nexport const MAX_SOURCE_BYTES = 1024 * 1024;\nexport interface ProjectConfig {\n patterns?: string[];\n alwaysInclude?: string[];\n ignore?: string[];\n audit?: {\n include?: string[];\n exclude?: Partial<Record<import(\"../audit/types.js\").CheckName, string[]>>;\n };\n}\nexport interface SourceFile {\n path: string;\n content: string;\n totalLines: number;\n}\n\nexport function isSensitiveFile(file: string): boolean {\n return file\n .split(/[\\\\/]/)\n .some((part) =>\n /^(?:\\.env(?:\\..*)?|id_rsa.*|id_ed25519.*)$|\\.(?:pem|key|p12|pfx|jks|keystore)$|credentials\\.|secret|^local\\.properties$/i.test(\n part,\n ),\n );\n}\n\n/** Bound reads even if a file grows after stat. Only read regular files. */\nexport async function readBoundedFile(file: string, maxBytes: number): Promise<string | null> {\n // Do not block on a FIFO or follow a symlink substituted after resolution.\n const handle = await fs.open(\n file,\n constants.O_RDONLY | constants.O_NONBLOCK | constants.O_NOFOLLOW,\n );\n try {\n const stat = await handle.stat();\n if (!stat.isFile() || stat.size > maxBytes) return null;\n const buffer = Buffer.alloc(Math.min(maxBytes + 1, stat.size + 1));\n let bytes = 0;\n while (bytes < buffer.length) {\n const result = await handle.read(buffer, bytes, buffer.length - bytes, null);\n if (result.bytesRead === 0) break;\n bytes += result.bytesRead;\n }\n return bytes === buffer.length ? null : buffer.subarray(0, bytes).toString(\"utf8\");\n } finally {\n await handle.close();\n }\n}\n\nexport async function loadProjectConfig(root: string): Promise<ProjectConfig> {\n try {\n const canonicalRoot = await fs.realpath(root);\n const configPath = await fs.realpath(path.join(root, \".mason/config.json\"));\n if (!isWithinRoot(canonicalRoot, configPath))\n throw new Error(\"Project configuration resolves outside the repository\");\n const raw = await readBoundedFile(configPath, 64 * 1024);\n if (raw === null)\n throw new Error(\"Project configuration is not a regular file or exceeds 64 KiB\");\n const value: unknown = JSON.parse(raw);\n if (!isRecord(value)) throw new Error(\"Expected a configuration object\");\n const config: ProjectConfig = {};\n for (const key of [\"patterns\", \"alwaysInclude\", \"ignore\"] as const) {\n if (value[key] === undefined) continue;\n if (!isStringArray(value[key])) {\n throw new Error(`Configuration ${key} must be an array of strings`);\n }\n config[key] = value[key];\n }\n if (value.audit !== undefined) {\n const audit = value.audit;\n if (!isRecord(audit)) throw new Error(\"Configuration audit must be an object\");\n const patterns = (raw: unknown): string[] => {\n if (\n !isStringArray(raw) ||\n raw.length > 100 ||\n !raw.every(\n (s) =>\n typeof s === \"string\" &&\n normalizeRepoPath(s) === s &&\n !s.startsWith(\"!\") &&\n !/[\\x00-\\x1f]/.test(s),\n )\n ) {\n throw new Error(\n \"Audit patterns must be at most 100 repository-relative globs without traversal or negation\",\n );\n }\n return raw;\n };\n config.audit = {};\n if (audit.include !== undefined) config.audit.include = patterns(audit.include);\n if (audit.exclude !== undefined) {\n if (!isRecord(audit.exclude))\n throw new Error(\"audit.exclude must map check names to patterns\");\n const { ALL_CHECKS } = await import(\"../audit/types.js\");\n config.audit.exclude = {};\n for (const [check, globs] of Object.entries(audit.exclude)) {\n if (!ALL_CHECKS.includes(check as (typeof ALL_CHECKS)[number]))\n throw new Error(\"Unknown audit check: \" + check);\n config.audit.exclude[check as (typeof ALL_CHECKS)[number]] = patterns(globs);\n }\n }\n }\n return config;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw new Error(\n `Cannot apply project file policy: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n}\n\n/** Scoped to one operation, so a later tool call sees newly edited files/ignores. */\nexport async function createFileAccess(rootDir: string) {\n const root = path.resolve(rootDir);\n const canonicalRoot = await fs.realpath(root).catch(() => root);\n const config = await loadProjectConfig(root);\n const ignore = [...SOURCE_IGNORE, ...(config.ignore ?? [])];\n let gitFiles: Set<string> | null = null;\n try {\n const { stdout } = await execGit(\n [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\"],\n { cwd: root, maxBuffer: 50 * 1024 * 1024 },\n );\n gitFiles = new Set(stdout.split(\"\\0\").filter(Boolean));\n } catch {\n // File-system projects are supported. Fail closed if this IS a Git repo.\n let inGit = false;\n try {\n await execGit([\"rev-parse\", \"--git-dir\"], { cwd: root });\n inGit = true;\n } catch {\n /* no Git */\n }\n if (inGit) throw new Error(\"Cannot enumerate Git files safely\");\n }\n\n async function resolve(file: string): Promise<string | null> {\n const relative = normalizeRepoPath(file);\n if (!relative || isSensitiveFile(relative) || (gitFiles && !gitFiles.has(relative)))\n return null;\n const candidate = path.join(root, relative);\n try {\n const real = await fs.realpath(candidate);\n if (!isWithinRoot(canonicalRoot, real) || isSensitiveFile(path.relative(canonicalRoot, real)))\n return null;\n const stat = await fs.stat(real);\n if (!stat.isFile() || stat.size > MAX_SOURCE_BYTES) return null;\n // A symlink must not bypass the target's ignore policy either.\n if (gitFiles && !gitFiles.has(path.relative(canonicalRoot, real).split(path.sep).join(\"/\")))\n return null;\n return real;\n } catch {\n return null;\n }\n }\n\n async function list(\n patterns: string | string[] = SOURCE_GLOB,\n options: { deep?: number; dot?: boolean } = {},\n ): Promise<string[]> {\n const found = await fg(patterns, { cwd: root, ignore, followSymbolicLinks: false, ...options });\n const safe = await Promise.all(found.map(async (f) => ((await resolve(f)) ? f : null)));\n return safe.filter((f): f is string => f !== null).sort();\n }\n\n async function read(file: string): Promise<SourceFile | null> {\n const relative = normalizeRepoPath(file);\n if (!relative) return null;\n const real = await resolve(relative);\n if (!real) return null;\n // Apply the same glob exclusions to explicit reads and symlink targets.\n for (const rel of new Set([\n relative,\n path.relative(canonicalRoot, real).split(path.sep).join(\"/\"),\n ])) {\n if (!(await fg(fg.escapePath(rel), { cwd: root, ignore, dot: true })).length) return null;\n }\n try {\n const content = await readBoundedFile(real, MAX_SOURCE_BYTES);\n return content === null\n ? null\n : { path: relative, content, totalLines: content.split(\"\\n\").length };\n } catch {\n return null;\n }\n }\n return { root, config, list, read, inventory: () => (gitFiles ? [...gitFiles].sort() : null) };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { normalizeRepoPath } from \"./paths.js\";\nimport { readBoundedFile } from \"./files.js\";\n\nexport interface StoreDiagnostic {\n path: string;\n message: string;\n}\n\n/** Metadata paths may not contain symlinks, including their parent directories. */\nexport async function storePath(\n root: string,\n relative: string,\n createParents = false,\n): Promise<string> {\n const normalized = normalizeRepoPath(relative);\n if (!normalized) throw new Error(`Invalid store path: ${relative}`);\n let current = await fs.realpath(root);\n const parts = normalized.split(\"/\");\n for (let i = 0; i < parts.length; i++) {\n current = path.join(current, parts[i]);\n let stat;\n try {\n stat = await fs.lstat(current);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n if (createParents && i < parts.length - 1) {\n try {\n await fs.mkdir(current);\n } catch (mkdirError) {\n if ((mkdirError as NodeJS.ErrnoException).code !== \"EEXIST\") throw mkdirError;\n }\n stat = await fs.lstat(current);\n }\n }\n if (stat?.isSymbolicLink()) throw new Error(`Symlink in store path: ${relative}`);\n }\n return current;\n}\n\nexport async function readStoreJson(root: string, relative: string): Promise<unknown | null> {\n try {\n const file = await storePath(root, relative);\n const raw = await readBoundedFile(file, 10 * 1024 * 1024);\n if (raw === null) throw new Error(\"file is not regular or exceeds 10 MiB\");\n const parsed: unknown = JSON.parse(raw);\n if (parsed === null) throw new Error(\"expected a JSON object, received null\");\n return parsed;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw new Error(\n `Invalid Mason store ${relative}: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n}\n\nexport async function writeStoreJson(\n root: string,\n relative: string,\n value: unknown,\n): Promise<void> {\n const payload = JSON.stringify(value, null, 2) + \"\\n\";\n if (Buffer.byteLength(payload) > 10 * 1024 * 1024) {\n throw new Error(`Mason store ${relative} exceeds 10 MiB`);\n }\n const file = await storePath(root, relative, true);\n const temporary = path.join(path.dirname(file), `.${path.basename(file)}.${randomUUID()}.tmp`);\n try {\n const handle = await fs.open(temporary, \"wx\", 0o600);\n try {\n await handle.writeFile(payload, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n await fs.rename(temporary, file);\n } finally {\n await fs.rm(temporary, { force: true });\n }\n}\n","import fg from \"fast-glob\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport path from \"node:path\";\nimport { execGit, type GitReadOptions } from \"../utils/git-read.js\";\nimport { loadProjectConfig, SOURCE_EXTENSIONS } from \"../utils/files.js\";\n\ninterface Inspection {\n root: string;\n reads: Map<string, Promise<unknown>>;\n}\nconst inspections = new AsyncLocalStorage<Inspection>();\n\n/** Always start fresh. In particular, final validation must not reuse initial reads. */\nexport function withRepositoryInspection<T>(root: string, run: () => Promise<T>): Promise<T> {\n return inspections.run({ root: path.resolve(root), reads: new Map() }, run);\n}\n\n/** Read observations are shared only inside an explicit inspection, never across hooks. */\nexport function inspectionRead<T>(root: string, key: string, read: () => Promise<T>): Promise<T> {\n const inspection = inspections.getStore();\n if (!inspection || inspection.root !== path.resolve(root)) return read();\n if (!inspection.reads.has(key)) {\n const pending = read();\n inspection.reads.set(key, pending);\n // A failed query must be retried, not turned into a reusable unavailable result.\n void pending.catch(() => {\n if (inspection.reads.get(key) === pending) inspection.reads.delete(key);\n });\n }\n return inspection.reads.get(key)! as Promise<T>;\n}\n\n/** Tool writes invalidate their cached observations within the active inspection. */\nexport function invalidateInspectionReads(root: string, prefix: string): void {\n const inspection = inspections.getStore();\n if (!inspection || inspection.root !== path.resolve(root)) return;\n for (const key of inspection.reads.keys())\n if (key.startsWith(prefix)) inspection.reads.delete(key);\n}\n\n/** Exact arguments and limits preserve each history query's semantics. */\nexport function inspectionGit(args: string[], options: GitReadOptions) {\n return inspectionRead(options.cwd, \"git:\" + JSON.stringify([args, options]), () =>\n execGit(args, options),\n );\n}\n\nconst sourceSpecs = SOURCE_EXTENSIONS.map((extension) => `:(glob)**/*.${extension}`);\nconst docSpecs = [\n \":(icase,glob)**/readme.md\",\n \":(icase,glob)**/agents.md\",\n \":(icase,glob)**/claude.md\",\n];\nconst sourceSuffixes = new Set(SOURCE_EXTENSIONS.map((extension) => \".\" + extension));\n\n/** Git still prunes ignored trees; unrelated generated files are never inventoried. */\nexport async function auditGitPaths(\n root: string,\n kind: \"documents\" | \"sources\",\n): Promise<string[]> {\n const custom = (await loadProjectConfig(root)).audit?.include ?? [];\n const shared = inspections.getStore()?.root === path.resolve(root) && !custom.length;\n const expanded = fg.generateTasks(custom).flatMap((task) => task.positive);\n if (expanded.length > 1000)\n throw new Error(\"Audit include patterns expand to more than 1,000 globs\");\n const documentSpecs = [...docSpecs, ...expanded.map((pattern) => `:(glob)${pattern}`)];\n const specs = shared\n ? [...documentSpecs, ...sourceSpecs]\n : kind === \"documents\"\n ? documentSpecs\n : sourceSpecs;\n const limit = kind === \"documents\" ? 16 * 1024 * 1024 : 32 * 1024 * 1024;\n const { stdout } = await inspectionGit(\n [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\", \"--\", ...specs],\n { cwd: root, maxBuffer: shared ? 48 * 1024 * 1024 : limit, timeout: 10000 },\n );\n const paths = [...new Set(stdout.split(\"\\0\").filter(Boolean))].filter((file) =>\n kind === \"documents\"\n ? custom.length > 0 || /^(readme|agents|claude)\\.md$/i.test(path.posix.basename(file))\n : // Git's *.ts also matches a file named .ts, unlike path.extname().\n sourceSuffixes.has(file.slice(file.lastIndexOf(\".\"))),\n );\n if (Buffer.byteLength(paths.join(\"\\0\")) > limit)\n throw new Error(\"Git \" + kind + \" inventory exceeds its bounded read limit.\");\n return paths.sort();\n}\n","import { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { z } from \"zod\";\nimport fg from \"fast-glob\";\nimport { inspectionGit, inspectionRead } from \"../audit/inspection.js\";\nimport { createFileAccess, MAX_SOURCE_BYTES } from \"../utils/files.js\";\nimport { indexMatchingPaths, matchingPaths, normalizeRepoPath } from \"../utils/paths.js\";\nimport { storePath } from \"../utils/storage.js\";\n\nconst repoPath = z.string().refine((p) => normalizeRepoPath(p) === p);\nexport const anchorCaptureSchema = z\n .object({\n anchors: z.array(repoPath),\n files: z.record(repoPath, z.string().regex(/^[a-f0-9]{64}$/)),\n complete: z.boolean(),\n })\n .refine(\n (capture) =>\n JSON.stringify(capture.anchors) === JSON.stringify([...new Set(capture.anchors)].sort()) &&\n matchingPaths(capture.anchors, Object.keys(capture.files)).length ===\n Object.keys(capture.files).length,\n \"Capture paths must belong to its normalized, sorted anchor scope\",\n );\nexport type AnchorCapture = z.infer<typeof anchorCaptureSchema>;\n\n/** Content evidence, not approval. Unreadable/excluded scopes never become current.\n * Batch independent scopes and share observations only inside one repository inspection.\n * Final validation creates a fresh inspection; standalone callers always read again.\n */\nexport async function captureAnchorScopes(\n root: string,\n scopes: string[][],\n): Promise<AnchorCapture[]> {\n const union = [...new Set(scopes.flat())].sort();\n let context: ReturnType<typeof prepareContext> | undefined;\n const prepareContext = async () => {\n const access = await inspectionRead(root, \"decision-anchor-access\", () =>\n createFileAccess(root),\n );\n const inventory = access.inventory();\n if (!inventory) throw new Error(\"Git anchor inventory unavailable\");\n const ignored = await inspectionGit(\n [\n \"ls-files\",\n \"-z\",\n \"--others\",\n \"--ignored\",\n \"--exclude-standard\",\n \"--\",\n ...union.map((anchor) => `:(literal)${anchor}`),\n ],\n { cwd: root, maxBuffer: 8 * 1024 * 1024 },\n );\n const files = [\n ...new Set([...inventory, ...ignored.stdout.split(\"\\0\").filter(Boolean)]),\n ].sort();\n // Apply file policy in one glob walk rather than one walk per anchor file.\n // storePath still rejects symlinked parents at each bounded byte read.\n const patterns = await Promise.all(\n union.map(async (anchor) => {\n const literal = fg.escapePath(anchor);\n try {\n return (await fs.lstat(await storePath(root, anchor))).isDirectory()\n ? `${literal}/**/*`\n : literal;\n } catch {\n return literal;\n }\n }),\n );\n const eligible = new Set(await access.list(patterns, { dot: true }));\n const indexed = indexMatchingPaths(scopes, files);\n const filesByScope = new Map(\n scopes.map((scope, index) => [JSON.stringify([...new Set(scope)].sort()), indexed[index]]),\n );\n return { filesByScope, eligible };\n };\n return Promise.all(\n scopes.map((scope) => {\n const anchors = [...new Set(scope)].sort();\n return inspectionRead(\n root,\n \"decision-anchor-capture:\" + JSON.stringify(anchors),\n async () => {\n const capture: AnchorCapture = { anchors, files: {}, complete: true };\n if (!anchors.length) return capture;\n try {\n const { eligible, filesByScope } = await (context ??= prepareContext());\n const files = filesByScope.get(JSON.stringify(anchors))!;\n if (files.length > 2000) return { ...capture, complete: false };\n for (const file of files) {\n const evidence = await inspectionRead(\n root,\n \"decision-anchor-file:\" + file,\n async () => {\n try {\n const absolute = await storePath(root, file);\n await fs.lstat(absolute); // Missing indexed files are deletions, not unreadable evidence.\n if (!eligible.has(file)) return { complete: false };\n const handle = await fs.open(\n absolute,\n constants.O_RDONLY | constants.O_NONBLOCK | constants.O_NOFOLLOW,\n );\n try {\n const stat = await handle.stat();\n if (!stat.isFile() || stat.size > MAX_SOURCE_BYTES)\n return { complete: false };\n const bytes = Buffer.alloc(Math.min(stat.size + 1, MAX_SOURCE_BYTES + 1));\n let size = 0;\n while (size < bytes.length) {\n const read = await handle.read(bytes, size, bytes.length - size, null);\n if (!read.bytesRead) break;\n size += read.bytesRead;\n }\n if (size === bytes.length) return { complete: false }; // Grew during capture.\n return {\n complete: true,\n hash: createHash(\"sha256\").update(bytes.subarray(0, size)).digest(\"hex\"),\n };\n } finally {\n await handle.close();\n }\n } catch (error) {\n return { complete: (error as NodeJS.ErrnoException).code === \"ENOENT\" };\n }\n },\n );\n if (!evidence.complete) capture.complete = false;\n if (evidence.hash) capture.files[file] = evidence.hash;\n }\n } catch {\n capture.complete = false;\n }\n return capture;\n },\n );\n }),\n );\n}\n\nexport async function captureAnchors(root: string, anchors: string[]): Promise<AnchorCapture> {\n return (await captureAnchorScopes(root, [anchors]))[0];\n}\n\nexport function changedCaptureFiles(before: AnchorCapture, after: AnchorCapture): string[] {\n return [...new Set([...Object.keys(before.files), ...Object.keys(after.files)])]\n .filter((file) => before.files[file] !== after.files[file])\n .sort();\n}\n","import { z } from \"zod\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { storePath } from \"./storage.js\";\n\nconst lockOwnerSchema = z.object({ host: z.string(), pid: z.number().int().positive() });\n\nasync function lockDiagnostic(file: string): Promise<string> {\n let reason: string;\n try {\n const owner = lockOwnerSchema.safeParse(JSON.parse(await fs.readFile(file, \"utf8\")));\n if (!owner.success) {\n reason = \"Lock owner data is incomplete or malformed.\";\n } else if (owner.data.host !== os.hostname()) {\n reason = \"The lock belongs to another host; its process cannot be checked locally.\";\n } else {\n try {\n process.kill(owner.data.pid, 0);\n reason = `Local owner PID ${owner.data.pid} is still running.`;\n } catch (error) {\n reason =\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n ? `Local owner PID ${owner.data.pid} has exited, but lock recovery has not completed.`\n : `Local owner PID ${owner.data.pid} could not be checked.`;\n }\n }\n } catch (error) {\n reason =\n error instanceof SyntaxError\n ? \"Lock owner data is incomplete or malformed.\"\n : \"Lock owner data could not be read; the lock may have changed.\";\n }\n if (\n await fs.lstat(file + \".reclaim\").then(\n () => true,\n () => false,\n )\n ) {\n reason += \" A recovery guard also needs inspection: \" + file + \".reclaim.\";\n }\n return (\n reason +\n \" Retry if a writer is active. For manual recovery, stop all Mason writers for this checkout, confirm they have exited (including other hosts), then remove only confirmed abandoned lock and lock.reclaim files. See docs/reference.md#snapshot-repairs-and-verification.\"\n );\n}\n\n/** Cross-process lock: a killed writer's lock is reclaimed only after its local PID is gone. */\nexport async function withStoreLock<T>(\n root: string,\n directory: string,\n run: () => Promise<T>,\n waitMs = 5000,\n label = \"Mason store\",\n): Promise<T> {\n const file = await storePath(root, directory + \"/lock\", true);\n const deadline = Date.now() + waitMs;\n let handle;\n while (!handle) {\n try {\n handle = await fs.open(file, \"wx\", 0o600);\n } catch (error) {\n // Windows can deny opening a lock while another process finishes deleting it.\n // Retry acquisition only, retaining the original error if access stays denied.\n if (process.platform === \"win32\" && (error as NodeJS.ErrnoException).code === \"EPERM\") {\n if (Date.now() >= deadline) throw error;\n await new Promise((resolve) => setTimeout(resolve, 40));\n continue;\n }\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n // Do not steal malformed, remote, or live locks on a time-based guess.\n try {\n const owner = lockOwnerSchema.parse(JSON.parse(await fs.readFile(file, \"utf8\")));\n if (owner.host === os.hostname() && Number.isInteger(owner.pid) && owner.pid > 0) {\n try {\n process.kill(owner.pid, 0);\n } catch (probe) {\n if ((probe as NodeJS.ErrnoException).code === \"ESRCH\") {\n // A separate guard arbitrates reclamation; recheck the owner before unlinking.\n const reclaim = file + \".reclaim\";\n let guard;\n try {\n guard = await fs.open(reclaim, \"wx\", 0o600);\n const current = lockOwnerSchema.parse(JSON.parse(await fs.readFile(file, \"utf8\")));\n if (current.pid === owner.pid && current.host === owner.host) await fs.unlink(file);\n } finally {\n if (guard) {\n await guard.close();\n await fs.rm(reclaim, { force: true });\n }\n }\n }\n }\n }\n } catch {\n /* Another writer may be creating/releasing/reclaiming it. */\n }\n if (Date.now() >= deadline)\n throw new Error(\n label +\n \" is busy or its lock needs inspection: \" +\n file +\n \". \" +\n (await lockDiagnostic(file)),\n { cause: error },\n );\n await new Promise((resolve) => setTimeout(resolve, 40));\n }\n if (handle) {\n try {\n await handle.writeFile(JSON.stringify({ pid: process.pid, host: os.hostname() }));\n } catch (error) {\n await handle.close().catch(() => {});\n await fs.rm(file, { force: true }).catch(() => {});\n throw error;\n }\n }\n }\n try {\n return await run();\n } finally {\n await handle.close();\n await fs.unlink(file);\n }\n}\n","import { withStoreLock } from \"../utils/store-lock.js\";\n\n/** Each checkout has its own snapshot, shared by all MCP processes. */\nexport function withSnapshotWrite<T>(\n root: string,\n run: () => Promise<T>,\n waitMs = 5000,\n): Promise<T> {\n return withStoreLock(root, \".mason/local/snapshot-write\", run, waitMs, \"Snapshot store\");\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport { createFileAccess } from \"../utils/files.js\";\nimport { readStoreJson, writeStoreJson, type StoreDiagnostic } from \"../utils/storage.js\";\nimport { z } from \"zod\";\nimport { withSnapshotWrite } from \"./lock.js\";\nimport { normalizeRepoPath } from \"../utils/paths.js\";\n\nexport interface FeatureEntry {\n description: string;\n files: string[];\n tests?: string[];\n /**\n * Commit this entry was last verified against. Entries updated by an\n * incremental save carry HEAD here; untouched entries keep the hash the\n * map had before the save, so drift stays visible per entry. Absent means\n * \"as of the snapshot's top-level gitHash\".\n */\n refreshedHash?: string;\n /**\n * Whether this is a user-facing capability or internal infrastructure\n * (DI wiring, config loading, logging, provider/transport plumbing).\n * Capabilities describe user-facing functionality;\n * infrastructure stays in the AI concept map only. Defaults to \"capability\"\n * when absent (older snapshots) — see normalizeFeatureType.\n */\n type?: \"capability\" | \"infrastructure\";\n /**\n * When an assistant last confirmed this entry's files actually implement\n * the claimed feature (verify_snapshot flow). Absent on older snapshots\n * and never-verified entries. Drift checks freshness against git; this\n * checks the map was CORRECT in the first place.\n */\n verifiedAt?: string;\n verifiedHash?: string;\n /** Digest of the entry and bounded source evidence reviewed for this verdict. */\n verificationToken?: string;\n /** Set when verification judged the entry wrong — re-map it. */\n verificationFailed?: boolean;\n verificationNote?: string;\n}\n\nexport type FeatureType = \"capability\" | \"infrastructure\";\n\n/**\n * Coerce an arbitrary type value to a known classification. Anything that\n * isn't explicitly \"infrastructure\" defaults to \"capability\" — so older\n * snapshots and unclassified entries are treated as user-facing (published),\n * never silently hidden.\n */\nexport function normalizeFeatureType(value: unknown): FeatureType {\n return value === \"infrastructure\" ? \"infrastructure\" : \"capability\";\n}\n\nexport interface FlowEntry {\n description: string;\n chain: string[];\n /** See FeatureEntry.refreshedHash. */\n refreshedHash?: string;\n /** See FeatureEntry.verifiedAt / verificationFailed. */\n verifiedAt?: string;\n verifiedHash?: string;\n /** Digest of the entry and bounded source evidence reviewed for this verdict. */\n verificationToken?: string;\n verificationFailed?: boolean;\n verificationNote?: string;\n}\n\nexport interface Snapshot {\n version: 2;\n createdAt: string;\n updatedAt: string;\n gitHash: string;\n features: Record<string, FeatureEntry>;\n flows: Record<string, FlowEntry>;\n}\n\nconst repoPath = z\n .string()\n .refine((value) => normalizeRepoPath(value) !== null, \"Expected a relative repository path\");\nconst verificationFields = {\n refreshedHash: z.string().optional(),\n verifiedAt: z.string().optional(),\n verifiedHash: z.string().optional(),\n verificationToken: z.string().optional(),\n verificationFailed: z.boolean().optional(),\n verificationNote: z.string().optional(),\n};\nexport const featureSchema = z\n .object({\n description: z.string(),\n files: z.array(repoPath),\n tests: z.array(repoPath).optional(),\n type: z.enum([\"capability\", \"infrastructure\"]).optional(),\n ...verificationFields,\n })\n .passthrough();\nexport const flowSchema = z\n .object({ description: z.string(), chain: z.array(repoPath), ...verificationFields })\n .passthrough();\nconst snapshotSchema = z\n .object({\n version: z.literal(2),\n createdAt: z.string(),\n updatedAt: z.string(),\n gitHash: z.string(),\n features: z.record(featureSchema),\n flows: z.record(flowSchema),\n })\n .passthrough();\n\nexport async function loadSnapshot(rootDir: string): Promise<Snapshot | null> {\n const parsed = await readStoreJson(rootDir, \".mason/snapshot.json\");\n if (parsed === null || (parsed as { version?: number }).version === 1) return null;\n const result = snapshotSchema.safeParse(parsed);\n if (!result.success) throw new Error(`Invalid Mason snapshot: ${result.error.message}`);\n return result.data;\n}\n\n/** Context and onboarding can use decisions even when the optional map is broken. */\nexport async function inspectSnapshot(rootDir: string): Promise<{\n status: \"available\" | \"missing\" | \"invalid\";\n snapshot: Snapshot | null;\n diagnostics: StoreDiagnostic[];\n}> {\n try {\n const raw = await readStoreJson(rootDir, \".mason/snapshot.json\");\n const snapshot = raw === null ? null : snapshotSchema.parse(raw);\n return { status: snapshot ? \"available\" : \"missing\", snapshot, diagnostics: [] };\n } catch (error) {\n return {\n status: \"invalid\",\n snapshot: null,\n diagnostics: [\n {\n path: \".mason/snapshot.json\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\n/** Read and commit under one cross-process lock; a null snapshot means no write. */\nexport async function updateSnapshot<T>(\n rootDir: string,\n update: (current: Snapshot | null) => Promise<{\n snapshot: Snapshot | null;\n result: T;\n }>,\n): Promise<T> {\n return withSnapshotWrite(rootDir, async () => {\n const change = await update(await loadSnapshot(rootDir));\n if (change.snapshot) {\n await writeStoreJson(rootDir, \".mason/snapshot.json\", snapshotSchema.parse(change.snapshot));\n }\n return change.result;\n });\n}\n\nexport async function getCurrentGitHash(rootDir: string): Promise<string> {\n try {\n const { stdout } = await execGit([\"rev-parse\", \"HEAD\"], {\n cwd: rootDir,\n });\n return stdout.trim();\n } catch {\n return \"unknown\";\n }\n}\n\nexport async function listSourceFiles(resolvedRoot: string): Promise<string[]> {\n return (await createFileAccess(resolvedRoot)).list();\n}\n","import path from \"node:path\";\n\n// Question/filler words that carry no signal about which entry a task\n// touches. Domain words (\"auth\", \"drift\") are never in this list.\nconst STOPWORDS = new Set([\n \"the\",\n \"a\",\n \"an\",\n \"and\",\n \"or\",\n \"of\",\n \"to\",\n \"in\",\n \"on\",\n \"for\",\n \"with\",\n \"how\",\n \"does\",\n \"do\",\n \"is\",\n \"are\",\n \"was\",\n \"what\",\n \"where\",\n \"which\",\n \"why\",\n \"when\",\n \"who\",\n \"i\",\n \"we\",\n \"my\",\n \"our\",\n \"you\",\n \"your\",\n \"it\",\n \"its\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n \"can\",\n \"could\",\n \"should\",\n \"would\",\n \"will\",\n \"want\",\n \"need\",\n \"please\",\n \"about\",\n \"into\",\n \"from\",\n \"when\",\n \"there\",\n \"any\",\n \"all\",\n \"some\",\n \"not\",\n \"but\",\n \"also\",\n \"just\",\n \"like\",\n \"get\",\n \"make\",\n \"use\",\n \"new\",\n \"work\",\n \"works\",\n \"working\",\n \"implement\",\n \"implemented\",\n \"change\",\n \"changed\",\n \"file\",\n \"files\",\n \"code\",\n]);\n\n/** Split camelCase/PascalCase/kebab/snake/path into lowercase word tokens. */\nexport function tokenize(text: string): string[] {\n return text\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 2 && !STOPWORDS.has(t));\n}\n\n/** Crude singular/plural folding so \"flows\" matches \"flow\" etc. */\nexport function stem(token: string): string {\n return token.length > 3 && token.endsWith(\"s\") ? token.slice(0, -1) : token;\n}\n\nexport function tokenSet(text: string): Set<string> {\n return new Set(tokenize(text).map(stem));\n}\n\nexport interface Scorable {\n name: string;\n description: string;\n files: string[];\n}\n\n/**\n * Lexical relevance of one entry to the task. Name hits are the strongest\n * signal, then description, then file-path words. Each distinct task token\n * counts once at its best weight, so a token appearing everywhere doesn't\n * triple-count.\n */\nexport function scoreEntry(taskTokens: Set<string>, entry: Scorable): number {\n const nameTokens = tokenSet(entry.name);\n const descTokens = tokenSet(entry.description);\n const fileTokens = tokenSet(entry.files.map((f) => path.basename(f)).join(\" \"));\n\n let score = 0;\n for (const token of taskTokens) {\n if (nameTokens.has(token)) score += 3;\n else if (descTokens.has(token)) score += 1;\n else if (fileTokens.has(token)) score += 1;\n }\n return score;\n}\n\n/** Jaccard similarity of two token sets: |∩| / |∪|, 0 when both empty. */\nexport function jaccard(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 0;\n let intersection = 0;\n for (const token of a) if (b.has(token)) intersection++;\n return intersection / (a.size + b.size - intersection);\n}\n","export type Freshness = \"current\" | \"changed\" | \"unknown\";\nexport interface TrustState {\n freshness: Freshness;\n verification: \"unverified\" | \"passed\" | \"failed\" | \"stale\" | \"unknown\";\n /** Historical map verdict, retained even when its evidence no longer applies. */\n recordedVerdict?: \"passed\" | \"failed\";\n verifiedAt?: string;\n verifiedHash?: string;\n reasons: string[];\n}\n\nexport function assessTrust(\n entry: {\n verifiedAt?: string;\n verifiedHash?: string;\n verificationFailed?: boolean;\n verificationNote?: string;\n },\n freshness: Freshness,\n): TrustState {\n const verification = entry.verificationFailed\n ? \"failed\"\n : entry.verifiedAt\n ? \"passed\"\n : \"unverified\";\n const reasons: string[] = [];\n if (freshness === \"unknown\")\n reasons.push(\n \"Anchors, history, or working-tree evidence are unavailable; verify before relying on this entry.\",\n );\n if (freshness === \"changed\")\n reasons.push(\n \"Anchored files changed; verify against current code before relying on this entry.\",\n );\n if (verification === \"failed\")\n reasons.push(\n `Verification failed: ${entry.verificationNote ?? \"re-map this entry before relying on it\"}`,\n );\n if (verification === \"unverified\") reasons.push(\"No correctness verification has been recorded.\");\n return {\n freshness,\n verification,\n verifiedAt: entry.verifiedAt,\n verifiedHash: entry.verifiedHash,\n reasons,\n };\n}\n\nexport function trustHint(states: TrustState[]): string {\n const parts: string[] = [];\n if (states.some((s) => s.verification === \"failed\" || s.recordedVerdict === \"failed\"))\n parts.push(\n \"Verification failed for returned entries; do not rely on those descriptions until corrected.\",\n );\n if (states.some((s) => s.verification === \"stale\"))\n parts.push(\n \"Recorded verification evidence changed; use verify_snapshot and review the current evidence before reusing those verdicts.\",\n );\n if (states.some((s) => s.verification === \"unknown\"))\n parts.push(\n \"Recorded verification evidence cannot be confirmed; inspect the files and obtain a fresh review before relying on those verdicts.\",\n );\n if (states.some((s) => s.freshness === \"unknown\"))\n parts.push(\n \"Freshness is unknown for some returned entries; inspect their files before relying on them.\",\n );\n if (states.some((s) => s.freshness === \"changed\"))\n parts.push(\n \"Some returned entries have changed files, including possible local edits; verify against the current code.\",\n );\n if (!parts.length)\n parts.push(\n \"No changes detected in the returned anchors. This does not prove the descriptions are correct.\",\n );\n if (states.some((s) => s.verification === \"unverified\"))\n parts.push(\n \"Some entries have never been verified; read their evidence or use verify_snapshot for map descriptions.\",\n );\n return parts.join(\" \");\n}\n","import { z } from \"zod\";\nimport { createHash } from \"node:crypto\";\nimport { anchorCaptureSchema } from \"./anchors.js\";\nimport { normalizeRepoPath } from \"../utils/paths.js\";\nimport { assessTrust, type Freshness } from \"../context/trust.js\";\n\nconst text = (max: number) => z.string().trim().min(1).max(max);\nexport const decisionSourceSchema = z\n .object({\n kind: z.enum([\"pull_request\", \"issue\", \"incident\", \"discussion\", \"document\", \"other\"]),\n reference: text(1000),\n note: text(500).optional(),\n })\n .strict();\nexport type DecisionSource = z.infer<typeof decisionSourceSchema>;\nexport const attributionSchema = z.object({\n owner: text(200).nullable().optional(),\n sources: z.array(decisionSourceSchema).max(20).optional(),\n actor: text(200).optional(),\n});\nconst contentSchema = z.object({\n title: z.string().min(1),\n body: z.string().min(1),\n category: z.enum([\"decision\", \"gotcha\", \"deprecation\", \"convention\"]),\n files: z.array(z.string().refine((f) => normalizeRepoPath(f) !== null)),\n owner: text(200).optional(),\n sources: z.array(decisionSourceSchema).max(20),\n});\nconst approvalSchema = z.enum([\"unreviewed\", \"proposed\", \"accepted\"]);\nconst statusSchema = z.enum([\"active\", \"superseded\", \"retired\"]);\nexport const reviewEvidenceSchema = z.object({\n baseHash: z.string(),\n headHash: z.string(),\n historyAvailable: z.boolean(),\n changedFiles: z.array(z.string()),\n localChanges: z.array(z.string()),\n});\nconst eventSchema = z.object({\n kind: z.enum([\n \"imported\",\n \"created\",\n \"revised\",\n \"accepted\",\n \"reaffirmed\",\n \"retired\",\n \"superseded\",\n ]),\n at: z.string().datetime(),\n actor: text(200).optional(),\n note: text(1500).optional(),\n revision: z.number().int().positive(),\n content: contentSchema,\n approval: approvalSchema,\n status: statusSchema,\n refreshedHash: z.string(),\n evidence: reviewEvidenceSchema.optional(),\n capture: anchorCaptureSchema.optional(),\n});\nexport type DecisionEvent = z.infer<typeof eventSchema>;\nexport type DecisionApproval = z.infer<typeof approvalSchema>;\nexport type DecisionContent = z.infer<typeof contentSchema>;\n\nconst legacySchema = z\n .object({\n version: z.literal(1),\n id: z.string().regex(/^[a-zA-Z0-9_-]+$/),\n title: z.string().min(1),\n body: z.string().min(1),\n category: contentSchema.shape.category,\n files: contentSchema.shape.files,\n createdAt: z.string(),\n updatedAt: z.string(),\n refreshedHash: z.string(),\n status: z.enum([\"active\", \"superseded\"]),\n supersededBy: z.string().optional(),\n })\n .passthrough();\nconst currentSchema = legacySchema\n .extend({\n version: z.literal(2),\n status: statusSchema,\n approval: approvalSchema,\n revision: z.number().int().positive(),\n owner: text(200).optional(),\n sources: z.array(decisionSourceSchema).max(20),\n history: z.array(eventSchema).min(1),\n capture: anchorCaptureSchema.optional(),\n inspections: z\n .array(\n z.object({\n at: z.string().datetime(),\n inspector: text(200),\n note: text(1500),\n outcome: z.literal(\"no_contradiction_found\"),\n scope: z.literal(\"operative\").optional(),\n decisionDigest: z.string().regex(/^[a-f0-9]{64}$/),\n headHash: z.string(),\n capture: anchorCaptureSchema,\n }),\n )\n .max(200)\n .optional(),\n })\n .superRefine((record, ctx) => {\n const invalid = (message: string) => ctx.addIssue({ code: \"custom\", message });\n const same = (a: unknown, b: unknown) => JSON.stringify(a) === JSON.stringify(b);\n let previous: DecisionEvent | undefined;\n for (const event of record.history) {\n if (!previous) {\n if (![\"created\", \"imported\"].includes(event.kind) || event.revision !== 1)\n invalid(\"History must begin with creation or legacy import at revision 1\");\n if (event.approval !== (event.kind === \"created\" ? \"proposed\" : \"unreviewed\"))\n invalid(\"Initial records cannot claim acceptance\");\n } else {\n if ([\"created\", \"imported\"].includes(event.kind)) invalid(\"History cannot restart\");\n if (previous.status !== \"active\") invalid(\"Archived decisions cannot be changed\");\n if (event.revision !== previous.revision + (event.kind === \"revised\" ? 1 : 0))\n invalid(\"Invalid revision sequence\");\n if (event.kind !== \"revised\" && !same(event.content, previous.content))\n invalid(\"A review cannot silently revise decision content\");\n if (event.kind === \"reaffirmed\" && previous.approval !== \"accepted\")\n invalid(\"Only accepted decisions can be reaffirmed\");\n if (event.kind === \"accepted\" && previous.approval === \"accepted\")\n invalid(\"Use reaffirmation for an accepted decision\");\n const approval =\n event.kind === \"revised\"\n ? \"proposed\"\n : [\"accepted\", \"reaffirmed\"].includes(event.kind)\n ? \"accepted\"\n : previous.approval;\n if (event.approval !== approval) invalid(\"Approval disagrees with review history\");\n if (\n ![\"accepted\", \"reaffirmed\"].includes(event.kind) &&\n event.refreshedHash !== previous.refreshedHash\n )\n invalid(\"Only a review can refresh the evidence baseline\");\n }\n if (\n event.kind !== \"imported\" &&\n event.status !==\n (event.kind === \"retired\"\n ? \"retired\"\n : event.kind === \"superseded\"\n ? \"superseded\"\n : \"active\")\n )\n invalid(\"Lifecycle disagrees with history\");\n if (\n [\"accepted\", \"reaffirmed\", \"retired\"].includes(event.kind) &&\n (!event.actor || !event.note || !event.evidence)\n )\n invalid(\"Reviews require a named reviewer, reason, and code evidence\");\n if ([\"accepted\", \"reaffirmed\"].includes(event.kind)) {\n if (!event.content.owner || !event.content.sources.length)\n invalid(\"Accepted decisions require an owner and source\");\n if (\n !event.evidence ||\n !/^[a-f0-9]{40,64}$/.test(event.evidence.headHash) ||\n event.refreshedHash !== event.evidence.headHash ||\n event.evidence.localChanges.length\n )\n invalid(\"Acceptance requires a committed evidence baseline\");\n }\n if (event.capture && !same([...event.content.files].sort(), event.capture.anchors))\n invalid(\"Capture scope disagrees with decision anchors\");\n previous = event;\n }\n if (previous && !same(previous.capture, record.capture))\n invalid(\"Capture does not match the final history event\");\n if (\n !previous ||\n !same(previous.content, decisionContent(record)) ||\n previous.approval !== record.approval ||\n previous.status !== record.status ||\n previous.revision !== record.revision ||\n previous.refreshedHash !== record.refreshedHash\n )\n invalid(\"Decision does not match the final history event\");\n });\n\nexport const decisionSchema = z.union([legacySchema, currentSchema]);\nexport type DecisionRecord = z.infer<typeof decisionSchema>;\nexport type ReviewedDecisionRecord = z.infer<typeof currentSchema>;\n\nexport function decisionContent(\n record: Pick<DecisionRecord, \"title\" | \"body\" | \"category\" | \"files\"> & {\n owner?: unknown;\n sources?: unknown;\n },\n): DecisionContent {\n return {\n title: record.title,\n body: record.body,\n category: record.category,\n files: record.files,\n ...(typeof record.owner === \"string\" ? { owner: record.owner } : {}),\n sources: Array.isArray(record.sources) ? (record.sources as DecisionSource[]) : [],\n };\n}\n\n/** Reading legacy records never upgrades their approval or rewrites their files. */\nexport function decisionApproval(record: DecisionRecord): DecisionApproval {\n return record.version === 1 ? \"unreviewed\" : record.approval;\n}\n\n/** The last accepted revision remains operative while a replacement is drafted.\n * This is a read-only projection; writes and review tokens use the complete record.\n * Archived records never regain authority from their history.\n */\nexport function effectiveDecision(record: DecisionRecord): DecisionRecord {\n if (record.version !== 2 || record.status !== \"active\" || record.approval !== \"proposed\")\n return record;\n let index = record.history.length - 1;\n while (index >= 0 && ![\"accepted\", \"reaffirmed\"].includes(record.history[index].kind)) index--;\n if (index < 0) return record;\n const event = record.history[index];\n return {\n ...record,\n ...event.content,\n owner: event.content.owner,\n approval: \"accepted\",\n revision: event.revision,\n refreshedHash: event.refreshedHash,\n capture: event.capture,\n updatedAt: event.at,\n history: record.history.slice(0, index + 1),\n };\n}\n\n/** Anchors relevant to either the operative knowledge or its pending proposal. */\nexport function decisionAnchors(record: DecisionRecord): string[] {\n return [...new Set([...effectiveDecision(record).files, ...record.files])];\n}\n\nexport function importLegacy(record: DecisionRecord, now: string): ReviewedDecisionRecord {\n if (record.version === 2) return record;\n // Ignore unrecognized legacy fields: they are not evidence of authorship or approval.\n const content = decisionContent({\n title: record.title,\n body: record.body,\n category: record.category,\n files: record.files,\n });\n return {\n id: record.id,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt,\n status: record.status,\n refreshedHash: record.refreshedHash,\n supersededBy: record.supersededBy,\n ...content,\n version: 2,\n approval: \"unreviewed\",\n revision: 1,\n history: [\n {\n kind: \"imported\",\n at: now,\n revision: 1,\n content,\n approval: \"unreviewed\",\n status: record.status,\n refreshedHash: record.refreshedHash,\n note: \"Imported a legacy record. Prior authorship and review history are unknown.\",\n },\n ],\n };\n}\n\nexport function decisionProvenance(record: DecisionRecord, freshness: Freshness = \"unknown\") {\n const approval = decisionApproval(record);\n const review =\n record.version === 2\n ? [...record.history]\n .reverse()\n .find(\n (e) => [\"accepted\", \"reaffirmed\"].includes(e.kind) && e.revision === record.revision,\n )\n : undefined;\n return {\n approval,\n revision: record.version === 2 ? record.revision : 0,\n owner: record.version === 2 ? (record.owner ?? null) : null,\n sources: record.version === 2 ? record.sources : [],\n guidance:\n record.status !== \"active\"\n ? \"historical\"\n : approval === \"accepted\"\n ? \"constraint\"\n : approval === \"proposed\"\n ? \"proposal\"\n : \"unreviewed\",\n reviewRequired:\n record.status === \"active\" && (approval !== \"accepted\" || freshness !== \"current\"),\n lastReview: review\n ? {\n reviewer: review.actor!,\n at: review.at,\n note: review.note!,\n gitHash: review.refreshedHash,\n }\n : null,\n };\n}\n\nexport function decisionTrust(record: DecisionRecord, freshness: Freshness) {\n const review = decisionProvenance(record, freshness).lastReview;\n return assessTrust(\n review ? { verifiedAt: review.at, verifiedHash: review.gitHash } : {},\n freshness,\n );\n}\n\n/** Inspection identity covers both the proposal and the operative accepted revision. */\nexport type InspectionScope = \"all\" | \"operative\";\n\nexport function decisionInspectionDigest(\n record: DecisionRecord,\n scope: InspectionScope = \"all\",\n): string {\n const effective = effectiveDecision(record);\n if (scope === \"operative\")\n return createHash(\"sha256\")\n .update(\n JSON.stringify([\n \"operative\",\n record.status,\n decisionApproval(effective),\n effective.version === 2 ? effective.revision : 0,\n decisionContent(effective),\n effective.refreshedHash,\n ]),\n )\n .digest(\"hex\");\n return createHash(\"sha256\")\n .update(\n JSON.stringify([\n record.status,\n decisionApproval(record),\n record.version === 2 ? record.revision : 0,\n decisionContent(record),\n decisionContent(effective),\n effective.refreshedHash,\n ]),\n )\n .digest(\"hex\");\n}\n\nexport function latestDecisionInspection(record: DecisionRecord, scope: InspectionScope = \"all\") {\n return record.version === 2\n ? record.inspections\n ?.filter(\n (i) =>\n (scope === \"operative\" || i.scope !== \"operative\") &&\n i.decisionDigest === decisionInspectionDigest(record, i.scope ?? \"all\"),\n )\n .at(-1)\n : undefined;\n}\n\nfunction revisionKnowledge(record: DecisionRecord, freshness: Freshness) {\n return {\n ...decisionContent(record),\n ...decisionProvenance(record, freshness),\n trust: decisionTrust(record, freshness),\n };\n}\n\n/** Readers show accepted content first and label the unaccepted draft separately. */\nexport function decisionKnowledge(\n record: DecisionRecord,\n freshness: Freshness = \"unknown\",\n proposalFreshness: Freshness = \"unknown\",\n) {\n const effective = effectiveDecision(record);\n const inspection = latestDecisionInspection(\n record,\n decisionApproval(effective) === \"accepted\" ? \"operative\" : \"all\",\n );\n return {\n ...revisionKnowledge(effective, freshness),\n ...(inspection\n ? {\n inspection: {\n freshness,\n at: inspection.at,\n inspector: inspection.inspector,\n note: inspection.note,\n outcome: inspection.outcome,\n scope: inspection.scope ?? \"all\",\n headHash: inspection.headHash,\n },\n }\n : {}),\n ...(effective !== record\n ? {\n pendingProposal: {\n ...revisionKnowledge(record, proposalFreshness),\n assessment: latestDecisionInspection(record)\n ? \"no_contradiction_found\"\n : \"not_assessed\",\n },\n }\n : {}),\n };\n}\n\nexport function compactDecisionKnowledge(...args: Parameters<typeof decisionKnowledge>) {\n const { body, pendingProposal, ...summary } = decisionKnowledge(...args);\n if (!pendingProposal) return summary;\n const { body: proposalBody, ...proposal } = pendingProposal;\n return { ...summary, pendingProposal: proposal };\n}\n\nexport const DECISION_GUIDANCE =\n \"Accepted decisions are recorded team constraints, subject to freshness checks. A pendingProposal is an unaccepted replacement; the accepted revision remains operative until explicit acceptance or retirement. Proposals are suggestions; legacy unreviewed records need confirmation. Use review_decision to prepare evidence and record a separate source inspection without human approval, or an authorized human review; identities and sources are recorded assertions, not authenticated proof.\";\n","import { inspectionRead, invalidateInspectionReads } from \"../audit/inspection.js\";\nimport { readBoundedFile } from \"../utils/files.js\";\nimport { captureAnchors } from \"./anchors.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { writeStoreJson, storePath, type StoreDiagnostic } from \"../utils/storage.js\";\nimport { sanitizeRepoPaths } from \"../utils/paths.js\";\nimport { getCurrentGitHash } from \"../snapshot/snapshot.js\";\nimport { jaccard, tokenSet } from \"../context/lexical.js\";\nimport {\n attributionSchema,\n decisionSchema,\n decisionContent,\n decisionApproval,\n effectiveDecision,\n importLegacy,\n type DecisionSource,\n type DecisionRecord,\n type ReviewedDecisionRecord,\n} from \"./provenance.js\";\nexport type { DecisionRecord } from \"./provenance.js\";\n\nexport type DecisionCategory = \"decision\" | \"gotcha\" | \"deprecation\" | \"convention\";\nexport type DecisionStatus = \"active\" | \"superseded\" | \"retired\";\n\nexport const TITLE_MAX_CHARS = 80;\nexport const BODY_RECOMMENDED_CHARS = 1500;\nexport const BODY_MAX_CHARS = 2500;\nexport const MAX_ACTIVE_DECISIONS = 150;\n\n// Share validation with MCP so rejected tool calls include the actual length.\nconst boundedText = (field: string, max: number, hint: string) =>\n z\n .string({\n errorMap: (issue, ctx) => ({\n message:\n issue.code === \"too_big\" && typeof ctx.data === \"string\"\n ? `${field} has ${ctx.data.length} characters; maximum is ${max} (${ctx.data.length - max} over). ${hint}`\n : ctx.defaultError,\n }),\n })\n .trim()\n .min(1, `${field} must be non-empty`)\n .max(max);\n\nexport const decisionTitleSchema = boundedText(\n \"title\",\n TITLE_MAX_CHARS,\n \"Tighten it to a specific headline.\",\n);\nexport const decisionBodySchema = boundedText(\n \"body\",\n BODY_MAX_CHARS,\n `Aim for ${BODY_RECOMMENDED_CHARS} characters or fewer. Preserve the rule, reason, and exceptions; put supporting references in sources.`,\n);\n\nconst DUPLICATE_JACCARD = 0.5;\nconst DUPLICATE_JACCARD_WITH_SHARED_FILE = 0.35;\n\n/** Raw bytes also feed automation fingerprints, including malformed records. */\nexport async function readDecisionInputs(\n rootDir: string,\n): Promise<{ inputs: Array<[string, string | null]>; diagnostics: StoreDiagnostic[] }> {\n return structuredClone(\n await inspectionRead(rootDir, \"decision-store:inputs\", async () => {\n const inputs: Array<[string, string | null]> = [];\n const diagnostics: StoreDiagnostic[] = [];\n let entries: string[];\n try {\n entries = await fs.readdir(await storePath(rootDir, \".mason/decisions\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\")\n diagnostics.push({ path: \".mason/decisions\", message: String(error) });\n return { inputs, diagnostics };\n }\n for (const entry of entries.sort()) {\n if (!entry.endsWith(\".json\")) continue;\n const relative = `.mason/decisions/${entry}`;\n try {\n const raw = await readBoundedFile(await storePath(rootDir, relative), 10 * 1024 * 1024);\n if (raw === null) throw new Error(\"file is not regular or exceeds 10 MiB\");\n inputs.push([relative, raw]);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") inputs.push([relative, null]);\n else\n diagnostics.push({\n path: relative,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { inputs, diagnostics };\n }),\n );\n}\n\nexport async function loadDecisionStore(\n rootDir: string,\n): Promise<{ records: DecisionRecord[]; diagnostics: StoreDiagnostic[] }> {\n // Callers may edit their returned records while preparing a write. Never expose\n // mutable cached records, and never share this cache with final validation.\n return structuredClone(\n await inspectionRead(rootDir, \"decision-store:parsed\", async () => {\n const raw = await readDecisionInputs(rootDir);\n const records: DecisionRecord[] = [];\n const diagnostics = [...raw.diagnostics];\n for (const [relative, content] of raw.inputs) {\n try {\n const record = decisionSchema.parse(content === null ? null : JSON.parse(content));\n if (relative !== `.mason/decisions/${record.id}.json`)\n throw new Error(\"Record id does not match its filename\");\n records.push(record);\n } catch (error) {\n diagnostics.push({\n path: relative,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { records, diagnostics };\n }),\n );\n}\n\nexport async function loadDecisions(rootDir: string): Promise<DecisionRecord[]> {\n return (await loadDecisionStore(rootDir)).records;\n}\n\nexport async function saveDecisionRecord(rootDir: string, record: DecisionRecord): Promise<void> {\n const validated = decisionSchema.parse(record);\n await writeStoreJson(rootDir, `.mason/decisions/${validated.id}.json`, validated);\n invalidateInspectionReads(rootDir, \"decision-store:\");\n}\n\n/**\n * Deterministic, human-readable id: base slug ≤60 chars, ending at a word\n * boundary when possible. A single longer word is cut to fit.\n * A slug collision with a DIFFERENT record appends a 6-hex content suffix.\n */\nexport function decisionIdFor(title: string, body: string, existingIds: Set<string>): string {\n const fullSlug = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n let slug = fullSlug.slice(0, 60);\n if (fullSlug.length > 60 && fullSlug[60] !== \"-\") {\n const boundary = slug.lastIndexOf(\"-\");\n if (boundary > 0) slug = slug.slice(0, boundary);\n }\n slug = slug.replace(/-+$/, \"\") || \"decision\";\n if (!existingIds.has(slug)) return slug;\n const suffix = createHash(\"sha1\")\n .update(title + body)\n .digest(\"hex\")\n .slice(0, 6);\n return `${slug}-${suffix}`;\n}\n\nexport function findNearDuplicate(\n candidate: { title: string; body: string; files: string[] },\n existing: DecisionRecord[],\n): { record: DecisionRecord; similarity: number } | null {\n const candidateTokens = tokenSet(`${candidate.title} ${candidate.body}`);\n const candidateFiles = new Set(candidate.files);\n let best: { record: DecisionRecord; similarity: number } | null = null;\n\n for (const record of existing) {\n if (record.status !== \"active\") continue;\n const similarity = jaccard(candidateTokens, tokenSet(`${record.title} ${record.body}`));\n const sharesFile = record.files.some((f) => candidateFiles.has(f));\n const threshold = sharesFile ? DUPLICATE_JACCARD_WITH_SHARED_FILE : DUPLICATE_JACCARD;\n if (similarity >= threshold && (!best || similarity > best.similarity)) {\n best = { record, similarity };\n }\n }\n return best;\n}\n\nexport interface UpsertDecisionInput {\n title: string;\n body: string;\n category: DecisionCategory;\n files?: string[];\n owner?: string | null;\n sources?: DecisionSource[];\n /** Only supply a known identity; never infer authorship from Git configuration. */\n actor?: string;\n /** Existing id to revise. Unchanged content is a no-op; use review_decision to reaffirm. */\n id?: string;\n /** Id of a decision this one replaces; the old record is kept, marked superseded. */\n supersedes?: string;\n /** Save even when a near-duplicate was detected. */\n force?: boolean;\n}\n\nexport type UpsertDecisionResult =\n | {\n status: \"created\" | \"updated\" | \"unchanged\" | \"superseded_and_created\";\n id: string;\n totalActive: number;\n warnings: string[];\n approval?: \"unreviewed\" | \"proposed\" | \"accepted\";\n hint?: string;\n pruneCandidates?: string[];\n }\n | { status: \"duplicate_suspected\"; existing: DecisionRecord; hint: string }\n | { status: \"error\"; error: string };\n\n/** Serialize tool writes so prepared reviews cannot overwrite another decision edit. */\nexport async function withDecisionWrite<T>(\n root: string,\n operation: () => Promise<T>,\n): Promise<T | { status: \"error\"; error: string }> {\n const lockPath = await storePath(root, \".mason/decisions/.write-lock\", true);\n let lock;\n try {\n lock = await fs.open(lockPath, \"wx\", 0o600);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\")\n return {\n status: \"error\",\n error:\n \"Decision store is locked by another write. Retry after it finishes; an abandoned .mason/decisions/.write-lock must be removed only after confirming no writer is running.\",\n };\n throw error;\n }\n try {\n return await operation();\n } finally {\n await lock.close();\n await fs.unlink(lockPath);\n }\n}\n\nexport async function upsertDecision(\n rootDir: string,\n input: UpsertDecisionInput,\n): Promise<UpsertDecisionResult> {\n const parsedTitle = decisionTitleSchema.safeParse(input.title),\n parsedBody = decisionBodySchema.safeParse(input.body);\n if (!parsedTitle.success) return { status: \"error\", error: parsedTitle.error.issues[0].message };\n if (!parsedBody.success) return { status: \"error\", error: parsedBody.error.issues[0].message };\n const title = parsedTitle.data,\n body = parsedBody.data;\n const attribution = attributionSchema.safeParse(input);\n if (!attribution.success) return { status: \"error\", error: attribution.error.message };\n if (input.id && input.supersedes)\n return {\n status: \"error\",\n error: \"Use either id to revise or supersedes to replace a record, not both.\",\n };\n return withDecisionWrite(rootDir, async () => {\n const store = await loadDecisionStore(rootDir);\n if (store.diagnostics.length)\n return {\n status: \"error\",\n error:\n \"Repair malformed decision records before saving: \" +\n store.diagnostics.map((d) => d.path).join(\", \"),\n };\n const existing = store.records,\n byId = new Map(existing.map((r) => [r.id, r]));\n const now = new Date().toISOString(),\n head = await getCurrentGitHash(rootDir);\n const warnings: string[] = [];\n if (body.length > BODY_RECOMMENDED_CHARS)\n warnings.push(\n `body has ${body.length} characters, above the recommended ${BODY_RECOMMENDED_CHARS}; matching context and hooks include it in full. Keep the rule, reason, and exceptions concise; use sources for supporting references.`,\n );\n const files = sanitizeRepoPaths(input.files ?? []);\n if (input.files && files.length < input.files.length)\n warnings.push(\"some anchor paths were outside the repo or duplicated and were dropped\");\n for (const file of files) {\n try {\n await fs.access(path.join(rootDir, file));\n } catch {\n warnings.push(`anchor file does not exist on disk: ${file}`);\n }\n }\n const hint =\n \"Saved locally for review and commit. Proposals are not accepted constraints; an existing accepted revision remains operative while its replacement is proposed. Use review_decision to prepare evidence and record a separate inspection without human approval, or an authorized acceptance or reaffirmation.\";\n if (input.id) {\n const original = byId.get(input.id);\n if (!original) return { status: \"error\", error: `no decision with id \"${input.id}\"` };\n if (original.status !== \"active\")\n return {\n status: \"error\",\n error: \"Archived records cannot be revised; create a new proposal.\",\n };\n const record = importLegacy(original, now);\n const content = decisionContent({\n ...record,\n title,\n body,\n category: input.category,\n files: input.files !== undefined ? files : record.files,\n owner:\n attribution.data.owner === undefined\n ? record.owner\n : (attribution.data.owner ?? undefined),\n sources: attribution.data.sources ?? record.sources,\n });\n if (JSON.stringify(content) === JSON.stringify(decisionContent(record))) {\n return {\n status: \"unchanged\",\n id: record.id,\n totalActive: existing.filter((r) => r.status === \"active\").length,\n approval: decisionApproval(original),\n warnings,\n hint: \"Unchanged content; no review or freshness stamp was written. Use review_decision for explicit re-verification.\",\n };\n }\n const revision = record.revision + 1;\n const capture = await captureAnchors(rootDir, content.files);\n const updated: ReviewedDecisionRecord = {\n ...record,\n ...content,\n owner: content.owner,\n updatedAt: now,\n revision,\n approval: \"proposed\",\n capture,\n history: [\n ...record.history,\n {\n kind: \"revised\",\n at: now,\n actor: attribution.data.actor,\n revision,\n content,\n approval: \"proposed\",\n status: \"active\",\n refreshedHash: record.refreshedHash,\n capture,\n },\n ],\n };\n await saveDecisionRecord(rootDir, updated);\n return {\n status: \"updated\",\n id: record.id,\n totalActive: existing.filter((r) => r.status === \"active\").length,\n approval: \"proposed\",\n warnings,\n hint,\n };\n }\n const old = input.supersedes ? byId.get(input.supersedes) : undefined;\n if (input.supersedes && !old)\n return { status: \"error\", error: `no decision with id \"${input.supersedes}\" to supersede` };\n if (\n old &&\n (old.status !== \"active\" || decisionApproval(effectiveDecision(old)) === \"accepted\")\n ) {\n return {\n status: \"error\",\n error:\n \"A proposal cannot supersede an accepted or archived record. Create and review the replacement separately, then explicitly retire the old decision with review_decision.\",\n };\n }\n if (!input.force) {\n const duplicate = findNearDuplicate({ title, body, files }, existing);\n if (duplicate)\n return {\n status: \"duplicate_suspected\",\n existing: duplicate.record,\n hint: `A similar decision exists (\"${duplicate.record.title}\"). Call save_decision with id=\"${duplicate.record.id}\" to revise it, or force:true if distinct.`,\n };\n }\n const id = decisionIdFor(title, body, new Set(byId.keys()));\n if (byId.has(id))\n return {\n status: \"error\",\n error: `Decision id collision: ${id}. Choose a distinct title or revise the existing record.`,\n };\n const content = decisionContent({\n title,\n body,\n category: input.category,\n files,\n owner: attribution.data.owner ?? undefined,\n sources: attribution.data.sources ?? [],\n });\n const capture = await captureAnchors(rootDir, content.files);\n const record: ReviewedDecisionRecord = {\n ...content,\n capture,\n version: 2,\n id,\n createdAt: now,\n updatedAt: now,\n refreshedHash: head,\n status: \"active\",\n approval: \"proposed\",\n revision: 1,\n history: [\n {\n kind: \"created\",\n at: now,\n actor: attribution.data.actor,\n revision: 1,\n content,\n approval: \"proposed\",\n status: \"active\",\n refreshedHash: head,\n capture,\n },\n ],\n };\n // Write the replacement first: a failed second write leaves both records\n // available instead of removing the original before its replacement exists.\n await saveDecisionRecord(rootDir, record);\n if (old) {\n const imported = importLegacy(old, now);\n await saveDecisionRecord(rootDir, {\n ...imported,\n status: \"superseded\",\n supersededBy: id,\n updatedAt: now,\n history: [\n ...imported.history,\n {\n kind: \"superseded\",\n at: now,\n actor: attribution.data.actor,\n note: `Replaced by proposal ${id}`,\n revision: imported.revision,\n content: decisionContent(imported),\n approval: imported.approval,\n status: \"superseded\",\n refreshedHash: imported.refreshedHash,\n capture: imported.capture,\n },\n ],\n });\n }\n const totalActive = existing.filter((r) => r.status === \"active\").length + (old ? 0 : 1);\n const result: UpsertDecisionResult = {\n status: old ? \"superseded_and_created\" : \"created\",\n id,\n totalActive,\n approval: \"proposed\",\n warnings,\n hint,\n };\n if (totalActive > MAX_ACTIVE_DECISIONS) {\n result.pruneCandidates = existing\n .filter((r) => r.status !== \"active\")\n .map((r) => r.id)\n .slice(0, 10);\n warnings.push(\n `${totalActive} active decisions exceeds the soft cap of ${MAX_ACTIVE_DECISIONS} — consider a cleanup PR (archived records first)`,\n );\n }\n return result;\n });\n}\n","import fs from \"node:fs/promises\";\nimport * as nativeFs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport fg from \"fast-glob\";\nimport { readBoundedFile } from \"../utils/files.js\";\nimport { storePath } from \"../utils/storage.js\";\nimport { execGit } from \"../utils/git-read.js\";\nimport { auditGitPaths } from \"./inspection.js\";\n\nconst MAX_INPUTS = 100_000;\n\n/** Check the paths a particular audit actually reads, including their parents. */\nexport async function auditInputPath(root: string, file: string): Promise<string> {\n if (file === \".\") return fs.realpath(root);\n try {\n return await storePath(root, file);\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Symlink\")) {\n throw new Error(\n `Audit input contains a symbolic link: ${file}. Its evidence could not be verified.`,\n { cause: error },\n );\n }\n throw error;\n }\n}\n\nexport async function readAuditInput(root: string, file: string): Promise<string | null> {\n try {\n const value = await readBoundedFile(await auditInputPath(root, file), 10 * 1024 * 1024);\n if (value === null) throw new Error(`Unreadable or oversized audit input: ${file}`);\n return value;\n } catch (error) {\n if ([\"ENOENT\", \"ENOTDIR\"].includes((error as NodeJS.ErrnoException).code ?? \"\")) return null;\n throw error;\n }\n}\n\n/** Bound relevant results and directory traversal, without counting unrelated files. */\nexport async function auditGlob(\n root: string,\n patterns: string | string[],\n options: {\n ignore?: string[];\n onlyDirectories?: boolean;\n followSymbolicLinks?: boolean;\n label: string;\n select?: (file: string) => boolean;\n },\n): Promise<string[]> {\n if (Array.isArray(patterns) && !patterns.length) return [];\n const directories = new Set<string>();\n // fast-glob may stat a link, but must never enumerate a linked directory.\n // Validate each traversal and each selected result instead of scanning the\n // entire repository just to reject unrelated symlinks.\n const readdir = ((\n directory: string,\n opts: unknown,\n callback: (error: unknown, entries?: unknown) => void,\n ) => {\n const relative = path.relative(root, directory).split(path.sep).join(\"/\") || \".\";\n directories.add(relative);\n if (directories.size > MAX_INPUTS) {\n callback(\n new Error(\n `${options.label} exceeds ${MAX_INPUTS.toLocaleString(\"en-US\")} directories while inspecting ${relative}. Narrow this check's inputs.`,\n ),\n );\n return;\n }\n auditInputPath(root, relative).then(() => {\n nativeFs.readdir(\n directory,\n opts as { withFileTypes: true },\n callback as (error: NodeJS.ErrnoException | null, entries: nativeFs.Dirent[]) => void,\n );\n }, callback);\n }) as typeof nativeFs.readdir;\n // Literal workspace patterns use lstat instead of readdir. Validate them\n // before fast-glob can silently discard a dangling link as a missing file.\n const lstat = ((file: string, callback: (error: unknown, stat?: nativeFs.Stats) => void) => {\n const relative = path.relative(root, file).split(path.sep).join(\"/\") || \".\";\n auditInputPath(root, relative).then(() => nativeFs.lstat(file, callback), callback);\n }) as typeof nativeFs.lstat;\n const stream = fg.stream(patterns, {\n cwd: root,\n ignore: options.ignore,\n onlyFiles: false,\n onlyDirectories: options.onlyDirectories,\n objectMode: true,\n followSymbolicLinks: options.followSymbolicLinks ?? true,\n fs: { readdir, lstat },\n concurrency: 16,\n }) as Readable;\n const matches: string[] = [];\n try {\n for await (const value of stream) {\n const entry = value as fg.Entry;\n const file = entry.path;\n if (options.select && !options.select(file)) continue;\n await auditInputPath(root, file);\n if (!options.onlyDirectories && !entry.dirent.isFile()) continue;\n matches.push(file);\n if (matches.length > MAX_INPUTS) {\n const largest = [\n ...matches.reduce((counts, item) => {\n const dir = item.split(\"/\")[0];\n counts.set(dir, (counts.get(dir) ?? 0) + 1);\n return counts;\n }, new Map<string, number>()),\n ]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3);\n throw new Error(\n `${options.label} exceeds ${MAX_INPUTS.toLocaleString(\"en-US\")} relevant paths. Largest directories: ${largest.map(([dir, count]) => `${dir} (${count})`).join(\", \")}. Narrow this check's inputs.`,\n );\n }\n }\n } finally {\n stream.destroy();\n }\n return matches.sort();\n}\n\n/** Git prunes ignored trees before discovery; tracked source remains visible. */\nexport async function gitSourcePaths(root: string): Promise<string[]> {\n return auditGitPaths(root, \"sources\");\n}\n\n/** Small directory batches, never a repository-wide inventory of ignored files. */\nexport async function gitIgnoredPaths(root: string, files: string[]): Promise<Set<string>> {\n if (!files.length) return new Set();\n const ignored = new Set<string>();\n for (let offset = 0; offset < files.length; offset += 1000) {\n try {\n const { stdout } = await execGit([\"check-ignore\", \"-z\", \"--stdin\"], {\n cwd: root,\n maxBuffer: 4 * 1024 * 1024,\n timeout: 10_000,\n input: files.slice(offset, offset + 1000).join(\"\\0\") + \"\\0\",\n });\n for (const file of stdout.split(\"\\0\").filter(Boolean)) ignored.add(file);\n } catch (error) {\n if ((error as { code?: number }).code !== 1) throw error;\n }\n }\n return ignored;\n}\n","import fg from \"fast-glob\";\nimport { auditGlob } from \"./inputs.js\";\n\n/** Filter literal existing paths with the same bounded, symlink-safe policy as discovery. */\nexport async function includedCheckPaths(\n root: string,\n paths: string[],\n exclude: string[],\n): Promise<Set<string>> {\n if (!exclude.length) return new Set(paths);\n const included = new Set<string>();\n for (let offset = 0; offset < paths.length; offset += 256) {\n for (const file of await auditGlob(\n root,\n paths.slice(offset, offset + 256).map((file) => fg.escapePath(file)),\n {\n ignore: exclude,\n followSymbolicLinks: false,\n label: \"Audit check exclusions\",\n },\n ))\n included.add(file);\n }\n return included;\n}\n","import path from \"node:path\";\nimport type { CommandClaim } from \"./types.js\";\n\nconst TOKEN = `(?:\"[^\"\\\\n]*\"|'[^'\\\\n]*'|[^\\\\s\\x60;&|]+)`;\nconst COMMAND = new RegExp(\n `\\\\b(npm|pnpm|yarn)((?:[ \\\\t]+${TOKEN})*?)[ \\\\t]+run[ \\\\t]+([A-Za-z0-9:_.-]+)`,\n \"g\",\n);\nconst literal = (value: string) => {\n const unquoted = value.replace(/^([\"'])(.*)\\1$/, \"$2\");\n return /[$`*?[\\]{}~\\\\\\x00-\\x1f]/.test(unquoted) || path.posix.isAbsolute(unquoted)\n ? null\n : unquoted;\n};\n\nfunction splitCommands(line: string): string[] {\n const parts: string[] = [];\n let quote = \"\",\n start = 0;\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n if (char === \"\\\\\") {\n i++;\n continue;\n }\n if (quote) {\n if (char === quote) quote = \"\";\n continue;\n }\n if (char === \"'\" || char === '\"') {\n quote = char;\n continue;\n }\n if (char === \";\" || line.slice(i, i + 2) === \"&&\") {\n parts.push(line.slice(start, i));\n if (char === \"&\") i++;\n start = i + 1;\n }\n }\n parts.push(line.slice(start));\n return parts;\n}\n\n/** Deliberately small shell subset: literal cd and npm-family run invocations. */\nexport function commandClaims(\n line: string,\n lineNo: number,\n cwd?: string | null,\n shell = false,\n): { claims: CommandClaim[]; cwd: string | null | undefined } {\n const claims: CommandClaim[] = [];\n const segments = splitCommands(line);\n for (const segment of segments) {\n const text = segment.trim().replace(/^\\$\\s+/, \"\");\n if (text.startsWith(\"#\") || /^(?:echo|printf)\\b/.test(text)) continue;\n const cd = text.match(/^cd\\s+(.+)$/);\n if (cd) {\n const directory = literal(cd[1]);\n cwd =\n directory === null || cwd === null || (/\\s/.test(directory) && !/^[\"']/.test(cd[1]))\n ? null\n : path.posix.join(cwd ?? \".\", directory);\n continue;\n }\n for (const match of text.matchAll(COMMAND)) {\n const flags = match[2].trim();\n const selector = flags.match(/^(?:--prefix|--dir|-C)(?:\\s+|=)(.+)$/);\n let directory = cwd;\n let scopeUnknown: string | undefined;\n if ((shell && match.index !== 0) || match[3].startsWith(\"-\"))\n scopeUnknown = \"Unsupported shell wrapper or options before the script.\";\n if (selector) {\n const selected = literal(selector[1]);\n directory =\n selected === null || cwd === null ? null : path.posix.join(cwd ?? \".\", selected);\n } else if (flags) scopeUnknown = \"Unsupported package-manager options before run: \" + flags;\n const tail = text.slice(match.index! + match[0].length).split(/\\s--(?:\\s|$)/)[0];\n if (\n /(?:^|\\s)(?:--workspace(?:s)?|-w|--filter|-F|--prefix|--dir|-C|--if-present)(?:\\s|=|$)/.test(\n tail,\n )\n ) {\n scopeUnknown = \"Package selection or conditional options after the script need review.\";\n }\n if (\n /[|()]/.test(text) ||\n /\\b(?:pushd|popd|if|for|while)\\b/.test(text) ||\n directory === null\n ) {\n scopeUnknown =\n \"The command's working directory or shell control flow could not be resolved.\";\n }\n claims.push({\n scriptName: match[3],\n invocation: match[0],\n excerpt: match[0],\n line: lineNo,\n ...(directory !== undefined && directory !== null ? { directory } : {}),\n ...(scopeUnknown ? { scopeUnknown } : {}),\n });\n }\n // An unresolved directory change must not leave later commands apparently scoped.\n if (/\\b(?:cd|pushd|popd)\\b/.test(text)) cwd = null;\n }\n return { claims, cwd };\n}\n","import type { PathClaim } from \"./types.js\";\n\n/**\n * A fenced block is treated as a directory tree only when it clearly is one —\n * below this many branch-glyph lines it's more likely an ASCII sketch.\n */\nconst MIN_GLYPH_LINES = 3;\n\nconst GLYPHS = [\"├──\", \"└──\"] as const;\n\nfunction glyphIndex(line: string): number {\n for (const glyph of GLYPHS) {\n const idx = line.indexOf(glyph);\n if (idx !== -1) return idx;\n }\n return -1;\n}\n\n/** Tree furniture: blank, or only vertical bars and whitespace. */\nfunction isSpacerLine(line: string): boolean {\n return /^[\\s│|]*$/.test(line);\n}\n\n/**\n * Strip an inline comment/annotation from a tree entry. Entries commonly\n * carry `# comment` or column-aligned notes after two or more spaces.\n */\nfunction entryName(afterGlyph: string): string | null {\n let name = afterGlyph.replace(/^\\s+/, \"\");\n const hash = name.search(/\\s+#/);\n if (hash !== -1) name = name.slice(0, hash);\n const columns = name.search(/\\s{2,}/);\n if (columns !== -1) name = name.slice(0, columns);\n name = name.trim();\n // A name with remaining internal whitespace is not a path — treat the\n // line as malformed rather than guessing.\n if (!name || /\\s/.test(name)) return null;\n return name;\n}\n\n/**\n * Reconstruct full paths from an ASCII directory tree inside a fenced block.\n *\n * The failure mode must always be a missed claim, never an invented path: a\n * line that doesn't parse cleanly aborts reconstruction below it, and every\n * emitted path still passes the deleted-reference provability gate later.\n *\n * `blockLines` are the fence's content lines; `blockStartLine` is the 1-based\n * doc line number of the first content line.\n */\nexport function extractTreeClaims(blockLines: string[], blockStartLine: number): PathClaim[] {\n const glyphLines = blockLines.filter((l) => glyphIndex(l) !== -1).length;\n if (glyphLines < MIN_GLYPH_LINES) return [];\n\n const claims: PathClaim[] = [];\n // Directories on the path from the root to the current entry, keyed by the\n // column their branch glyph appeared at.\n const stack: Array<{ col: number; name: string }> = [];\n let rootPrefix = \"\";\n let started = false;\n\n for (let i = 0; i < blockLines.length; i++) {\n const line = blockLines[i];\n const col = glyphIndex(line);\n\n if (col === -1) {\n if (isSpacerLine(line)) continue;\n if (!started) {\n // A bare `src/` line above the first glyph names the tree's root.\n const candidate = line.trim();\n if (candidate.endsWith(\"/\") && !/\\s/.test(candidate)) {\n rootPrefix = candidate.replace(/\\/+$/, \"\");\n claims.push({\n path: rootPrefix,\n line: blockStartLine + i,\n excerpt: candidate,\n });\n }\n continue;\n }\n // Unparseable line after the tree began: stop here, keep what we have.\n return claims;\n }\n\n started = true;\n const name = entryName(line.slice(col + GLYPHS[0].length));\n if (name === null) return claims;\n\n while (stack.length > 0 && stack[stack.length - 1].col >= col) {\n stack.pop();\n }\n\n const isDir = name.endsWith(\"/\");\n const cleanName = name.replace(/\\/+$/, \"\");\n const segments = [...(rootPrefix ? [rootPrefix] : []), ...stack.map((s) => s.name), cleanName];\n claims.push({\n path: segments.join(\"/\"),\n line: blockStartLine + i,\n excerpt: name,\n });\n\n if (isDir) stack.push({ col, name: cleanName });\n }\n\n return claims;\n}\n","import MarkdownIt from \"markdown-it\";\nimport { commandClaims } from \"./commands.js\";\nimport type { CommandClaim, CountClaim, DocClaims, PathClaim } from \"./types.js\";\nimport { extractTreeClaims } from \"./tree.js\";\n\n/**\n * Single-segment names that count as path claims without containing a \"/\".\n * Anything else without a slash is prose (\"name your file `config.ts`\"), not\n * a claim about this repo.\n */\nconst ROOT_FILE_NAMES = new Set([\n \"package.json\",\n \"package-lock.json\",\n \"pnpm-workspace.yaml\",\n \"tsconfig.json\",\n \"tsup.config.ts\",\n \"vitest.config.ts\",\n \"Makefile\",\n \"Dockerfile\",\n \"docker-compose.yml\",\n \"Cargo.toml\",\n \"go.mod\",\n \"go.sum\",\n \"pyproject.toml\",\n \"requirements.txt\",\n \"Gemfile\",\n \"composer.json\",\n \"settings.gradle.kts\",\n \"settings.gradle\",\n \"build.gradle.kts\",\n \"build.gradle\",\n \"manifest.json\",\n \"server.json\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\",\n \"CLAUDE.md\",\n \"AGENTS.md\",\n \".gitignore\",\n \".env.example\",\n]);\n\nconst SHELL_FENCE_INFOS = new Set([\"\", \"bash\", \"sh\", \"shell\", \"console\", \"zsh\"]);\n\nconst markdown = new MarkdownIt(\"commonmark\", { html: false });\nconst COUNT_RE = /(\\d+)\\s+(modules?|packages?|workspaces?|crates?)\\b/gi;\n/** \"3 package managers\" is not a package count. */\nconst COUNT_DENYLIST_RE = /^\\s*(manager|registr|lock|json)/i;\n\nconst IGNORE_LINE = \"<!-- mason:ignore -->\";\nconst IGNORE_START = \"<!-- mason:ignore-start -->\";\nconst IGNORE_END = \"<!-- mason:ignore-end -->\";\n\n/**\n * Normalize a candidate token into a repo-relative path claim, or return\n * null when the token is not a claim about this repo (URL, glob,\n * placeholder, relative import example, bare word).\n */\nexport function normalizePathToken(token: string): string | null {\n let t = token.trim();\n if (!t) return null;\n if (/\\s/.test(t)) return null;\n if (t.includes(\"://\") || t.includes(\"\\\\\")) return null;\n if (/[*?[\\]{}<>$`]/.test(t)) return null;\n if (t.startsWith(\"/\") || t.startsWith(\"~\") || t.startsWith(\"./\") || t.startsWith(\"../\")) {\n return null;\n }\n // `src/mcp/tools.ts:189` claims the file, not the line.\n t = t.replace(/:\\d+(?:-\\d+)?$/, \"\");\n if (t.includes(\":\")) return null;\n const normalized = t.replace(/\\/+$/, \"\");\n if (!normalized) return null;\n // `server/src/test/kotlin/...` — a dots-only segment is an \"and so on\"\n // placeholder, not a claim.\n if (normalized.split(\"/\").some((seg) => /^\\.+$/.test(seg))) return null;\n if (normalized.includes(\"/\")) return normalized;\n return ROOT_FILE_NAMES.has(normalized) ? normalized : null;\n}\n\n/** A fence line that is exactly one path-shaped token is a file-list claim. */\nfunction exactTokenPath(line: string): string | null {\n const trimmed = line.trim();\n if (!trimmed || /\\s/.test(trimmed) || !trimmed.includes(\"/\")) return null;\n return normalizePathToken(trimmed);\n}\n\nfunction computeIgnoredLines(lines: string[]): boolean[] {\n const ignored = new Array<boolean>(lines.length).fill(false);\n let inRegion = false;\n let ignoreNext = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.includes(IGNORE_START)) {\n inRegion = true;\n ignored[i] = true;\n continue;\n }\n if (line.includes(IGNORE_END)) {\n inRegion = false;\n ignored[i] = true;\n continue;\n }\n if (inRegion) {\n ignored[i] = true;\n continue;\n }\n if (ignoreNext) {\n if (line.trim().length === 0) continue; // skip blanks to the next real line\n ignored[i] = true;\n ignoreNext = false;\n continue;\n }\n if (line.includes(IGNORE_LINE)) {\n ignored[i] = true;\n const rest = line.replace(IGNORE_LINE, \"\").trim();\n if (rest.length === 0) ignoreNext = true;\n }\n }\n return ignored;\n}\n\n/**\n * Extract every checkable claim from a context-file's markdown. Deterministic\n * and purely lexical — precision comes from the checks' provability gates,\n * not from clever parsing here.\n */\nexport function extractClaims(content: string): DocClaims {\n const lines = content.split(\"\\n\");\n const ignored = computeIgnoredLines(lines);\n\n const paths = new Map<string, PathClaim>();\n const counts: CountClaim[] = [];\n const commands = new Map<string, CommandClaim>();\n\n const addPath = (claim: PathClaim): void => {\n const key = [claim.relativeTo ?? \"scope\", claim.path].join(\":\");\n if (!paths.has(key)) paths.set(key, claim);\n };\n const addCommand = (claim: CommandClaim): void => {\n const key = JSON.stringify([claim.scriptName, claim.directory, claim.scopeUnknown]);\n if (!commands.has(key)) commands.set(key, claim);\n };\n\n // A real Markdown parser distinguishes reference links, images and escaped\n // destinations from code examples. Ignore markers preserve source line offsets.\n const parsed = markdown.parse(lines.map((line, i) => (ignored[i] ? \"\" : line)).join(\"\\n\"), {});\n for (const token of parsed) {\n if (token.type !== \"inline\" || !token.map) continue;\n let line = token.map[0] + 1;\n for (const child of token.children ?? []) {\n const target =\n child.type === \"link_open\"\n ? child.attrGet(\"href\")\n : child.type === \"image\"\n ? child.attrGet(\"src\")\n : null;\n if (target && !/^(?:[a-z][a-z0-9+.-]*:|[/#~])/i.test(target)) {\n let pathname: string | null = null;\n try {\n pathname = decodeURIComponent(target.split(/[?#]/)[0]);\n } catch {\n /* Unsupported URL encoding. */\n }\n if (pathname && !/[$*?{}<>\\\\\\x00-\\x1f]/.test(pathname)) {\n addPath({ path: pathname, line, excerpt: target, relativeTo: \"document\" });\n }\n }\n if (child.type === \"softbreak\" || child.type === \"hardbreak\") line++;\n else line += child.content.split(\"\\n\").length - 1;\n }\n }\n\n let shellCwd: string | null | undefined;\n let inFence = false;\n let fenceInfo = \"\";\n let fenceMarker = \"\";\n let blockLines: string[] = [];\n let blockStartLine = 0;\n\n const processBlock = (): void => {\n for (const claim of extractTreeClaims(blockLines, blockStartLine)) {\n addPath(claim);\n }\n for (let i = 0; i < blockLines.length; i++) {\n const exact = exactTokenPath(blockLines[i]);\n if (exact) {\n addPath({\n path: exact,\n line: blockStartLine + i,\n excerpt: blockLines[i].trim(),\n });\n }\n }\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNo = i + 1;\n const fenceMatch = line.match(/^\\s*(```+|~~~+)(.*)$/);\n\n if (fenceMatch) {\n if (!inFence) {\n inFence = true;\n fenceMarker = fenceMatch[1][0];\n fenceInfo = fenceMatch[2].trim().toLowerCase();\n blockLines = [];\n shellCwd = undefined;\n blockStartLine = lineNo + 1;\n } else if (fenceMatch[1][0] === fenceMarker) {\n inFence = false;\n processBlock();\n }\n continue;\n }\n\n if (inFence) {\n // Ignored lines become spacers so the rest of a tree still parses.\n blockLines.push(ignored[i] ? \"\" : line);\n if (!ignored[i] && SHELL_FENCE_INFOS.has(fenceInfo)) {\n const scanned = commandClaims(line, lineNo, shellCwd, true);\n shellCwd = scanned.cwd;\n for (const claim of scanned.claims) addCommand(claim);\n }\n continue;\n }\n\n if (ignored[i]) continue;\n\n for (const m of line.matchAll(/`([^`]+)`/g)) {\n const normalized = normalizePathToken(m[1]);\n if (normalized) {\n addPath({ path: normalized, line: lineNo, excerpt: m[1] });\n }\n }\n for (const m of line.matchAll(/\"([A-Za-z][\\w.@-]*(?:\\/[\\w.@-]+)+\\/?)\"/g)) {\n const normalized = normalizePathToken(m[1]);\n if (normalized) {\n addPath({ path: normalized, line: lineNo, excerpt: m[1] });\n }\n }\n for (const m of line.matchAll(COUNT_RE)) {\n const rest = line.slice((m.index ?? 0) + m[0].length);\n if (COUNT_DENYLIST_RE.test(rest)) continue;\n counts.push({\n count: Number.parseInt(m[1], 10),\n unit: m[2].toLowerCase(),\n line: lineNo,\n excerpt: m[0],\n });\n }\n for (const match of line.matchAll(/`([^`]+)`/g)) {\n for (const claim of commandClaims(match[1], lineNo, undefined, true).claims)\n addCommand(claim);\n }\n for (const claim of commandClaims(line.replace(/`[^`]+`/g, \"\"), lineNo).claims)\n addCommand(claim);\n }\n\n // An unclosed fence still gets its block processed — trees at the end of a\n // truncated doc are claims too.\n if (inFence) processBlock();\n\n return {\n paths: [...paths.values()],\n counts,\n commands: [...commands.values()],\n };\n}\n","import { inspectionGit } from \"./inspection.js\";\nimport type { CommitRef } from \"./types.js\";\n\nconst COMMIT_FORMAT = \"%H%x09%cI%x09%s\";\n\nfunction parseCommitLine(line: string): CommitRef | null {\n const parts = line.split(\"\\t\");\n if (parts.length < 3 || !parts[0]) return null;\n return { hash: parts[0], date: parts[1], subject: parts.slice(2).join(\"\\t\") };\n}\n\n/** Most recent commit touching a path, or null if the path was never tracked. */\nexport async function lastCommitOf(\n resolvedRoot: string,\n relPath: string,\n): Promise<CommitRef | null> {\n try {\n const { stdout } = await inspectionGit(\n [\"log\", \"-1\", `--format=${COMMIT_FORMAT}`, \"--\", `:(literal)${relPath}`],\n { cwd: resolvedRoot },\n );\n const line = stdout.trim().split(\"\\n\")[0];\n return line ? parseCommitLine(line) : null;\n } catch {\n return null;\n }\n}\n\n/** The commit that deleted a path, or null if none did. */\nexport async function deletingCommitOf(\n resolvedRoot: string,\n relPath: string,\n): Promise<CommitRef | null> {\n try {\n const { stdout } = await inspectionGit(\n [\"log\", \"-1\", \"--diff-filter=D\", `--format=${COMMIT_FORMAT}`, \"--\", `:(literal)${relPath}`],\n { cwd: resolvedRoot },\n );\n const line = stdout.trim().split(\"\\n\")[0];\n return line ? parseCommitLine(line) : null;\n } catch {\n return null;\n }\n}\n\n/** Oldest commit touching a path (used to date a directory's appearance). */\nexport async function firstCommitOf(\n resolvedRoot: string,\n relPath: string,\n): Promise<CommitRef | null> {\n try {\n const { stdout } = await inspectionGit(\n [\"log\", \"--reverse\", `--format=${COMMIT_FORMAT}`, \"--\", `:(literal)${relPath}`],\n { cwd: resolvedRoot, maxBuffer: 10 * 1024 * 1024 },\n );\n const line = stdout.trim().split(\"\\n\")[0];\n return line ? parseCommitLine(line) : null;\n } catch {\n return null;\n }\n}\n\nexport interface RangeCommits {\n commits: Array<CommitRef & { files: string[] }>;\n total: number;\n}\n\n/**\n * Commits in fromHash..HEAD touching any of the pathspecs, newest first, with\n * the touched files per commit. Rev-range, not --since: immune to rebase date\n * skew and CI checkout mtimes. Returns null when the range is uncomputable\n * (unreachable base commit, shallow clone, no git).\n */\nexport async function commitsTouchingSince(\n resolvedRoot: string,\n fromHash: string,\n pathspecs: string[],\n): Promise<RangeCommits | null> {\n if (!fromHash || fromHash === \"unknown\") return null;\n try {\n const { stdout } = await inspectionGit(\n [\n \"log\",\n `${fromHash}..HEAD`,\n `--format=%x01${COMMIT_FORMAT}`,\n \"--name-only\",\n \"--\",\n ...pathspecs,\n ],\n { cwd: resolvedRoot, maxBuffer: 10 * 1024 * 1024 },\n );\n\n const commits: Array<CommitRef & { files: string[] }> = [];\n // \\x01 marks each commit header so name-only file lists can't be\n // mistaken for headers.\n for (const block of stdout.split(\"\\x01\")) {\n if (!block.trim()) continue;\n const lines = block.split(\"\\n\").filter((l) => l.trim().length > 0);\n const ref = parseCommitLine(lines[0]);\n if (!ref) continue;\n commits.push({ ...ref, files: lines.slice(1).map((l) => l.trim()) });\n }\n return { commits, total: commits.length };\n } catch {\n return null;\n }\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport { profilePhase } from \"../utils/profile.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { extractClaims } from \"./claims.js\";\nimport { lastCommitOf } from \"./git.js\";\nimport fg from \"fast-glob\";\nimport { auditGlob, auditInputPath, readAuditInput } from \"./inputs.js\";\nimport { loadProjectConfig } from \"../utils/files.js\";\nimport { auditGitPaths } from \"./inspection.js\";\nimport type { CommitRef, DocClaims } from \"./types.js\";\n\n/**\n * Instruction entry points written by setup. Audit discovery is broader and\n * preserves actual filename casing; setup/teardown must not edit every README.\n */\nexport const DOC_CANDIDATES = [\"AGENTS.md\", \"CLAUDE.md\", \".claude/CLAUDE.md\"] as const;\n\nexport interface AuditDoc {\n /** Repo-relative posix path. */\n path: string;\n content: string;\n /** Directory whose instructions this document describes, not a proven shell cwd. */\n scope: string;\n kind: \"instructions\" | \"readme\" | \"guide\";\n lineCount: number;\n /** Null when the doc is untracked. */\n lastCommit: CommitRef | null;\n /** Uncommitted edits present. */\n dirty: boolean;\n claims: DocClaims;\n}\n\nasync function dirtyDocs(resolvedRoot: string, files: string[]): Promise<Set<string>> {\n if (!files.length) return new Set();\n try {\n const dirty = new Set<string>();\n for (let offset = 0; offset < files.length; offset += 256) {\n const { stdout } = await execGit(\n [\n \"status\",\n \"--porcelain=v1\",\n \"-z\",\n \"--untracked-files=all\",\n \"--\",\n ...files.slice(offset, offset + 256).map((file) => `:(literal)${file}`),\n ],\n { cwd: resolvedRoot, maxBuffer: 16 * 1024 * 1024, timeout: 10000 },\n );\n const entries = stdout.split(\"\\0\");\n for (let i = 0; i < entries.length; i++) {\n if (!entries[i]) continue;\n const status = entries[i].slice(0, 2);\n dirty.add(entries[i].slice(3));\n // Porcelain -z emits destination first, then the original rename/copy path.\n if (/[RC]/.test(status) && entries[i + 1]) dirty.add(entries[++i]);\n }\n }\n return dirty;\n } catch {\n return new Set(files);\n }\n}\n\n/** Readme/instruction discovery shares the exact inventory used by automation. */\nexport async function discoverDocPaths(root: string): Promise<string[]> {\n let candidates: string[];\n try {\n candidates = await auditGitPaths(root, \"documents\");\n } catch (error) {\n // Outside Git we still discover documents so the audit can report Git unavailable.\n try {\n await execGit([\"rev-parse\", \"--git-dir\"], { cwd: root });\n } catch {\n return localDocPaths(root);\n }\n throw error;\n }\n candidates.push(...(await localDocPaths(root)));\n const config = await loadProjectConfig(root);\n const excluded = [\n \"**/node_modules/**\",\n \"**/vendor/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/target/**\",\n \"**/.git/**\",\n \"**/.venv/**\",\n \"**/venv/**\",\n \".mason/**\",\n ...(config.ignore ?? []),\n ];\n // Static patterns preserve literal metacharacters and reject selected symlinks.\n const paths: string[] = [];\n const unique = [...new Set(candidates)].sort();\n for (let offset = 0; offset < unique.length; offset += 256) {\n paths.push(\n ...(await auditGlob(\n root,\n unique.slice(offset, offset + 256).map((p) => fg.escapePath(p)),\n {\n ignore: excluded,\n followSymbolicLinks: false,\n label: \"Documentation discovery\",\n },\n )),\n );\n if (paths.length > 10000)\n throw new Error(\n \"Documentation discovery exceeds 10,000 relevant files; narrow .mason/config.json ignore patterns.\",\n );\n }\n const priority = (file: string) => {\n const index = (DOC_CANDIDATES as readonly string[]).findIndex(\n (p) => p.toLowerCase() === file.toLowerCase(),\n );\n return index < 0 ? DOC_CANDIDATES.length : index;\n };\n return paths.sort((a, b) => priority(a) - priority(b) || a.localeCompare(b));\n}\n\n/** Explicit local entry points may be ignored; preserve their real spelling. */\nasync function localDocPaths(root: string): Promise<string[]> {\n const paths: string[] = [];\n for (const dir of [\".\", \".claude\"]) {\n let entries;\n try {\n entries = await fs.readdir(await auditInputPath(root, dir), { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw error;\n }\n for (const entry of entries)\n if (/^(?:agents|claude|readme)\\.md$/i.test(entry.name)) {\n paths.push(path.posix.join(dir, entry.name));\n }\n }\n return paths;\n}\n\nexport function documentScope(file: string): string {\n // Explicitly included guides describe the repository; entry points retain directory scope.\n if (!/^(readme|agents|claude)\\.md$/i.test(path.posix.basename(file))) return \".\";\n const parent = path.posix.dirname(file);\n return path.posix.basename(parent).toLowerCase() === \".claude\"\n ? path.posix.dirname(parent)\n : parent;\n}\n\nexport async function discoverDocs(resolvedRoot: string): Promise<AuditDoc[]> {\n return profilePhase(\"audit.documents\", () => readDocs(resolvedRoot));\n}\n\nasync function readDocs(resolvedRoot: string): Promise<AuditDoc[]> {\n const docs: AuditDoc[] = [];\n const files = await discoverDocPaths(resolvedRoot);\n const dirty = await dirtyDocs(resolvedRoot, files);\n // Bound concurrent Git processes even when discovery reaches thousands of docs.\n for (let offset = 0; offset < files.length; offset += 4) {\n docs.push(\n ...(await Promise.all(\n files.slice(offset, offset + 4).map(async (candidate): Promise<AuditDoc> => {\n const [content, lastCommit] = await Promise.all([\n readAuditInput(resolvedRoot, candidate),\n profilePhase(\"audit.document-history\", () => lastCommitOf(resolvedRoot, candidate)),\n ]);\n if (content === null)\n throw new Error(\"Document disappeared during discovery: \" + candidate);\n return {\n path: candidate,\n content,\n scope: documentScope(candidate),\n kind: /^readme\\.md$/i.test(path.posix.basename(candidate))\n ? \"readme\"\n : /^(agents|claude)\\.md$/i.test(path.posix.basename(candidate))\n ? \"instructions\"\n : \"guide\",\n lineCount: content.split(\"\\n\").length,\n lastCommit,\n dirty: dirty.has(candidate),\n claims: extractClaims(content),\n };\n }),\n )),\n );\n }\n return docs;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { auditInputPath } from \"./inputs.js\";\nimport { documentScope } from \"./docs.js\";\nimport type { ClaimScope, PathClaim } from \"./types.js\";\n\n/** Lexical containment, before inspecting any path from documentation. */\nexport function scopedPath(directory: string, value: string): string | null {\n if (path.posix.isAbsolute(value) || value.includes(\"\\\\\") || /[\\x00-\\x1f]/.test(value))\n return null;\n const resolved = path.posix.normalize(path.posix.join(directory, value));\n return resolved === \"..\" || resolved.startsWith(\"../\") ? null : resolved;\n}\n\nexport function pathClaimScope(doc: string, claim: PathClaim): ClaimScope | null {\n const directory = claim.relativeTo === \"document\" ? path.posix.dirname(doc) : documentScope(doc);\n const local = scopedPath(directory, claim.path);\n if (!local) return null;\n const candidates =\n claim.relativeTo === \"document\" || directory === \".\"\n ? [local]\n : [...new Set([local, scopedPath(\".\", claim.path)].filter((p): p is string => p !== null))];\n return {\n basis:\n claim.relativeTo === \"document\"\n ? \"document-link\"\n : directory === \".\"\n ? \"repository\"\n : \"document\",\n directory,\n candidates,\n };\n}\n\n/** Missing is distinct from unreadable/unsafe; cache and checks use the same observation. */\nexport async function pathExists(root: string, file: string): Promise<boolean> {\n try {\n await fs.access(await auditInputPath(root, file));\n return true;\n } catch (error) {\n // A child of a regular file cannot exist either. Keep symlink and access\n // failures distinct: neither establishes that a reference is missing.\n if ([\"ENOENT\", \"ENOTDIR\"].includes((error as NodeJS.ErrnoException).code ?? \"\")) return false;\n throw error;\n }\n}\n\nexport function gitMetadataPath(file: string): boolean {\n return file.split(\"/\").includes(\".git\");\n}\n\nexport function optionalMasonPath(file: string): boolean {\n return file.split(\"/\").includes(\".mason\");\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { loadSnapshot, getCurrentGitHash, listSourceFiles } from \"../snapshot/snapshot.js\";\nimport type { Snapshot } from \"../snapshot/snapshot.js\";\nimport type { Freshness } from \"../context/trust.js\";\nimport { matchingPaths } from \"../utils/paths.js\";\n\n// Incremental refresh stops paying off once a large share of the map is\n// touched — but small absolute counts are always cheap to refresh in place,\n// so both thresholds must be exceeded before recommending a full rebuild.\nconst FULL_REBUILD_FRACTION = 0.4;\nconst FULL_REBUILD_MIN_CHANGED_MAPPED_FILES = 10;\n\nexport type ChangeStatus = \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n\nexport interface FileChange {\n status: ChangeStatus;\n /** Current path (the new path for renames). */\n path: string;\n /** Pre-rename path, only present for renames. */\n previousPath?: string;\n}\n\nexport type DriftRecommendation = \"up-to-date\" | \"incremental\" | \"full-rebuild\";\n\nexport interface WorkingTreeReport {\n available: boolean;\n changedFiles: string[];\n untrackedFiles: string[];\n}\n\nexport interface DriftReport {\n /** Live entry state; committed drift alone continues to drive CLI exit codes. */\n featureFreshness?: Record<string, Freshness>;\n flowFreshness?: Record<string, Freshness>;\n workingTree?: WorkingTreeReport;\n verification?: { neverVerified: number; failed: string[] };\n stale: boolean;\n snapshotHash: string;\n headHash: string;\n /** Commits between the snapshot and HEAD; null when history is unavailable. */\n commitsBehind: number | null;\n /**\n * False when the snapshot commit is unreachable (shallow clone, rewritten\n * history) — staleFeatures/unmappedFiles/renames cannot be computed then.\n */\n historyAvailable: boolean;\n /** Current paths of every file changed since the snapshot. */\n changedFiles: string[];\n /** Stale feature name → the mapped files that changed under it. */\n staleFeatures: Record<string, string[]>;\n /** Stale flow name → the chain files that changed under it. */\n staleFlows: Record<string, string[]>;\n totalFeatures: number;\n totalFlows: number;\n /** New source files not referenced by any feature or flow. */\n unmappedFiles: string[];\n /** Files referenced by the map that no longer exist on disk. */\n ghostFiles: string[];\n renames: Array<{ from: string; to: string }>;\n recommendation: DriftRecommendation;\n}\n\nfunction parseChanges(output: string): FileChange[] {\n const fields = output.split(\"\\0\");\n const changes: FileChange[] = [];\n for (let i = 0; i < fields.length && fields[i];) {\n const code = fields[i++];\n const first = fields[i++];\n if (!first) break;\n const second = /^[RC]/.test(code) ? fields[i++] : undefined;\n const change: FileChange = second\n ? code.startsWith(\"R\")\n ? { status: \"renamed\", path: second, previousPath: first }\n : { status: \"added\", path: second }\n : { status: code === \"A\" ? \"added\" : code === \"D\" ? \"deleted\" : \"modified\", path: first };\n if (\n change.path.startsWith(\".mason/\") &&\n (!change.previousPath || change.previousPath.startsWith(\".mason/\"))\n )\n continue;\n changes.push(change);\n }\n return changes;\n}\n\nexport function touchedPaths(changes: FileChange[]): string[] {\n return [\n ...new Set(changes.flatMap((c) => (c.previousPath ? [c.previousPath, c.path] : [c.path]))),\n ].sort();\n}\n\nexport async function getChangesWithStatus(\n resolvedRoot: string,\n fromHash: string,\n toHash = \"HEAD\",\n): Promise<FileChange[] | null> {\n if (\n !fromHash ||\n fromHash === \"unknown\" ||\n fromHash.startsWith(\"-\") ||\n !toHash ||\n toHash === \"unknown\" ||\n toHash.startsWith(\"-\")\n )\n return null;\n try {\n const { stdout } = await execGit(\n [\"diff\", \"--name-status\", \"-z\", \"-M\", fromHash, toHash, \"--\"],\n { cwd: resolvedRoot, maxBuffer: 10 * 1024 * 1024 },\n );\n return parseChanges(stdout);\n } catch {\n return null;\n }\n}\n\nexport async function getWorkingTree(resolvedRoot: string): Promise<WorkingTreeReport> {\n try {\n const [diff, untracked] = await Promise.all([\n execGit([\"diff\", \"--name-status\", \"-z\", \"-M\", \"HEAD\", \"--\"], {\n cwd: resolvedRoot,\n maxBuffer: 10 * 1024 * 1024,\n }),\n execGit([\"ls-files\", \"-z\", \"--others\", \"--exclude-standard\"], {\n cwd: resolvedRoot,\n maxBuffer: 10 * 1024 * 1024,\n }),\n ]);\n const untrackedFiles = untracked.stdout\n .split(\"\\0\")\n .filter((f) => f && !f.startsWith(\".mason/\"));\n return {\n available: true,\n changedFiles: [\n ...new Set([...touchedPaths(parseChanges(diff.stdout)), ...untrackedFiles]),\n ].sort(),\n untrackedFiles,\n };\n } catch {\n return { available: false, changedFiles: [], untrackedFiles: [] };\n }\n}\n\nasync function countCommitsBehind(resolvedRoot: string, fromHash: string): Promise<number | null> {\n if (!fromHash || fromHash === \"unknown\" || fromHash.startsWith(\"-\")) return null;\n try {\n const { stdout } = await execGit([\"rev-list\", \"--count\", `${fromHash}..HEAD`], {\n cwd: resolvedRoot,\n });\n const count = Number.parseInt(stdout.trim(), 10);\n return Number.isNaN(count) ? null : count;\n } catch {\n return null;\n }\n}\n\nfunction collectMappedFiles(snapshot: Snapshot): Set<string> {\n const mappedFiles = new Set<string>();\n for (const feature of Object.values(snapshot.features)) {\n for (const f of feature.files) mappedFiles.add(f);\n for (const t of feature.tests ?? []) mappedFiles.add(t);\n }\n for (const flow of Object.values(snapshot.flows)) {\n for (const f of flow.chain) mappedFiles.add(f);\n }\n return mappedFiles;\n}\n\nasync function findGhostFiles(resolvedRoot: string, mappedFiles: Set<string>): Promise<string[]> {\n const ghosts: string[] = [];\n for (const file of mappedFiles) {\n try {\n await fs.access(path.join(resolvedRoot, file));\n } catch {\n ghosts.push(file);\n }\n }\n return ghosts.sort();\n}\n\n/**\n * Compare the concept map against HEAD and report feature-level drift.\n * Fully deterministic — git + filesystem only, no LLM involved.\n * Returns null when no snapshot exists.\n */\nexport async function computeDrift(rootDir: string): Promise<DriftReport | null> {\n const root = path.resolve(rootDir);\n const snapshot = await loadSnapshot(root);\n if (!snapshot) return null;\n const [headHash, workingTree] = await Promise.all([\n getCurrentGitHash(root),\n getWorkingTree(root),\n ]);\n const hashFor = (entry: { refreshedHash?: string }) => entry.refreshedHash ?? snapshot.gitHash;\n const entries = [...Object.values(snapshot.features), ...Object.values(snapshot.flows)];\n const hashes = new Set([snapshot.gitHash, ...entries.map(hashFor)]);\n const changesByHash = new Map<string, FileChange[] | null>();\n await Promise.all(\n [...hashes].map(async (hash) => {\n changesByHash.set(\n hash,\n hash === headHash && headHash !== \"unknown\" ? [] : await getChangesWithStatus(root, hash),\n );\n }),\n );\n const historyAvailable =\n headHash !== \"unknown\" && [...changesByHash.values()].every((changes) => changes !== null);\n const mappedFiles = collectMappedFiles(snapshot);\n const report: DriftReport = {\n stale: !historyAvailable,\n snapshotHash: snapshot.gitHash,\n headHash,\n commitsBehind: 0,\n historyAvailable,\n changedFiles: [],\n staleFeatures: {},\n staleFlows: {},\n totalFeatures: Object.keys(snapshot.features).length,\n totalFlows: Object.keys(snapshot.flows).length,\n unmappedFiles: [],\n ghostFiles: await findGhostFiles(root, mappedFiles),\n renames: [],\n recommendation: historyAvailable ? \"up-to-date\" : \"full-rebuild\",\n featureFreshness: {},\n flowFreshness: {},\n workingTree,\n verification: {\n neverVerified: entries.filter((e) => !e.verifiedAt).length,\n failed: [...Object.entries(snapshot.features), ...Object.entries(snapshot.flows)]\n .filter(([, e]) => e.verificationFailed)\n .map(([name]) => name),\n },\n };\n const counts = await Promise.all(\n [...hashes].map(async (hash) => (hash === headHash ? 0 : countCommitsBehind(root, hash))),\n );\n const knownCounts = counts.filter((n): n is number => n !== null);\n report.commitsBehind = knownCounts.length ? Math.max(...knownCounts) : null;\n\n const check = (\n name: string,\n files: string[],\n hash: string,\n staleEntries: Record<string, string[]>,\n freshness: Record<string, Freshness>,\n ) => {\n const changes = changesByHash.get(hash);\n const committedHits = changes ? matchingPaths(files, touchedPaths(changes)) : [];\n if (committedHits.length) staleEntries[name] = committedHits;\n const localHits = matchingPaths(files, workingTree.changedFiles);\n freshness[name] =\n files.length === 0 || changes === null || changes === undefined || !workingTree.available\n ? \"unknown\"\n : committedHits.length ||\n localHits.length ||\n files.some((f) => report.ghostFiles.includes(f))\n ? \"changed\"\n : \"current\";\n };\n for (const [name, feature] of Object.entries(snapshot.features)) {\n check(\n name,\n [...feature.files, ...(feature.tests ?? [])],\n hashFor(feature),\n report.staleFeatures,\n report.featureFreshness!,\n );\n }\n for (const [name, flow] of Object.entries(snapshot.flows)) {\n check(name, flow.chain, hashFor(flow), report.staleFlows, report.flowFreshness!);\n }\n\n const allChanges = [...changesByHash.values()].flatMap((changes) => changes ?? []);\n report.changedFiles = [...new Set(allChanges.map((c) => c.path))].sort();\n // Complete coverage, including omissions from a map saved at HEAD. Untracked\n // files remain in workingTree and never change the committed-drift exit code.\n const sourceFiles = new Set(await listSourceFiles(root));\n let committedFiles: Set<string> = new Set();\n try {\n const { stdout } = await execGit([\"ls-tree\", \"-r\", \"--name-only\", \"-z\", \"HEAD\"], {\n cwd: root,\n maxBuffer: 50 * 1024 * 1024,\n });\n committedFiles = new Set(stdout.split(\"\\0\").filter(Boolean));\n } catch {\n report.historyAvailable = false;\n report.stale = true;\n }\n report.unmappedFiles = [...sourceFiles]\n .filter((f) => committedFiles.has(f) && !mappedFiles.has(f))\n .sort();\n const renames = new Map<string, { from: string; to: string }>();\n for (const change of allChanges) {\n if (change.status === \"renamed\" && change.previousPath)\n renames.set(`${change.previousPath}\\0${change.path}`, {\n from: change.previousPath,\n to: change.path,\n });\n }\n report.renames = [...renames.values()];\n const changedMapped = new Set([\n ...Object.values(report.staleFeatures).flat(),\n ...Object.values(report.staleFlows).flat(),\n ]);\n // A locally deleted file is a live-edit warning, not committed map drift.\n const committedGhosts = report.ghostFiles.filter((f) => !workingTree.changedFiles.includes(f));\n report.stale ||=\n changedMapped.size > 0 || report.unmappedFiles.length > 0 || committedGhosts.length > 0;\n if (!report.historyAvailable) report.recommendation = \"full-rebuild\";\n else if (!report.stale) report.recommendation = \"up-to-date\";\n else\n report.recommendation =\n changedMapped.size >= FULL_REBUILD_MIN_CHANGED_MAPPED_FILES &&\n changedMapped.size / Math.max(1, mappedFiles.size) > FULL_REBUILD_FRACTION\n ? \"full-rebuild\"\n : \"incremental\";\n return report;\n}\n","import path from \"node:path\";\nimport { deletingCommitOf, lastCommitOf } from \"../git.js\";\nimport { gitMetadataPath, optionalMasonPath, pathClaimScope, pathExists } from \"../scope.js\";\nimport type { Evidence } from \"../types.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\n/** Prove removed references only when their scope is resolved. */\nexport async function checkDeletedReferences(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n for (const doc of ctx.docs) {\n const changes = ctx.changesSinceDoc.get(doc.path);\n const renames = new Map(\n (changes ?? [])\n .filter((c) => c.status === \"renamed\" && c.previousPath)\n .map((c) => [c.previousPath!, c.path]),\n );\n for (const claim of doc.claims.paths) {\n const scope = pathClaimScope(doc.path, claim);\n if (!scope) {\n result.skipped.push({\n check: \"deleted-reference\",\n doc: doc.path,\n reason: `Reference ${claim.excerpt} is outside the repository or has an unsupported path.`,\n });\n continue;\n }\n if (scope.candidates.some(optionalMasonPath)) continue;\n if (scope.candidates.some(gitMetadataPath)) {\n result.skipped.push({\n check: \"deleted-reference\",\n doc: doc.path,\n reason: `Reference ${claim.path} names Git metadata, whose layout varies between checkouts; it was not verified as a repository file.`,\n });\n continue;\n }\n if (\n (await Promise.all(scope.candidates.map((file) => pathExists(ctx.root, file)))).some(\n Boolean,\n )\n )\n continue;\n\n const candidates = await Promise.all(\n scope.candidates.map(async (file) => ({\n file,\n tracked: await lastCommitOf(ctx.root, file),\n parent: await pathExists(ctx.root, path.posix.dirname(file)),\n })),\n );\n const candidate =\n candidates.find((c) => c.tracked || renames.has(c.file)) ??\n candidates.find((c) => c.parent);\n // No history/parent for a bare path is usually an illustrative example.\n if (!candidate && claim.relativeTo !== \"document\") continue;\n const resolvedPath = candidate?.file ?? scope.candidates[0];\n const renamedTo = renames.get(resolvedPath) ?? null;\n const deletedInCommit =\n candidate?.tracked && !renamedTo ? await deletingCommitOf(ctx.root, resolvedPath) : null;\n const evidence: Evidence = {\n kind: \"missing-path\",\n claimed: claim.path,\n resolvedPath,\n scope,\n renamedTo,\n deletedInCommit,\n everTracked: !!candidate?.tracked || !!renamedTo,\n parentDirExists: candidate?.parent ?? false,\n };\n const anchor = { doc: doc.path, line: claim.line, excerpt: claim.excerpt };\n const message = renamedTo\n ? `\\`${resolvedPath}\\` was renamed to \\`${renamedTo}\\``\n : `\\`${resolvedPath}\\` does not exist` +\n (deletedInCommit\n ? ` – deleted in ${deletedInCommit.hash.slice(0, 7)} \"${deletedInCommit.subject}\" (${deletedInCommit.date.slice(0, 10)})`\n : \"\");\n if (scope.basis !== \"document\" && (renamedTo || candidate?.tracked)) {\n result.issues.push({\n type: \"deleted-reference\",\n message,\n anchor,\n confidence: \"certain\",\n evidence,\n });\n } else {\n result.advisories.push({\n resolution: \"recheck\",\n type: \"deleted-reference\",\n message:\n message +\n (scope.basis === \"document\"\n ? \"; the bare path's document/repository scope needs review.\"\n : \"; no tracked history establishes it as a required file. Review for a typo, generated output, or example.\"),\n anchor,\n evidence,\n });\n }\n }\n }\n return result;\n}\n","import { inspectionRead } from \"../inspection.js\";\nimport fg from \"fast-glob\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { loadProjectConfig, SOURCE_IGNORE } from \"../../utils/files.js\";\nimport { auditGlob, auditInputPath, gitIgnoredPaths, gitSourcePaths } from \"../inputs.js\";\nimport { firstCommitOf } from \"../git.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\n/** Directories that are never \"modules\" worth documenting. */\nconst DIR_DENYLIST = new Set([\n \"node_modules\",\n \"dist\",\n \"build\",\n \"out\",\n \"coverage\",\n \"target\",\n \"vendor\",\n \"__pycache__\",\n \"venv\",\n \".venv\",\n \".git\",\n \".gradle\",\n \".mason\",\n \".claude\",\n \".github\",\n \".vscode\",\n \".idea\",\n]);\n\n/** Second-level dirs need a bit more substance before they count. */\nconst SECOND_LEVEL_MIN_SOURCE_FILES = 2;\n/**\n * Descend into a top-level dir only when the docs evidently enumerate its\n * children — at least this many of its subdirs already mentioned.\n */\nconst ENUMERATION_THRESHOLD = 2;\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Word-boundary mention check across the union of all docs — `app` must not\n * match \"application\", and a dir mentioned only in AGENTS.md must not be\n * flagged against CLAUDE.md.\n */\nfunction isMentioned(combinedDocs: string, name: string): boolean {\n const re = new RegExp(`(^|[^A-Za-z0-9_-])${escapeRegExp(name)}(/|[^A-Za-z0-9_-]|$)`, \"im\");\n return re.test(combinedDocs);\n}\n\nexport async function checkNewModules(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n if (ctx.docs.length === 0) return result;\n\n const combinedDocs = moduleDocumentation(ctx.docs);\n const primaryDoc = ctx.docs[0].path;\n const checkedDocs = ctx.docs.map((d) => d.path);\n\n const flag = async (dir: string, sourceFileCount: number): Promise<void> => {\n result.advisories.push({\n resolution: \"recheck\",\n type: \"new-module\",\n message: `directory \\`${dir}/\\` contains ${sourceFileCount} source file${sourceFileCount === 1 ? \"\" : \"s\"} but is not mentioned in the discovered documentation; review whether it needs documenting`,\n anchor: { doc: primaryDoc, line: null, excerpt: dir },\n evidence: {\n kind: \"unmentioned-dir\",\n dir,\n sourceFileCount,\n firstCommit: await firstCommitOf(ctx.root, dir),\n checkedDocs,\n },\n });\n };\n\n for (const candidate of await moduleCandidates(ctx.root, combinedDocs)) {\n await flag(candidate.dir, candidate.sourceFileCount);\n }\n\n return result;\n}\n\n/** Nested documentation establishes a directory is documented without requiring\n * every package README to repeat its full repository path. */\nexport function moduleDocumentation(docs: Array<{ path: string; content: string }>): string {\n return docs\n .map(\n (doc) =>\n doc.content +\n \"\\n\" +\n (path.posix.dirname(doc.path) === \".\" ? \"\" : path.posix.dirname(doc.path) + \"/\"),\n )\n .join(\"\\n\");\n}\n\n/** Shared dependency witness: cache exactly the module candidates the audit observes. */\nexport function moduleCandidates(root: string, combinedDocs: string) {\n return inspectionRead(root, \"modules:\" + combinedDocs, () =>\n collectModuleCandidates(root, combinedDocs),\n );\n}\n\nasync function collectModuleCandidates(root: string, combinedDocs: string) {\n const [config, sourcePaths] = await Promise.all([loadProjectConfig(root), gitSourcePaths(root)]);\n const ignore = [...SOURCE_IGNORE, ...(config.ignore ?? [])];\n const sources = sourcePaths.filter(\n (file) => !file.split(\"/\").some((part) => part.startsWith(\".\")),\n );\n const listSubdirs = async (parents: string[]): Promise<Map<string, string[]>> => {\n const byParent = new Map<string, string[]>();\n // Gather one level before asking Git about ignores, with bounded directory reads.\n for (let offset = 0; offset < parents.length; offset += 16) {\n await Promise.all(\n parents.slice(offset, offset + 16).map(async (dir) => {\n const entries = await fs.readdir(await auditInputPath(root, dir), {\n withFileTypes: true,\n });\n // An unrelated directory alias is not a source module. Selected links\n // still pass through auditGlob's path and parent validation.\n const dirs = entries\n .filter(\n (entry) =>\n (entry.isDirectory() ||\n (entry.isSymbolicLink() &&\n sources.some((file) =>\n file.startsWith(path.posix.join(dir, entry.name) + \"/\"),\n ))) &&\n !entry.name.startsWith(\".\") &&\n !DIR_DENYLIST.has(entry.name),\n )\n .map((entry) => path.posix.join(dir, entry.name));\n byParent.set(dir, dirs);\n }),\n );\n }\n const ignored = await gitIgnoredPaths(root, [...byParent.values()].flat());\n const result = new Map<string, string[]>();\n for (const dir of parents) {\n // An ignore rule does not remove already tracked source from the audit.\n const visible = new Set(\n byParent\n .get(dir)!\n .filter(\n (candidate) =>\n !ignored.has(candidate) || sources.some((file) => file.startsWith(candidate + \"/\")),\n ),\n );\n result.set(\n dir,\n (\n await auditGlob(root, dir === \".\" ? \"*\" : `${fg.escapePath(dir)}/*`, {\n ignore,\n onlyDirectories: true,\n label: \"Module directory discovery\",\n select: (file) => visible.has(file),\n })\n ).map((file) => path.posix.basename(file)),\n );\n }\n return result;\n };\n const countSourceFiles = async (dir: string): Promise<number> => {\n const files = sources.filter((file) => file.startsWith(dir + \"/\"));\n let count = 0;\n // Literal path batches avoid compiling one enormous glob pattern set in a\n // genuinely large source module. Apply exclusions before counting results.\n for (let offset = 0; offset < files.length; offset += 256) {\n count += (\n await auditGlob(\n root,\n files.slice(offset, offset + 256).map((file) => fg.escapePath(file)),\n {\n ignore,\n followSymbolicLinks: false,\n label: `Source discovery in ${dir}`,\n },\n )\n ).length;\n if (count > 100000)\n throw new Error(\n `Source discovery in ${dir} exceeds 100,000 relevant files. Exclude generated source with .mason/config.json ignore patterns or narrow this audit's checks.`,\n );\n }\n return count;\n };\n const candidates: Array<{ dir: string; sourceFileCount: number }> = [];\n const topDirs = (await listSubdirs([\".\"])).get(\".\")!;\n const nested = await listSubdirs(topDirs.filter((dir) => isMentioned(combinedDocs, dir)));\n for (const topDir of topDirs) {\n const topMentioned = isMentioned(combinedDocs, topDir);\n\n if (!topMentioned) {\n const count = await countSourceFiles(topDir);\n if (count >= 1) candidates.push({ dir: topDir, sourceFileCount: count });\n continue;\n }\n\n // The docs know this dir. If they enumerate its children (several\n // subdirs already mentioned), an unmentioned sibling is drift — this is\n // how a freshly added module under src/ gets caught.\n const subdirs = nested.get(topDir)!;\n const mentioned = subdirs.filter((s) => isMentioned(combinedDocs, s));\n if (mentioned.length < ENUMERATION_THRESHOLD) continue;\n\n for (const sub of subdirs) {\n if (isMentioned(combinedDocs, sub)) continue;\n const count = await countSourceFiles(`${topDir}/${sub}`);\n if (count >= SECOND_LEVEL_MIN_SOURCE_FILES) {\n candidates.push({ dir: `${topDir}/${sub}`, sourceFileCount: count });\n }\n }\n }\n\n return candidates;\n}\n","import { isRecord, isStringArray } from \"../../utils/validation.js\";\nimport path from \"node:path\";\nimport { documentScope } from \"../docs.js\";\nimport { auditGlob, readAuditInput } from \"../inputs.js\";\nimport type { CountClaim } from \"../types.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\nconst MEMBERS_CAP = 50;\n\ninterface CountSource {\n actual: number;\n countedFrom: string;\n members: string[];\n}\n\nasync function countGradleModules(root: string): Promise<CountSource | null> {\n for (const name of [\"settings.gradle.kts\", \"settings.gradle\"]) {\n const content = await readAuditInput(root, name);\n if (content === null) continue;\n // include(\":a\", \":b\") — count quoted project strings, not include() calls.\n const members: string[] = [];\n for (const call of content.matchAll(/include\\s*\\(([^)]*)\\)/g)) {\n for (const proj of call[1].matchAll(/[\"']([^\"']+)[\"']/g)) {\n members.push(proj[1]);\n }\n }\n if (members.length === 0) return null;\n return { actual: members.length, countedFrom: name, members };\n }\n return null;\n}\n\nasync function countNpmWorkspaces(root: string): Promise<CountSource | null> {\n const pkgRaw = await readAuditInput(root, \"package.json\");\n if (pkgRaw !== null) {\n let globs: string[] = [];\n try {\n const pkg: unknown = JSON.parse(pkgRaw);\n if (!isRecord(pkg)) return null;\n const workspaces = isRecord(pkg.workspaces) ? pkg.workspaces.packages : pkg.workspaces;\n // A malformed declaration cannot establish a workspace count.\n if (workspaces !== undefined && !isStringArray(workspaces)) return null;\n globs = workspaces ?? [];\n } catch {\n // Malformed package.json — nothing provable here.\n }\n if (globs.length > 0) {\n const matched = await auditGlob(\n root,\n globs.map((g) => `${g.replace(/\\/+$/, \"\")}/package.json`),\n { ignore: [\"**/node_modules/**\"], label: \"npm workspace discovery\" },\n );\n return {\n actual: matched.length,\n countedFrom: \"package.json workspaces\",\n members: matched.map((m) => path.dirname(m)).sort(),\n };\n }\n }\n\n const pnpmRaw = await readAuditInput(root, \"pnpm-workspace.yaml\");\n if (pnpmRaw !== null) {\n const globs: string[] = [];\n let inPackages = false;\n for (const line of pnpmRaw.split(\"\\n\")) {\n if (/^packages\\s*:/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const entry = line.match(/^\\s*-\\s*[\"']?([^\"'#\\s]+)/);\n if (entry) {\n if (!entry[1].startsWith(\"!\")) globs.push(entry[1]);\n } else if (line.trim().length > 0 && !line.startsWith(\" \")) {\n inPackages = false;\n }\n }\n }\n if (globs.length > 0) {\n const matched = await auditGlob(\n root,\n globs.map((g) => `${g.replace(/\\/+$/, \"\")}/package.json`),\n { ignore: [\"**/node_modules/**\"], label: \"pnpm workspace discovery\" },\n );\n return {\n actual: matched.length,\n countedFrom: \"pnpm-workspace.yaml\",\n members: matched.map((m) => path.dirname(m)).sort(),\n };\n }\n }\n return null;\n}\n\nasync function countCargoCrates(root: string): Promise<CountSource | null> {\n const content = await readAuditInput(root, \"Cargo.toml\");\n if (content === null) return null;\n const membersBlock = content.match(/members\\s*=\\s*\\[([\\s\\S]*?)\\]/);\n if (!membersBlock) return null;\n const entries = [...membersBlock[1].matchAll(/[\"']([^\"']+)[\"']/g)].map((m) => m[1]);\n if (entries.length === 0) return null;\n\n // Workspace members may be globs (\"crates/*\") — resolve them against\n // directories that actually contain a Cargo.toml.\n const members = new Set<string>();\n for (const entry of entries) {\n if (/[*?[\\]{}]/.test(entry)) {\n const matched = await auditGlob(root, `${entry.replace(/\\/+$/, \"\")}/Cargo.toml`, {\n ignore: [\"**/target/**\"],\n label: \"Cargo workspace discovery\",\n });\n for (const m of matched) members.add(path.dirname(m));\n } else if ((await readAuditInput(root, path.posix.join(entry, \"Cargo.toml\"))) !== null) {\n members.add(entry);\n }\n }\n if (members.size === 0) return null;\n return {\n actual: members.size,\n countedFrom: \"Cargo.toml workspace members\",\n members: [...members].sort(),\n };\n}\n\n/**\n * Map a claim's unit to the ecosystem that can prove it. When the mapped\n * ecosystem has no workspace manifest in this repo, the claim is skipped —\n * \"12 packages\" in a Gradle repo proves nothing either way.\n */\nexport async function resolveCountSource(\n root: string,\n claim: CountClaim,\n): Promise<CountSource | null> {\n const unit = claim.unit.replace(/s$/, \"\");\n if (unit === \"module\") return countGradleModules(root);\n if (unit === \"workspace\") return countNpmWorkspaces(root);\n if (unit === \"crate\") return countCargoCrates(root);\n // \"packages\" is ecosystem-ambiguous — first manifest that resolves wins.\n return (\n (await countNpmWorkspaces(root)) ??\n (await countCargoCrates(root)) ??\n (await countGradleModules(root))\n );\n}\n\n/** Nested documents cannot assert the root workspace's count implicitly. */\nexport async function resolveDocCountSource(\n root: string,\n doc: string,\n claim: CountClaim,\n): Promise<CountSource | null> {\n const scope = documentScope(doc);\n const source = await resolveCountSource(path.join(root, scope), claim);\n if (!source || scope === \".\") return source;\n return {\n ...source,\n countedFrom: scope + \"/\" + source.countedFrom,\n members: source.members.map((member) => scope + \"/\" + member),\n };\n}\n\nexport async function checkStaleCounts(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n\n for (const doc of ctx.docs) {\n for (const claim of doc.claims.counts) {\n const source = await resolveDocCountSource(ctx.root, doc.path, claim);\n if (source === null) {\n result.skipped.push({\n check: \"stale-count\",\n doc: doc.path,\n reason: `${doc.path}: cannot resolve a workspace manifest for \"${claim.excerpt}\"`,\n });\n continue;\n }\n if (source.actual === claim.count) continue;\n result.issues.push({\n type: \"stale-count\",\n message: `says \"${claim.excerpt}\" but ${source.countedFrom} resolves to ${source.actual}`,\n anchor: { doc: doc.path, line: claim.line, excerpt: claim.excerpt },\n confidence: \"certain\",\n evidence: {\n kind: \"count-mismatch\",\n claimed: claim.count,\n actual: source.actual,\n unit: claim.unit,\n countedFrom: source.countedFrom,\n members: source.members.slice(0, MEMBERS_CAP),\n },\n });\n }\n }\n\n return result;\n}\n","import { isRecord } from \"../../utils/validation.js\";\nimport path from \"node:path\";\nimport { auditGlob, readAuditInput } from \"../inputs.js\";\nimport { documentScope } from \"../docs.js\";\nimport { scopedPath } from \"../scope.js\";\nimport type { ClaimScope, CommandClaim } from \"../types.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\nconst AVAILABLE_SCRIPTS_CAP = 30;\nfunction scriptsOf(raw: string): string[] | null {\n try {\n const pkg: unknown = JSON.parse(raw);\n if (!isRecord(pkg)) return null;\n if (pkg.scripts === undefined) return [];\n return isRecord(pkg.scripts) &&\n Object.values(pkg.scripts).every((value) => typeof value === \"string\")\n ? Object.keys(pkg.scripts)\n : null;\n } catch {\n return null;\n }\n}\n\ninterface Resolution {\n doc: string;\n claim: CommandClaim;\n scope: ClaimScope;\n manifest: string | null;\n scripts: string[];\n elsewhere: string[];\n problem?: string;\n}\n\n/** Shared dependency resolver: the cache records every manifest actually consulted. */\nexport async function commandInputs(\n root: string,\n docs: Array<{ path: string; claims: { commands: CommandClaim[] } }>,\n) {\n const contents = new Map<string, string | null>();\n const read = async (file: string) => {\n if (!contents.has(file)) contents.set(file, await readAuditInput(root, file));\n return contents.get(file)!;\n };\n await read(\"package.json\");\n let inventory: string[] | undefined;\n const resolutions: Resolution[] = [];\n for (const doc of docs)\n for (const claim of doc.claims.commands) {\n const base = documentScope(doc.path);\n const directory = scopedPath(base, claim.directory ?? \".\");\n const scope: ClaimScope = {\n basis: claim.directory === undefined ? \"document\" : \"explicit\",\n directory: directory ?? base,\n candidates: [],\n };\n const resolution: Resolution = {\n doc: doc.path,\n claim,\n scope,\n manifest: null,\n scripts: [],\n elsewhere: [],\n };\n resolutions.push(resolution);\n if (claim.scopeUnknown || directory === null) {\n resolution.problem = claim.scopeUnknown ?? \"The command's directory leaves the repository.\";\n continue;\n }\n let cursor = directory;\n while (true) {\n const manifest = path.posix.join(cursor, \"package.json\");\n scope.candidates.push(manifest);\n const raw = await read(manifest);\n if (raw !== null) {\n resolution.manifest = manifest;\n const scripts = scriptsOf(raw);\n if (scripts === null) resolution.problem = \"Invalid package manifest: \" + manifest;\n else resolution.scripts = scripts;\n break;\n }\n // An explicit directory is a declared execution scope, never silently use a sibling.\n if (claim.directory !== undefined || cursor === \".\") break;\n cursor = path.posix.dirname(cursor);\n }\n if (!resolution.manifest && !resolution.problem) {\n resolution.problem = `No package.json for the command's scope (${directory}).`;\n }\n if (\n resolution.problem ||\n resolution.scripts.includes(claim.scriptName) ||\n claim.directory !== undefined\n )\n continue;\n inventory ??= await commandManifests(root);\n for (const manifest of [...new Set([\"package.json\", ...inventory])].sort()) {\n if (scope.candidates.includes(manifest)) continue;\n scope.candidates.push(manifest);\n const raw = await read(manifest);\n if (raw === null) continue;\n const scripts = scriptsOf(raw);\n if (scripts === null)\n resolution.problem = \"Cannot establish script availability: invalid manifest \" + manifest;\n else if (scripts.includes(claim.scriptName)) resolution.elsewhere.push(manifest);\n }\n }\n return { manifests: [...contents].sort(([a], [b]) => a.localeCompare(b)), resolutions };\n}\n\nexport async function checkDeadCommands(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n const { resolutions } = await commandInputs(ctx.root, ctx.docs);\n for (const { doc, claim, scope, scripts, elsewhere, problem, manifest } of resolutions) {\n if (problem) {\n result.skipped.push({ check: \"dead-command\", doc, reason: problem });\n continue;\n }\n if (scripts.includes(claim.scriptName)) continue;\n const evidence = {\n kind: \"missing-script\" as const,\n scriptName: claim.scriptName,\n invocation: claim.invocation,\n manifestsChecked: scope.candidates,\n availableScripts: scripts.slice(0, AVAILABLE_SCRIPTS_CAP),\n scope,\n };\n const anchor = { doc, line: claim.line, excerpt: claim.excerpt };\n const message = `\\`${claim.invocation}\\` names script \"${claim.scriptName}\", which is absent from ${manifest}`;\n // Nested docs imply a package, but may describe commands run from another cwd.\n const certain = documentScope(doc) === \".\" && (scope.basis === \"explicit\" || !elsewhere.length);\n if (certain)\n result.issues.push({\n type: \"dead-command\",\n message,\n anchor,\n confidence: \"certain\",\n evidence,\n });\n else\n result.advisories.push({\n resolution: \"recheck\",\n type: \"dead-command\",\n message:\n message +\n (elsewhere.length\n ? `; it exists in ${elsewhere.join(\", \")}. Clarify the intended working directory.`\n : \"; the intended working directory needs review.\"),\n anchor,\n evidence,\n });\n }\n return result;\n}\n\n/** Ignored workspace manifests may still be explicit command dependencies. */\nexport function commandManifests(root: string): Promise<string[]> {\n return auditGlob(root, \"**/package.json\", {\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \".mason/reports/**\",\n \"package.json\",\n ],\n label: \"Command manifest discovery\",\n });\n}\n","import { isRecord } from \"../utils/validation.js\";\nimport path from \"node:path\";\nimport { parse as parseToml } from \"smol-toml\";\nimport { inspectionGit } from \"./inspection.js\";\n\nexport interface DependencyMatch {\n dependency: string;\n manifest: string;\n before: string | null;\n after: string | null;\n line: number;\n excerpt: string;\n}\n\n/** Preserve line numbers while excluding comments and Mason's generated instructions. */\nexport function dependencyText(content: string): string {\n return content\n .replace(/<!-- mason:start -->[\\s\\S]*?<!-- mason:end -->/g, (text) =>\n text.replace(/[^\\n]/g, \" \"),\n )\n .replace(/<!--[\\s\\S]*?-->/g, (text) => text.replace(/[^\\n]/g, \" \"));\n}\n\n/** Conservative supported declarations. Other ecosystems remain informational. */\nfunction declarations(file: string, source: string): Map<string, string> {\n const result = new Map<string, string>();\n if (!source) return result;\n if (path.posix.basename(file) === \"package.json\") {\n const json: unknown = JSON.parse(source);\n if (!isRecord(json)) throw new Error(\"Invalid package manifest\");\n for (const section of [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n \"engines\",\n ]) {\n const entries = json[section];\n if (entries === undefined) continue;\n if (!isRecord(entries) || !Object.values(entries).every((value) => typeof value === \"string\"))\n throw new Error(\"Invalid dependency declarations: \" + section);\n for (const [name, value] of Object.entries(entries)) {\n if (typeof value === \"string\")\n result.set(name, [...(result.has(name) ? [result.get(name)] : []), value].join(\"; \"));\n }\n }\n } else if (file.endsWith(\"libs.versions.toml\")) {\n const catalog = parseToml(source);\n const versions = catalog.versions;\n for (const section of [\"libraries\", \"plugins\"]) {\n const entries = catalog[section];\n if (entries === undefined) continue;\n if (!isRecord(entries)) throw new Error(\"Invalid version catalog: \" + section);\n for (const entry of Object.values(entries)) {\n if (typeof entry === \"string\") {\n const parts = entry.split(\":\");\n if (parts.length >= 3) result.set(parts.slice(0, -1).join(\":\"), parts.at(-1)!);\n } else if (isRecord(entry)) {\n const name =\n entry.module ??\n (typeof entry.group === \"string\" && typeof entry.name === \"string\"\n ? `${entry.group}:${entry.name}`\n : entry.id);\n const version =\n typeof entry.version === \"string\"\n ? entry.version\n : isRecord(entry.version) &&\n typeof entry.version.ref === \"string\" &&\n isRecord(versions)\n ? versions[entry.version.ref]\n : undefined;\n if (typeof name === \"string\")\n result.set(name, typeof version === \"string\" ? version : \"unspecified\");\n else throw new Error(\"Invalid version catalog entry\");\n } else throw new Error(\"Invalid version catalog entry\");\n }\n }\n } else if (/build\\.gradle(?:\\.kts)?$/.test(file)) {\n for (const match of source.matchAll(/[\"']([\\w.-]+:[\\w.-]+):([^\"'\\s]+)[\"']/g))\n result.set(match[1], match[2]);\n for (const match of source.matchAll(\n /\\bid\\s*\\(?\\s*[\"']([\\w.-]+)[\"']\\s*\\)?\\s*version\\s*[\"']([^\"']+)[\"']/g,\n ))\n result.set(match[1], match[2]);\n }\n return result;\n}\n\nexport async function matchDependencyChanges(\n root: string,\n from: string,\n head: string,\n files: string[],\n content: string,\n) {\n const matches: DependencyMatch[] = [];\n const lines = dependencyText(content).split(\"\\n\");\n let incomplete = files.length > 64;\n for (const file of files.slice(0, 64)) {\n if (!/(?:^|\\/)(?:package\\.json|libs\\.versions\\.toml|build\\.gradle(?:\\.kts)?)$/.test(file)) {\n incomplete = true;\n continue;\n }\n try {\n const read = async (revision: string) => {\n // ls-tree distinguishes a missing file (addition/deletion) from unavailable evidence.\n const { stdout: entry } = await inspectionGit(\n [\"ls-tree\", revision, \"--\", `:(literal)${file}`],\n { cwd: root, timeout: 10000 },\n );\n if (!entry) return \"\";\n if (!entry.startsWith(\"100644 \") && !entry.startsWith(\"100755 \"))\n throw new Error(\"Unsupported manifest mode\");\n return (\n await inspectionGit([\"show\", `${revision}:${file}`], {\n cwd: root,\n maxBuffer: 1024 * 1024,\n timeout: 10000,\n })\n ).stdout;\n };\n const [before, after] = await Promise.all([read(from), read(head)]);\n const old = declarations(file, before),\n next = declarations(file, after);\n for (const dependency of new Set([...old.keys(), ...next.keys()])) {\n if (old.get(dependency) === next.get(dependency)) continue;\n const escaped = dependency.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const mention = new RegExp(\n `(^|[^a-zA-Z0-9_@./-])${escaped}(?![a-zA-Z0-9_/-]|\\\\.[a-zA-Z0-9_])`,\n \"i\",\n );\n const line = lines.findIndex((text) => mention.test(text));\n if (line < 0) continue;\n matches.push({\n dependency,\n manifest: file,\n before: old.get(dependency) ?? null,\n after: next.get(dependency) ?? null,\n line: line + 1,\n excerpt: lines[line].trim().slice(0, 500),\n });\n if (matches.length >= 100) return { matches, incomplete: true };\n }\n } catch {\n incomplete = true;\n }\n }\n return { matches, incomplete };\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport type { RangeCommits } from \"./git.js\";\n\nasync function git(root: string, args: string[]) {\n return (await execGit(args, { cwd: root, timeout: 10000, maxBuffer: 2 * 1024 * 1024 })).stdout;\n}\n\n/** A deliberately narrow recognizer, not a Gradle evaluator. Unknown syntax stays advisory. */\nfunction withoutAndroidReleaseValues(text: string): string | null {\n if (\n /\\/\\*|\"\"\"|'''/.test(text) ||\n !/id\\s*\\(?\\s*[\"']com\\.android\\.(application|library)[\"']/.test(text)\n )\n return null;\n const scopes: string[] = [];\n const normalized: string[] = [];\n let assignments = 0;\n for (const line of text.split(\"\\n\")) {\n // Remove ordinary quoted strings and line comments solely for brace tracking.\n const code = line.replace(/\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\/\\/.*$/g, (token) =>\n token.startsWith(\"//\") ? \"\" : '\"\"',\n );\n const assignment = line.match(\n /^(\\s*)(versionName|versionCode)(\\s*(?:=\\s*|\\s+))(\"[A-Za-z0-9._+-]+\"|'[A-Za-z0-9._+-]+'|\\d+)(\\s*)$/,\n );\n if (\n assignment &&\n scopes.join(\"/\") === \"android/defaultConfig\" &&\n (assignment[2] === \"versionCode\" ? /^\\d+$/.test(assignment[4]) : /^[\"']/.test(assignment[4]))\n ) {\n normalized.push(\n assignment[1] + assignment[2] + assignment[3] + \"<release-value>\" + assignment[5],\n );\n assignments++;\n } else {\n // References can feed dependency coordinates or other executable configuration.\n if (/\\bversion(?:Name|Code)\\b/.test(line)) return null;\n normalized.push(line);\n }\n const named = code.match(/^\\s*(android|defaultConfig)\\s*\\{\\s*$/)?.[1];\n for (const brace of code.matchAll(/[{}]/g)) {\n if (brace[0] === \"{\") scopes.push(named ?? \"unknown\");\n else if (!scopes.length) return null;\n else scopes.pop();\n }\n }\n return assignments && !scopes.length ? normalized.join(\"\\n\") : null;\n}\n\n/** Only omit single-parent commits whose every touched manifest is proven release metadata. */\nexport async function releaseMetadataOnly(\n root: string,\n commit: RangeCommits[\"commits\"][number],\n): Promise<boolean> {\n if (\n !commit.files.length ||\n !commit.files.every((file) => /(^|\\/)build\\.gradle(?:\\.kts)?$/.test(file))\n )\n return false;\n try {\n const parents = (await git(root, [\"rev-list\", \"--parents\", \"-n\", \"1\", commit.hash]))\n .trim()\n .split(/\\s+/);\n if (parents.length !== 2) return false;\n for (const file of commit.files) {\n const raw = await git(root, [\n \"diff\",\n \"--raw\",\n \"-z\",\n \"--no-renames\",\n \"--no-ext-diff\",\n \"--no-textconv\",\n parents[1],\n commit.hash,\n \"--\",\n file,\n ]);\n if (!/^:(100644|100755) \\1 [a-f0-9]+ [a-f0-9]+ M\\0/.test(raw)) return false;\n const [before, after] = await Promise.all([\n git(root, [\"show\", parents[1] + \":\" + file]),\n git(root, [\"show\", commit.hash + \":\" + file]),\n ]);\n const previous = withoutAndroidReleaseValues(before);\n if (previous === null || previous !== withoutAndroidReleaseValues(after)) return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n","import { matchDependencyChanges } from \"../dependency-claims.js\";\nimport { documentScope } from \"../docs.js\";\nimport { releaseMetadataOnly } from \"../release-metadata.js\";\nimport { commitsTouchingSince } from \"../git.js\";\nimport { inspectionGit } from \"../inspection.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\nconst MANIFEST_COMMITS_CAP = 10;\n\n/** A relevance filter, not semantic validation of a dependency or its version. */\nexport function hasDependencyContent(content: string): boolean {\n const text = content\n .replace(/<!-- mason:start -->[\\s\\S]*?<!-- mason:end -->/g, \"\")\n .replace(/<!--[\\s\\S]*?-->/g, \"\");\n return (\n /\\b(?:dependenc(?:y|ies)|librar(?:y|ies)|frameworks?|tech(?:nology)? stack|prerequisites|requirements)\\b/i.test(\n text,\n ) ||\n /\\b(?:package\\.json|build\\.gradle(?:\\.kts)?|settings\\.gradle(?:\\.kts)?|libs\\.versions\\.toml|Cargo\\.toml|go\\.mod|pyproject\\.toml|requirements\\.txt|Gemfile|composer\\.json)\\b/i.test(\n text,\n ) ||\n /\\b(?:node(?:\\.js)?|npm|pnpm|yarn|bun|deno|python|ruby|rust|go|java|jdk|kotlin|gradle|swift|php|react|vue|angular|compose|ktor|room)\\s*(?:version\\s*)?[`*:=>~^v\\s-]*\\d+(?:\\.\\d+)*\\b/i.test(\n text,\n ) ||\n /\\b(?:npm|pnpm|yarn|pip3?|cargo|gem|composer)\\s+(?:install|add|require)\\b/i.test(text)\n );\n}\n\n/**\n * Tracked manifest files at any depth. Lockfiles are pure churn and are\n * deliberately not matched.\n */\nconst MANIFEST_PATHSPECS = [\n \":(glob)**/package.json\",\n \":(glob)**/build.gradle.kts\",\n \":(glob)**/build.gradle\",\n \"settings.gradle.kts\",\n \"settings.gradle\",\n \"gradle/libs.versions.toml\",\n \":(glob)**/Cargo.toml\",\n \"go.mod\",\n \"pyproject.toml\",\n \"requirements.txt\",\n \"Gemfile\",\n \"composer.json\",\n];\n\n/** Share exact dependency scope with persisted advisory assessments. */\nexport function manifestPathspecs(doc: string): string[] {\n const scope = documentScope(doc);\n if (scope === \".\") return MANIFEST_PATHSPECS;\n const escaped = scope.replace(/[\\\\*?[\\]]/g, \"\\\\$&\");\n return MANIFEST_PATHSPECS.map((spec) =>\n spec.startsWith(\":(glob)\")\n ? \":(glob)\" + escaped + \"/\" + spec.slice(\":(glob)\".length)\n : \":(literal)\" + scope + \"/\" + spec,\n );\n}\n\n/**\n * A matched declaration change is advisory, never proof of an incorrect claim.\n * Manifest recency without an affected passage is background information.\n */\nexport async function checkDepsChanged(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n result.suppressedAdvisories = [];\n const releaseOnly = new Map<string, boolean>();\n\n for (const doc of ctx.docs) {\n if (!doc.lastCommit) {\n result.skipped.push({\n check: \"deps-changed\",\n doc: doc.path,\n reason: `${doc.path} has no commit history`,\n });\n continue;\n }\n\n // Local edits must not erase the dependency evidence we are preparing to\n // retain. Inspect the committed document for dirty inputs, including setup.\n let content = doc.content;\n if (doc.dirty) {\n try {\n content = (\n await inspectionGit([\"show\", `${doc.lastCommit.hash}:${doc.path}`], {\n cwd: ctx.root,\n maxBuffer: 10 * 1024 * 1024,\n timeout: 10000,\n })\n ).stdout;\n } catch {\n result.skipped.push({\n check: \"deps-changed\",\n doc: doc.path,\n reason: `${doc.path}: committed dependency content is unavailable`,\n });\n continue;\n }\n }\n\n const range = await commitsTouchingSince(\n ctx.root,\n doc.lastCommit.hash,\n manifestPathspecs(doc.path),\n );\n if (range === null) {\n result.skipped.push({\n check: \"deps-changed\",\n doc: doc.path,\n reason: `${doc.path}: commit range unreachable (shallow clone?)`,\n });\n continue;\n }\n // Bound extra history reads. Older/ambiguous commits remain advisory.\n const relevant = [];\n for (const commit of range.commits) {\n if (!releaseOnly.has(commit.hash) && releaseOnly.size < 100) {\n releaseOnly.set(commit.hash, await releaseMetadataOnly(ctx.root, commit));\n }\n if (!releaseOnly.get(commit.hash)) relevant.push(commit);\n }\n range.commits = relevant;\n range.total = relevant.length;\n if (range.total === 0) continue;\n\n const relevance = await matchDependencyChanges(\n ctx.root,\n doc.lastCommit.hash,\n ctx.headHash,\n [...new Set(range.commits.flatMap((commit) => commit.files))],\n content,\n );\n // Documents without any dependency guidance or matched declaration stay quiet.\n if (!relevance.matches.length && !hasDependencyContent(content)) continue;\n const match = relevance.matches[0];\n if (doc.dirty && match)\n result.skipped.push({\n check: \"deps-changed\",\n doc: doc.path,\n reason: `${doc.path} has uncommitted edits – suppressed while in flight`,\n });\n (doc.dirty ? result.suppressedAdvisories : result.advisories).push({\n type: \"deps-changed\",\n ...(match ? {} : { resolution: \"informational\" as const }),\n message: match\n ? `${match.dependency} changed from ${match.before ?? \"absent\"} to ${match.after ?? \"removed\"} in ${match.manifest}; review ${doc.path}:${match.line}: ${match.excerpt}${relevance.matches.length > 1 ? ` (${relevance.matches.length - 1} more matches in evidence)` : \"\"}`\n : `Dependency manifests changed after the document baseline ${doc.lastCommit.hash.slice(0, 7)} (${doc.lastCommit.date.slice(0, 10)}); no specific affected passage was established. Informational only.${relevance.incomplete ? \" Some manifest declarations could not be matched.\" : \"\"}`,\n anchor: { doc: doc.path, line: match?.line ?? null, excerpt: match?.excerpt ?? null },\n evidence: {\n kind: \"doc-behind-manifests\",\n docLastCommit: doc.lastCommit,\n manifestCommits: range.commits.slice(0, MANIFEST_COMMITS_CAP),\n totalCommits: range.total,\n matches: relevance.matches,\n matchingIncomplete: relevance.incomplete,\n },\n });\n }\n\n return result;\n}\n","import { captureAnchorScopes, changedCaptureFiles, type AnchorCapture } from \"./anchors.js\";\nimport path from \"node:path\";\nimport { getChangesWithStatus, getWorkingTree, touchedPaths } from \"../drift/drift.js\";\nimport { matchingPaths } from \"../utils/paths.js\";\nimport type { Freshness } from \"../context/trust.js\";\nimport type { StoreDiagnostic } from \"../utils/storage.js\";\nimport { getCurrentGitHash } from \"../snapshot/snapshot.js\";\nimport { loadDecisionStore } from \"./decisions.js\";\nimport type { DecisionRecord } from \"./decisions.js\";\nimport { decisionApproval, effectiveDecision, latestDecisionInspection } from \"./provenance.js\";\n\n/**\n * Deliberately separate from DriftReport: mason-drift's exit codes and\n * --json shape are a CI contract, and `stale` there means MAP staleness.\n * Decision staleness is additive on top.\n */\nexport interface DecisionDriftReport {\n historyAvailable: boolean;\n freshness?: Record<string, Freshness>;\n diagnostics?: StoreDiagnostic[];\n totalDecisions: number;\n /** Decision id → committed and local anchor files changed since the evidence baseline. */\n staleDecisions: Record<string, string[]>;\n /** Draft anchors have their own freshness; they cannot replace accepted anchors. */\n pendingProposals?: Record<string, { freshness: Freshness; changedFiles: string[] }>;\n}\n\n/**\n * Flag active decisions whose anchor files changed since the record was\n * last verified. Anchorless decisions have unknown freshness and do not\n * contribute to committed drift.\n * Deterministic — git only, no LLM.\n */\nexport async function computeDecisionDrift(\n rootDir: string,\n decisions?: DecisionRecord[],\n): Promise<DecisionDriftReport> {\n const resolvedRoot = path.resolve(rootDir);\n const store = decisions\n ? { records: decisions, diagnostics: [] }\n : await loadDecisionStore(resolvedRoot);\n const report: DecisionDriftReport = {\n historyAvailable: true,\n totalDecisions: store.records.length,\n staleDecisions: {},\n freshness: {},\n diagnostics: store.diagnostics,\n };\n const [head, workingTree] = await Promise.all([\n getCurrentGitHash(resolvedRoot),\n getWorkingTree(resolvedRoot),\n ]);\n const changesByHash = new Map<string, string[] | null>();\n const baselines = store.records\n .filter((record) => record.status === \"active\")\n .flatMap((record) => {\n const effective = effectiveDecision(record);\n return [...new Set([effective, record])].flatMap((candidate) => {\n const inspection = latestDecisionInspection(\n record,\n candidate === effective && decisionApproval(effective) === \"accepted\"\n ? \"operative\"\n : \"all\",\n );\n const capture =\n inspection?.capture ?? (candidate.version === 2 ? candidate.capture : undefined);\n return capture ? [capture] : [];\n });\n });\n const captures = await captureAnchorScopes(\n resolvedRoot,\n baselines.map((baseline) => baseline.anchors),\n );\n const currentCaptures = new Map(\n baselines.map((baseline, index) => [JSON.stringify(baseline.anchors), captures[index]]),\n );\n const inspect = async (\n record: DecisionRecord,\n inspectionCapture?: AnchorCapture,\n ): Promise<{ freshness: Freshness; changedFiles: string[] }> => {\n if (record.files.length === 0) return { freshness: \"unknown\", changedFiles: [] };\n const baseline = inspectionCapture ?? (record.version === 2 ? record.capture : undefined);\n if (baseline) {\n const current = currentCaptures.get(JSON.stringify(baseline.anchors))!;\n const hits = changedCaptureFiles(baseline, current).filter(\n (file) => matchingPaths(record.files, [file]).length,\n );\n return {\n freshness:\n !baseline.complete || !current.complete ? \"unknown\" : hits.length ? \"changed\" : \"current\",\n changedFiles: hits,\n };\n }\n let touched = changesByHash.get(record.refreshedHash);\n if (touched === undefined) {\n const changes =\n record.refreshedHash === head && head !== \"unknown\"\n ? []\n : await getChangesWithStatus(resolvedRoot, record.refreshedHash);\n touched = changes === null ? null : touchedPaths(changes);\n changesByHash.set(record.refreshedHash, touched);\n }\n if (touched === null) report.historyAvailable = false;\n const hits = touched ? matchingPaths(record.files, touched) : [];\n const localHits = matchingPaths(record.files, workingTree.changedFiles);\n return {\n freshness:\n touched === null || !workingTree.available\n ? \"unknown\"\n : hits.length || localHits.length\n ? \"changed\"\n : \"current\",\n changedFiles: [...new Set([...hits, ...localHits])].sort(),\n };\n };\n for (const record of store.records) {\n if (record.status !== \"active\") continue;\n const effective = effectiveDecision(record);\n const inspection = latestDecisionInspection(\n record,\n decisionApproval(effective) === \"accepted\" ? \"operative\" : \"all\",\n );\n const state = await inspect(effective, inspection?.capture);\n report.freshness![record.id] = state.freshness;\n if (state.changedFiles.length) report.staleDecisions[record.id] = state.changedFiles;\n if (effective !== record)\n (report.pendingProposals ??= {})[record.id] = await inspect(\n record,\n latestDecisionInspection(record)?.capture,\n );\n }\n return report;\n}\n","import { computeDecisionDrift } from \"../../decisions/drift.js\";\nimport { loadDecisionStore } from \"../../decisions/decisions.js\";\nimport { decisionProvenance, effectiveDecision } from \"../../decisions/provenance.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\n/**\n * Advisory only, and only when .mason/decisions/ exists (the zero-setup\n * path stays dark on bare repos). Decision records encode human knowledge —\n * they are surfaced for re-verification, never rewritten by the fix agent.\n */\nexport async function checkDecisionAnchors(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n if (!ctx.decisionsPresent) return result;\n\n const store = await loadDecisionStore(ctx.root);\n const records = store.records;\n for (const diagnostic of store.diagnostics)\n result.skipped.push({\n check: \"decision-anchor-drift\",\n reason: `${diagnostic.path}: ${diagnostic.message}`,\n });\n const drift = await computeDecisionDrift(ctx.root, records);\n if (!drift.historyAvailable) {\n result.skipped.push({\n check: \"decision-anchor-drift\",\n reason: \"some decision base commits are unreachable (shallow clone?)\",\n });\n }\n\n const changed = records\n .filter((record) => record.status === \"active\")\n .flatMap(\n (record) =>\n [\n {\n record: effectiveDecision(record),\n changedFiles: drift.staleDecisions[record.id] ?? [],\n freshness: drift.freshness?.[record.id] ?? \"unknown\",\n },\n ...(drift.pendingProposals?.[record.id]\n ? [{ record, ...drift.pendingProposals[record.id] }]\n : []),\n ] as const,\n );\n for (const { record, changedFiles, freshness } of changed) {\n if (freshness === \"unknown\" && record.files.length) {\n result.skipped.push({\n check: \"decision-anchor-drift\",\n reason: `Anchor evidence for decision ${record.id} is incomplete or unreadable`,\n });\n continue;\n }\n if (!changedFiles.length) continue;\n const id = record.id;\n const provenance = decisionProvenance(record, freshness);\n result.advisories.push({\n type: \"decision-anchor-drift\",\n message: `decision \"${record.title}\" (${provenance.approval}) has anchors changed since capture or review; consistency is unchecked`,\n anchor: {\n doc: `.mason/decisions/${id}.json`,\n line: null,\n excerpt: record.title,\n },\n evidence: {\n kind: \"decision-anchor\",\n provenance,\n decisionId: id,\n title: record.title,\n changedFiles,\n refreshedHash: record.refreshedHash,\n },\n });\n }\n\n return result;\n}\n","import type { FileChange } from \"../../drift/drift.js\";\nimport type { AuditAdvisory, AuditIssue, CheckName } from \"../types.js\";\nimport type { AuditDoc } from \"../docs.js\";\nimport { checkDeletedReferences } from \"./deleted-reference.js\";\nimport { checkNewModules } from \"./new-module.js\";\nimport { checkStaleCounts } from \"./stale-count.js\";\nimport { checkDeadCommands } from \"./dead-command.js\";\nimport { checkDepsChanged } from \"./deps-changed.js\";\nimport { checkDecisionAnchors } from \"./decision-anchor.js\";\n\nexport interface CheckContext {\n root: string;\n docs: AuditDoc[];\n headHash: string;\n /** Doc path → changes since the doc's last commit; null when uncomputable. */\n changesSinceDoc: Map<string, FileChange[] | null>;\n /** Whether .mason/decisions/ exists. */\n decisionsPresent: boolean;\n}\n\nexport interface CheckResult {\n issues: AuditIssue[];\n advisories: AuditAdvisory[];\n suppressedAdvisories?: AuditAdvisory[];\n skipped: Array<{ check: string; reason: string; doc?: string }>;\n}\n\nexport type CheckFn = (ctx: CheckContext) => Promise<CheckResult>;\n\nexport const CHECKS: Record<CheckName, CheckFn> = {\n \"deleted-reference\": checkDeletedReferences,\n \"new-module\": checkNewModules,\n \"stale-count\": checkStaleCounts,\n \"dead-command\": checkDeadCommands,\n \"deps-changed\": checkDepsChanged,\n \"decision-anchor-drift\": checkDecisionAnchors,\n};\n\nexport function emptyResult(): CheckResult {\n return { issues: [], advisories: [], skipped: [] };\n}\n","import { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport type { AuditIssue, AuditAdvisory } from \"./types.js\";\nexport type Finding = AuditIssue | AuditAdvisory;\nexport const digest = (value: unknown) =>\n createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\");\nexport const checkSchema = z.enum([\n \"deleted-reference\",\n \"new-module\",\n \"stale-count\",\n \"dead-command\",\n \"deps-changed\",\n \"decision-anchor-drift\",\n]);\nexport const commitSchema = z.object({\n hash: z.string().regex(/^[a-f0-9]{40,64}$/),\n date: z.string(),\n subject: z.string(),\n});\nconst anchorSchema = z.object({\n doc: z.string(),\n line: z.number().int().positive().nullable(),\n excerpt: z.string().nullable(),\n});\nconst count = z.number().int().nonnegative();\nconst scopeSchema = z.object({\n basis: z.enum([\"repository\", \"document\", \"document-link\", \"explicit\"]),\n directory: z.string(),\n candidates: z.array(z.string()),\n});\nconst evidenceSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"missing-path\"),\n claimed: z.string(),\n renamedTo: z.string().nullable(),\n deletedInCommit: commitSchema.nullable(),\n everTracked: z.boolean(),\n parentDirExists: z.boolean(),\n resolvedPath: z.string().optional(),\n scope: scopeSchema.optional(),\n }),\n z.object({\n kind: z.literal(\"unmentioned-dir\"),\n dir: z.string(),\n sourceFileCount: count,\n firstCommit: commitSchema.nullable(),\n checkedDocs: z.array(z.string()),\n }),\n z.object({\n kind: z.literal(\"count-mismatch\"),\n claimed: count,\n actual: count,\n unit: z.string(),\n countedFrom: z.string(),\n members: z.array(z.string()),\n }),\n z.object({\n kind: z.literal(\"missing-script\"),\n scriptName: z.string(),\n invocation: z.string(),\n manifestsChecked: z.array(z.string()),\n availableScripts: z.array(z.string()),\n scope: scopeSchema.optional(),\n }),\n z.object({\n kind: z.literal(\"doc-behind-manifests\"),\n docLastCommit: commitSchema,\n manifestCommits: z.array(commitSchema.extend({ files: z.array(z.string()) })),\n totalCommits: count,\n matches: z\n .array(\n z.object({\n dependency: z.string(),\n manifest: z.string(),\n before: z.string().nullable(),\n after: z.string().nullable(),\n line: z.number().int().positive(),\n excerpt: z.string(),\n }),\n )\n .optional(),\n matchingIncomplete: z.boolean().optional(),\n }),\n z.object({\n kind: z.literal(\"decision-anchor\"),\n decisionId: z.string(),\n title: z.string(),\n changedFiles: z.array(z.string()),\n refreshedHash: z.string(),\n provenance: z.object({}).passthrough().optional(),\n }),\n]);\nconst findingSchema = z.object({\n message: z.string(),\n anchor: anchorSchema,\n evidence: evidenceSchema,\n});\nexport const issueSchema = findingSchema.extend({\n type: z.enum([\"deleted-reference\", \"new-module\", \"stale-count\", \"dead-command\"]),\n confidence: z.enum([\"certain\", \"likely\"]),\n});\nexport const advisorySchema = findingSchema.extend({\n type: checkSchema,\n resolution: z.enum([\"recheck\", \"informational\"]).optional(),\n});\nexport const checkResultSchema = z.object({\n issues: z.array(issueSchema),\n advisories: z.array(advisorySchema),\n suppressedAdvisories: z.array(advisorySchema).optional(),\n skipped: z.array(z.object({ check: z.string(), reason: z.string(), doc: z.string().optional() })),\n});\n/** Lines and wording can change without changing the underlying claim. */\nexport function findingId(finding: Finding): string {\n const e = finding.evidence;\n let key: unknown;\n switch (e.kind) {\n case \"missing-path\":\n key =\n e.resolvedPath && e.resolvedPath !== e.claimed ? [e.claimed, e.resolvedPath] : e.claimed;\n break;\n case \"unmentioned-dir\":\n key = e.dir;\n break;\n case \"count-mismatch\":\n key = [e.unit.replace(/s$/, \"\"), e.countedFrom];\n break;\n case \"missing-script\":\n key = e.scope && e.scope.directory !== \".\" ? [e.scriptName, e.scope.directory] : e.scriptName;\n break;\n case \"doc-behind-manifests\":\n key = null;\n break;\n case \"decision-anchor\":\n key = [e.decisionId, e.provenance?.revision, e.provenance?.approval];\n break;\n }\n return digest([finding.type, finding.anchor.doc, key]);\n}\n","import { z } from \"zod\";\nimport { anchorCaptureSchema, changedCaptureFiles } from \"../decisions/anchors.js\";\nimport type { Inputs } from \"./evidence.js\";\nimport { digest } from \"../audit/findings.js\";\nimport type { State } from \"./store.js\";\nimport type { AutomationEvent, AutomationReport } from \"./runtime.js\";\n\nconst evidenceSchema = z.record(z.object({ digest: z.string(), capture: anchorCaptureSchema }));\nexport const stopReviewSchema = z.object({\n pending: z.record(z.object({ head: z.string(), evidence: evidenceSchema })),\n edited: z.record(z.record(z.string().nullable())),\n delivered: z.record(z.object({ digest: z.string(), files: z.record(z.string().nullable()) })),\n});\ntype Session = State[\"sessions\"][string];\nconst empty = (): z.infer<typeof stopReviewSchema> => ({ pending: {}, edited: {}, delivered: {} });\n\n/** Only paired captures establish observed edits, independently of commits and dirty status. */\nexport function observeDecisionEdits(session: Session, inputs: Inputs, event: AutomationEvent) {\n if (event.host !== \"claude\" || !event.mutating || !event.toolId) return;\n const state = (session.stopReview ??= empty());\n if (event.event === \"before_tool\") {\n state.pending[event.toolId] = { head: inputs.head, evidence: inputs.decisionEvidence };\n } else if (event.event === \"after_tool\") {\n const before = state.pending[event.toolId];\n delete state.pending[event.toolId];\n // A pull/merge/checkout can change content without a local edit. If HEAD moved,\n // retain earlier observations but do not attribute this interval to the agent.\n if (!before || before.head !== inputs.head) return;\n for (const [id, previous] of Object.entries(before.evidence)) {\n const current = inputs.decisionEvidence[id];\n if (\n !current ||\n !previous.capture.complete ||\n !current.capture.complete ||\n digest(previous.capture.anchors) !== digest(current.capture.anchors)\n )\n continue;\n const edited = (state.edited[id] ??= {});\n for (const file of changedCaptureFiles(previous.capture, current.capture)) {\n edited[file] = current.capture.files[file] ?? null;\n }\n }\n }\n}\n\n/** Delivery is not resolution. Only explicit resolution clears its receipt. */\nexport function clearResolvedStopReviews(sessions: State[\"sessions\"], report: AutomationReport) {\n if (\n report.status === \"unavailable\" ||\n report.checks.skipped.some((check) => check.check === \"decision-anchor-drift\")\n )\n return;\n const active = new Set(\n report.findings.flatMap((finding) => {\n const evidence = (finding.current ?? finding.original).evidence;\n return evidence.kind === \"decision-anchor\" &&\n finding.status !== \"resolved\" &&\n (finding.current || finding.status === \"unverified\")\n ? [evidence.decisionId]\n : [];\n }),\n );\n for (const session of Object.values(sessions)) {\n if (!session.stopReview) continue;\n for (const id of Object.keys(session.stopReview.delivered)) {\n if (!active.has(id)) delete session.stopReview.delivered[id];\n }\n }\n}\n\nexport function decisionStopReview(\n session: Session,\n inputs: Inputs,\n report: AutomationReport,\n reentry: boolean,\n) {\n const state = (session.stopReview ??= empty());\n const decisions = new Map<\n string,\n { title: string; digest: string; files: Record<string, string | null> }\n >();\n for (const finding of report.findings) {\n const evidence = finding.current?.evidence;\n if (\n finding.status === \"resolved\" ||\n finding.status === \"unverified\" ||\n evidence?.kind !== \"decision-anchor\"\n )\n continue;\n const current = inputs.decisionEvidence[evidence.decisionId];\n const edited = state.edited[evidence.decisionId];\n if (\n !current?.capture.complete ||\n !edited ||\n !evidence.changedFiles.some(\n (file) =>\n Object.hasOwn(edited, file) && edited[file] === (current.capture.files[file] ?? null),\n )\n )\n continue;\n const value = decisions.get(evidence.decisionId) ?? {\n title: evidence.title,\n digest: current.digest,\n files: {},\n };\n for (const file of evidence.changedFiles) {\n if (Object.hasOwn(edited, file) && edited[file] === (current.capture.files[file] ?? null))\n value.files[file] = edited[file];\n }\n decisions.set(evidence.decisionId, value);\n }\n if (!decisions.size) return { reason: null, block: false };\n let fresh = false;\n for (const [id, value] of decisions) {\n const previous = state.delivered[id];\n if (\n previous?.digest !== value.digest ||\n Object.entries(value.files).some(\n ([file, digest]) => !Object.hasOwn(previous.files, file) || previous.files[file] !== digest,\n )\n )\n fresh = true;\n // Consume feedback on re-entry too: another hook may have continued the turn.\n state.delivered[id] = {\n digest: value.digest,\n files: { ...(previous?.digest === value.digest ? previous.files : {}), ...value.files },\n };\n }\n const safe = (value: string) => value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \").slice(0, 250);\n const reason = [\n \"Mason: unresolved decision drift overlaps changes observed during this session. Before ending the turn, inspect these decisions:\",\n ...[...decisions].map(\n ([id, value]) =>\n `Decision ${JSON.stringify(safe(value.title))} (${safe(id)}): review_decision(action: \"prepare\", id: ${JSON.stringify(id)}).`,\n ),\n 'Check the claims against the source and diff. When an accepted revision exists, prepare and inspect with inspectionScope: \"operative\" to assess it separately; a contradictory pending draft remains unassessed and must not be promoted. For proposal-only or legacy records use the default all scope. If no contradiction is found in the selected scope, record action: \"inspect\" with the reviewToken, actual inspector, and a note explaining the evidence. \"Expected changes\" or \"my own commits\" are not evidence.',\n \"If contradicted or uncertain, explain the mismatch to the user and request direction. Do not accept, reaffirm, or retire a decision without authorized human review. A revised proposal leaves the accepted revision operative until reviewed.\",\n `Evidence: ${report.reportPath}. Concurrent changes can contribute; captures do not prove authorship. This reminder does not resolve the finding.`,\n ].join(\"\\n\");\n return { reason, block: !reentry && fresh };\n}\n","import { z } from \"zod\";\nimport type { RepairFinding } from \"../audit/repair.js\";\nimport { digest } from \"../audit/findings.js\";\n\n// Compare conditions, not report wording, line numbers, commit IDs, or timestamps.\nconst conditionSchema = z.object({\n level: z.number(),\n facts: z.array(z.string()),\n magnitude: z.number().optional(),\n});\nconst MAX_COMPLETION_FINDINGS = 4;\n\ntype Condition = z.infer<typeof conditionSchema>;\nexport const notificationStateSchema = z.object({\n version: z.literal(1),\n baselineHead: z.string(),\n baseline: z.record(conditionSchema),\n delivered: z.record(conditionSchema),\n cleared: z.array(z.string()),\n});\nexport type NotificationState = z.infer<typeof notificationStateSchema>;\n\nfunction condition(finding: RepairFinding): { id: string; condition: Condition } {\n const source = finding.current ?? finding.original;\n const e = source.evidence;\n // Decision approval/revision changes alone do not create a new drift condition.\n const id =\n e.kind === \"decision-anchor\"\n ? digest([source.type, source.anchor.doc, e.decisionId])\n : finding.id;\n const result: Condition = { level: \"confidence\" in source ? 2 : 1, facts: [] };\n switch (e.kind) {\n case \"count-mismatch\":\n result.magnitude = Math.abs(e.actual - e.claimed);\n break;\n case \"unmentioned-dir\":\n result.magnitude = e.sourceFileCount;\n break;\n case \"decision-anchor\":\n result.facts = [...e.changedFiles].sort();\n break;\n case \"doc-behind-manifests\":\n result.facts = (e.matches ?? [])\n .map((m) => JSON.stringify([m.manifest, m.dependency, m.after]))\n .sort();\n break;\n // For missing paths/scripts, the finding ID already identifies the condition.\n }\n return { id, condition: result };\n}\n\nexport function notificationConditions(findings: RepairFinding[]): Record<string, Condition> {\n const active = findings.filter((f) => f.status !== \"resolved\");\n const currentIds = new Set(active.filter((f) => f.current).map((f) => condition(f).id));\n const result: Record<string, Condition> = {};\n for (const f of active) {\n const value = condition(f);\n // Historical revisions must not override current evidence for the same decision.\n if (!f.current && currentIds.has(value.id)) continue;\n const previous = result[value.id];\n result[value.id] = previous\n ? {\n level: Math.max(previous.level, value.condition.level),\n facts: [...new Set([...previous.facts, ...value.condition.facts])].sort(),\n ...(previous.magnitude !== undefined || value.condition.magnitude !== undefined\n ? { magnitude: Math.max(previous.magnitude ?? 0, value.condition.magnitude ?? 0) }\n : {}),\n }\n : value.condition;\n }\n return result;\n}\n\nexport function createNotificationState(\n findings: RepairFinding[],\n head: string,\n): NotificationState {\n return {\n version: 1,\n baselineHead: head,\n baseline: notificationConditions(findings),\n delivered: {},\n cleared: [],\n };\n}\n\nfunction worsened(current: Condition, previous?: Condition): boolean {\n return (\n !previous ||\n current.level > previous.level ||\n (current.magnitude ?? 0) > (previous.magnitude ?? 0) ||\n current.facts.some((fact) => !previous.facts.includes(fact))\n );\n}\n\n/** Each delivery channel owns its state; explicit audits never consume notifications. */\nexport function completionFindings(\n state: NotificationState,\n findings: RepairFinding[],\n): RepairFinding[] {\n const current = notificationConditions(findings);\n const cleared = new Set(state.cleared);\n const resolvedIds = new Set(\n findings.filter((f) => f.status === \"resolved\").map((f) => condition(f).id),\n );\n for (const id of Object.keys(state.baseline))\n if (resolvedIds.has(id) && !current[id]) cleared.add(id);\n state.cleared = [...cleared];\n\n const selected: RepairFinding[] = [];\n const selectedIds = new Set<string>();\n const delivered: Record<string, Condition> = { ...state.delivered };\n for (const finding of findings) {\n const value = condition(finding);\n const previous = state.delivered[value.id];\n value.condition = current[value.id] ?? value.condition;\n // Missing or temporarily unverified evidence must not erase delivery history.\n if (finding.status === \"unverified\" || (!finding.current && finding.status !== \"resolved\")) {\n continue;\n }\n if (finding.status === \"resolved\") {\n if (!current[value.id]) delete delivered[value.id];\n continue;\n }\n const eligible = cleared.has(value.id) || worsened(value.condition, state.baseline[value.id]);\n if (!eligible) continue;\n if (!selectedIds.has(value.id) && worsened(value.condition, previous)) {\n selectedIds.add(value.id);\n const source = finding.current!;\n selected.push(\n source.evidence.kind === \"decision-anchor\"\n ? {\n ...finding,\n current: {\n ...source,\n evidence: { ...source.evidence, changedFiles: value.condition.facts },\n },\n }\n : finding,\n );\n // Only displayed findings count as delivered. Overflow remains eligible\n // for the next completion, including after a session restart.\n if (selected.length <= MAX_COMPLETION_FINDINGS) delivered[value.id] = value.condition;\n }\n }\n state.delivered = delivered;\n return selected;\n}\n\nexport function completionSummary(findings: RepairFinding[], reportPath: string): string | null {\n if (!findings.length) return null;\n const safe = (value: string) => value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \").slice(0, 250);\n return [\n `Mason: ${findings.length} new or worsened finding(s) since the retained baseline.`,\n ...findings.slice(0, MAX_COMPLETION_FINDINGS).map((f) => {\n const source = f.current ?? f.original;\n if (source.evidence.kind === \"decision-anchor\") {\n const evidence = source.evidence;\n return [\n `[advisory] Decision \"${safe(evidence.title)}\" has ${evidence.changedFiles.length} anchored file(s) changed since capture or review; consistency is unchecked.`,\n `Inspect the decision and diff with review_decision(action: \"prepare\", id: ${JSON.stringify(evidence.decisionId)}). Record action: \"inspect\" after source inspection finds no contradiction; human acceptance is not required.`,\n `Changed files: ${safe(evidence.changedFiles.join(\", \"))}`,\n ].join(\"\\n\");\n }\n return `[${f.status === \"unresolved\" ? \"issue\" : \"advisory\"}] ${safe(source.anchor.doc)}: ${safe(source.message)}`;\n }),\n ...(findings.length > MAX_COMPLETION_FINDINGS\n ? [`${findings.length - MAX_COMPLETION_FINDINGS} more in the report; pending later feedback.`]\n : []),\n `Evidence: ${reportPath}. Explicit audit: mason_automation(action: \"check\").`,\n \"Inspect findings within the authorized work. Concurrent changes may also contribute; this summary does not establish who introduced them.\",\n ].join(\"\\n\");\n}\n","import { z } from \"zod\";\nimport { withStoreLock } from \"../utils/store-lock.js\";\nimport { stopReviewSchema } from \"./stop-review.js\";\nimport { notificationStateSchema } from \"./notifications.js\";\n\nexport const hostSchema = z.enum([\"claude\", \"codex\"]);\nexport type Host = z.infer<typeof hostSchema>;\nexport const events = [\n \"session_start\",\n \"turn_start\",\n \"before_tool\",\n \"after_tool\",\n \"task_end\",\n] as const;\nexport type Event = (typeof events)[number];\nexport const stateSchema = z.object({\n version: z.literal(1),\n root: z.string(),\n gitDir: z.string(),\n branch: z.string(),\n baselines: z\n .array(\n z.object({ path: z.string(), at: z.string(), event: z.string(), fingerprint: z.string() }),\n )\n .max(128),\n sessions: z.record(\n z.object({\n host: hostSchema,\n lastUsed: z.string(),\n notifiedDiagnostics: z.array(z.string()).default([]),\n pending: z.record(z.string()),\n stopReview: stopReviewSchema.optional(),\n coverageGaps: z.array(z.string()),\n events: z.record(z.object({ at: z.string(), count: z.number().int().positive() })),\n }),\n ),\n updatedAt: z.string(),\n fingerprint: z.string().nullable(),\n latest: z.string().nullable(),\n guidance: z.object({ fingerprint: z.string(), path: z.string() }).optional(),\n notifications: notificationStateSchema.optional(),\n agentNotifications: notificationStateSchema.optional(),\n analysis: z\n .object({ id: z.string(), fingerprint: z.string(), completedAt: z.number(), path: z.string() })\n .optional(),\n});\nexport type State = z.infer<typeof stateSchema>;\nexport function parseState(raw: unknown): State {\n try {\n return stateSchema.parse(raw);\n } catch (error) {\n throw new Error(\"Invalid automation state; original evidence was retained.\", { cause: error });\n }\n}\n\n/** Preserve the automation lock location and diagnostics for existing callers. */\nexport function withLock<T>(\n root: string,\n directory: string,\n run: () => Promise<T>,\n waitMs = 5000,\n): Promise<T> {\n return withStoreLock(root, directory, run, waitMs, \"Automation\");\n}\n","import { inspectionGit } from \"./inspection.js\";\nimport { execGit } from \"../utils/git-read.js\";\nimport fs from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport { advisorySchema, digest, findingId, type Finding } from \"./findings.js\";\nimport { manifestPathspecs } from \"./checks/deps-changed.js\";\nimport { readAuditInput } from \"./inputs.js\";\nimport { pathExists } from \"./scope.js\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\nimport { normalizeRepoPath } from \"../utils/paths.js\";\nimport { withLock } from \"../automation/store.js\";\nimport { loadDecisionStore } from \"../decisions/decisions.js\";\nimport { latestDecisionInspection } from \"../decisions/provenance.js\";\nimport { captureAnchors, changedCaptureFiles } from \"../decisions/anchors.js\";\nimport { computeDecisionDrift } from \"../decisions/drift.js\";\n\nconst git = async (root: string, ...args: string[]) =>\n (\n await (\n [\"log\", \"ls-tree\", \"ls-files\", \"merge-base\"].includes(args[0]) ? inspectionGit : execGit\n )(args, { cwd: root, timeout: 10_000, maxBuffer: 8 * 1024 * 1024 })\n ).stdout;\nconst hashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nconst commitSchema = z.string().regex(/^[a-f0-9]{40,64}$/);\nconst evidenceSchema = z.object({\n head: commitSchema,\n fingerprint: hashSchema,\n scope: z.array(z.string()).min(1).max(1000),\n tree: z.string().max(2 * 1024 * 1024),\n lastScopeCommit: commitSchema,\n paths: z.array(z.object({ path: z.string(), exists: z.boolean() })).max(1000),\n});\nconst dismissalReasonSchema = z.enum([\"no-dependency-claims\", \"unrelated-manifest-change\"]);\nconst eventSchema = z.object({\n at: z.string().datetime(),\n reviewer: z.string().trim().min(1).max(200).optional(),\n note: z.string().trim().min(1).max(2500),\n outcome: z.enum([\"addressed\", \"inapplicable\", \"deferred\", \"dismissed\"]),\n reasonCode: dismissalReasonSchema.optional(),\n finding: advisorySchema.refine(\n (finding) => finding.evidence.kind !== \"decision-anchor\",\n \"Decision findings use decision reviews\",\n ),\n evidence: evidenceSchema,\n});\nconst recordSchema = z.object({\n version: z.literal(1),\n id: hashSchema,\n events: z.array(eventSchema).min(1).max(200),\n digest: hashSchema,\n});\ntype ReviewRecord = z.infer<typeof recordSchema>;\nexport const reviewSummarySchema = z.object({\n id: hashSchema,\n status: z.enum([\"current\", \"reopened\", \"deferred\", \"unverified\"]),\n reason: z.string(),\n recordPath: z.string().optional(),\n reviewer: z.string().optional(),\n note: z.string().optional(),\n outcome: z\n .enum([\n \"addressed\",\n \"inapplicable\",\n \"deferred\",\n \"accepted\",\n \"reaffirmed\",\n \"retired\",\n \"dismissed\",\n \"no_contradiction_found\",\n ])\n .optional(),\n reviewedHead: z.string().optional(),\n});\nexport type AdvisoryReviewSummary = z.infer<typeof reviewSummarySchema>;\nexport const advisoryReviewRequest = z.object({\n baselinePath: z.string().min(1),\n findingId: hashSchema,\n action: z\n .enum([\"prepare\", \"addressed\", \"inapplicable\", \"deferred\", \"dismiss\"])\n .default(\"prepare\"),\n reasonCode: dismissalReasonSchema.optional(),\n reviewer: eventSchema.shape.reviewer.optional(),\n note: eventSchema.shape.note.optional(),\n reviewToken: hashSchema.optional(),\n});\nexport type AdvisoryReviewInput = z.input<typeof advisoryReviewRequest>;\nconst recordPath = (id: string) => `.mason/reviews/advisories/${hashSchema.parse(id)}.json`;\n\nasync function readRecord(root: string, id: string): Promise<ReviewRecord | null> {\n const raw = await readStoreJson(root, recordPath(id));\n if (raw === null) return null;\n const record = recordSchema.parse(raw);\n const { digest: stored, ...payload } = record;\n if (\n record.id !== id ||\n digest(payload) !== stored ||\n record.events.some(\n (event) =>\n findingId(event.finding as Finding) !== id ||\n (event.outcome === \"dismissed\"\n ? !event.reasonCode || event.finding.type !== \"deps-changed\"\n : !event.reviewer || !!event.reasonCode) ||\n event.evidence.fingerprint !== evidenceFingerprint(event.evidence, event.reasonCode),\n )\n ) {\n throw new Error(\"Advisory review record is inconsistent or modified; inspect its history.\");\n }\n return record;\n}\n\nfunction evidenceFingerprint(\n evidence: z.infer<typeof evidenceSchema>,\n reason?: z.infer<typeof dismissalReasonSchema>,\n): string {\n return digest([\n evidence.scope,\n evidence.tree,\n ...(reason === \"no-dependency-claims\" ? [] : [evidence.lastScopeCommit]),\n evidence.paths,\n ]);\n}\n\nfunction scopes(finding: Finding, reason?: z.infer<typeof dismissalReasonSchema>): string[] {\n const files = [finding.anchor.doc],\n e = finding.evidence;\n if (e.kind === \"decision-anchor\")\n throw new Error(\"Use review_decision for decision acceptance, reaffirmation or retirement.\");\n if (reason === \"no-dependency-claims\" && e.kind === \"doc-behind-manifests\")\n return [`:(literal)${finding.anchor.doc}`];\n if (e.kind === \"doc-behind-manifests\")\n return [`:(literal)${finding.anchor.doc}`, ...manifestPathspecs(finding.anchor.doc)];\n if (e.kind === \"missing-path\")\n files.push(...(e.scope?.candidates ?? [e.resolvedPath ?? e.claimed]));\n else if (e.kind === \"missing-script\")\n files.push(...e.manifestsChecked, ...(e.scope?.candidates ?? []));\n else if (e.kind === \"unmentioned-dir\") files.push(e.dir, ...e.checkedDocs);\n else throw new Error(\"This advisory has no supported review scope.\");\n return [...new Set(files)]\n .map((file) => {\n if (normalizeRepoPath(file) !== file)\n throw new Error(\"Advisory contains an invalid scoped path: \" + file);\n return `:(literal)${file}`;\n })\n .sort();\n}\n\n/** Committed, scoped Git evidence survives unrelated and review-record-only commits. */\nasync function reviewEvidence(\n root: string,\n finding: Finding,\n reason?: z.infer<typeof dismissalReasonSchema>,\n) {\n if (normalizeRepoPath(finding.anchor.doc) !== finding.anchor.doc)\n throw new Error(\"Invalid advisory document path.\");\n const scope = scopes(finding, reason);\n const head = (await git(root, \"rev-parse\", \"HEAD\")).trim();\n const tracked = (await git(root, \"ls-files\", \"--cached\", \"-z\", \"--\", ...scope))\n .split(\"\\0\")\n .filter(Boolean);\n if (tracked.length > 20_000) throw new Error(\"Advisory scope exceeds 20,000 tracked files.\");\n const [tree, status, lastScopeCommit, document] = await Promise.all([\n tracked.length\n ? git(\n root,\n \"ls-tree\",\n \"-r\",\n \"-z\",\n \"HEAD\",\n \"--\",\n ...tracked.map((file) => `:(literal)${file}`),\n )\n : \"\",\n git(root, \"status\", \"--porcelain=v1\", \"-z\", \"--untracked-files=all\", \"--\", ...scope),\n git(root, \"log\", \"-1\", \"--format=%H\", \"HEAD\", \"--\", ...scope).then((value) => value.trim()),\n readAuditInput(root, finding.anchor.doc),\n ]);\n if (!document?.trim())\n throw new Error(\"Original advisory document is missing, empty or unreadable.\");\n if (tree.length > 2 * 1024 * 1024 || tree.split(\"\\0\").length > 20_000)\n throw new Error(\n \"Advisory scope is too large for a complete review; narrow the documentation scope.\",\n );\n // Reject symlinks rather than trusting a blob that describes an external target.\n for (const entry of tree.split(\"\\0\").filter(Boolean)) {\n const tab = entry.indexOf(\"\\t\"),\n file = entry.slice(tab + 1);\n if (entry.startsWith(\"120000 \") || entry.startsWith(\"160000 \"))\n throw new Error(\"Symlink or submodule in advisory review scope: \" + file);\n await storePath(root, file);\n }\n // Path checks observe presence even for explicitly documented ignored\n // outputs. Git alone cannot detect those appearing or disappearing.\n const paths =\n finding.evidence.kind === \"missing-path\"\n ? await Promise.all(\n (\n finding.evidence.scope?.candidates ?? [\n finding.evidence.resolvedPath ?? finding.evidence.claimed,\n ]\n ).map(async (file) => ({ path: file, exists: await pathExists(root, file) })),\n )\n : [];\n let dirty = status.length > 0;\n if (finding.evidence.kind === \"missing-script\") {\n for (const file of [\n ...finding.evidence.manifestsChecked,\n ...(finding.evidence.scope?.candidates ?? []),\n ]) {\n if (!tracked.includes(file) && (await pathExists(root, file))) dirty = true;\n }\n }\n const fingerprint = evidenceFingerprint(\n { head, scope, tree, lastScopeCommit, paths, fingerprint: \"\" },\n reason,\n );\n if ((await git(root, \"rev-parse\", \"HEAD\")).trim() !== head)\n throw new Error(\"HEAD changed while collecting review evidence.\");\n return {\n ...evidenceSchema.parse({ head, scope, tree, lastScopeCommit, paths, fingerprint }),\n dirty,\n documentDigest: digest(document),\n };\n}\n\nasync function decisionAssessment(\n root: string,\n finding: Finding,\n baselineHead: string,\n): Promise<AdvisoryReviewSummary | null> {\n const evidence = finding.evidence;\n if (evidence.kind !== \"decision-anchor\") return null;\n const id = findingId(finding);\n const store = await loadDecisionStore(root);\n if (store.diagnostics.length)\n throw new Error(\n \"Decision records have unavailable or malformed evidence; review cannot be confirmed.\",\n );\n const record = store.records.find((record) => record.id === evidence.decisionId);\n if (!record || record.version !== 2) return null;\n const inspection = latestDecisionInspection(\n record,\n evidence.provenance?.approval === \"accepted\" ? \"operative\" : \"all\",\n );\n if (inspection && record.status === \"active\") {\n const capture = await captureAnchors(root, inspection.capture.anchors);\n let ancestor = true;\n try {\n await git(root, \"merge-base\", \"--is-ancestor\", baselineHead, inspection.headHash);\n } catch {\n ancestor = false;\n }\n if (ancestor)\n return {\n id,\n status:\n !capture.complete || !inspection.capture.complete\n ? \"unverified\"\n : changedCaptureFiles(inspection.capture, capture).length\n ? \"reopened\"\n : \"current\",\n outcome: \"no_contradiction_found\",\n reviewer: inspection.inspector,\n note: inspection.note,\n reviewedHead: inspection.headHash,\n recordPath: `.mason/decisions/${record.id}.json`,\n reason:\n \"A separate source inspection reports no contradiction; this does not accept or reaffirm the decision. Relevant anchor changes reopen the advisory.\",\n };\n }\n const events = record.history.filter((event) =>\n [\"accepted\", \"reaffirmed\", \"retired\"].includes(event.kind),\n );\n const event = events.at(-1);\n if (\n !event?.evidence ||\n !event.actor ||\n !event.note ||\n !event.evidence.historyAvailable ||\n event.evidence.localChanges.length\n )\n return null;\n try {\n await git(root, \"merge-base\", \"--is-ancestor\", baselineHead, event.evidence.headHash);\n } catch {\n return null;\n }\n const drift = await computeDecisionDrift(root, [record]);\n if (!drift.historyAvailable) throw new Error(\"Decision review history is unavailable.\");\n const retired = record.status === \"retired\" && event.kind === \"retired\";\n const current =\n retired ||\n (record.status === \"active\" &&\n record.approval === \"accepted\" &&\n drift.freshness?.[record.id] === \"current\" &&\n !drift.pendingProposals?.[record.id]);\n return {\n id,\n status: current ? \"current\" : \"reopened\",\n outcome: event.kind as \"accepted\" | \"reaffirmed\" | \"retired\",\n reviewer: event.actor,\n note: event.note,\n reviewedHead: event.evidence.headHash,\n recordPath: `.mason/decisions/${record.id}.json`,\n reason: current\n ? \"The existing decision review records acceptance, reaffirmation or retirement covering the original finding.\"\n : \"Decision content or anchor evidence changed after its review; review the decision again.\",\n };\n}\n\nexport async function assessAdvisory(\n root: string,\n finding: Finding,\n baselineHead: string,\n): Promise<AdvisoryReviewSummary | null> {\n if (\"confidence\" in finding) return null;\n const id = findingId(finding);\n try {\n if (finding.evidence.kind === \"decision-anchor\")\n return await decisionAssessment(root, finding, baselineHead);\n const record = await readRecord(root, id);\n if (!record) return null;\n const event = record.events.at(-1)!;\n // Use the reviewed scope, not a newly shortened finding's preview of that scope.\n const current = await reviewEvidence(root, event.finding as Finding, event.reasonCode);\n await git(root, \"merge-base\", \"--is-ancestor\", event.evidence.head, current.head);\n const base = {\n id,\n recordPath: recordPath(id),\n reviewer: event.reviewer,\n note: event.note,\n outcome: event.outcome,\n reviewedHead: event.evidence.head,\n };\n if (\n current.dirty ||\n current.fingerprint !== event.evidence.fingerprint ||\n digest(scopes(finding, event.reasonCode)) !== digest(event.evidence.scope)\n )\n return {\n ...base,\n status: \"reopened\",\n reason:\n \"Relevant document or repository evidence changed after the assessment; prepare a new review.\",\n };\n return {\n ...base,\n status: event.outcome === \"deferred\" ? \"deferred\" : \"current\",\n reason:\n event.outcome === \"deferred\"\n ? \"The review was deferred and remains outstanding.\"\n : \"An explicit assessment covers the current committed scope. This does not approve an engineering decision or certify correctness.\",\n };\n } catch (error) {\n return {\n id,\n status: \"unverified\",\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/** Fingerprint receipt content so concurrent automation cannot publish an older assessment. */\nexport async function advisoryReviewInventory(root: string) {\n let names: string[];\n try {\n names = await fs.readdir(await storePath(root, \".mason/reviews/advisories\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n }\n if (names.length > 5000) throw new Error(\"Advisory review inventory exceeds 5,000 records.\");\n return Promise.all(\n names\n .filter((name) => name.endsWith(\".json\"))\n .sort()\n .map(async (name) => [name, await readAuditInput(root, \".mason/reviews/advisories/\" + name)]),\n );\n}\n\nexport async function reviewAdvisory(rootDir: string, input: AdvisoryReviewInput) {\n const root = await fs.realpath(rootDir),\n request = advisoryReviewRequest.parse(input);\n const { loadRepairBaseline } = await import(\"./repair.js\");\n const baseline = await loadRepairBaseline(root, request.baselinePath);\n const finding = [\n ...baseline.original.advisories,\n ...(baseline.original.suppressedAdvisories ?? []),\n ].find((f) => findingId(f) === request.findingId);\n if (!finding)\n throw new Error(\n \"No advisory with this findingId in the original baseline. Provable issues must be repaired and rechecked.\",\n );\n if (finding.evidence.kind === \"decision-anchor\")\n return {\n status: \"decision-review-required\",\n decisionId: finding.evidence.decisionId,\n hint: \"Use review_decision to prepare evidence and record a source inspection without human approval, or an authorized acceptance, reaffirmation or retirement, then verify this original repair baseline. An advisory assessment cannot approve a decision.\",\n };\n if (request.action === \"dismiss\") {\n if (finding.type !== \"deps-changed\" || finding.evidence.kind !== \"doc-behind-manifests\")\n throw new Error(\"One-step dismissal is only available for dependency advisories.\");\n if (!request.reasonCode || !request.note)\n throw new Error(\n \"Dismissal requires reasonCode and note; it does not require a reviewer or prepared token.\",\n );\n } else if (request.reasonCode) throw new Error(\"reasonCode is only used with dismiss.\");\n const prepare = async () => {\n const record = await readRecord(root, request.findingId);\n const evidence = await reviewEvidence(root, finding, request.reasonCode);\n await git(root, \"merge-base\", \"--is-ancestor\", baseline.original.headHash!, evidence.head);\n const token = digest({ baseline: baseline.original, finding, evidence, record });\n return { record, evidence, token };\n };\n if (request.action === \"prepare\") {\n const state = await prepare();\n let diff: string | null = null,\n diffNote: string | undefined;\n const from =\n finding.evidence.kind === \"doc-behind-manifests\"\n ? finding.evidence.docLastCommit.hash\n : baseline.original.headHash!;\n try {\n const full = await git(\n root,\n \"diff\",\n \"--no-ext-diff\",\n \"--no-textconv\",\n \"--no-color\",\n \"--no-renames\",\n \"-U3\",\n from,\n state.evidence.head,\n \"--\",\n ...state.evidence.scope,\n );\n diff = full.slice(0, 16000);\n if (full.length > diff.length)\n diffNote = \"Diff preview truncated; inspect the full scoped diff before reviewing.\";\n } catch {\n diffNote =\n \"Diff preview unavailable; inspect the original cited evidence directly before reviewing.\";\n }\n if ((await prepare()).token !== state.token)\n throw new Error(\"Review evidence changed during preparation; retry.\");\n return {\n status: \"prepared\",\n findingId: request.findingId,\n finding,\n evidence: state.evidence,\n history: state.record?.events ?? [],\n reviewToken: state.token,\n diff,\n diffNote,\n hint: \"Inspect the original finding, scoped document and relevant code changes. Record addressed, inapplicable or deferred only when the user or cited project review authorizes that assessment. Supply the actual reviewer, reason in note and reviewToken. Relevant edits must be committed first. Deferral remains outstanding. Review identities are recorded assertions, not authenticated approvals.\",\n };\n }\n if (request.action !== \"dismiss\" && (!request.reviewer || !request.note || !request.reviewToken))\n throw new Error(\n \"Prepare first; recording an assessment requires reviewToken, reviewer and note.\",\n );\n return withLock(root, \".mason/reports/advisory-review-locks/\" + request.findingId, async () => {\n const state = await prepare();\n if (request.action !== \"dismiss\" && state.token !== request.reviewToken)\n throw new Error(\n \"Review conflict: evidence or review history changed since preparation. Prepare and inspect a new review.\",\n );\n if (state.evidence.dirty)\n throw new Error(\n \"Commit relevant document and repository edits before recording the assessment. Unrelated local work may remain.\",\n );\n if ((state.record?.events.length ?? 0) >= 200)\n throw new Error(\"Review history limit reached; existing events were retained.\");\n const { dirty, documentDigest, ...evidence } = state.evidence;\n const event = eventSchema.parse({\n at: new Date().toISOString(),\n reviewer: request.reviewer,\n note: request.note,\n outcome: request.action === \"dismiss\" ? \"dismissed\" : request.action,\n reasonCode: request.reasonCode,\n finding,\n evidence,\n });\n const payload = {\n version: 1 as const,\n id: request.findingId,\n events: [...(state.record?.events ?? []), event],\n };\n if ((await prepare()).token !== state.token)\n throw new Error(\"Review conflict: evidence changed while recording the assessment.\");\n await writeStoreJson(root, recordPath(request.findingId), {\n ...payload,\n digest: digest(payload),\n });\n return {\n status: \"recorded\",\n recordPath: recordPath(request.findingId),\n event,\n hint:\n request.action === \"dismiss\"\n ? \"Dismissal saved and effective locally. Commit the record to share it. No-dependency-claims dismissals reopen on document content changes; unrelated-manifest-change dismissals reopen on scoped document or manifest changes. This does not approve a decision.\"\n : \"Review and commit this assessment record through the normal project workflow, then verify the original repair baseline. Relevant changes reopen the assessment; deferral remains outstanding.\",\n };\n });\n}\n","import { loadProjectConfig } from \"../utils/files.js\";\nimport { includedCheckPaths } from \"./policy.js\";\nimport { profilePhase } from \"../utils/profile.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getChangesWithStatus } from \"../drift/drift.js\";\nimport type { FileChange } from \"../drift/drift.js\";\nimport { getCurrentGitHash } from \"../snapshot/snapshot.js\";\nimport { discoverDocs } from \"./docs.js\";\nimport { ALL_CHECKS } from \"./types.js\";\nimport type { AuditReport, CheckName } from \"./types.js\";\nimport { CHECKS } from \"./checks/index.js\";\nimport { assessAdvisory } from \"./advisory-review.js\";\nimport type { CheckContext, CheckResult } from \"./checks/index.js\";\n\nexport interface AuditOptions {\n /** Subset of checks to run; defaults to all. */\n checks?: CheckName[];\n /** Internal execution boundary used by the automation dependency cache. */\n runCheck?: (name: CheckName, context: CheckContext) => Promise<CheckResult>;\n}\n\n/**\n * Audit discovered instruction files and READMEs\n * against repo reality. Fully deterministic — git, filesystem, and lexical\n * extraction only; no LLM, no network. Returns null when no context file\n * exists.\n */\nexport async function computeAudit(\n rootDir: string,\n options: AuditOptions = {},\n): Promise<AuditReport | null> {\n return profilePhase(\"audit.current\", () => auditCurrent(rootDir, options));\n}\n\nasync function auditCurrent(rootDir: string, options: AuditOptions): Promise<AuditReport | null> {\n const resolvedRoot = path.resolve(rootDir);\n const [docs, headHash] = await Promise.all([\n discoverDocs(resolvedRoot),\n getCurrentGitHash(resolvedRoot),\n ]);\n if (docs.length === 0) return null;\n\n const report: AuditReport = {\n version: 1,\n root: resolvedRoot,\n gitAvailable: headHash !== \"unknown\",\n headHash,\n checksRun: [],\n docs: docs.map((d) => ({\n path: d.path,\n scope: d.scope,\n kind: d.kind,\n lastCommit: d.lastCommit,\n dirty: d.dirty,\n lineCount: d.lineCount,\n })),\n decisionsChecked: false,\n issues: [],\n advisories: [],\n suppressedAdvisories: [],\n skippedChecks: [],\n clean: true,\n };\n\n // Without git the provability gates cannot run — the caller treats this\n // as an error rather than silently degrading precision.\n if (!report.gitAvailable) return report;\n\n const changesSinceDoc = new Map<string, FileChange[] | null>();\n const changesByCommit = new Map<string, FileChange[] | null>();\n for (const doc of docs) {\n const hash = doc.lastCommit?.hash;\n if (hash && !changesByCommit.has(hash))\n changesByCommit.set(hash, await getChangesWithStatus(resolvedRoot, hash));\n changesSinceDoc.set(doc.path, hash ? changesByCommit.get(hash)! : null);\n }\n\n let decisionsPresent = false;\n try {\n await fs.access(path.join(resolvedRoot, \".mason\", \"decisions\"));\n decisionsPresent = true;\n } catch {\n // No decision store — the check stays dark (zero-setup path).\n }\n report.decisionsChecked = decisionsPresent;\n\n const ctx: CheckContext = {\n root: resolvedRoot,\n docs,\n headHash,\n changesSinceDoc,\n decisionsPresent,\n };\n\n const policy = (await loadProjectConfig(resolvedRoot)).audit;\n const selected = options.checks ?? ALL_CHECKS;\n for (const name of ALL_CHECKS) {\n if (!selected.includes(name)) continue;\n const exclusions = policy?.exclude?.[name] ?? [];\n const included = await includedCheckPaths(\n resolvedRoot,\n docs.map((doc) => doc.path),\n exclusions,\n );\n const excluded = docs\n .filter((doc) => !included.has(doc.path))\n .map((doc) => ({ check: name, doc: doc.path }));\n if (excluded.length) (report.excludedChecks ??= []).push(...excluded);\n const scoped = { ...ctx, docs: docs.filter((doc) => included.has(doc.path)) };\n const { issues, advisories, suppressedAdvisories, skipped } = await (options.runCheck\n ? options.runCheck(name, scoped)\n : CHECKS[name](scoped));\n report.checksRun!.push(name);\n report.issues.push(...issues);\n const advisoryPaths = await includedCheckPaths(\n resolvedRoot,\n [...new Set(advisories.map((f) => f.anchor.doc))],\n exclusions,\n );\n report.advisories.push(...advisories.filter((f) => advisoryPaths.has(f.anchor.doc)));\n for (const f of advisories)\n if (!advisoryPaths.has(f.anchor.doc))\n (report.excludedChecks ??= []).push({ check: name, doc: f.anchor.doc });\n report.suppressedAdvisories!.push(...(suppressedAdvisories ?? []));\n report.skippedChecks.push(...skipped);\n }\n\n report.clean = report.issues.length === 0;\n const reviews = (\n await Promise.all(\n [...report.advisories, ...report.suppressedAdvisories!].map((finding) =>\n assessAdvisory(resolvedRoot, finding, headHash),\n ),\n )\n ).filter((review) => review !== null);\n if (reviews.length) report.advisoryReviews = reviews;\n return report;\n}\n","import { profilePhase } from \"../utils/profile.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { computeAudit, type AuditOptions } from \"./audit.js\";\nimport { discoverDocPaths } from \"./docs.js\";\nimport { getCurrentGitHash } from \"../snapshot/snapshot.js\";\nimport { getChangesWithStatus } from \"../drift/drift.js\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\nimport { loadProjectConfig, readBoundedFile } from \"../utils/files.js\";\nimport { isWithinRoot, normalizeRepoPath } from \"../utils/paths.js\";\nimport { ALL_CHECKS } from \"./types.js\";\nimport type { AuditReport, CheckName } from \"./types.js\";\nimport {\n checkSchema,\n commitSchema,\n issueSchema,\n advisorySchema,\n digest,\n findingId,\n type Finding,\n} from \"./findings.js\";\nimport {\n assessAdvisory,\n advisoryReviewInventory,\n reviewSummarySchema,\n type AdvisoryReviewSummary,\n} from \"./advisory-review.js\";\nexport { checkResultSchema, findingId } from \"./findings.js\";\nconst count = z.number().int().nonnegative();\n\nexport const reportSchema = z.object({\n version: z.literal(1),\n root: z.string(),\n gitAvailable: z.literal(true),\n headHash: commitSchema.shape.hash,\n checksRun: z.array(checkSchema).nonempty(),\n docs: z\n .array(\n z.object({\n path: z.string().refine((value) => normalizeRepoPath(value) === value),\n scope: z.string().optional(),\n kind: z.enum([\"instructions\", \"readme\", \"guide\"]).optional(),\n lastCommit: commitSchema.nullable(),\n dirty: z.boolean(),\n lineCount: count,\n }),\n )\n .nonempty(),\n decisionsChecked: z.boolean(),\n clean: z.boolean(),\n excludedChecks: z.array(z.object({ check: checkSchema, doc: z.string() })).optional(),\n issues: z.array(issueSchema),\n advisories: z.array(advisorySchema),\n suppressedAdvisories: z.array(advisorySchema).optional(),\n skippedChecks: z.array(\n z.object({ check: z.string(), reason: z.string(), doc: z.string().optional() }),\n ),\n});\nconst baselineSchema = z.object({\n kind: z.literal(\"mason-audit-repair\"),\n version: z.literal(1),\n createdAt: z.string().datetime(),\n report: reportSchema,\n digest: z.string().regex(/^[a-f0-9]{64}$/),\n});\n\nexport type RepairStatus = \"resolved\" | \"unresolved\" | \"review-required\" | \"unverified\";\n\nexport interface RepairFinding {\n id: string;\n original: Finding;\n status: RepairStatus;\n reason: string;\n current?: Finding;\n review?: AdvisoryReviewSummary;\n}\nexport const repairFindingSchema = z.object({\n id: z.string(),\n original: z.union([issueSchema, advisorySchema]),\n status: z.enum([\"resolved\", \"unresolved\", \"review-required\", \"unverified\"]),\n reason: z.string(),\n current: z.union([issueSchema, advisorySchema]).optional(),\n review: reviewSummarySchema.optional(),\n});\nexport interface RepairVerification {\n version: 1;\n action: \"verify\";\n baselinePath: string;\n baselineHead: string;\n currentHead: string | null;\n status: \"verified\" | \"issues-remain\" | \"incomplete\";\n findings: RepairFinding[];\n newFindings: Finding[];\n diagnostics: string[];\n currentAudit: AuditReport | null;\n counts: Record<RepairStatus, number>;\n scope: string;\n}\n\nfunction recheckable(finding: Finding): boolean {\n return (\n !(\"confidence\" in finding) &&\n finding.resolution === \"recheck\" &&\n [\"deleted-reference\", \"dead-command\", \"new-module\"].includes(finding.type) &&\n [\"missing-path\", \"missing-script\", \"unmentioned-dir\"].includes(finding.evidence.kind)\n );\n}\nfunction allFindings(report: AuditReport): Finding[] {\n return [...report.issues, ...report.advisories, ...(report.suppressedAdvisories ?? [])];\n}\n\nasync function docState(root: string): Promise<string> {\n const docs = [];\n for (const doc of await discoverDocPaths(root)) {\n try {\n const content = await readBoundedFile(await storePath(root, doc), 10 * 1024 * 1024);\n if (content === null)\n throw new Error(\"Context file is not regular or exceeds 10 MiB: \" + doc);\n docs.push([doc, digest(content)]);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n docs.push([doc, null]);\n }\n }\n return digest([docs, (await loadProjectConfig(root)).audit]);\n}\n\n/** Refuse a verification assembled across a commit or instruction-file edit. */\nasync function stableAudit(\n root: string,\n checks: CheckName[],\n options: AuditOptions = {},\n): Promise<AuditReport | null> {\n return profilePhase(\"repair.audit\", () => readStableAudit(root, checks, options));\n}\n\nasync function readStableAudit(root: string, checks: CheckName[], options: AuditOptions) {\n const head = await getCurrentGitHash(root);\n const before = await docState(root);\n const report = await computeAudit(root, { ...options, checks });\n if (\n head !== (await getCurrentGitHash(root)) ||\n before !== (await docState(root)) ||\n (report && report.headHash !== head)\n ) {\n throw new Error(\n \"HEAD or context files changed during the audit; retry against a stable checkout.\",\n );\n }\n return report;\n}\n\nexport async function prepareRepair(\n rootDir: string,\n checks: CheckName[] = ALL_CHECKS,\n options: AuditOptions = {},\n) {\n return prepareOriginal(rootDir, checks, options);\n}\n\ninterface RepairSession {\n audit: (checks: CheckName[]) => Promise<AuditReport | null>;\n document: (file: string) => Promise<string | null>;\n history: (head: string) => ReturnType<typeof getChangesWithStatus>;\n assessment: typeof assessAdvisory;\n}\n\n/** Automation shares one inspection across its audit and original baselines.\n * Its required validator re-reads the full input inventory before this returns.\n * Standalone prepare/verify retain their own stability guards below.\n */\nexport async function withRepairSession<T>(\n root: string,\n options: AuditOptions,\n run: (session: {\n prepare: () => ReturnType<typeof prepareRepair>;\n verify: (baselinePath: string) => Promise<RepairVerification>;\n currentAudit: () => Promise<AuditReport | null>;\n }) => Promise<T>,\n validate: () => Promise<void>,\n cachedAudit?: AuditReport,\n): Promise<T> {\n const head = await getCurrentGitHash(root);\n const audits = new Map<string, Promise<AuditReport | null>>();\n const documents = new Map<string, Promise<string | null>>();\n const history = new Map<string, ReturnType<typeof getChangesWithStatus>>();\n const assessments = new Map<string, ReturnType<typeof assessAdvisory>>();\n const memo = <T>(\n cache: Map<string, Promise<T>>,\n key: string,\n read: () => Promise<T>,\n ): Promise<T> => {\n if (!cache.has(key)) cache.set(key, read());\n return cache.get(key)!;\n };\n const session: RepairSession = {\n audit: (checks) =>\n memo(audits, [...checks].sort().join(\",\"), async () => {\n if (\n cachedAudit &&\n cachedAudit.headHash === head &&\n cachedAudit.root === root &&\n digest([...checks].sort()) === digest([...(cachedAudit.checksRun ?? [])].sort())\n ) {\n // Raw audit results are cached, never their approval assessments. Original\n // baselines may refer to scopes no longer mentioned in the current docs.\n const current = structuredClone(cachedAudit);\n const reviews = (\n await Promise.all(allFindings(current).map((f) => assessAdvisory(root, f, head)))\n ).filter((r) => r !== null);\n delete current.advisoryReviews;\n if (reviews.length) current.advisoryReviews = reviews;\n return current;\n }\n return computeAudit(root, { ...options, checks });\n }),\n document: (file) =>\n memo(documents, file, async () =>\n readBoundedFile(await storePath(root, file), 10 * 1024 * 1024),\n ),\n history: (head) => memo(history, head, () => getChangesWithStatus(root, head)),\n assessment: (dir, finding, head) =>\n memo(assessments, digest([dir, finding, head]), () => assessAdvisory(dir, finding, head)),\n };\n const result = await run({\n prepare: () => prepareOriginal(root, ALL_CHECKS, options, session),\n verify: (baseline) =>\n profilePhase(\"repair.verify\", () => verifyOriginal(root, baseline, options, session)),\n currentAudit: () => session.audit(ALL_CHECKS),\n });\n await validate();\n return result;\n}\n\nasync function prepareOriginal(\n rootDir: string,\n checks: CheckName[],\n options: AuditOptions,\n session?: RepairSession,\n) {\n const root = await fs.realpath(rootDir);\n const selected = z.array(checkSchema).nonempty().parse(checks);\n const report = await (session ? session.audit(selected) : stableAudit(root, selected, options));\n if (!report) throw new Error(\"No context files found to prepare a repair.\");\n if (!report.gitAvailable)\n throw new Error(\"Readable Git history is required to prepare a repair.\");\n // Canonicalize before hashing; validation on read must yield the same bytes.\n const storedReport = reportSchema.parse(report);\n const payload = {\n kind: \"mason-audit-repair\" as const,\n version: 1 as const,\n createdAt: new Date().toISOString(),\n report: storedReport,\n };\n const baselinePath = \".mason/reports/repairs/\" + randomUUID() + \".json\";\n await writeStoreJson(root, baselinePath, { ...payload, digest: digest(payload) });\n return { version: 1 as const, action: \"prepare\" as const, baselinePath, report };\n}\n\nexport async function loadRepairBaseline(rootDir: string, baselinePath: string) {\n const root = await fs.realpath(rootDir);\n const declaredRoot = path.resolve(rootDir);\n const relative = path.isAbsolute(baselinePath)\n ? path.relative(isWithinRoot(declaredRoot, baselinePath) ? declaredRoot : root, baselinePath)\n : baselinePath;\n const stored = baselineSchema.parse(await readStoreJson(root, relative));\n const { digest: savedDigest, ...payload } = stored;\n if (digest(payload) !== savedDigest)\n throw new Error(\"Repair baseline was modified; use the original baseline.\");\n if (stored.report.root !== root)\n throw new Error(\"Repair baseline belongs to a different repository.\");\n const original = stored.report as AuditReport;\n return { root, relative, original };\n}\n\nexport async function verifyRepair(\n rootDir: string,\n baselinePath: string,\n options: AuditOptions = {},\n): Promise<RepairVerification> {\n return profilePhase(\"repair.verify\", () => verifyOriginal(rootDir, baselinePath, options));\n}\n\nasync function verifyOriginal(\n rootDir: string,\n baselinePath: string,\n options: AuditOptions,\n session?: RepairSession,\n): Promise<RepairVerification> {\n const { root, relative, original } = await loadRepairBaseline(rootDir, baselinePath);\n const diagnostics: string[] = [];\n let reviewDigest: string | undefined;\n let current: AuditReport | null = null;\n try {\n if (!session) reviewDigest = digest(await advisoryReviewInventory(root));\n current = await (session\n ? session.audit(original.checksRun!)\n : stableAudit(root, original.checksRun!, options));\n if (!current) diagnostics.push(\"No context files remain available to audit.\");\n else if (!current.gitAvailable) diagnostics.push(\"Git history is unavailable.\");\n for (const doc of original.docs) {\n if (\n !allFindings(original).some((f) => f.anchor.doc === doc.path) ||\n !current?.docs.some((d) => d.path === doc.path)\n )\n continue;\n const content = await (session\n ? session.document(doc.path)\n : readBoundedFile(await storePath(root, doc.path), 10 * 1024 * 1024));\n if (content === null || !content.trim()) {\n diagnostics.push(\n \"Original context file \" +\n doc.path +\n \" is empty or unreadable; losing its claims does not verify a repair.\",\n );\n }\n }\n if (\n (await (session\n ? session.history(original.headHash!)\n : getChangesWithStatus(root, original.headHash!))) === null\n ) {\n diagnostics.push(\n \"The original audit commit is unavailable; repair history cannot be verified.\",\n );\n }\n } catch (error) {\n diagnostics.push(error instanceof Error ? error.message : String(error));\n }\n const currentById = new Map((current ? allFindings(current) : []).map((f) => [findingId(f), f]));\n const originalFindings = allFindings(original);\n const originalIds = new Set(originalFindings.map(findingId));\n const missingDocs = original.docs.filter(\n (doc) => !current?.docs.some((d) => d.path === doc.path),\n );\n for (const doc of missingDocs)\n diagnostics.push(\n \"Original context file \" +\n doc.path +\n \" is unavailable; removing it does not verify a repair.\",\n );\n const findings = await Promise.all(\n originalFindings.map(async (finding): Promise<RepairFinding> => {\n const id = findingId(finding);\n const now = currentById.get(id);\n const base = { id, original: finding, ...(now ? { current: now } : {}) };\n if (diagnostics.length || !current) {\n return {\n ...base,\n status: \"unverified\",\n reason: \"The original audit scope could not be verified. See diagnostics.\",\n };\n }\n if (now && (\"confidence\" in finding || \"confidence\" in now)) {\n return {\n ...base,\n status: \"unresolved\",\n reason: \"The original check still reports this claim.\",\n };\n }\n if (\n current.excludedChecks?.some(\n (excluded) => excluded.check === finding.type && excluded.doc === finding.anchor.doc,\n )\n ) {\n return {\n ...base,\n status: \"resolved\",\n reason:\n \"Excluded by project audit policy; this is not a correctness assessment. Original evidence is retained.\",\n };\n }\n const skipped = current.skippedChecks.filter(\n (s) => s.check === finding.type && (!s.doc || s.doc === finding.anchor.doc),\n );\n if (!current.checksRun?.includes(finding.type) || skipped.length) {\n return {\n ...base,\n status: \"unverified\",\n reason: skipped.map((s) => s.reason).join(\"; \") || \"The original check did not run.\",\n };\n }\n const review = await (session?.assessment ?? assessAdvisory)(\n root,\n now ?? finding,\n original.headHash!,\n );\n if (review) {\n if (review.status === \"unverified\")\n return { ...base, review, status: \"unverified\", reason: review.reason };\n if (review.status === \"current\")\n return { ...base, review, status: \"resolved\", reason: review.reason };\n return { ...base, review, status: \"review-required\", reason: review.reason };\n }\n if (\n !(\"confidence\" in finding) &&\n finding.evidence.kind === \"doc-behind-manifests\" &&\n !finding.evidence.matches?.length &&\n (!now || (!(\"confidence\" in now) && now.resolution === \"informational\"))\n ) {\n return {\n ...base,\n status: \"resolved\",\n reason:\n \"Manifest recency alone establishes no affected passage. Retained as information; no assessment is required.\",\n };\n }\n if (!(\"confidence\" in finding) && (!recheckable(finding) || now)) {\n return {\n ...base,\n status: \"review-required\",\n reason:\n (now\n ? \"The current check still reports this advisory. \"\n : finding.type === \"deps-changed\"\n ? \"The current check no longer reports this condition; the historical advisory remains awaiting assessment. \"\n : \"The current check no longer reports the original finding; retained evidence still requires assessment. \") +\n \"An audit cannot establish that this advisory was reviewed. Retain its original evidence and report a separate assessment; editing or committing the doc is not approval.\",\n };\n }\n return {\n ...base,\n status: \"resolved\",\n reason:\n \"The original check ran and no longer reports this claim. Inspect the edit for semantic correctness.\",\n };\n }),\n );\n if (!session)\n try {\n if (\n reviewDigest !== digest(await advisoryReviewInventory(root)) ||\n current?.headHash !== (await getCurrentGitHash(root))\n ) {\n diagnostics.push(\n \"HEAD or advisory review records changed during verification; repeat against stable evidence.\",\n );\n for (const finding of findings) {\n finding.status = \"unverified\";\n finding.reason = diagnostics.at(-1)!;\n }\n }\n } catch (error) {\n diagnostics.push(String(error));\n for (const finding of findings) {\n finding.status = \"unverified\";\n finding.reason = \"Advisory review evidence became unavailable during verification.\";\n }\n }\n const newFindings = [...currentById].filter(([id]) => !originalIds.has(id)).map(([, f]) => f);\n const reviewedIds = new Set(\n current?.advisoryReviews\n ?.filter((review) => review.status === \"current\")\n .map((review) => review.id),\n );\n const counts: Record<RepairStatus, number> = {\n resolved: 0,\n unresolved: 0,\n \"review-required\": 0,\n unverified: 0,\n };\n for (const f of findings) counts[f.status]++;\n const incomplete =\n diagnostics.length > 0 ||\n counts.unverified > 0 ||\n counts[\"review-required\"] > 0 ||\n (current?.skippedChecks.length ?? 0) > 0 ||\n newFindings.some(\n (f) =>\n !(\"confidence\" in f) && f.resolution !== \"informational\" && !reviewedIds.has(findingId(f)),\n );\n const issuesRemain = counts.unresolved > 0 || newFindings.some((f) => \"confidence\" in f);\n return {\n version: 1,\n action: \"verify\",\n baselinePath: relative,\n baselineHead: original.headHash!,\n currentHead: current?.gitAvailable ? current.headHash! : null,\n status: incomplete ? \"incomplete\" : issuesRemain ? \"issues-remain\" : \"verified\",\n findings,\n newFindings,\n diagnostics,\n currentAudit: current,\n counts,\n scope:\n \"Original audit checks over current context files and repository evidence. Resolved means no longer detected by the check or covered by an explicit assessment of current evidence; inspect each finding's reason and review. This is not a certification of documentation or application correctness.\",\n };\n}\n\nexport function repairExitCode(report: RepairVerification): number {\n return report.status === \"verified\" ? 0 : report.status === \"issues-remain\" ? 1 : 2;\n}\n\nexport function formatRepairSummary(report: RepairVerification): string {\n return [\n \"Repair verification: \" + report.status + \". Baseline: \" + report.baselinePath,\n ...report.findings.map(\n (f) =>\n \" [\" +\n f.status +\n \"] \" +\n f.original.type +\n \" \" +\n f.original.anchor.doc +\n \": \" +\n (f.current?.message ??\n \"Historical evidence at \" + report.baselineHead.slice(0, 7) + \": \" + f.original.message) +\n \"\\n \" +\n f.reason +\n \"\\n findingId: \" +\n f.id,\n ),\n ...report.newFindings.map((f) => \" [new] \" + f.type + \" \" + f.anchor.doc + \": \" + f.message),\n ...report.diagnostics.map((d) => \" [unverified] \" + d),\n ...(report.currentAudit?.skippedChecks ?? []).map(\n (s) => \" [skipped] \" + s.check + \": \" + s.reason,\n ),\n report.scope,\n ].join(\"\\n\");\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport { captureAnchorScopes, type AnchorCapture } from \"../decisions/anchors.js\";\nimport {\n loadDecisionStore,\n readDecisionInputs,\n type DecisionRecord,\n} from \"../decisions/decisions.js\";\nimport { decisionAnchors, decisionInspectionDigest } from \"../decisions/provenance.js\";\nimport { includedCheckPaths } from \"../audit/policy.js\";\nimport { loadProjectConfig } from \"../utils/files.js\";\nimport { execGit } from \"../utils/git-read.js\";\nimport { profilePhase } from \"../utils/profile.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { discoverDocPaths } from \"../audit/docs.js\";\nimport { pathClaimScope, pathExists, optionalMasonPath, gitMetadataPath } from \"../audit/scope.js\";\nimport { extractClaims } from \"../audit/claims.js\";\nimport { checkResultSchema } from \"../audit/repair.js\";\nimport { CHECKS, type CheckResult } from \"../audit/checks/index.js\";\nimport type { AuditOptions } from \"../audit/audit.js\";\nimport type { CheckName } from \"../audit/types.js\";\nimport { readAuditInput } from \"../audit/inputs.js\";\nimport { moduleCandidates, moduleDocumentation } from \"../audit/checks/new-module.js\";\nimport { resolveDocCountSource } from \"../audit/checks/stale-count.js\";\nimport { commandInputs } from \"../audit/checks/dead-command.js\";\nimport { storePath } from \"../utils/storage.js\";\nimport { advisoryReviewInventory } from \"../audit/advisory-review.js\";\n\ndeclare const PKG_VERSION: string;\nconst engineVersion = typeof PKG_VERSION === \"string\" ? PKG_VERSION : \"development\";\nexport const hash = (value: unknown): string =>\n createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\");\nexport async function git(root: string, ...args: string[]): Promise<string> {\n return profilePhase(\n \"automation.git\",\n async () =>\n (await execGit(args, { cwd: root, maxBuffer: 16 * 1024 * 1024, timeout: 10000 })).stdout,\n );\n}\n\nexport async function workspace(dir: string) {\n const root = await fs.realpath((await git(dir, \"rev-parse\", \"--show-toplevel\")).trim());\n const [gitDir, branch] = await Promise.all([\n git(root, \"rev-parse\", \"--absolute-git-dir\").then((value) => fs.realpath(value.trim())),\n git(root, \"symbolic-ref\", \"--quiet\", \"HEAD\").then(\n (value) => value.trim(),\n () => \"detached\",\n ),\n ]);\n return {\n root,\n gitDir,\n branch,\n directory: \".mason/reports/automation/\" + hash([root, gitDir, branch]).slice(0, 24),\n };\n}\n\nconst content = readAuditInput;\n\nexport interface Inputs {\n fingerprint: string;\n head: string;\n docs: Record<string, string | null>;\n keys: Record<CheckName, string>;\n decisionEvidence: Record<string, { digest: string; capture: AnchorCapture }>;\n}\n\nasync function captureDecisionEvidence(root: string, records: DecisionRecord[]) {\n const scopes = new Map(\n records\n .filter((record) => record.status === \"active\")\n .map((record) => {\n const anchors = decisionAnchors(record).sort();\n return [JSON.stringify(anchors), anchors] as const;\n }),\n );\n // Dirty path/status alone cannot detect another edit to the same file.\n // Preserve each scope's bound: a large union must not hide smaller complete captures.\n const captures = await captureAnchorScopes(root, [...scopes.values()]);\n const capturesByScope = new Map([...scopes.keys()].map((key, index) => [key, captures[index]]));\n const decisionEvidence: Inputs[\"decisionEvidence\"] = {};\n for (const record of records.filter((record) => record.status === \"active\")) {\n const key = JSON.stringify(decisionAnchors(record).sort());\n decisionEvidence[record.id] = {\n digest: decisionInspectionDigest(record),\n capture: capturesByScope.get(key)!,\n };\n }\n return decisionEvidence;\n}\n\n/** Guidance inputs exclude documentation claims, repair baselines and advisory reviews. */\nexport async function readGuidanceInputs(root: string): Promise<Inputs> {\n const [head, raw, store, shallowPath, replacements] = await Promise.all([\n git(root, \"rev-parse\", \"HEAD\").then((text) => text.trim()),\n readDecisionInputs(root),\n loadDecisionStore(root),\n git(root, \"rev-parse\", \"--git-path\", \"shallow\"),\n git(root, \"for-each-ref\", \"--format=%(refname) %(objectname)\", \"refs/replace\"),\n ]);\n if (raw.diagnostics.length || store.diagnostics.length)\n throw new Error(\n \"Cannot read decision inputs: \" +\n [...raw.diagnostics, ...store.diagnostics].map((d) => `${d.path}: ${d.message}`).join(\"; \"),\n );\n const decisionEvidence = await captureDecisionEvidence(root, store.records);\n const shallow = await fs\n .readFile(path.resolve(root, shallowPath.trim()), \"utf8\")\n .catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n const fingerprint = hash([\n \"guidance\",\n engineVersion,\n head,\n raw.inputs,\n decisionEvidence,\n shallow,\n replacements,\n ]);\n return {\n fingerprint,\n head,\n decisionEvidence,\n docs: {},\n keys: {\n \"deleted-reference\": \"\",\n \"new-module\": \"\",\n \"stale-count\": \"\",\n \"dead-command\": \"\",\n \"deps-changed\": \"\",\n \"decision-anchor-drift\": fingerprint,\n },\n };\n}\n\nexport async function readInputs(root: string): Promise<Inputs> {\n return profilePhase(\"automation.inputs\", () => collectInputs(root));\n}\n\nasync function collectInputs(root: string): Promise<Inputs> {\n const docPaths = await discoverDocPaths(root);\n const auditPolicy = (await loadProjectConfig(root)).audit;\n const allowed = new Map<CheckName, Set<string>>();\n for (const name of [\"deleted-reference\", \"new-module\", \"stale-count\", \"dead-command\"] as const) {\n allowed.set(name, await includedCheckPaths(root, docPaths, auditPolicy?.exclude?.[name] ?? []));\n }\n const [headText, docStatus, shallowPath, replacements] = await Promise.all([\n git(root, \"rev-parse\", \"HEAD\"),\n docPaths.length\n ? git(\n root,\n \"status\",\n \"--porcelain=v1\",\n \"-z\",\n \"--untracked-files=all\",\n \"--\",\n ...docPaths.map((p) => `:(literal)${p}`),\n )\n : \"\",\n git(root, \"rev-parse\", \"--git-path\", \"shallow\"),\n git(root, \"for-each-ref\", \"--format=%(refname) %(objectname)\", \"refs/replace\"),\n ]);\n const head = headText.trim();\n let shallow: string | null = null;\n try {\n shallow = await fs.readFile(path.resolve(root, shallowPath.trim()), \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n const docs: Record<string, string | null> = {};\n const docContents: Array<[string, string | null]> = [];\n const parsedDocs = [];\n const claims: Array<[string, boolean, boolean]> = [];\n const presence = new Map<string, Promise<boolean>>();\n const exists = (file: string) => {\n if (!presence.has(file)) presence.set(file, pathExists(root, file));\n return presence.get(file)!;\n };\n for (const file of docPaths) {\n const text = await content(root, file);\n docs[file] = text === null ? null : hash(text);\n docContents.push([file, text]);\n const parsed = { path: file, content: text ?? \"\", claims: extractClaims(text ?? \"\") };\n parsedDocs.push(parsed);\n for (const claim of allowed.get(\"deleted-reference\")!.has(file) ? parsed.claims.paths : []) {\n const scope = pathClaimScope(file, claim);\n if (scope?.candidates.some(gitMetadataPath)) continue;\n for (const candidate of scope?.candidates ?? []) {\n if (optionalMasonPath(candidate)) continue;\n const [filePresent, parentPresent] = await Promise.all([\n exists(candidate),\n exists(path.posix.dirname(candidate)),\n ]);\n claims.push([candidate, filePresent, parentPresent]);\n }\n }\n }\n const combinedDocs = moduleDocumentation(\n parsedDocs.filter((doc) => allowed.get(\"new-module\")!.has(doc.path)),\n );\n const countClaims = parsedDocs\n .filter((doc) => allowed.get(\"stale-count\")!.has(doc.path))\n .flatMap((doc) => doc.claims.counts.map((claim) => ({ doc: doc.path, claim })));\n const decisionDirectory = await storePath(root, \".mason/decisions\");\n const decisionPresence = await fs.lstat(decisionDirectory).then(\n (stat) => (stat.isDirectory() ? \"directory\" : \"file\"),\n (error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return \"absent\";\n throw error;\n },\n );\n const [modules, counts, commands, decisionInputs] = await Promise.all([\n combinedDocs ? moduleCandidates(root, combinedDocs) : [],\n Promise.all(countClaims.map(({ doc, claim }) => resolveDocCountSource(root, doc, claim))),\n commandInputs(\n root,\n parsedDocs.filter((doc) => allowed.get(\"dead-command\")!.has(doc.path)),\n ),\n readDecisionInputs(root),\n ]);\n if (decisionInputs.diagnostics.length)\n throw new Error(\n \"Cannot read decision inputs: \" +\n decisionInputs.diagnostics.map((d) => `${d.path}: ${d.message}`).join(\"; \"),\n );\n const decisions = decisionInputs.inputs;\n // Decision freshness observes tracked and local anchor changes; other checks\n // do not need a repository-wide status or index scan.\n const [status, index] = decisions.length\n ? await Promise.all([\n git(\n root,\n \"status\",\n \"--porcelain=v1\",\n \"-z\",\n \"--untracked-files=all\",\n \"--\",\n \".\",\n \":(exclude).mason/reports\",\n ),\n git(root, \"ls-files\", \"--stage\", \"-z\", \"--\", \".\", \":(exclude).mason/reports\"),\n ])\n : [\"\", \"\"];\n const records = decisions.length ? (await loadDecisionStore(root)).records : [];\n const decisionEvidence = await captureDecisionEvidence(root, records);\n const anchorContent = Object.entries(decisionEvidence);\n const common = [8, engineVersion, head, shallow, replacements, docContents, auditPolicy];\n const keys: Record<CheckName, string> = {\n \"deleted-reference\": hash([common, claims, docStatus]),\n \"new-module\": hash([common, modules]),\n \"stale-count\": hash([common, counts]),\n \"dead-command\": hash([common, commands]),\n \"deps-changed\": hash([common, docStatus]),\n \"decision-anchor-drift\": hash([\n common,\n decisionPresence,\n decisions,\n status,\n index,\n anchorContent,\n ]),\n };\n return {\n fingerprint: hash([keys, await advisoryReviewInventory(root)]),\n head,\n docs,\n keys,\n decisionEvidence,\n };\n}\n\nconst cacheSchema = z.object({\n version: z.literal(1),\n entries: z.record(z.object({ key: z.string(), result: checkResultSchema })),\n digest: z.string(),\n});\nexport function checkCache(raw: unknown, inputs: Inputs) {\n let entries: Record<string, { key: string; result: CheckResult }> = {};\n let diagnostic: string | null = null;\n if (raw !== null) {\n const parsed = cacheSchema.safeParse(raw);\n if (parsed.success && parsed.data.digest === hash(parsed.data.entries))\n entries = parsed.data.entries as Record<string, { key: string; result: CheckResult }>;\n else diagnostic = \"Discarded an invalid automation cache; checks are being recomputed.\";\n }\n const ran = new Set<CheckName>(),\n reused = new Set<CheckName>();\n const options: AuditOptions = {\n runCheck: async (name, ctx) => {\n if (entries[name]?.key === inputs.keys[name]) {\n reused.add(name);\n return structuredClone(entries[name].result);\n }\n const result = await profilePhase(\"check.\" + name, () => CHECKS[name](ctx));\n ran.add(name);\n // An unavailable check must be retried even if the file inputs match.\n if (!result.skipped.length) entries[name] = { key: inputs.keys[name], result };\n else delete entries[name];\n return result;\n },\n };\n return {\n options,\n ran,\n reused,\n diagnostic,\n has: (name: CheckName) =>\n entries[name]?.key === inputs.keys[name] && !entries[name].result.skipped.length,\n serialize: () => {\n const canonical = cacheSchema.shape.entries.parse(entries);\n return { version: 1, entries: canonical, digest: hash(canonical) };\n },\n };\n}\n","import { z } from \"zod\";\nimport { readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport { workspace } from \"./evidence.js\";\nimport { withLock } from \"./store.js\";\n\nexport const stopBlockSchema = z.enum([\"off\", \"drift\"]);\nconst configSchema = z.object({ version: z.literal(1), stopBlock: stopBlockSchema });\nconst directory = \".mason/reports/automation\";\nconst configPath = directory + \"/config.json\";\n\nexport async function readAutomationConfig(root: string) {\n const raw = await readStoreJson(root, configPath);\n return raw === null\n ? { version: 1 as const, stopBlock: \"drift\" as const }\n : configSchema.parse(raw);\n}\n\nexport async function configureStopBlock(dir: string, value: unknown) {\n const stopBlock = stopBlockSchema.parse(value);\n const ws = await workspace(dir);\n return withLock(ws.root, directory, async () => {\n const config = { ...(await readAutomationConfig(ws.root)), stopBlock };\n await writeStoreJson(ws.root, configPath, config);\n return config;\n });\n}\n","import { isRecord } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport { workspace, hash } from \"./evidence.js\";\nimport { readStoreJson, writeStoreJson, storePath } from \"../utils/storage.js\";\nimport { withStoreLock } from \"../utils/store-lock.js\";\nimport type { AutomationEvent, AutomationReport } from \"./runtime.js\";\nimport type { RepairFinding } from \"../audit/repair.js\";\n\nconst directory = \".mason/local/usefulness\";\nconst configPath = directory + \"/config.json\";\nconst configSchema = z.object({ version: z.literal(1), enabled: z.boolean() });\nexport const usefulnessRating = z.enum([\"helpful\", \"already-knew\", \"irrelevant\", \"deferred\"]);\nconst findingSchema = z.object({\n type: z.string(),\n channels: z.array(z.enum([\"agent\", \"completion\"])),\n status: z.enum([\"resolved\", \"unresolved\", \"review-required\", \"unverified\", \"unknown\"]),\n deliveredAt: z.string(),\n observedAt: z.string(),\n rating: usefulnessRating.optional(),\n});\nconst sessionSchema = z.object({\n host: z.string(),\n updatedAt: z.string(),\n endedAt: z.string().optional(),\n checks: z.number(),\n checkMs: z.number(),\n findings: z.record(findingSchema),\n decisions: z.array(z.string()),\n retrievalObserved: z.boolean(),\n receiptIds: z.array(z.string()),\n reportPath: z.string(),\n truncated: z.boolean(),\n});\nconst stateSchema = z.object({ version: z.literal(1), sessions: z.record(sessionSchema) });\ntype Session = z.infer<typeof sessionSchema>;\nconst empty = () => ({ version: 1 as const, sessions: {} as Record<string, Session> });\nconst statePath = (ws: Awaited<ReturnType<typeof workspace>>) =>\n `${directory}/${hash([ws.root, ws.gitDir, ws.branch]).slice(0, 24)}.json`;\nasync function enabled(root: string) {\n const raw = await readStoreJson(root, configPath);\n return raw !== null && configSchema.parse(raw).enabled;\n}\nexport async function configureUsefulness(\n dir: string,\n value: boolean,\n options: { onlyIfUnset?: boolean } = {},\n) {\n const ws = await workspace(dir);\n const configured = await withStoreLock(ws.root, directory, async () => {\n if (options.onlyIfUnset) {\n const existing = await readStoreJson(ws.root, configPath);\n if (existing !== null) return configSchema.parse(existing).enabled;\n }\n // Self-contained ignore rules keep these observations local even before project setup.\n const ignore = await storePath(ws.root, directory + \"/.gitignore\", true);\n try {\n await fs.writeFile(ignore, \"*\\n\", { flag: \"wx\", mode: 0o600 });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n await writeStoreJson(ws.root, configPath, { version: 1, enabled: value });\n return value;\n });\n return {\n enabled: configured,\n storage: directory,\n note: \"Local only. Disabling retains prior observations.\",\n };\n}\n\n/** Store IDs and counts, never hook payloads, prompts, returned text or source contents. */\nexport async function observeUsefulness(\n root: string,\n event: AutomationEvent,\n report: AutomationReport,\n agent: RepairFinding[],\n completion: RepairFinding[],\n elapsedMs: number,\n observedAt = new Date().toISOString(),\n) {\n if (!event.host || !event.sessionId || !(await enabled(root))) return;\n const ws = await workspace(root);\n await withStoreLock(ws.root, directory, async () => {\n if (!(await enabled(root))) return;\n const raw = await readStoreJson(root, statePath(ws));\n const state = raw === null ? empty() : stateSchema.parse(raw);\n const now = observedAt;\n const key = hash([event.host, event.sessionId]);\n const session = (state.sessions[key] ??= {\n host: event.host!,\n updatedAt: now,\n checks: 0,\n checkMs: 0,\n findings: {},\n decisions: [],\n retrievalObserved: false,\n receiptIds: [],\n reportPath: report.reportPath,\n truncated: false,\n });\n const newer = now >= session.updatedAt;\n if (newer) {\n session.updatedAt = now;\n session.reportPath = report.reportPath;\n }\n session.checks++;\n session.checkMs += Math.max(0, elapsedMs);\n if (newer) {\n if (event.event === \"task_end\") session.endedAt = now;\n else delete session.endedAt;\n }\n // Publication and stats recording use separate locks. A first-delivery record\n // can arrive after a newer audit; use that retained audit for its status.\n let latestFindings: { id: string; status: z.infer<typeof findingSchema>[\"status\"] }[] = [];\n if (\n !newer &&\n [...agent.slice(0, 4), ...completion.slice(0, 4)].some((f) => !session.findings[f.id])\n ) {\n try {\n if (!session.reportPath.startsWith(ws.directory + \"/checks/\"))\n throw new Error(\"Unexpected report path\");\n latestFindings = z\n .object({\n findings: z.array(z.object({ id: z.string(), status: findingSchema.shape.status })),\n })\n .parse(await readStoreJson(root, session.reportPath)).findings;\n } catch {\n /* Unavailable newer evidence means unknown, never reuse an older verdict. */\n }\n }\n for (const [channel, findings] of [\n [\"agent\", agent],\n [\"completion\", completion],\n ] as const) {\n for (const finding of findings.slice(0, 4)) {\n if (!session.findings[finding.id] && Object.keys(session.findings).length >= 200) {\n session.truncated = true;\n continue;\n }\n const saved = (session.findings[finding.id] ??= {\n type: finding.original.type,\n channels: [],\n status: newer\n ? finding.status\n : (latestFindings.find((f) => f.id === finding.id)?.status ?? \"unknown\"),\n deliveredAt: now,\n observedAt: newer ? now : session.updatedAt,\n });\n if (!saved.channels.includes(channel)) saved.channels.push(channel);\n }\n }\n for (const [id, saved] of Object.entries(session.findings)) {\n if (now < saved.observedAt) continue;\n const current = report.findings.find((f) => f.id === id);\n saved.status = current?.status ?? \"unknown\";\n saved.observedAt = now;\n }\n // Only successful get_context response receipts count as retrieval. Invocation alone is insufficient.\n if (event.retrievedDecisionIds !== undefined && event.toolId) {\n const receipt = hash([event.toolId]);\n if (!session.receiptIds.includes(receipt)) {\n session.retrievalObserved = true;\n const decisions = [\n ...new Set([...session.decisions, ...event.retrievedDecisionIds.map((id) => hash([id]))]),\n ];\n if (decisions.length > 200) session.truncated = true;\n session.decisions = decisions.slice(0, 200);\n session.receiptIds = [...session.receiptIds, receipt].slice(-200);\n }\n }\n const keys = Object.keys(state.sessions).sort((a, b) =>\n state.sessions[b].updatedAt.localeCompare(state.sessions[a].updatedAt),\n );\n for (const key of keys.slice(50)) delete state.sessions[key];\n await writeStoreJson(root, statePath(ws), state);\n });\n}\nexport async function rateUsefulness(\n dir: string,\n sessionId: string,\n findingId: string,\n rating: z.infer<typeof usefulnessRating>,\n) {\n const ws = await workspace(dir);\n return withStoreLock(ws.root, directory, async () => {\n const state = stateSchema.parse(await readStoreJson(ws.root, statePath(ws)));\n const finding = state.sessions[sessionId]?.findings[findingId];\n if (!finding)\n throw new Error(\"Unknown retained session or finding; inspect mason stats --json.\");\n finding.rating = usefulnessRating.parse(rating);\n await writeStoreJson(ws.root, statePath(ws), state);\n return { session: sessionId, finding: findingId, rating };\n });\n}\nexport async function usefulnessStatus(dir: string, sessionId?: string) {\n const ws = await workspace(dir);\n const raw = await readStoreJson(ws.root, statePath(ws));\n const state = raw === null ? empty() : stateSchema.parse(raw);\n if (sessionId !== undefined && !Object.hasOwn(state.sessions, sessionId))\n throw new Error(\"Unknown retained session; inspect mason stats --json for session IDs.\");\n const sessions = Object.entries(state.sessions)\n .filter(([id]) => sessionId === undefined || id === sessionId)\n .sort(([, a], [, b]) => b.updatedAt.localeCompare(a.updatedAt))\n .map(([id, s]) => ({\n id,\n ...s,\n receiptIds: undefined,\n delivered: Object.keys(s.findings).length,\n resolved: Object.values(s.findings).filter((f) => f.status === \"resolved\").length,\n unknown: Object.values(s.findings).filter(\n (f) => f.status === \"unknown\" || f.status === \"unverified\",\n ).length,\n open: Object.values(s.findings).filter(\n (f) => f.status === \"unresolved\" || f.status === \"review-required\",\n ).length,\n ratings: Object.fromEntries(\n usefulnessRating.options.map((rating) => [\n rating,\n Object.values(s.findings).filter((f) => f.rating === rating).length,\n ]),\n ),\n deferred: Object.values(s.findings).filter((f) => f.rating === \"deferred\").length,\n retrievedDecisions: s.retrievalObserved ? s.decisions.length : null,\n application: \"unknown\",\n modelTokens: null,\n }));\n const sum = (pick: (s: (typeof sessions)[number]) => number) =>\n sessions.reduce((total, s) => total + pick(s), 0);\n const retrievalObservedSessions = sessions.filter((s) => s.retrievalObserved).length;\n return {\n version: 1,\n enabled: await enabled(ws.root),\n branch: ws.branch,\n sessionId: sessionId ?? null,\n summary: {\n sessions: sessions.length,\n delivered: sum((s) => s.delivered),\n resolved: sum((s) => s.resolved),\n open: sum((s) => s.open),\n unknown: sum((s) => s.unknown),\n ratings: Object.fromEntries(\n usefulnessRating.options.map((rating) => [rating, sum((s) => s.ratings[rating])]),\n ),\n retrievedDecisions: retrievalObservedSessions ? sum((s) => s.retrievedDecisions ?? 0) : null,\n retrievalObservedSessions,\n checks: sum((s) => s.checks),\n checkMs: sum((s) => s.checkMs),\n truncatedSessions: sessions.filter((s) => s.truncated).length,\n application: \"unknown\",\n modelTokens: null,\n },\n note: \"Counts sum distinct findings and returned records within each retained session; the same item may appear in multiple sessions. Status reflects the last observed check, not a fresh verification. Up to 50 sessions and 200 findings/records per session are retained. Resolution after a notice does not establish causation. Ratings are supplied feedback, not authenticated judgments. Lesson application, later-session reuse and model-token cost are unknown.\",\n sessions,\n };\n}\nexport function summarizeUsefulness(result: Awaited<ReturnType<typeof usefulnessStatus>>) {\n const s = result.summary;\n return [\n `Mason stats — tracking ${result.enabled ? \"enabled\" : \"disabled\"} (local only)`,\n `${s.sessions} retained session(s)${result.sessionId ? \" selected\" : \" in this branch\"}. Counts are summed per session.`,\n `Findings: ${s.delivered} delivered; ${s.resolved} observed resolved; ${s.open} open; ${s.unknown} unknown.`,\n `Feedback: ${s.ratings.helpful} helpful; ${s.ratings[\"already-knew\"]} already knew; ${s.ratings.irrelevant} irrelevant; ${s.ratings.deferred} deferred.`,\n `Decision records returned: ${s.retrievedDecisions ?? \"unknown\"} (${s.retrievalObservedSessions}/${s.sessions} sessions with retrieval receipts); application unknown.`,\n `Automation: ${(s.checkMs / 1000).toFixed(2)} seconds across ${s.checks} observations; model-token cost unknown.`,\n ...(s.truncatedSessions\n ? [`${s.truncatedSessions} session(s) have truncated observations.`]\n : []),\n ...(result.sessionId\n ? result.sessions.flatMap((session) => [\n `Session ${session.id} (${session.host}) — ${session.endedAt ? \"last observed stop \" + session.endedAt : \"no final stop observed\"}`,\n `Evidence: ${session.reportPath}`,\n ...Object.entries(session.findings).map(\n ([id, f]) =>\n ` ${id}: ${f.type}; ${f.status}; ${f.channels.join(\"/\")}${f.rating ? \"; rated \" + f.rating : \"\"}`,\n ),\n ])\n : [\n s.sessions\n ? \"Use --json for session IDs, then --session <id> for details.\"\n : \"No retained sessions observed.\",\n ]),\n \"Last observed checks only. Resolution after a notice does not prove Mason caused it.\",\n ].join(\"\\n\");\n}\n\n/** Hosts may wrap MCP text blocks; do not infer retrieval from tool inputs. */\nexport function retrievedDecisions(\n tool: string | undefined,\n response: unknown,\n): string[] | undefined {\n if (!/(?:^|__)mason__get_context$/.test(tool ?? \"\")) return undefined;\n try {\n let value: unknown = typeof response === \"string\" ? JSON.parse(response) : response;\n if (!isRecord(value)) return undefined;\n if (value.isError) return undefined;\n if (Array.isArray(value?.content)) {\n const block: unknown = value.content.find(\n (item: unknown) => isRecord(item) && item.type === \"text\" && typeof item.text === \"string\",\n );\n if (!isRecord(block) || typeof block.text !== \"string\" || !block.text) return undefined;\n const text = block.text;\n value = JSON.parse(text);\n }\n if (!isRecord(value) || !isRecord(value.decisions)) return undefined;\n return Object.keys(value.decisions)\n .filter((id) => /^[a-zA-Z0-9_-]{1,200}$/.test(id))\n .slice(0, 200);\n } catch {\n return undefined;\n }\n}\n","import os from \"node:os\";\nimport fs from \"node:fs/promises\";\nimport { withLock } from \"./store.js\";\nimport { hash, workspace } from \"./evidence.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { readStoreJson, writeStoreJson, storePath } from \"../utils/storage.js\";\n\nconst failureSchema = z.object({\n code: z.enum([\n \"inputs-changed\",\n \"storage-full\",\n \"busy\",\n \"invalid-input\",\n \"history-unavailable\",\n \"invalid-evidence\",\n \"io-error\",\n \"internal\",\n ]),\n message: z.string(),\n retryable: z.boolean(),\n receiptRecorded: z.boolean(),\n});\nexport type AutomationFailure = z.infer<typeof failureSchema>;\nconst attemptSchema = z.object({\n id: z.string().regex(/^[a-zA-Z0-9_-]+$/),\n lease: z.literal(true).optional(),\n event: z.string(),\n startedAt: z.string(),\n finishedAt: z.string().optional(),\n durationMs: z.number().nonnegative().optional(),\n pid: z.number().int().positive(),\n host: z.string(),\n status: z.enum([\"running\", \"completed\", \"failed\", \"unknown\"]),\n verificationStatus: z.string().optional(),\n reportPath: z.string().optional(),\n failure: failureSchema.optional(),\n});\nconst executionSchema = z.object({\n version: z.literal(1),\n attempts: z.array(attemptSchema).max(160),\n discardedAttempts: z.number().int().nonnegative().default(0),\n});\nfunction parseExecution(raw: unknown) {\n try {\n return executionSchema.parse(raw);\n } catch (error) {\n throw new Error(\"Invalid automation execution store; receipt history was retained.\", {\n cause: error,\n });\n }\n}\n\n/** Classify failures without interpreting the advisory hook's exit code as evidence. */\nexport function automationFailure(error: unknown): AutomationFailure {\n const recorded = failureSchema.safeParse((error as { failure?: unknown } | null)?.failure);\n if (recorded.success) return recorded.data;\n const message = (error instanceof Error ? error.message : String(error))\n .replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \")\n .slice(0, 700);\n const codes = new Set<string>();\n let cause: unknown = error;\n for (let i = 0; cause && i < 8; i++) {\n codes.add(String((cause as NodeJS.ErrnoException).code));\n cause = (cause as Error).cause;\n }\n const code: AutomationFailure[\"code\"] =\n codes.has(\"ENOSPC\") || codes.has(\"EDQUOT\")\n ? \"storage-full\"\n : /changed during|changed while|changed between/.test(message)\n ? \"inputs-changed\"\n : /Automation is busy/.test(message)\n ? \"busy\"\n : /not a git repository|unknown revision|bad revision|different history|unreachable/.test(\n message,\n )\n ? \"history-unavailable\"\n : error instanceof z.ZodError ||\n error instanceof SyntaxError ||\n /Hook input|Expected one command|Unknown automation command|--host/.test(message)\n ? \"invalid-input\"\n : /store|baseline|modified|symbolic link|Symlink|automation state|state belongs/.test(\n message,\n )\n ? \"invalid-evidence\"\n : [...codes].some((c) => /^E[A-Z]+$/.test(c))\n ? \"io-error\"\n : \"internal\";\n return {\n code,\n message,\n retryable: [\"inputs-changed\", \"storage-full\", \"busy\", \"io-error\"].includes(code),\n receiptRecorded: false,\n };\n}\n\nexport function failureMessage(error: unknown): string {\n const failure = automationFailure(error);\n return (\n `Mason automation unavailable [${failure.code}]; evidence capture/verification was not established. ${failure.message}` +\n (failure.receiptRecorded ? \"\" : \" No durable failure receipt was recorded.\")\n );\n}\n\nconst notificationsSchema = z.object({\n version: z.literal(1),\n sessions: z.record(\n z.object({\n signature: z.string(),\n code: failureSchema.shape.code,\n message: z.string(),\n count: z.number().int().positive(),\n lastAt: z.string(),\n }),\n ),\n});\n\nexport async function failureNotifications(root: string, directory: string) {\n const raw = await readStoreJson(root, directory + \"/notifications.json\");\n return raw === null ? { version: 1 as const, sessions: {} } : notificationsSchema.parse(raw);\n}\n\n/** Suppress repeats only after the failure itself has a durable execution receipt. */\nexport async function hookFailureMessage(\n dir: string,\n host: string,\n sessionId: string,\n error: unknown,\n): Promise<string | null> {\n const failure = automationFailure(error);\n if (!failure.receiptRecorded) return failureMessage(error);\n try {\n const ws = await workspace(dir);\n return await withLock(ws.root, ws.directory + \"/notifications\", async () => {\n const notices = await failureNotifications(ws.root, ws.directory);\n const key = hash([host, sessionId]),\n signature = hash([failure.code, failure.message]);\n const previous = notices.sessions[key];\n const execution = await executionStatus(ws.root, ws.directory);\n const recovered =\n previous &&\n execution.attempts.some((a) => a.status === \"completed\" && a.startedAt > previous.lastAt);\n const repeat = previous?.signature === signature && !recovered;\n notices.sessions[key] = {\n signature,\n code: failure.code,\n message: failure.message,\n count: repeat ? previous.count + 1 : 1,\n lastAt: new Date().toISOString(),\n };\n notices.sessions = Object.fromEntries(\n Object.entries(notices.sessions)\n .sort(([, a], [, b]) => b.lastAt.localeCompare(a.lastAt))\n .slice(0, 32),\n );\n await writeStoreJson(ws.root, ws.directory + \"/notifications.json\", notices);\n return repeat\n ? null\n : failureMessage(error) +\n \" Repeated failures in this session are recorded in mason status --json.\";\n });\n } catch {\n return failureMessage(error);\n }\n}\n\n/** Each invocation owns a receipt while only brief log updates are serialized. */\nconst leasePath = (directory: string, id: string) => `${directory}/executions/${id}.json`;\n\nasync function refreshRunning(\n root: string,\n directory: string,\n attempts: z.infer<typeof attemptSchema>[],\n) {\n for (const attempt of attempts) {\n if (attempt.status !== \"running\") continue;\n let alive = false;\n try {\n const owner = (await readStoreJson(\n root,\n attempt.lease ? leasePath(directory, attempt.id) : directory + \"/lock\",\n )) as { pid?: unknown; host?: unknown } | null;\n if (\n attempt.host === os.hostname() &&\n owner?.pid === attempt.pid &&\n owner.host === attempt.host\n ) {\n try {\n process.kill(attempt.pid, 0);\n alive = true;\n } catch (error) {\n alive = (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n }\n } catch {\n /* Missing ownership never establishes a running check. */\n }\n if (!alive) attempt.status = \"unknown\";\n }\n}\n\nasync function editExecution(\n root: string,\n directory: string,\n edit: (log: z.infer<typeof executionSchema>) => void,\n) {\n return withLock(root, directory + \"/execution-lock\", async () => {\n const file = directory + \"/execution.json\";\n const raw = await readStoreJson(root, file);\n const log =\n raw === null\n ? { version: 1 as const, attempts: [], discardedAttempts: 0 }\n : parseExecution(raw);\n await refreshRunning(root, directory, log.attempts);\n edit(log);\n // Keep every live invocation plus the latest 32 finished attempts.\n const finished = log.attempts.filter((a) => a.status !== \"running\");\n const discard = new Set(finished.slice(0, Math.max(0, finished.length - 32)).map((a) => a.id));\n log.discardedAttempts += discard.size;\n log.attempts = log.attempts.filter((a) => !discard.has(a.id));\n await writeStoreJson(root, file, log);\n });\n}\n\nexport async function recordExecution<T extends { report: { status: string; reportPath: string } }>(\n root: string,\n directory: string,\n event: string,\n run: () => Promise<T>,\n): Promise<T> {\n const started = performance.now();\n const attempt: z.infer<typeof attemptSchema> = {\n id: randomUUID(),\n event,\n startedAt: new Date().toISOString(),\n pid: process.pid,\n host: os.hostname(),\n status: \"running\",\n lease: true,\n };\n const owner = leasePath(directory, attempt.id);\n const finish = async (changes: Partial<z.infer<typeof attemptSchema>>) =>\n editExecution(root, directory, (log) => {\n const current = log.attempts.find((a) => a.id === attempt.id);\n if (!current)\n throw new Error(\n \"Automation execution receipt disappeared; completion could not be recorded.\",\n );\n Object.assign(current, changes, {\n finishedAt: new Date().toISOString(),\n durationMs: performance.now() - started,\n });\n });\n await writeStoreJson(root, owner, { pid: attempt.pid, host: attempt.host });\n try {\n await editExecution(root, directory, (log) => {\n if (log.attempts.filter((a) => a.status === \"running\").length >= 128)\n throw new Error(\"Too many active automation executions; existing receipts were retained.\");\n log.attempts.push(attempt);\n });\n try {\n const result = await run();\n await finish({\n status: \"completed\",\n verificationStatus: result.report.status,\n reportPath: result.report.reportPath,\n });\n return result;\n } catch (error) {\n const failure = automationFailure(error);\n try {\n await finish({ status: \"failed\", failure: { ...failure, receiptRecorded: true } });\n failure.receiptRecorded = true;\n } catch {\n /* Storage failures may also prevent their own completion receipt. */\n }\n throw Object.assign(new Error(failure.message, { cause: error }), { failure });\n }\n } finally {\n await fs.rm(await storePath(root, owner), { force: true }).catch(() => {});\n }\n}\n\nexport async function executionStatus(root: string, directory: string) {\n const raw = await readStoreJson(root, directory + \"/execution.json\");\n if (raw === null) return { status: \"not-observed\" as const, attempts: [] };\n const log = parseExecution(raw);\n await refreshRunning(root, directory, log.attempts);\n const completed = [...log.attempts].reverse().find((a) => a.status === \"completed\");\n // A success that began before another call failed cannot establish recovery.\n const outstanding = [...log.attempts]\n .reverse()\n .find(\n (a) =>\n [\"failed\", \"unknown\"].includes(a.status) &&\n (!completed || (a.finishedAt ?? a.startedAt) >= completed.startedAt),\n );\n const status = log.attempts.some((a) => a.status === \"running\")\n ? \"running\"\n : (outstanding?.status ?? log.attempts.at(-1)?.status ?? \"not-observed\");\n return { status, attempts: log.attempts, discardedAttempts: log.discardedAttempts };\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport { loadDecisionStore } from \"./decisions.js\";\nimport { decisionApproval } from \"./provenance.js\";\n\n/** Informational only: saving, committing, and accepting are separate operations. */\nexport async function pendingKnowledge(root: string, now = Date.now()): Promise<string | null> {\n try {\n const [store, status] = await Promise.all([\n loadDecisionStore(root),\n execGit(\n [\"status\", \"--porcelain=v1\", \"-z\", \"--untracked-files=all\", \"--\", \".mason/decisions\"],\n { cwd: root, timeout: 10000, maxBuffer: 1024 * 1024 },\n ),\n ]);\n const changed = new Set<string>();\n const entries = status.stdout.split(\"\\0\");\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (!entry) continue;\n const file = entry.slice(3);\n if (/^\\.mason\\/decisions\\/[^/]+\\.json$/.test(file)) changed.add(file);\n if (/[RC]/.test(entry.slice(0, 2))) i++; // porcelain -z includes the old name separately\n }\n const records = new Map(\n store.records.map((record) => [`.mason/decisions/${record.id}.json`, record]),\n );\n const age = (at?: string) => {\n const time = at ? Date.parse(at) : NaN;\n return Number.isFinite(time)\n ? `${Math.max(0, Math.floor((now - time) / 86400000))} days`\n : \"unknown age\";\n };\n const safe = (value: string) => value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \");\n const list = (items: string[]) =>\n items.slice(0, 5).map(safe).join(\"; \") +\n (items.length > 5 ? `; ${items.length - 5} more` : \"\");\n const proposals = store.records\n .filter((record) => record.status === \"active\" && decisionApproval(record) === \"proposed\")\n .map((record) => {\n // Revisions must not reset how long an outstanding proposal has waited.\n const history = record.version === 2 ? record.history : [];\n let lastReview = -1;\n history.forEach((event, index) => {\n if (event.kind === \"accepted\" || event.kind === \"reaffirmed\") lastReview = index;\n });\n const since =\n history\n .slice(lastReview + 1)\n .find((event) => event.kind === \"created\" || event.kind === \"revised\")?.at ??\n record.createdAt;\n return { record, since };\n })\n .sort((a, b) => {\n const timestamp = (value: string) =>\n Number.isFinite(Date.parse(value)) ? Date.parse(value) : Infinity;\n return timestamp(a.since) - timestamp(b.since) || a.record.id.localeCompare(b.record.id);\n });\n const lines = [];\n if (changed.size)\n lines.push(\n `${changed.size} uncommitted decision record(s): ${list(\n [...changed]\n .sort()\n .map((file) => `${file} (saved-record age: ${age(records.get(file)?.updatedAt)})`),\n )}.`,\n );\n if (proposals.length)\n lines.push(\n `${proposals.length} proposal(s) awaiting review (oldest first): ${list(\n proposals.map(\n ({ record, since }) => `.mason/decisions/${record.id}.json (${age(since)})`,\n ),\n )}.`,\n );\n if (store.diagnostics.length)\n lines.push(\n `${store.diagnostics.length} decision record(s) could not be read; pending knowledge summary is incomplete.`,\n );\n return lines.length\n ? `Mason pending knowledge:\\n${lines.join(\"\\n\")}\\nInformational only; review and commit through the normal project workflow. No approval is implied.`\n : null;\n } catch {\n return \"Mason pending knowledge: unavailable; decision records or Git status could not be read.\";\n }\n}\n","import { loadDecisionStore } from \"../decisions/decisions.js\";\nimport { checkDecisionAnchors } from \"../audit/checks/decision-anchor.js\";\nimport { readAutomationConfig } from \"./config.js\";\nimport {\n observeDecisionEdits,\n decisionStopReview,\n clearResolvedStopReviews,\n} from \"./stop-review.js\";\nimport { observeUsefulness } from \"./usefulness.js\";\nimport { completionFindings, completionSummary, createNotificationState } from \"./notifications.js\";\nimport { profilePhase } from \"../utils/profile.js\";\nimport { withRepositoryInspection } from \"../audit/inspection.js\";\nimport { recordExecution, executionStatus, failureNotifications } from \"./execution.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport {\n withRepairSession,\n reportSchema,\n findingId,\n repairFindingSchema,\n type RepairFinding,\n type RepairVerification,\n} from \"../audit/repair.js\";\nimport { ALL_CHECKS, type AuditReport } from \"../audit/types.js\";\nimport { readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport {\n checkCache,\n git,\n hash,\n readInputs,\n readGuidanceInputs,\n workspace,\n type Inputs,\n} from \"./evidence.js\";\nimport { parseState, withLock, type Event, type Host, type State } from \"./store.js\";\n\nexport interface AutomationEvent {\n event: Event;\n host?: Host;\n sessionId?: string;\n toolId?: string;\n mutating?: boolean;\n retrievedDecisionIds?: string[];\n stopHookActive?: boolean;\n}\nexport interface AutomationReport {\n version: 1;\n status: \"verified\" | \"issues-remain\" | \"incomplete\" | \"unavailable\";\n root: string;\n branch: string;\n head: string;\n baselinePaths: string[];\n reportPath: string;\n findings: RepairFinding[];\n diagnostics: string[];\n checks: {\n ran: string[];\n reused: string[];\n skipped: NonNullable<AuditReport>[\"skippedChecks\"];\n shared?: boolean;\n auditReused?: boolean;\n };\n counts: RepairVerification[\"counts\"];\n capture: \"observed\" | \"unknown\";\n scope: string;\n}\n\nconst SCOPE =\n \"Documentation audit evidence only. Hook receipts show observed events, not complete interception. Resolved findings no longer fail their checks or have a recorded assessment covering current evidence. Repair and review only within the user's task authorization.\";\nconst priority = { resolved: 0, \"review-required\": 1, unresolved: 2, unverified: 3 };\nconst cleanText = (text: string) =>\n text.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \").slice(0, 250);\n\n/** Read tools cannot create repair evidence. Observe their lifecycle without rescanning the checkout. */\nexport async function observeReadOnlyTool(dir: string, event: AutomationEvent) {\n const ws = await profilePhase(\"automation.workspace\", () => workspace(dir));\n await withLock(ws.root, ws.directory, async () => {\n const statePath = ws.directory + \"/state.json\";\n const raw = await readStoreJson(ws.root, statePath);\n if (raw === null) return;\n const state = parseState(raw);\n if (state.root !== ws.root || state.gitDir !== ws.gitDir || state.branch !== ws.branch) {\n throw new Error(\n \"Automation state belongs to another branch or worktree; original evidence was retained.\",\n );\n }\n const session =\n event.host && event.sessionId ? state.sessions[hash([event.host, event.sessionId])] : null;\n if (!session) return;\n const now = new Date().toISOString();\n session.lastUsed = now;\n session.events[event.event] = { at: now, count: (session.events[event.event]?.count ?? 0) + 1 };\n // Do not advance the audit fingerprint, report, or execution verdict: no check ran.\n await writeStoreJson(ws.root, statePath, state);\n });\n return { root: ws.root, directory: ws.directory };\n}\n\nexport function summarize(report: AutomationReport): string {\n const open = report.findings.filter((f) => f.status !== \"resolved\");\n const onlyReview =\n report.status === \"incomplete\" &&\n !report.diagnostics.length &&\n !report.counts.unresolved &&\n !report.counts.unverified &&\n report.counts[\"review-required\"] > 0;\n return [\n onlyReview\n ? `Mason: ${report.counts[\"review-required\"]} advisor${report.counts[\"review-required\"] === 1 ? \"y\" : \"ies\"} awaiting review; no unresolved issues.`\n : `Mason: ${report.status}; ${report.counts.unresolved} unresolved, ${report.counts[\"review-required\"]} need review, ${report.counts.unverified} unverified.`,\n ...open.slice(0, 4).map((f) => {\n const detail = f.current\n ? f.current.message\n : f.status === \"review-required\"\n ? `${f.original.type}: current check no longer reports ${f.original.type === \"deps-changed\" ? \"this condition\" : \"the original finding\"}; historical evidence awaits assessment.`\n : `Original evidence: ${f.original.message}. ${f.reason}`;\n return `[${f.status}] ${cleanText(f.original.anchor.doc)}: ${cleanText(detail)}`;\n }),\n ...(open.length > 4 ? [`${open.length - 4} more findings in the report.`] : []),\n ...report.diagnostics.slice(0, 2).map(cleanText),\n `Evidence: ${report.reportPath}. Resume/check with mason_automation(action: \"check\") or mason check.`,\n \"Keep original evidence. Address findings relevant to the authorized task; report unrelated findings with a brief scope reason and suggested follow-up. Use mason audit review for authorized assessments; otherwise leave advisories open without approving them.\",\n ].join(\"\\n\");\n}\n\ntype Workspace = Awaited<ReturnType<typeof workspace>>;\n\nasync function loadState(ws: Workspace): Promise<State> {\n const raw = await readStoreJson(ws.root, ws.directory + \"/state.json\");\n const state =\n raw === null\n ? {\n version: 1 as const,\n root: ws.root,\n gitDir: ws.gitDir,\n branch: ws.branch,\n baselines: [],\n sessions: {},\n updatedAt: new Date().toISOString(),\n fingerprint: null,\n latest: null,\n }\n : parseState(raw);\n if (state.root !== ws.root || state.gitDir !== ws.gitDir || state.branch !== ws.branch) {\n throw new Error(\n \"Automation state belongs to another branch or worktree; original evidence was retained.\",\n );\n }\n return state;\n}\n\nconst analysisSchema = z.object({\n id: z.string(),\n fingerprint: z.string(),\n completedAt: z.number(),\n baselineDigest: z.string(),\n currentAudit: reportSchema.nullable().optional(),\n report: z.object({\n version: z.literal(1),\n status: z.enum([\"verified\", \"issues-remain\", \"incomplete\", \"unavailable\"]),\n root: z.string(),\n branch: z.string(),\n head: z.string(),\n baselinePaths: z.array(z.string()),\n reportPath: z.string(),\n findings: z.array(repairFindingSchema),\n diagnostics: z.array(z.string()),\n checks: z.object({\n ran: z.array(z.string()),\n reused: z.array(z.string()),\n skipped: z.array(\n z.object({ check: z.string(), reason: z.string(), doc: z.string().optional() }),\n ),\n auditReused: z.boolean().optional(),\n }),\n counts: z.object({\n resolved: z.number(),\n unresolved: z.number(),\n \"review-required\": z.number(),\n unverified: z.number(),\n }),\n capture: z.enum([\"observed\", \"unknown\"]),\n scope: z.string(),\n }),\n});\nconst sharedSchema = z.object({ analysis: analysisSchema, digest: z.string() });\ntype Analysis = z.infer<typeof analysisSchema>;\nconst baselineDigest = async (ws: Workspace, state: State) =>\n profilePhase(\"automation.baselines\", async () =>\n hash(\n await Promise.all(\n state.baselines.map(async (b) => [b.path, await readStoreJson(ws.root, b.path)]),\n ),\n ),\n );\n\nasync function matchingAnalysis(\n ws: Workspace,\n state: State,\n inputs: Inputs,\n): Promise<{ analysis: Analysis | null; diagnostic?: string }> {\n const pointer = state.analysis;\n if (!pointer || pointer.fingerprint !== inputs.fingerprint) return { analysis: null };\n if (pointer.path !== ws.directory + \"/checks/analysis-\" + inputs.fingerprint + \".json\") {\n throw new Error(\"Invalid automation analysis cache path; inspect the retained state.\");\n }\n // This is a derived cache, not original repair evidence. Missing or malformed\n // data can be rebuilt, but storage/permission failures and unsafe paths remain\n // errors. Never discard or replace an original baseline to recover a cache.\n const invalid = {\n analysis: null,\n diagnostic:\n \"Discarded an invalid current-audit cache; audit preparation and original verification were repeated.\",\n };\n let raw: unknown;\n try {\n raw = await readStoreJson(ws.root, pointer.path);\n } catch (error) {\n const cause = (error as Error).cause;\n if (\n cause instanceof SyntaxError ||\n (cause instanceof Error && cause.message === \"expected a JSON object, received null\")\n )\n return invalid;\n throw error;\n }\n if (raw === null) return { analysis: null };\n const parsed = sharedSchema.safeParse(raw);\n if (!parsed.success) return invalid;\n const stored = parsed.data;\n const a = stored.analysis;\n if (\n stored.digest !== hash(a) ||\n a.id !== pointer.id ||\n a.fingerprint !== inputs.fingerprint ||\n a.completedAt !== pointer.completedAt ||\n a.report.root !== ws.root ||\n a.report.branch !== ws.branch ||\n a.report.head !== inputs.head ||\n hash(a.report.baselinePaths) !== hash(state.baselines.map((b) => b.path))\n ) {\n return invalid;\n }\n if (a.baselineDigest !== (await baselineDigest(ws, state)))\n throw new Error(\"Repair baseline was modified; use the original baseline.\");\n return { analysis: a };\n}\n\nasync function verifyInputs(ws: Workspace, inputs: Inputs, guidance = false) {\n return profilePhase(\"automation.revalidate\", () =>\n withRepositoryInspection(ws.root, async () => {\n const [after, currentWs] = await Promise.all([\n guidance ? readGuidanceInputs(ws.root) : readInputs(ws.root),\n workspace(ws.root),\n ]);\n if (after.fingerprint !== inputs.fingerprint || currentWs.directory !== ws.directory) {\n throw new Error(\n \"Repository inputs or branch changed during automation; no current verification was recorded. Retry on a stable checkout.\",\n );\n }\n }),\n );\n}\n\n/** Expensive reads and checks never hold the shared state lock. */\nasync function computeAnalysis(\n ws: Workspace,\n state: State,\n inputs: Inputs,\n event: AutomationEvent,\n previousAudit?: AuditReport | null,\n cacheDiagnostic?: string,\n) {\n const baselines = [...state.baselines];\n const now = new Date().toISOString();\n const empty: AutomationReport = {\n version: 1,\n status: \"unavailable\",\n root: ws.root,\n branch: ws.branch,\n head: inputs.head,\n baselinePaths: [],\n reportPath: \"\",\n findings: [],\n diagnostics: [\n \"No README.md or agent instruction files were discovered. Documentation capture is unavailable; other Mason tools remain usable.\",\n ],\n checks: { ran: [], reused: [], skipped: [] },\n counts: { resolved: 0, unresolved: 0, \"review-required\": 0, unverified: 0 },\n capture: \"unknown\",\n scope: SCOPE,\n };\n if (!baselines.length && Object.values(inputs.docs).every((value) => value === null)) {\n await verifyInputs(ws, inputs);\n return { baselines, report: empty, cache: null };\n }\n if (ws.branch === \"detached\" && state.latest) {\n const previous = (await readStoreJson(ws.root, state.latest)) as AutomationReport | null;\n if (!previous?.head || !/^[a-f0-9]{40,64}$/.test(previous.head))\n throw new Error(\"The previous detached checkout evidence is unavailable.\");\n try {\n await git(ws.root, \"merge-base\", \"--is-ancestor\", previous.head, inputs.head);\n } catch {\n throw new Error(\n \"Detached checkout moved to a different history; original repair evidence was retained. Inspect that baseline explicitly.\",\n );\n }\n }\n let cached: unknown = null;\n const diagnostics: string[] = cacheDiagnostic ? [cacheDiagnostic] : [];\n try {\n cached = await readStoreJson(ws.root, ws.directory + \"/cache.json\");\n } catch {\n diagnostics.push(\"Unreadable automation cache; checks are being recomputed.\");\n }\n const cache = checkCache(cached, inputs);\n if (cache.diagnostic) diagnostics.push(cache.diagnostic);\n // Only complete, validated raw checks can bypass current-audit preparation.\n // Retained history and review outcomes are still evaluated on every invocation.\n const cachedAudit =\n previousAudit?.gitAvailable &&\n previousAudit.headHash === inputs.head &&\n previousAudit.root === ws.root &&\n !previousAudit.skippedChecks.length &&\n ALL_CHECKS.every((name) => previousAudit.checksRun?.includes(name) && cache.has(name))\n ? previousAudit\n : undefined;\n if (cachedAudit) for (const name of ALL_CHECKS) cache.reused.add(name);\n let currentAudit: AuditReport | null = null;\n const verifications = await withRepairSession(\n ws.root,\n cache.options,\n async (repairs) => {\n const saveBaseline = async () => {\n if (baselines.length >= 128)\n throw new Error(\n \"128 retained baselines need review; automatic capture stopped without discarding original evidence.\",\n );\n const prepared = await repairs.prepare();\n baselines.push({\n path: prepared.baselinePath,\n at: now,\n event: event.event,\n fingerprint: inputs.fingerprint,\n });\n };\n if (!baselines.length) await saveBaseline();\n const verifications: RepairVerification[] = [];\n for (const baseline of baselines) verifications.push(await repairs.verify(baseline.path));\n const known = new Set(verifications.flatMap((v) => v.findings.map((f) => f.id)));\n // A clean initial baseline cannot retain findings introduced by a later rename.\n // Preserve those findings now, before another tool can edit or commit the docs.\n if (verifications.some((v) => v.newFindings.some((f) => !known.has(findingId(f))))) {\n await saveBaseline();\n verifications.push(await repairs.verify(baselines.at(-1)!.path));\n }\n currentAudit = await repairs.currentAudit();\n return verifications;\n },\n () => verifyInputs(ws, inputs),\n cachedAudit,\n );\n const merged = new Map<string, RepairFinding>();\n for (const verification of verifications) {\n for (const finding of verification.findings) {\n const previous = merged.get(finding.id);\n if (!previous || priority[finding.status] > priority[previous.status])\n merged.set(finding.id, finding);\n }\n diagnostics.push(...verification.diagnostics);\n }\n\n const counts = { resolved: 0, unresolved: 0, \"review-required\": 0, unverified: 0 };\n for (const finding of merged.values()) counts[finding.status]++;\n const report: AutomationReport = {\n version: 1,\n status:\n diagnostics.length || verifications.some((v) => v.status === \"incomplete\")\n ? \"incomplete\"\n : counts.unresolved\n ? \"issues-remain\"\n : \"verified\",\n root: ws.root,\n branch: ws.branch,\n head: inputs.head,\n baselinePaths: baselines.map((b) => b.path),\n reportPath: \"\",\n findings: [...merged.values()],\n diagnostics: [...new Set(diagnostics)],\n checks: {\n ran: [...cache.ran],\n reused: [...cache.reused].filter((name) => !cache.ran.has(name)),\n skipped: verifications.at(-1)!.currentAudit?.skippedChecks ?? [],\n ...(cachedAudit ? { auditReused: true } : {}),\n },\n counts,\n capture: \"unknown\",\n scope: SCOPE,\n };\n return {\n baselines,\n report,\n currentAudit,\n cache: cache.ran.size || cached === null || cache.diagnostic ? cache.serialize() : null,\n };\n}\n\n/** Per-input coordination shares expensive work; unrelated inputs can be checked concurrently. */\nasync function analyze(ws: Workspace, inputs: Inputs, event: AutomationEvent, startedAt: number) {\n return withLock(\n ws.root,\n ws.directory + \"/analysis/\" + inputs.fingerprint,\n async () => {\n const before = await loadState(ws);\n const { analysis: previous, diagnostic } = await matchingAnalysis(ws, before, inputs);\n // Overlap may share the whole verification. Sequential calls reuse only its\n // current audit: original history and review scopes need fresh inspection.\n if (previous && previous.completedAt >= startedAt)\n return { analysis: previous, shared: true };\n const originalDigest = await baselineDigest(ws, before);\n const computed = await computeAnalysis(\n ws,\n before,\n inputs,\n event,\n previous?.currentAudit as AuditReport | undefined,\n diagnostic,\n );\n if (originalDigest !== (await baselineDigest(ws, before)))\n throw new Error(\n \"Repair baseline was modified during automation; original evidence must be inspected.\",\n );\n const id = randomUUID();\n const analysis = analysisSchema.parse({\n id,\n fingerprint: inputs.fingerprint,\n completedAt: Date.now(),\n baselineDigest: await baselineDigest(ws, { ...before, baselines: computed.baselines }),\n report: computed.report,\n currentAudit: computed.currentAudit,\n });\n const analysisPath = ws.directory + \"/checks/analysis-\" + inputs.fingerprint + \".json\";\n await withLock(ws.root, ws.directory, async () => {\n const state = await loadState(ws);\n // A concurrent check may have retained different original evidence. Never overwrite it.\n if (\n hash(state.baselines) !== hash(before.baselines) ||\n state.analysis?.id !== before.analysis?.id\n ) {\n throw new Error(\n \"Automation evidence changed during analysis; retry against the retained baselines.\",\n );\n }\n await writeStoreJson(ws.root, analysisPath, { analysis, digest: hash(analysis) });\n if (computed.cache)\n await writeStoreJson(ws.root, ws.directory + \"/cache.json\", computed.cache);\n state.baselines = computed.baselines;\n state.analysis = {\n id,\n fingerprint: inputs.fingerprint,\n completedAt: analysis.completedAt,\n path: analysisPath,\n };\n await writeStoreJson(ws.root, ws.directory + \"/state.json\", state);\n });\n return { analysis, shared: false };\n },\n Math.max(0, 25000 - (Date.now() - startedAt)),\n );\n}\n\n/** Current decision evidence uses the same publication/receipt path, without repair baselines. */\nasync function guidanceAnalysis(ws: Workspace, inputs: Inputs) {\n const checked = await checkDecisionAnchors({\n root: ws.root,\n docs: [],\n headHash: inputs.head,\n changesSinceDoc: new Map(),\n decisionsPresent: true,\n });\n const findings: RepairFinding[] = checked.advisories.map((current) => ({\n id: findingId(current),\n original: current,\n current,\n status: \"review-required\",\n reason: \"Current decision anchors changed; inspect their reasoning.\",\n }));\n // Reuse the last guidance receipt for explicit closure; absence alone is not proof.\n const before = await loadState(ws);\n if (before.guidance) {\n const prior = z\n .object({ findings: z.array(repairFindingSchema) })\n .parse(await readStoreJson(ws.root, before.guidance.path)) as { findings: RepairFinding[] };\n const currentIds = new Set(findings.map((finding) => finding.id));\n const records = (await loadDecisionStore(ws.root)).records;\n for (const previous of prior.findings) {\n if (currentIds.has(previous.id) || previous.original.evidence.kind !== \"decision-anchor\")\n continue;\n const evidence = previous.original.evidence;\n const record = records.find((record) => record.id === evidence.decisionId);\n const capture = record && inputs.decisionEvidence[record.id]?.capture;\n const resolved =\n record?.status === \"retired\" ||\n (!!record && !!capture?.complete && capture.anchors.length > 0 && !checked.skipped.length);\n findings.push({\n id: previous.id,\n original: previous.original,\n status: resolved ? \"resolved\" : \"unverified\",\n reason: resolved\n ? \"Current decision evidence no longer reports this drift, or the retained record is retired.\"\n : \"Decision evidence could not establish closure.\",\n });\n }\n }\n const counts = {\n resolved: 0,\n unresolved: 0,\n \"review-required\": 0,\n unverified: checked.skipped.length,\n };\n for (const finding of findings) counts[finding.status]++;\n const report: AutomationReport = {\n version: 1,\n status: counts.unverified || counts[\"review-required\"] ? \"incomplete\" : \"verified\",\n root: ws.root,\n branch: ws.branch,\n head: inputs.head,\n baselinePaths: [],\n reportPath: \"\",\n findings,\n diagnostics: [\n ...checked.skipped.map((item) => item.reason),\n ...findings\n .filter((finding) => finding.status === \"unverified\")\n .map((finding) => `Decision ${finding.id}: ${finding.reason}`),\n ],\n checks: { ran: [\"decision-anchor-drift\"], reused: [], skipped: checked.skipped },\n counts,\n capture: \"unknown\",\n scope:\n \"Decision anchor evidence only. Documentation audits and retained repair baselines were not checked. Source inspection remains separate from human approval.\",\n };\n await verifyInputs(ws, inputs, true);\n return { analysis: { id: \"guidance\", report }, shared: false as const };\n}\n\nexport async function automate(dir: string, event: AutomationEvent) {\n return runAutomation(dir, event, false);\n}\n\nexport async function observeDecisionLifecycle(dir: string, event: AutomationEvent) {\n return runAutomation(dir, event, true);\n}\n\n/** Durable lifecycle: read concurrently, then merge each call into the latest state. */\nasync function runAutomation(dir: string, event: AutomationEvent, guidance: boolean) {\n const startedAt = Date.now();\n const ws = await profilePhase(\"automation.workspace\", () => workspace(dir));\n const config = await readAutomationConfig(ws.root);\n const output = await recordExecution(ws.root, ws.directory, event.event, () =>\n withRepositoryInspection(ws.root, async () => {\n const inputs = await (guidance ? readGuidanceInputs(ws.root) : readInputs(ws.root));\n const result = await profilePhase(\"automation.analysis\", async () =>\n guidance ? await guidanceAnalysis(ws, inputs) : await analyze(ws, inputs, event, startedAt),\n );\n if (!guidance && result.shared) {\n await verifyInputs(ws, inputs);\n if (result.analysis.baselineDigest !== (await baselineDigest(ws, await loadState(ws)))) {\n throw new Error(\n \"Repair baseline was modified during shared automation; original evidence must be inspected.\",\n );\n }\n }\n return profilePhase(\"automation.publish\", () =>\n withLock(ws.root, ws.directory, async () => {\n const state = await loadState(ws);\n if (!guidance && state.analysis?.id !== result.analysis.id)\n throw new Error(\n \"Automation evidence changed during publication; retry against the current inputs.\",\n );\n const report = structuredClone(result.analysis.report) as AutomationReport;\n if (guidance) await verifyInputs(ws, inputs, true);\n if (!state.notifications) {\n // Upgrade from the last retained observation, not a fresh session's state.\n // This keeps changes made since that observation eligible for notification.\n let baseline = { findings: report.findings, head: report.head };\n const previousPath = guidance ? state.guidance?.path : state.latest;\n if (previousPath) {\n try {\n const previous = z\n .object({ findings: z.array(repairFindingSchema), head: z.string() })\n .safeParse(await readStoreJson(ws.root, previousPath));\n if (!previous.success) throw new Error(\"Unsupported saved report\");\n baseline = previous.data as typeof baseline;\n } catch {\n report.diagnostics.push(\n \"The saved notification baseline could not be read; initialized from the current audit. Original repair evidence is retained. Run an explicit check for all outstanding findings.\",\n );\n }\n }\n state.notifications = createNotificationState(baseline.findings, baseline.head);\n }\n if (result.shared)\n report.checks = {\n ...report.checks,\n ran: [],\n reused: [...new Set([...report.checks.ran, ...report.checks.reused])],\n shared: true,\n };\n report.reportPath =\n ws.directory + \"/checks/\" + (guidance ? \"guidance-\" : \"\") + randomUUID() + \".json\";\n const now = new Date().toISOString();\n const key = event.host && event.sessionId ? hash([event.host, event.sessionId]) : null;\n const newSession = key !== null && !state.sessions[key];\n if (key && !state.sessions[key]) {\n const keys = Object.keys(state.sessions).sort((a, b) =>\n state.sessions[a].lastUsed.localeCompare(state.sessions[b].lastUsed),\n );\n // Pending pre-edit captures cannot be evicted by another session's arrival.\n const removable = keys.filter((k) => !Object.keys(state.sessions[k].pending).length);\n for (const expired of removable.slice(0, Math.max(0, keys.length - 31)))\n delete state.sessions[expired];\n if (Object.keys(state.sessions).length >= 128)\n throw new Error(\n \"Too many sessions with unfinished tool calls; original evidence was retained.\",\n );\n state.sessions[key] = {\n host: event.host!,\n notifiedDiagnostics: [],\n lastUsed: now,\n pending: {},\n coverageGaps: [],\n events: {},\n };\n }\n const session = key ? state.sessions[key] : null;\n clearResolvedStopReviews(state.sessions, report);\n if (session) {\n observeDecisionEdits(session, inputs, event);\n session.lastUsed = now;\n session.events[event.event] = {\n at: now,\n count: (session.events[event.event]?.count ?? 0) + 1,\n };\n if (event.event === \"before_tool\" && event.mutating && event.toolId) {\n if (Object.keys(session.pending).length >= 128)\n throw new Error(\"Too many unfinished tool calls to track pre-edit evidence.\");\n session.pending[event.toolId] = inputs.fingerprint;\n }\n if (event.event === \"after_tool\" && event.mutating) {\n if (!event.toolId || !session.pending[event.toolId]) {\n const gap =\n \"A tool completed without an observed matching pre-tool capture in this checkout; pre-edit coverage is unknown. The tool may have changed checkouts; captures are kept separately for each worktree.\";\n if (!session.coverageGaps.includes(gap)) session.coverageGaps.push(gap);\n }\n if (event.toolId) delete session.pending[event.toolId];\n }\n report.diagnostics.push(...session.coverageGaps);\n if (session.coverageGaps.length && report.status !== \"unavailable\")\n report.status = \"incomplete\";\n report.capture =\n report.status !== \"unavailable\" &&\n !session.coverageGaps.length &&\n (session.events.session_start || session.events.before_tool)\n ? \"observed\"\n : \"unknown\";\n }\n // Checks and original repair baselines are independent of conversational output.\n // Potentially mutating tool names do not establish that anything changed.\n const selected =\n session && event.event === \"task_end\"\n ? completionFindings(state.notifications, report.findings)\n : [];\n // Agent delivery and user completion summaries must not consume each other.\n state.agentNotifications ??= { ...structuredClone(state.notifications), delivered: {} };\n const feedback =\n session && [\"turn_start\", \"after_tool\"].includes(event.event)\n ? completionFindings(state.agentNotifications, report.findings)\n : [];\n const diagnostics = session\n ? report.diagnostics.filter((d) => !session.notifiedDiagnostics.includes(d)).slice(0, 2)\n : [];\n if (session)\n session.notifiedDiagnostics = [\n ...new Set([\n ...session.notifiedDiagnostics.filter((d) => report.diagnostics.includes(d)),\n ...diagnostics,\n ]),\n ];\n const stopReview =\n session &&\n event.host === \"claude\" &&\n event.event === \"task_end\" &&\n config.stopBlock === \"drift\"\n ? decisionStopReview(session, inputs, report, !!event.stopHookActive)\n : { reason: null, block: false };\n const message = !session\n ? summarize(report)\n : [\n stopReview.reason,\n completionSummary(selected, report.reportPath),\n completionSummary(feedback, report.reportPath),\n ...(diagnostics.length\n ? [\n `Mason: verification limited. ${diagnostics.slice(0, 2).map(cleanText).join(\" \")} Evidence: ${report.reportPath}.`,\n ]\n : []),\n ]\n .filter(Boolean)\n .join(\"\\n\") || null;\n const notify = message !== null;\n // Completion notices are advisory; no automatic retry/repair loop.\n const previousPath = guidance ? state.guidance?.path : state.latest;\n const previousFingerprint = guidance ? state.guidance?.fingerprint : state.fingerprint;\n const persistReport =\n !previousPath ||\n previousFingerprint !== inputs.fingerprint ||\n notify ||\n newSession ||\n event.event === \"task_end\";\n if (!persistReport) report.reportPath = previousPath!;\n state.updatedAt = now;\n if (guidance)\n state.guidance = { fingerprint: inputs.fingerprint, path: report.reportPath };\n else {\n state.fingerprint = inputs.fingerprint;\n state.latest = report.reportPath;\n }\n if (persistReport) await writeStoreJson(ws.root, report.reportPath, report);\n await writeStoreJson(ws.root, ws.directory + \"/state.json\", state);\n return {\n report,\n message,\n stopBlockReason: stopReview.block ? stopReview.reason : null,\n observedAt: now,\n delivery: { agent: feedback.slice(0, 4), completion: selected.slice(0, 4) },\n };\n }),\n );\n }),\n );\n try {\n await observeUsefulness(\n ws.root,\n event,\n output.report,\n output.delivery.agent,\n output.delivery.completion,\n Date.now() - startedAt,\n output.observedAt,\n );\n } catch {\n // Optional observations must never suppress the audit result or existing feedback.\n if (event.event === \"task_end\")\n output.message = [\n output.message,\n \"Mason: local usefulness tracking unavailable; inspect mason stats --json.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n return output;\n}\n\n/** Read-only inspection: configured hooks and observed runtime events are different facts. */\nexport async function automationStatus(dir: string) {\n const { pendingKnowledge } = await import(\"../decisions/pending.js\");\n const ws = await profilePhase(\"automation.workspace\", () => workspace(dir));\n const config = await readAutomationConfig(ws.root);\n const knowledge = await pendingKnowledge(ws.root);\n const execution = await executionStatus(ws.root, ws.directory);\n const notifications = await failureNotifications(ws.root, ws.directory);\n const raw = await readStoreJson(ws.root, ws.directory + \"/state.json\");\n if (raw === null)\n return {\n version: 1,\n stopBlock: config.stopBlock,\n status: execution.status === \"not-observed\" ? \"not-observed\" : \"unavailable\",\n root: ws.root,\n branch: ws.branch,\n baselinePaths: [],\n scope: \"not-observed\",\n auditReportPath: null,\n hosts: {},\n execution,\n notifications,\n knowledge,\n };\n const state = parseState(raw);\n if (state.root !== ws.root || state.gitDir !== ws.gitDir || state.branch !== ws.branch)\n throw new Error(\"Automation state belongs to another workspace.\");\n const inputs = await (state.guidance ? readGuidanceInputs(ws.root) : readInputs(ws.root));\n const reportPath = state.guidance?.path ?? state.latest;\n const latest = reportPath\n ? ((await readStoreJson(ws.root, reportPath!)) as AutomationReport | null)\n : null;\n const hosts: Record<string, { sessions: number; observedEvents: string[] }> = {};\n for (const session of Object.values(state.sessions)) {\n const host = (hosts[session.host] ??= { sessions: 0, observedEvents: [] });\n host.sessions++;\n host.observedEvents = [...new Set([...host.observedEvents, ...Object.keys(session.events)])];\n }\n const unfinished = [\"failed\", \"unknown\", \"running\"].includes(execution.status);\n return {\n version: 1,\n stopBlock: config.stopBlock,\n status: unfinished\n ? \"unavailable\"\n : inputs.fingerprint === (state.guidance?.fingerprint ?? state.fingerprint)\n ? \"current\"\n : \"changed\",\n root: ws.root,\n branch: ws.branch,\n baselinePaths: state.baselines.map((b) => b.path),\n reportPath,\n scope: state.guidance ? \"decision-guidance\" : \"documentation-audit\",\n auditReportPath: state.latest,\n verificationStatus: unfinished ? \"unavailable\" : (latest?.status ?? \"unavailable\"),\n hosts,\n execution,\n notifications,\n knowledge,\n notificationBaselineHead: state.notifications?.baselineHead ?? null,\n note: \"Status describes the reported scope only. Decision guidance does not verify documentation repairs. Observed events do not prove all tool paths are intercepted. Run mason check for retained audit evidence.\",\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { git } from \"./evidence.js\";\nimport type { Host } from \"./store.js\";\n\nasync function repositoryRoot(dir: string): Promise<string | null> {\n if (!path.isAbsolute(dir)) throw new Error(\"Hook input working directory must be absolute.\");\n try {\n return await fs.realpath((await git(dir, \"rev-parse\", \"--show-toplevel\")).trim());\n } catch (error) {\n if (\n (error as NodeJS.ErrnoException).code === \"ENOENT\" ||\n /not a git repository/.test(String((error as { stderr?: string }).stderr))\n )\n return null;\n throw error;\n }\n}\n\n/** The host payload follows directory/worktree changes; the launch directory may not. */\nexport async function resolveHookRoot(\n host: Host,\n cwd: string,\n options: {\n launchCwd?: string;\n projectDir?: string;\n } = {},\n): Promise<string> {\n const current = await repositoryRoot(cwd);\n if (current) return current;\n const projectDir =\n options.projectDir ?? (host === \"claude\" ? process.env.CLAUDE_PROJECT_DIR : undefined);\n const projectRoot = projectDir ? await repositoryRoot(projectDir) : null;\n if (projectDir && !projectRoot)\n throw new Error(\n \"Hook input is outside Git and the host project is no longer a Git repository. Restore its history before running mason check.\",\n );\n const launchRoot = await repositoryRoot(options.launchCwd ?? process.cwd());\n const roots = [\n ...new Set([launchRoot, projectRoot].filter((root): root is string => root !== null)),\n ];\n if (!roots.length)\n throw new Error(\n \"Hook input is outside a Git repository and no project root is available. Return to the project and run mason check.\",\n );\n if (roots.length > 1)\n throw new Error(\n \"Hook input is outside a Git repository and project roots disagree. Return to the intended checkout and run mason check; verification was not established.\",\n );\n // CLAUDE_PROJECT_DIR stays at the original checkout after EnterWorktree.\n // Without a current repository, it cannot distinguish those checkouts.\n const worktrees = (await git(roots[0], \"worktree\", \"list\", \"--porcelain\", \"-z\"))\n .split(\"\\0\")\n .filter((field) => field.startsWith(\"worktree \"));\n if (worktrees.length !== 1)\n throw new Error(\n \"Hook input is outside a Git repository with multiple worktrees. Return to the intended worktree and run mason check; the active checkout is unknown.\",\n );\n return roots[0];\n}\n","import { z } from \"zod\";\nimport { isStringArray } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { loadDecisionStore } from \"../decisions/decisions.js\";\nimport { decisionAnchors, decisionKnowledge, DECISION_GUIDANCE } from \"../decisions/provenance.js\";\nimport { anchorMatches } from \"../utils/paths.js\";\nimport { createHash } from \"node:crypto\";\nimport type { Freshness } from \"../context/trust.js\";\nimport type { DecisionRecord } from \"../decisions/decisions.js\";\nimport { computeDecisionDrift, type DecisionDriftReport } from \"../decisions/drift.js\";\n\n/** More than a few constraints per fire is noise, not context. */\nconst MAX_INJECTED_DECISIONS = 3;\n/** Walk-up bound when locating the Mason root from an edited file. */\nconst MAX_WALK_UP = 30;\n\nconst SUPPORTED_TOOLS = new Set([\"Read\", \"Edit\", \"Write\"]);\n\nexport interface HookStdin {\n session_id?: string;\n agent_id?: string;\n cwd?: string;\n hook_event_name?: string;\n tool_name?: string;\n tool_input?: { file_path?: string };\n}\n\nconst hookStdinSchema = z.object({\n session_id: z.string().optional(),\n agent_id: z.string().optional(),\n cwd: z.string().optional(),\n hook_event_name: z.string().optional(),\n tool_name: z.string().optional(),\n tool_input: z.object({ file_path: z.string().optional() }).optional(),\n});\n\nexport interface HookEnv {\n /** Override for tests; defaults to os.tmpdir(). */\n stateDir?: string;\n /** Standard lifecycle integration confines delivery to its active checkout. */\n rootDir?: string;\n /** Standalone hooks retain PostToolUse; the lifecycle adapter can deliver before edits. */\n hookEventName?: \"PreToolUse\" | \"PostToolUse\";\n}\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Locate the nearest ancestor holding a .mason/decisions store. Stops at the\n * first .git boundary — a repo without Mason must stay silent, not borrow a\n * parent directory's decisions.\n */\nasync function findMasonRoot(startDir: string): Promise<string | null> {\n let dir = startDir;\n for (let i = 0; i < MAX_WALK_UP; i++) {\n if (await exists(path.join(dir, \".mason\", \"decisions\"))) return dir;\n if (await exists(path.join(dir, \".git\"))) return null;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\nfunction anchorsCover(record: DecisionRecord, relPath: string): boolean {\n return decisionAnchors(record).some((anchor) => anchorMatches(anchor, relPath));\n}\n\nfunction exactAnchor(record: DecisionRecord, relPath: string): boolean {\n return decisionAnchors(record).some((a) => a.replace(/\\/+$/, \"\") === relPath);\n}\n\nfunction stateKey(input: HookStdin): string {\n const raw = `${input.session_id ?? \"nosession\"}${input.agent_id ? `-${input.agent_id}` : \"\"}`;\n return raw.replace(/[^A-Za-z0-9_-]/g, \"\").slice(0, 120) || \"nosession\";\n}\n\nasync function loadInjected(stateFile: string): Promise<Set<string>> {\n try {\n const parsed: unknown = JSON.parse(await fs.readFile(stateFile, \"utf-8\"));\n return new Set(isStringArray(parsed) ? parsed : []);\n } catch {\n return new Set();\n }\n}\n\nfunction formatContext(\n relPath: string,\n records: DecisionRecord[],\n drift: DecisionDriftReport,\n): string {\n const lines: string[] = [];\n lines.push(\n `Mason: decision knowledge relevant to ${relPath} or updated since this session saw it. This replaces earlier guidance for the same decision id. ${DECISION_GUIDANCE} Retired or superseded records are no longer active. Use Mason tools to record decision changes and source inspections; do not edit the JSON in .mason/decisions/ directly.`,\n );\n const append = (\n id: string,\n knowledge: ReturnType<typeof decisionKnowledge>,\n label: string,\n freshness: Freshness,\n ) => {\n const stale =\n freshness === \"current\"\n ? \"\"\n : freshness === \"changed\"\n ? \" [recorded against changed files – verify against current code before relying on it]\"\n : \" [freshness unknown – verify against current code before relying on it]\";\n lines.push(\n `- [${label}] [${knowledge.category}] ${knowledge.title}: ${knowledge.body} (id: ${id}; revision: ${knowledge.revision}; anchors: ${knowledge.files.join(\", \")}; owner: ${knowledge.owner ?? \"unknown\"}; sources: ${\n knowledge.sources\n .slice(0, 2)\n .map((s) => s.reference)\n .join(\", \") || \"unrecorded\"\n })${stale}`,\n );\n };\n for (const record of records) {\n const knowledge = decisionKnowledge(\n record,\n drift.freshness?.[record.id] ?? \"unknown\",\n drift.pendingProposals?.[record.id]?.freshness ?? \"unknown\",\n );\n append(\n record.id,\n knowledge,\n record.status === \"active\" ? knowledge.approval : record.status,\n knowledge.trust.freshness,\n );\n if (knowledge.pendingProposal)\n append(\n record.id,\n knowledge.pendingProposal,\n \"proposed\",\n knowledge.pendingProposal.trust.freshness,\n );\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * The push half of Mason's memory: when an agent touches a file that a\n * decision record anchors, the record is injected into the session via the\n * PostToolUse hook contract — deterministically, without relying on the\n * model deciding to ask. Returns the hook's stdout JSON, or null for\n * \"stay silent\" (no store, no match, already injected, malformed input —\n * a hook must never disrupt the session).\n */\nexport async function runHook(stdinText: string, env: HookEnv = {}): Promise<string | null> {\n let input: HookStdin;\n try {\n input = hookStdinSchema.parse(JSON.parse(stdinText));\n } catch {\n return null;\n }\n\n if (!input || typeof input !== \"object\") return null;\n if (input.tool_name && !SUPPORTED_TOOLS.has(input.tool_name)) return null;\n const filePath = input.tool_input?.file_path;\n if (!filePath || typeof filePath !== \"string\") return null;\n\n const absPath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(input.cwd ?? process.cwd(), filePath);\n const root = await findMasonRoot(path.dirname(absPath));\n if (!root) return null;\n if (env.rootDir && (await fs.realpath(root)) !== (await fs.realpath(env.rootDir))) return null;\n const relPath = path.relative(root, absPath).split(path.sep).join(\"/\");\n if (relPath.startsWith(\"..\")) return null;\n\n const { records } = await loadDecisionStore(root);\n\n const stateDir = env.stateDir ?? os.tmpdir();\n const stateFile = path.join(\n stateDir,\n `mason-hook-${createHash(\"sha256\").update(root).digest(\"hex\").slice(0, 12)}-${stateKey(input)}.json`,\n );\n const injected = await loadInjected(stateFile);\n const recordKey = (record: DecisionRecord) =>\n `${record.id}:${createHash(\"sha256\").update(JSON.stringify(record)).digest(\"hex\")}`;\n const previouslyInjected = (record: DecisionRecord) =>\n [...injected].some((key) => key === record.id || key.startsWith(`${record.id}:`));\n // Re-inject revised/accepted records and withdraw previously injected records\n // that were retired during this session. Untouched archived records stay dark.\n // Also update previously seen records after their anchors move. Otherwise an\n // acceptance or retirement could leave obsolete guidance in the session.\n const fresh = records.filter(\n (r) =>\n !injected.has(recordKey(r)) &&\n (previouslyInjected(r) || (r.status === \"active\" && anchorsCover(r, relPath))),\n );\n if (fresh.length === 0) return null;\n\n // Exact-file anchors outrank directory-prefix ones; newest knowledge wins ties.\n fresh.sort((a, b) => {\n const withdrawn = Number(b.status !== \"active\") - Number(a.status !== \"active\");\n if (withdrawn) return withdrawn;\n const exactDiff = Number(exactAnchor(b, relPath)) - Number(exactAnchor(a, relPath));\n if (exactDiff !== 0) return exactDiff;\n return b.updatedAt.localeCompare(a.updatedAt);\n });\n const selected = fresh.slice(0, MAX_INJECTED_DECISIONS);\n\n const drift = await computeDecisionDrift(root, selected);\n\n for (const record of selected) injected.add(recordKey(record));\n try {\n await fs.writeFile(stateFile, JSON.stringify([...injected]), \"utf-8\");\n } catch {\n // Dedupe state is a convenience; losing it must not block injection.\n }\n\n return JSON.stringify({\n hookSpecificOutput: {\n hookEventName: env.hookEventName ?? \"PostToolUse\",\n additionalContext: formatContext(relPath, selected, drift),\n },\n });\n}\n","import { z } from \"zod\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { git } from \"../automation/evidence.js\";\nimport { readStoreJson } from \"../utils/storage.js\";\n\nexport const setupHostSchema = z.object({\n configuredVersion: z.string(),\n revision: z.string().uuid(),\n fingerprint: z.string(),\n mcpFingerprint: z.string(),\n instructions: z.array(z.string()),\n});\nexport const setupSchema = z.object({\n version: z.literal(2),\n hosts: z.object({\n codex: setupHostSchema.optional(),\n claude: setupHostSchema.optional(),\n }),\n});\nexport const SETUP_PATH = \".mason/local/setup.json\";\nexport const INACTIVE_HOSTS_PATH = \".mason/local/inactive-hosts.json\";\nexport const inactiveHostsSchema = z.object({\n version: z.literal(1),\n hosts: z.array(z.enum([\"claude\", \"codex\"])),\n});\nexport type SetupConfig = z.infer<typeof setupSchema>;\nexport async function loadSetup(root: string): Promise<SetupConfig | null> {\n const raw = await readStoreJson(root, SETUP_PATH);\n if (raw === null) return null;\n return setupSchema.parse(raw);\n}\n\n/** Share activation with linked worktrees, never their audit evidence or ownership. */\nexport async function effectiveSetup(\n root: string,\n): Promise<{ root: string; setup: SetupConfig | null }> {\n const local = await loadSetup(root);\n // Even an empty local record is authoritative (including after teardown).\n if (local) return { root, setup: local };\n const common = await fs.realpath(\n path.resolve(root, (await git(root, \"rev-parse\", \"--git-common-dir\")).trim()),\n );\n const own = await fs.realpath((await git(root, \"rev-parse\", \"--absolute-git-dir\")).trim());\n if (common === own) return { root, setup: null };\n // Git's first worktree identifies the primary checkout. Bare repositories\n // have no primary checkout from which to inherit activation.\n const primary = (await git(root, \"worktree\", \"list\", \"--porcelain\", \"-z\"))\n .split(\"\\0\\0\")[0]\n .split(\"\\0\");\n const candidate = primary.find((field) => field.startsWith(\"worktree \"))?.slice(9);\n if (!candidate || primary.includes(\"bare\")) return { root, setup: null };\n let inheritedRoot: string;\n try {\n inheritedRoot = await fs.realpath(\n (await git(candidate, \"rev-parse\", \"--show-toplevel\")).trim(),\n );\n } catch (error) {\n // --separate-git-dir may list only the metadata directory, with no recorded\n // checkout location. Do not infer a sibling or search unrelated directories.\n if (/must be run in a work tree/.test(String((error as { stderr?: string }).stderr)))\n return { root, setup: null };\n throw error;\n }\n const inheritedCommon = await fs.realpath(\n path.resolve(inheritedRoot, (await git(inheritedRoot, \"rev-parse\", \"--git-common-dir\")).trim()),\n );\n if (inheritedCommon !== common)\n throw new Error(\"Linked worktree setup does not belong to the same Git repository.\");\n const setup = await loadSetup(inheritedRoot);\n const inactive = await readStoreJson(root, INACTIVE_HOSTS_PATH);\n if (inactive && setup)\n for (const host of inactiveHostsSchema.parse(inactive).hosts) delete setup.hosts[host];\n return { root: inheritedRoot, setup };\n}\n\nconst receiptSchema = z.object({\n version: z.literal(1),\n host: z.enum([\"codex\", \"claude\"]),\n status: z.enum([\"installing\", \"configured\"]),\n initialReportPath: z.string().optional(),\n initialBaselinePaths: z.array(z.string()).optional(),\n root: z.string(),\n revision: z.string().uuid(),\n configuredAt: z.string().optional(),\n});\nexport async function loadSetupReceipt(root: string, directory: string, host: \"codex\" | \"claude\") {\n const raw = await readStoreJson(root, directory + \"/setup-\" + host + \".json\");\n if (raw === null) return null;\n const receipt = receiptSchema.parse(raw);\n if (receipt.root !== root || receipt.host !== host)\n throw new Error(\"Setup receipt belongs to another installation.\");\n return receipt;\n}\n","import { z } from \"zod\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport fs from \"node:fs/promises\";\nimport type { Host } from \"../automation/store.js\";\nimport { git } from \"../automation/evidence.js\";\nimport { effectiveSetup } from \"./model.js\";\n\ndeclare const PKG_VERSION: string;\nexport const executingVersion = () =>\n typeof PKG_VERSION === \"string\" ? PKG_VERSION : \"development\";\n\n// Windows needs cmd to launch both npm's and the standalone installer's .cmd shim.\nexport function globalCommand(args: string[], platform = process.platform) {\n return platform === \"win32\"\n ? { command: \"cmd.exe\", args: [\"/d\", \"/s\", \"/c\", \"mason\", ...args] }\n : { command: \"mason\", args };\n}\nexport const mcpCommand = (host: Host) => globalCommand([\"--setup-host\", host, \"mcp\"]);\nexport const hookCommand = (host: Host) => `mason --setup-host ${host}`;\n\n/** Probe the same PATH command the host will use; never download during setup. */\nexport async function installedCommand() {\n const invocation = globalCommand([\"internal-integration-version\"]);\n try {\n const { stdout } = await promisify(execFile)(invocation.command, invocation.args, {\n timeout: 5000,\n maxBuffer: 8192,\n windowsHide: true,\n });\n const result = z\n .object({ protocol: z.literal(1), version: z.string() })\n .parse(JSON.parse(stdout));\n if (result.protocol !== 1 || typeof result.version !== \"string\")\n throw new Error(\"Unsupported Mason integration protocol.\");\n return { available: true, version: result.version, message: null };\n } catch {\n return {\n available: false,\n version: null,\n message:\n \"An up-to-date mason command is not available on this process's PATH. Install or upgrade Mason, then reopen your terminal or desktop assistant and rerun mason setup.\",\n };\n }\n}\n\n/** Replaces the environment previously supplied by generated project launchers. */\nexport async function prepareLaunch(\n host: Host,\n options: { dir?: string; allowInactive?: boolean } = {},\n) {\n const root = await fs.realpath(\n (await git(options.dir ?? process.cwd(), \"rev-parse\", \"--show-toplevel\")).trim(),\n );\n const entry = (await effectiveSetup(root)).setup?.hosts[host];\n process.env.MASON_SETUP_ROOT = root;\n process.env.MASON_SETUP_HOST = host;\n delete process.env.MASON_SETUP_REVISION;\n if (!entry) {\n if (options.allowInactive) return false;\n throw new Error(\n `Mason is not configured locally for ${host}. Run mason setup --host ${host} in this checkout.`,\n );\n }\n process.env.MASON_SETUP_REVISION = entry.revision;\n return true;\n}\n\nexport function inactiveSetupMessage(): string | null {\n const host = process.env.MASON_SETUP_HOST;\n if (\n !process.env.MASON_SETUP_ROOT ||\n process.env.MASON_SETUP_REVISION ||\n (host !== \"claude\" && host !== \"codex\")\n )\n return null;\n return `Mason MCP is available, but automatic hooks are inactive in ${process.env.MASON_SETUP_ROOT}. Run mason setup --host ${host} in that checkout, review the host configuration, then restart the assistant. Setup has not been performed automatically.`;\n}\n","import fs from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport { hash, workspace } from \"../automation/evidence.js\";\nimport { withLock, events, type Host } from \"../automation/store.js\";\nimport { readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport { effectiveSetup } from \"./model.js\";\nimport { executingVersion, inactiveSetupMessage } from \"./launcher.js\";\n\nconst observationSchema = z.object({\n version: z.literal(1),\n masonVersion: z.string(),\n root: z.string(),\n revision: z.string(),\n host: z.enum([\"codex\", \"claude\"]),\n contextCalls: z.number().int().nonnegative(),\n lastContextAt: z.string().optional(),\n sessions: z.record(\n z.object({\n events: z.array(z.enum(events)),\n at: z.string(),\n verificationStatus: z.string().optional(),\n reportPath: z.string().optional(),\n }),\n ),\n});\nexport type Observation = z.infer<typeof observationSchema>;\nexport function observationPath(\n directory: string,\n host: Host,\n revision: string,\n version = executingVersion(),\n) {\n return `${directory}/activation/${host}-${revision}-${hash(version).slice(0, 12)}.json`;\n}\n\nexport async function readObservation(\n root: string,\n directory: string,\n host: Host,\n revision: string,\n version = executingVersion(),\n): Promise<Observation | null> {\n const raw = await readStoreJson(root, observationPath(directory, host, revision, version));\n if (raw === null) return null;\n const record = observationSchema.parse(raw);\n if (\n record.root !== root ||\n record.host !== host ||\n record.revision !== revision ||\n record.masonVersion !== version\n )\n throw new Error(\"Activation receipt belongs to another installation.\");\n return record;\n}\n\n/** Only the configured Mason invocation supplies these values. Never persist task text or tool arguments. */\nexport async function observeActivation(\n dir: string,\n event: \"context\" | (typeof events)[number],\n options: {\n sessionId?: string;\n verificationStatus?: string;\n reportPath?: string;\n directory?: string;\n } = {},\n): Promise<string | null> {\n const host = process.env.MASON_SETUP_HOST,\n revision = process.env.MASON_SETUP_REVISION;\n if ((host !== \"codex\" && host !== \"claude\") || !process.env.MASON_SETUP_ROOT) return null;\n try {\n if (!revision) {\n if ((await effectiveSetup(process.env.MASON_SETUP_ROOT)).setup?.hosts[host]) {\n return \"Mason setup is now present. Restart the assistant to connect this MCP session to the configured integration; activation has not been established by this session.\";\n }\n return inactiveSetupMessage();\n }\n const capturedDirectory =\n options.directory?.match(/^\\.mason\\/reports\\/automation\\/[a-f0-9]{24}$/)?.[0] ??\n options.reportPath?.match(/^(\\.mason\\/reports\\/automation\\/[a-f0-9]{24})\\/checks\\//)?.[1];\n const ws = capturedDirectory\n ? { root: await fs.realpath(dir), directory: capturedDirectory }\n : await workspace(dir);\n if (ws.root !== (await fs.realpath(process.env.MASON_SETUP_ROOT))) return null;\n const { setup } = await effectiveSetup(ws.root);\n if (setup?.hosts[host]?.revision !== revision)\n return \"Mason setup changed; restart the assistant to observe the current integration.\";\n const directory = ws.directory + \"/activation\";\n await withLock(ws.root, directory, async () => {\n const now = new Date().toISOString();\n const record =\n (await readObservation(ws.root, ws.directory, host, revision)) ??\n ({\n version: 1,\n masonVersion: executingVersion(),\n root: ws.root,\n revision,\n host,\n contextCalls: 0,\n sessions: {},\n } satisfies Observation);\n if (event === \"context\") {\n record.contextCalls++;\n record.lastContextAt = now;\n } else if (options.sessionId) {\n const key = hash(options.sessionId);\n const session = record.sessions[key] ?? { events: [], at: now };\n // Repeated tool observations add no activation evidence; avoid another write.\n if (event !== \"task_end\" && session.events.includes(event)) return;\n session.events = [...new Set([...session.events, event])];\n session.at = now;\n if (event === \"task_end\") {\n session.verificationStatus = options.verificationStatus;\n session.reportPath = options.reportPath;\n }\n record.sessions[key] = session;\n const ordered = Object.entries(record.sessions).sort(([, a], [, b]) =>\n b.at.localeCompare(a.at),\n );\n record.sessions = Object.fromEntries(ordered.slice(0, 32));\n } else return;\n await writeStoreJson(ws.root, observationPath(ws.directory, host, revision), record);\n });\n return null;\n } catch (error) {\n return (\n \"Mason activation observation could not be saved; activation coverage is unknown. \" +\n (error instanceof Error ? error.message : String(error))\n .replace(/[\\u0000-\\u001f\\u007f]/g, \" \")\n .slice(0, 300)\n );\n }\n}\n","import { retrievedDecisions } from \"./usefulness.js\";\nimport { failureMessage, hookFailureMessage } from \"./execution.js\";\nimport { z } from \"zod\";\nimport { observeDecisionLifecycle, observeReadOnlyTool, type AutomationEvent } from \"./runtime.js\";\nimport { hostSchema, type Host } from \"./store.js\";\nimport { resolveHookRoot } from \"./hook-root.js\";\nimport { runHook } from \"../hook/hook.js\";\n\nconst inputSchema = z.object({\n cwd: z.string().min(1),\n session_id: z.string().min(1).max(500),\n hook_event_name: z.enum([\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"Stop\",\n ]),\n tool_name: z.string().optional(),\n tool_use_id: z.string().max(500).optional(),\n tool_response: z.unknown().optional(),\n tool_input: z.unknown().optional(),\n stop_hook_active: z.boolean().optional(),\n permission_mode: z.string().optional(),\n});\nconst lifecycle: Record<z.infer<typeof inputSchema>[\"hook_event_name\"], AutomationEvent[\"event\"]> =\n {\n SessionStart: \"session_start\",\n UserPromptSubmit: \"turn_start\",\n PreToolUse: \"before_tool\",\n PostToolUse: \"after_tool\",\n Stop: \"task_end\",\n };\n\n/** Reuse the existing file-scoped injector; never infer file targets from shell text. */\nasync function decisionContext(host: Host, raw: unknown, root: string): Promise<string | null> {\n const input = inputSchema.parse(raw);\n if (\n host !== \"claude\" ||\n !(\n (input.hook_event_name === \"PostToolUse\" && input.tool_name === \"Read\") ||\n (input.hook_event_name === \"PreToolUse\" && [\"Edit\", \"Write\"].includes(input.tool_name ?? \"\"))\n )\n )\n return null;\n try {\n const output = await runHook(JSON.stringify(raw), {\n rootDir: root,\n hookEventName: input.hook_event_name,\n });\n if (!output) return null;\n const parsed: unknown = JSON.parse(output);\n return z\n .object({ hookSpecificOutput: z.object({ additionalContext: z.string() }) })\n .parse(parsed).hookSpecificOutput.additionalContext;\n } catch (error) {\n // Delivery failure must not discard a guidance notice or an activation diagnostic.\n return failureMessage(error) + \" Decision knowledge was not delivered.\";\n }\n}\n\n/** Shell and unknown/MCP tools are conservatively observed: edits need not use a file editor. */\nexport function normalizeHook(\n host: Host,\n raw: unknown,\n): { cwd: string; name: string; readOnly: boolean; event: AutomationEvent } {\n hostSchema.parse(host);\n const input = inputSchema.parse(raw);\n const readOnly = (\n host === \"claude\"\n ? /^(Read|Glob|Grep|WebSearch|WebFetch)$/\n : /^(read_file|list_dir|grep_files|Read|Glob|Grep)$/\n ).test(input.tool_name ?? \"\");\n return {\n cwd: input.cwd,\n name: input.hook_event_name,\n readOnly,\n event: {\n event: lifecycle[input.hook_event_name],\n host,\n sessionId: input.session_id,\n toolId: input.tool_use_id,\n stopHookActive: input.stop_hook_active,\n mutating: !!input.tool_name && !readOnly,\n ...(input.hook_event_name === \"PostToolUse\"\n ? { retrievedDecisionIds: retrievedDecisions(input.tool_name, input.tool_response) }\n : {}),\n },\n };\n}\n\nexport async function runAutomationHook(\n host: Host,\n stdin: string,\n options: { managed?: boolean } = {},\n): Promise<Record<string, unknown> | null> {\n let name = \"\";\n let hook: ReturnType<typeof normalizeHook> | undefined;\n try {\n if (Buffer.byteLength(stdin) > 1024 * 1024) throw new Error(\"Hook input exceeds 1 MiB.\");\n let raw: unknown;\n try {\n raw = JSON.parse(stdin);\n } catch {\n throw new Error(\"Hook input is not valid JSON.\");\n }\n const input = normalizeHook(host, raw);\n hook = input;\n name = input.name;\n if (options.managed) {\n input.cwd = await resolveHookRoot(host, input.cwd);\n const { prepareLaunch } = await import(\"../setup/launcher.js\");\n if (!(await prepareLaunch(host, { dir: input.cwd, allowInactive: true }))) return null;\n }\n if ([\"before_tool\", \"after_tool\"].includes(input.event.event) && input.readOnly) {\n const observed = await observeReadOnlyTool(input.cwd, input.event);\n const { observeActivation } = await import(\"../setup/observations.js\");\n const warning = await observeActivation(observed.root, input.event.event, {\n sessionId: input.event.sessionId,\n directory: observed.directory,\n });\n const knowledge = await decisionContext(host, raw, observed.root);\n return knowledge\n ? {\n ...(warning ? { systemMessage: warning } : {}),\n hookSpecificOutput: { hookEventName: name, additionalContext: knowledge },\n }\n : warning\n ? { systemMessage: warning }\n : null;\n }\n const result = await observeDecisionLifecycle(input.cwd, input.event);\n const { observeActivation } = await import(\"../setup/observations.js\");\n const warning = await observeActivation(result.report.root, input.event.event, {\n sessionId: input.event.sessionId,\n verificationStatus: result.report.status,\n reportPath: result.report.reportPath,\n });\n if (warning) result.message = [result.message, warning].filter(Boolean).join(\"\\n\");\n const knowledge = await decisionContext(host, raw, result.report.root);\n if (knowledge) result.message = [result.message, knowledge].filter(Boolean).join(\"\\n\\n\");\n if (name === \"Stop\" && result.stopBlockReason) {\n return { decision: \"block\", reason: result.message ?? result.stopBlockReason };\n }\n if (!result.message) return null;\n if (name === \"Stop\") {\n // Re-entry remains advisory; delivery does not resolve the finding.\n return { systemMessage: result.message };\n }\n return { hookSpecificOutput: { hookEventName: name, additionalContext: result.message } };\n } catch (error) {\n const message = hook\n ? await hookFailureMessage(hook.cwd, host, hook.event.sessionId!, error)\n : failureMessage(error);\n if (!message) return null;\n // Hook failure is visible but does not turn guidance into an editing permission gate.\n return {\n systemMessage: message,\n ...([\"SessionStart\", \"UserPromptSubmit\", \"PreToolUse\", \"PostToolUse\"].includes(name)\n ? { hookSpecificOutput: { hookEventName: name, additionalContext: message } }\n : {}),\n };\n }\n}\n\nexport const HOOK_EVENTS = [\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"Stop\",\n] as const;\n/** Only guard Mason's generated launch, never interpret a custom command prefix. */\nexport function managedHookCommand(host: Host, platform = process.platform, legacy = false) {\n const command = `mason --setup-host ${host}${legacy ? \" auto\" : \"\"} hook --host ${host}`;\n return platform === \"win32\"\n ? `cmd.exe /d /s /c \"where mason >nul 2>nul & if errorlevel 1 (exit /b 0) else (${command})\"`\n : `if command -v mason >/dev/null 2>&1; then ${command}; fi`;\n}\nexport function knownManagedHookCommands(host: Host) {\n return [\n \"npx --no-install --package mason-context mason auto hook --host \" + host,\n \"npx --no-install --package mason-context mason hook --host \" + host,\n managedHookCommand(host, \"linux\"),\n managedHookCommand(host, \"win32\"),\n managedHookCommand(host, \"linux\", true),\n managedHookCommand(host, \"win32\", true),\n `mason --setup-host ${host} hook --host ${host}`,\n `mason --setup-host ${host} auto hook --host ${host}`,\n ];\n}\n/** Migration recognizes both platforms; runtime compatibility is platform-specific. */\nexport function compatibleManagedHookCommands(host: Host, platform = process.platform) {\n return [\n managedHookCommand(host, platform),\n managedHookCommand(host, platform, true),\n `mason --setup-host ${host} hook --host ${host}`,\n `mason --setup-host ${host} auto hook --host ${host}`,\n ];\n}\nexport function hookConfig(host: Host, command = \"npx --no-install --package mason-context mason\") {\n const handler = {\n type: \"command\",\n command: [`mason --setup-host ${host}`, `mason --setup-host ${host} auto`].includes(command)\n ? managedHookCommand(host)\n : command + \" hook --host \" + host,\n timeout: 30,\n };\n return {\n hooks: Object.fromEntries(\n HOOK_EVENTS.map((name) => [\n name,\n [\n {\n ...([\"PreToolUse\", \"PostToolUse\"].includes(name) ? { matcher: \".*\" } : {}),\n hooks: [{ ...handler }],\n },\n ],\n ]),\n ),\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { readBoundedFile } from \"../utils/files.js\";\nimport { storePath } from \"../utils/storage.js\";\n\nexport interface FileEdit {\n path: string;\n before: string | null;\n after: string;\n}\nexport interface RemovalEdit {\n path: string;\n before: string | null;\n after: null;\n}\nexport async function readText(root: string, file: string): Promise<string | null> {\n try {\n const text = await readBoundedFile(await storePath(root, file), 2 * 1024 * 1024);\n if (text === null)\n throw new Error(\"Setup input is not a regular file or exceeds 2 MiB: \" + file);\n return text;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\n/** Preserve all bytes outside one unambiguous managed block. */\nexport function managedBlock(text: string, start: string, end: string, body: string): string {\n const starts = text.split(start).length - 1,\n ends = text.split(end).length - 1;\n if (starts !== ends || starts > 1 || (starts === 1 && text.indexOf(end) < text.indexOf(start))) {\n throw new Error(\n \"Ambiguous Mason instruction/configuration markers; repair the marked block before setup.\",\n );\n }\n const eol = text.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const block = [start, body.replace(/\\r?\\n/g, eol), end].join(eol);\n if (starts)\n return text.slice(0, text.indexOf(start)) + block + text.slice(text.indexOf(end) + end.length);\n return (\n text + (text.length && !text.endsWith(\"\\n\") ? eol : \"\") + (text.length ? eol : \"\") + block + eol\n );\n}\n\n/** Compare before replacing or removing: retain a user's concurrent edit. */\nexport async function applyEdit(root: string, edit: FileEdit | RemovalEdit): Promise<boolean> {\n const current = await readText(root, edit.path);\n if (current === edit.after) return false;\n if (current !== edit.before)\n throw new Error(\n \"Integration input changed during update: \" +\n edit.path +\n \". Rerun the requested command to resume.\",\n );\n if (edit.after === null) {\n const file = await storePath(root, edit.path);\n if ((await readText(root, edit.path)) !== edit.before)\n throw new Error(\"Input changed during removal: \" + edit.path);\n await fs.unlink(file);\n return true;\n }\n const file = await storePath(root, edit.path, true);\n const temporary = path.join(path.dirname(file), \".mason-setup-\" + randomUUID() + \".tmp\");\n try {\n const mode = await fs.stat(file).then(\n (s) => s.mode & 0o777,\n () => 0o600,\n );\n const handle = await fs.open(temporary, \"wx\", mode);\n try {\n await handle.writeFile(edit.after, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n if ((await readText(root, edit.path)) !== edit.before)\n throw new Error(\"Integration input changed during update: \" + edit.path);\n await fs.rename(temporary, file);\n return true;\n } finally {\n await fs.rm(temporary, { force: true });\n }\n}\n","import { z } from \"zod\";\nimport { parse } from \"smol-toml\";\nimport { hash } from \"../automation/evidence.js\";\nimport { readText, type FileEdit } from \"./files.js\";\n\nexport const OWNERSHIP_PATH = \".mason/local/integration.json\";\nexport const BLOCKS = [\n [\"<!-- mason:start -->\", \"<!-- mason:end -->\"],\n [\"<!-- mason:agents:start -->\", \"<!-- mason:agents:end -->\"],\n [\"# mason:mcp:start\", \"# mason:mcp:end\"],\n] as const;\nconst fileSchema = z.object({\n created: z.boolean(),\n initialHash: z.string(),\n blocks: z.record(z.string()),\n mcpHash: z.string().optional(),\n hookCommands: z.array(z.string()).optional(),\n hooks: z.record(z.array(z.string())).optional(),\n});\nexport const ownershipSchema = z.object({ version: z.literal(1), files: z.record(fileSchema) });\nexport type Ownership = z.infer<typeof ownershipSchema>;\n\nexport function blockSpan(text: string, start: string, end: string) {\n const starts = text.split(start).length - 1,\n ends = text.split(end).length - 1;\n if (!starts && !ends) return null;\n const from = text.indexOf(start),\n to = text.indexOf(end) + end.length;\n if (starts !== 1 || ends !== 1 || to <= from)\n throw new Error(\"Ambiguous Mason markers; inspect the marked block manually.\");\n return { from, to, text: text.slice(from, to) };\n}\n\n/** Persist ownership before shared edits so interrupted setup remains removable. */\nexport async function ownershipEdit(\n root: string,\n edits: FileEdit[],\n hookCommands: Record<string, string> = {},\n): Promise<FileEdit> {\n const before = await readText(root, OWNERSHIP_PATH);\n const record: Ownership =\n before === null ? { version: 1, files: {} } : ownershipSchema.parse(JSON.parse(before));\n for (const edit of edits) {\n const previous = record.files[edit.path];\n const entry = {\n created: edit.before === null || (previous?.created ?? false),\n initialHash:\n edit.before === null || previous?.initialHash === hash(edit.before)\n ? hash(edit.after)\n : (previous?.initialHash ?? hash(edit.after)),\n blocks: Object.fromEntries(\n BLOCKS.flatMap(([start, end]) => {\n const block = blockSpan(edit.after, start, end);\n return block ? [[start, hash(block.text)]] : [];\n }),\n ),\n };\n const hostConfig: unknown = edit.path.endsWith(\".json\") ? JSON.parse(edit.after) : undefined;\n const parsedHost = z\n .object({\n mcpServers: z.record(z.unknown()).optional(),\n hooks: z.record(z.array(z.object({ hooks: z.array(z.unknown()) }))).optional(),\n })\n .parse(hostConfig ?? {});\n const mcp =\n edit.path === \".codex/config.toml\"\n ? (parse(edit.after).mcp_servers as Record<string, unknown>)?.mason\n : edit.path === \".mcp.json\"\n ? parsedHost.mcpServers?.mason\n : undefined;\n const hooks =\n edit.path === \".codex/hooks.json\" || edit.path === \".claude/settings.json\"\n ? parsedHost.hooks\n : undefined;\n record.files[edit.path] = {\n ...entry,\n ...(mcp === undefined ? {} : { mcpHash: hash(mcp) }),\n ...(hookCommands[edit.path]\n ? {\n hookCommands: [\n ...new Set([...(previous?.hookCommands ?? []), hookCommands[edit.path]]),\n ],\n }\n : {}),\n ...(hooks === undefined\n ? {}\n : {\n hooks: Object.fromEntries(\n Object.entries(hooks).map(([event, groups]) => [\n event,\n groups.flatMap((group) => group.hooks.map(hash)),\n ]),\n ),\n }),\n };\n }\n return { path: OWNERSHIP_PATH, before, after: JSON.stringify(record, null, 2) + \"\\n\" };\n}\n\n/** Forget earlier commands only after their replacement and installation record were saved. */\nexport async function completedHookOwnership(\n root: string,\n file: string,\n command: string,\n): Promise<FileEdit> {\n const before = await readText(root, OWNERSHIP_PATH);\n const record = ownershipSchema.parse(JSON.parse(before ?? \"null\"));\n record.files[file].hookCommands = [command];\n return { path: OWNERSHIP_PATH, before, after: JSON.stringify(record, null, 2) + \"\\n\" };\n}\n","import { z } from \"zod\";\nimport { readStoreJson } from \"../utils/storage.js\";\nimport { applyEdit, readText, type FileEdit } from \"../setup/files.js\";\n\nexport interface ProjectMarker {\n version: 1;\n initializedAt: string;\n features?: Record<string, unknown>;\n}\n\nconst markerSchema = z\n .object({\n version: z.literal(1),\n initializedAt: z.string(),\n features: z.record(z.unknown()).optional(),\n })\n .passthrough();\n\nexport async function loadProjectMarker(rootDir: string): Promise<ProjectMarker | null> {\n const raw = await readStoreJson(rootDir, \".mason/local/project.json\");\n if (raw === null) return null;\n const marker = markerSchema.parse(raw);\n return { ...marker, features: await loadProjectFeatures(rootDir) };\n}\n\nexport async function loadProjectFeatures(rootDir: string) {\n const config = z\n .record(z.unknown())\n .parse((await readStoreJson(rootDir, \".mason/config.json\")) ?? {});\n return z.record(z.unknown()).parse(config.features ?? {});\n}\n\nexport async function saveProjectMarker(rootDir: string, marker: ProjectMarker): Promise<void> {\n const { ancillaryEdits } = await import(\"../setup/config.js\");\n for (const edit of [\n ...(await ancillaryEdits(rootDir)),\n ...(await projectMarkerEdits(rootDir, marker)),\n ])\n await applyEdit(rootDir, edit);\n}\n\nasync function projectMarkerEdits(rootDir: string, marker: ProjectMarker): Promise<FileEdit[]> {\n const { features, ...local } = markerSchema.parse(marker);\n const file = \".mason/local/project.json\";\n const edits = [\n {\n path: file,\n before: await readText(rootDir, file),\n after: JSON.stringify(local, null, 2) + \"\\n\",\n },\n ];\n if (features && Object.keys(features).length) {\n const configPath = \".mason/config.json\",\n before = await readText(rootDir, configPath);\n const config = z.record(z.unknown()).parse(JSON.parse(before ?? \"{}\"));\n config.features = { ...z.record(z.unknown()).parse(config.features ?? {}), ...features };\n edits.push({ path: configPath, before, after: JSON.stringify(config, null, 2) + \"\\n\" });\n }\n return edits;\n}\n\n/** Marker-delimited project instructions make the tools useful in later sessions. */\nexport const CLAUDE_MD_SECTION = `<!-- mason:start -->\n## Mason project knowledge\n\nMason provides recorded decisions and file impact over MCP. A concept map is optional.\n\n- Task, bug, change request, or investigation of why the project works this way → \\`get_context\\` with the task text and known files: matching decisions, related tests, impact, and any available map entries.\n- Before editing a file → \\`get_impact\\` to check references, tests, and historical change partners.\n- Investigation or correction reveals a reusable project lesson → \\`save_decision\\` as soon as the lesson is supported by evidence; do not wait for implementation, task completion, or merge. Record the established observation now and identify unimplemented remedies as tentative. Capture only the lasting constraint and reason, with anchors and known sources, owner, and recorder. This creates a proposal; never infer approval. Preserve uncertain causes and unknown attribution. Route project lessons here; keep personal preferences in agent memory. Skip code summaries, current checkout status, temporary task permissions, session trivia, and secrets. No qualifying lesson means no record.\n- Before saving, compare the lesson with matching \\`get_context\\` records and any pending proposal. If new evidence changes the same lesson's assumptions, scope, or recommended action, revise it with \\`save_decision(id: existingId)\\`, including when it is accepted. Preserve supported rationale and sources, replace obsolete instructions, and add the new evidence. Create a separate record for a genuinely distinct lesson; skip unchanged restatements. Revision preserves history and leaves the accepted version operative until authorized review.\n- Consult trust metadata before relying on entries: unknown or changed freshness requires inspection, stale or unknown map verification requires a fresh evidence review, and a recorded failed verdict means the description must be corrected. Check approval too: proposals are suggestions, legacy records are unreviewed, and accepted decisions are recorded constraints subject to freshness checks. An accepted revision remains operative while a pending proposal is reviewed; keep both versions and their freshness distinct.\n- Asked to review pending project knowledge → \\`mason_automation(action: \"status\")\\` lists pending proposals and uncommitted records. For ordinary tasks, inspect matching proposals through \\`get_context\\`; do not request acceptance merely because a proposal exists.\n- Asked to review or re-verify a decision → \\`review_decision\\` first to inspect content, sources, history, and code changes. To inspect accepted guidance separately, use inspectionScope \\`operative\\` on both preparation and inspection; a pending draft remains visible and unassessed. Default all scope covers both revisions. After source inspection finds no contradiction in the selected scope, record action \\`inspect\\` with the actual inspector, note, and prepared token; this does not claim human approval. Record acceptance, reaffirmation, or retirement only when authorized by the user or a cited team review, with the actual reviewer and reason. Never infer approval from unchanged code. Review and commit the local record through the normal project workflow.\n- Use \\`mason status\\` or \\`mason_automation(action: \"status\")\\` to inspect configuration and observed use. Lifecycle hooks check decision anchors and surface guidance; changed anchors request inspection and do not prove the rationale obsolete.\n- Audits and repair verification are explicit workflows. Run \\`mason audit --help\\` or \\`mason check\\` when that work is requested; setup does not perform an audit or prepare repairs.\n\nInspect source for what the retrieved context does not answer.\n<!-- mason:end -->`;\n\nexport type InitMode = \"quickstart\" | \"init\" | \"setup\";\n\nconst ASSISTANT_SETUP = `UNIFIED SETUP\nWhen the user requests Mason setup, call mason_init again with mode: \"setup\" and host: \"codex\" or \"claude\" for the assistant being configured. Default setup validates existing shared configuration and writes local activation state only. To explicitly prepare or update shared configuration for review and commit, use mode: \"init\" (CLI: mason init); dryRun: true previews without writes. Initialization does not activate the checkout. This uses the same engine as mason init: use the installed mason command on PATH, merge project MCP configuration and hooks, update marker-delimited instructions and Git ignore rules, and record setup. A concept map is optional.\nIf the user only requested inspection or review, report findings without running setup. The setup result distinguishes configured from observed activation. Explain the host's native trust step and request a new session; never trust hooks on the user's behalf or claim activation from generated configuration alone. After a normal task finishes, mason_automation(action: \"status\") or mason status reports observed context use and hook events. Existing findings remain reviewable; setup does not approve advisories or manufacture decisions.\n\nThe managed project guidance is:\n${CLAUDE_MD_SECTION}`;\n\nconst QUICKSTART_PLAYBOOK = `Start with the audit and review results included in this response. No concept map is required.\n\n1. Explain the actionable findings with their source evidence. Separate audit issues, advisories, and skipped checks. The review covers committed changes from the merge base to HEAD; workingTree paths are not included in that review. An unavailable or empty check is not proof that the project is correct. Use the CLI for full output if a summary is truncated.\n2. Address findings within the user's requested scope. Initialization prepares shared configuration; setup only activates existing configuration locally; rewriting existing project claims requires repair scope. If repair is authorized, run \\`mason audit --prepare-repair --json\\` before editing; it saves the full original findings even when this summary is truncated. Inspect relevant source, make grounded edits, then run \\`mason audit --verify-repair <baselinePath> --json\\` with that same baseline, including after any final doc commit. Report resolved, unresolved, review-required, unverified, and new findings. Keep suppressed advisories visible even when initialization has already edited an instruction file. Do not invent a decision just to populate the store.\n3. Capture a supported lesson as soon as it is established; do not wait for implementation, task completion, or merge. Keep unimplemented remedies tentative. When the task reveals a real lesson or constraint, compare matching \\`get_context\\` records first. If its assumptions, scope, or recommended action changed, revise that record using \\`save_decision(id: existingId)\\`; create a separate record for a genuinely distinct lesson and skip unchanged restatements. Include title, body, category, anchors, and known owner/source/actor information. Preserve supported rationale and sources, replace obsolete instructions, and add new evidence. Missing attribution can be added later. The tool writes a local proposal; editing it preserves revision history and requires a new acceptance, while any earlier accepted revision remains operative. An unchanged save never refreshes its evidence. When decision review is requested, \\`review_decision\\` prepares the record and code evidence before any authorized verdict. Review and commit records through the normal workflow. Retrieve it on the next relevant task with \\`get_context(dir, task, files)\\`.\n\n${ASSISTANT_SETUP}\n\nOPTIONAL ARCHITECTURE MAP\nExisting maps remain readable for legacy projects. Managed map creation has been removed; use the agent's own source tools for architecture investigations.`;\n\nexport function setupPlaybook(): string {\n return QUICKSTART_PLAYBOOK;\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport { parse, stringify } from \"smol-toml\";\nimport { z } from \"zod\";\nimport { CLAUDE_MD_SECTION } from \"../mcp/init.js\";\nimport { DOC_CANDIDATES } from \"../audit/docs.js\";\nimport { hookConfig, compatibleManagedHookCommands } from \"../automation/adapters.js\";\nimport { configPath, automationConfigSchema, AUTOMATION_PATH } from \"../automation/install.js\";\nimport type { Host } from \"../automation/store.js\";\nimport { readText, managedBlock, type FileEdit } from \"./files.js\";\nimport { hookCommand, mcpCommand } from \"./launcher.js\";\n\nconst object = z.record(z.unknown());\nexport const mcpPath = (host: Host) => (host === \"codex\" ? \".codex/config.toml\" : \".mcp.json\");\nconst TOML_START = \"# mason:mcp:start\",\n TOML_END = \"# mason:mcp:end\";\nconst POINTER_START = \"<!-- mason:agents:start -->\",\n POINTER_END = \"<!-- mason:agents:end -->\";\nexport async function instructionEdits(root: string, host?: Host) {\n const found = await Promise.all(\n DOC_CANDIDATES.map(async (file) => ({ path: file, text: await readText(root, file) })),\n );\n const existing = found.find((f) => f.text !== null);\n const primary =\n host === \"codex\" && found[0].text === null\n ? { path: \"AGENTS.md\", text: null }\n : (existing ?? { path: \"AGENTS.md\", text: null });\n const originalGuidance =\n primary.text === null && existing\n ? \"Follow the existing project conventions in \" + existing.path + \".\\n\"\n : \"\";\n const edits: FileEdit[] = [\n {\n path: primary.path,\n before: primary.text,\n after: managedBlock(\n primary.text ?? originalGuidance,\n \"<!-- mason:start -->\",\n \"<!-- mason:end -->\",\n CLAUDE_MD_SECTION.split(\"\\n\").slice(1, -1).join(\"\\n\"),\n ),\n },\n ];\n if (primary.path === \"AGENTS.md\") {\n const secondary = found.filter((f) => f.path !== \"AGENTS.md\" && f.text !== null);\n if (host === \"claude\" && !secondary.length) secondary.push({ path: \"CLAUDE.md\", text: null });\n for (const file of secondary) {\n const text = file.text ?? \"\";\n const legacy = text.includes(\"<!-- mason:start -->\") || text.includes(\"<!-- mason:end -->\");\n const imported = \"@\" + (file.path.startsWith(\".claude/\") ? \"../AGENTS.md\" : \"AGENTS.md\");\n if (text.trim() === imported) continue;\n // Claude expands native imports at session start; a prose mention does not load the guidance.\n const pointer = \"Mason project knowledge and shared project instructions:\\n\" + imported;\n edits.push({\n path: file.path,\n before: file.text,\n after: managedBlock(\n text,\n legacy ? \"<!-- mason:start -->\" : POINTER_START,\n legacy ? \"<!-- mason:end -->\" : POINTER_END,\n pointer,\n ),\n });\n }\n }\n return edits;\n}\n\n/** Retain host options and environment; replace only transport/launch details. */\nfunction managedMcp(previous: unknown, host: Host) {\n const options = previous === undefined ? {} : object.parse(previous);\n for (const key of [\n \"command\",\n \"args\",\n \"url\",\n \"type\",\n \"headers\",\n \"http_headers\",\n \"env_http_headers\",\n \"bearer_token_env_var\",\n ])\n delete options[key];\n return { ...options, ...(host === \"claude\" ? { type: \"stdio\" } : {}), ...mcpCommand(host) };\n}\n\nexport async function mcpEdit(root: string, host: Host): Promise<FileEdit> {\n const file = mcpPath(host),\n before = await readText(root, file);\n if (host === \"claude\") {\n const config = before === null ? {} : object.parse(JSON.parse(before));\n const servers = object.parse(config.mcpServers ?? {});\n // Mason owns only its named server; other servers and settings retain their values.\n return {\n path: file,\n before,\n after:\n JSON.stringify(\n { ...config, mcpServers: { ...servers, mason: managedMcp(servers.mason, host) } },\n null,\n 2,\n ) + \"\\n\",\n };\n }\n const config = parse(before ?? \"\");\n const managed = (before ?? \"\").includes(TOML_START);\n const servers = config.mcp_servers as Record<string, unknown> | undefined;\n const desired = managedMcp(servers?.mason, host);\n let base = before ?? \"\";\n if (servers?.mason && !managed) {\n // Migrate ordinary explicit tables without reserializing the rest of TOML.\n // Validate the whole semantic result afterwards, including multiline strings.\n const headers = [...base.matchAll(/^\\s*\\[\\[?.+?\\]\\]?[^\\S\\r\\n]*(?:#.*)?$/gm)];\n const spans = headers.flatMap((header, index) =>\n /^\\s*\\[mcp_servers\\.mason(?:\\.[A-Za-z0-9_-]+)*\\]/.test(header[0])\n ? [{ start: header.index!, end: headers[index + 1]?.index ?? base.length }]\n : [],\n );\n if (!spans.length)\n throw new Error(\n \"Cannot safely migrate the existing Mason MCP TOML entry. Use an explicit [mcp_servers.mason] table and rerun setup; the file was retained.\",\n );\n for (const span of spans.reverse()) base = base.slice(0, span.start) + base.slice(span.end);\n }\n const after = managedBlock(\n base,\n TOML_START,\n TOML_END,\n stringify({ mcp_servers: { mason: desired } }).trimEnd(),\n );\n const parsed = parse(after);\n const expected = { ...config, mcp_servers: { ...(servers ?? {}), mason: desired } };\n if (!isDeepStrictEqual(parsed, expected))\n throw new Error(\n \"Could not safely configure the Mason MCP entry without changing other settings.\",\n );\n return { path: file, before, after };\n}\n\nexport async function hookEdits(root: string, host: Host): Promise<FileEdit[]> {\n const file = configPath(host),\n before = await readText(root, file);\n const { planAutomationInstall } = await import(\"../automation/install.js\");\n const plan = await planAutomationInstall(root, host, hookCommand(host));\n return [\n { path: file, before, after: JSON.stringify(plan.config, null, 2) + \"\\n\" },\n {\n path: AUTOMATION_PATH,\n before: await readText(root, AUTOMATION_PATH),\n after: JSON.stringify(plan.record, null, 2) + \"\\n\",\n },\n ];\n}\n\nexport async function ancillaryEdits(root: string) {\n const ignore = await readText(root, \".gitignore\");\n const rules = [\n \"!/.mason/\",\n \"/.mason/*\",\n \"!/.mason/decisions/\",\n \"!/.mason/decisions/**\",\n \"!/.mason/reviews/\",\n \"!/.mason/reviews/**\",\n \"!/.mason/config.json\",\n \"!/.mason/snapshot.json\",\n \"/.mason/local/\",\n \"/.mason/reports/\",\n ].join(\"\\n\");\n return [\n {\n path: \".gitignore\",\n before: ignore,\n after: managedBlock(ignore ?? \"\", \"# mason:ignore:start\", \"# mason:ignore:end\", rules),\n },\n ];\n}\n\nexport async function inspectHostConfig(root: string, host: Host, plannedMcp?: string) {\n const text = plannedMcp ?? (await readText(root, mcpPath(host)));\n const config = host === \"codex\" ? parse(text ?? \"\") : object.parse(JSON.parse(text ?? \"{}\"));\n const servers = (host === \"codex\" ? config.mcp_servers : config.mcpServers) as\n Record<string, unknown> | undefined;\n const hooks = automationConfigSchema.parse(\n JSON.parse((await readText(root, configPath(host))) ?? \"{}\"),\n );\n const expected = hookConfig(host, hookCommand(host));\n const compatible = compatibleManagedHookCommands(host);\n const mcp = servers?.mason === undefined ? null : object.parse(servers.mason);\n return {\n mcp,\n mcpDisabled: mcp?.enabled === false,\n hooks: Object.fromEntries(\n Object.keys(expected.hooks).map((event) => [\n event,\n (hooks.hooks?.[event] ?? []).flatMap(\n (group) =>\n group.hooks\n .filter((handler) => compatible.includes(handler.command ?? \"\"))\n .map((handler) => ({ ...group, hooks: [handler] })) ?? [],\n ),\n ]),\n ),\n disabled:\n hooks.disableAllHooks === true ||\n (config.features as Record<string, unknown> | undefined)?.hooks === false ||\n (config.features as Record<string, unknown> | undefined)?.codex_hooks === false,\n };\n}\n\n/** Runtime compatibility is independent of the current generated template. */\nexport async function inspectIntegration(root: string, host: Host) {\n const config = await inspectHostConfig(root, host);\n const instructions = await instructionEdits(root, host);\n const primary = instructions[0]?.before ?? \"\";\n const { blockSpan } = await import(\"./ownership.js\");\n const block = blockSpan(primary, \"<!-- mason:start -->\", \"<!-- mason:end -->\");\n const instructionCompatible =\n !!block &&\n [\"get_context\", \"save_decision\", \"review_decision\"].every((tool) =>\n block.text.includes(tool),\n ) &&\n instructions.slice(1).every((edit) => {\n const imported = edit.path.startsWith(\".claude/\") ? \"@../AGENTS.md\" : \"@AGENTS.md\";\n return (edit.before ?? \"\").split(/\\r?\\n/).some((line) => line.trim() === imported);\n });\n const expectedHooks = hookConfig(host, hookCommand(host)).hooks;\n const normalizedHooks = Object.fromEntries(\n Object.entries(config.hooks).map(([event, groups]) => [\n event,\n groups.map((group) => ({\n ...group,\n hooks: group.hooks.map((handler) => ({\n ...handler,\n command: expectedHooks.SessionStart[0].hooks[0].command,\n })),\n })),\n ]),\n );\n const mcpCompatible =\n isDeepStrictEqual({ command: config.mcp?.command, args: config.mcp?.args }, mcpCommand(host)) &&\n (config.mcp?.type === undefined || config.mcp.type === \"stdio\");\n const hooksCompatible = isDeepStrictEqual(normalizedHooks, expectedHooks);\n return {\n ...config,\n instructions,\n instructionCompatible,\n instructionsCurrent: instructions.every((edit) => edit.before === edit.after),\n mcpCompatible,\n hooksCompatible,\n hooksCurrent: isDeepStrictEqual(config.hooks, expectedHooks),\n compatible: instructionCompatible && mcpCompatible && hooksCompatible,\n };\n}\n","import { z } from \"zod\";\nimport { readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport { workspace } from \"./evidence.js\";\nimport { HOOK_EVENTS, hookConfig, knownManagedHookCommands } from \"./adapters.js\";\nimport { withLock, type Host } from \"./store.js\";\nimport { readText } from \"../setup/files.js\";\nimport { OWNERSHIP_PATH, ownershipSchema } from \"../setup/ownership.js\";\n\nconst groupSchema = z\n .object({\n hooks: z.array(z.object({ type: z.string(), command: z.string().optional() }).passthrough()),\n })\n .passthrough();\nexport const automationConfigSchema = z\n .object({ hooks: z.record(z.array(groupSchema)).optional() })\n .passthrough();\nexport const recordSchema = z.object({\n version: z.literal(1),\n hosts: z.record(z.object({ command: z.string() })),\n});\nexport const AUTOMATION_PATH = \".mason/local/automation.json\";\nasync function installationRecord(root: string) {\n return recordSchema.parse(\n (await readStoreJson(root, AUTOMATION_PATH)) ?? { version: 1, hosts: {} },\n );\n}\nexport const configPath = (host: Host) =>\n host === \"claude\" ? \".claude/settings.json\" : \".codex/hooks.json\";\n\n/** Explicit install preserves other settings and hooks, replacing only Mason's recorded handlers. */\nexport async function installAutomation(dir: string, host: Host, command?: string) {\n const ws = await workspace(dir);\n return withLock(ws.root, \".mason/reports/setup-lock\", () =>\n installLocked(ws.root, host, command),\n );\n}\n\nexport async function planAutomationInstall(root: string, host: Host, command?: string) {\n const file = configPath(host);\n const before = await readText(root, file);\n const existing = automationConfigSchema.parse(JSON.parse(before ?? \"{}\"));\n const record = await installationRecord(root);\n const desired = hookConfig(host, command);\n const newCommand = desired.hooks.SessionStart[0].hooks[0].command;\n const previous = record.hosts[host]?.command;\n const ownershipText = await readText(root, OWNERSHIP_PATH);\n const pending =\n ownershipText === null\n ? []\n : (ownershipSchema.parse(JSON.parse(ownershipText)).files[file]?.hookCommands ?? []);\n // A clone has shared hooks but no local ownership receipt.\n const owned = new Set([previous, ...pending, newCommand, ...knownManagedHookCommands(host)]);\n const hooks = existing.hooks ?? {};\n for (const event of HOOK_EVENTS) {\n hooks[event] = (hooks[event] ?? [])\n .map((group) => ({\n ...group,\n hooks: group.hooks.filter(\n (handler) =>\n !(\n handler.type === \"command\" &&\n typeof handler.command === \"string\" &&\n owned.has(handler.command)\n ),\n ),\n }))\n .filter((group) => group.hooks.length);\n hooks[event].push(...desired.hooks[event]);\n }\n record.hosts[host] = { command: newCommand };\n return { file, before, config: { ...existing, hooks }, record, newCommand };\n}\n\nasync function installLocked(root: string, host: Host, command?: string) {\n const { file, before, config, record, newCommand } = await planAutomationInstall(\n root,\n host,\n command,\n );\n const { ancillaryEdits } = await import(\"../setup/config.js\");\n const { applyEdit } = await import(\"../setup/files.js\");\n const { ownershipEdit, completedHookOwnership } = await import(\"../setup/ownership.js\");\n const edit = { path: file, before, after: JSON.stringify(config, null, 2) + \"\\n\" };\n const ancillary = await ancillaryEdits(root);\n await applyEdit(root, await ownershipEdit(root, [edit], { [file]: newCommand }));\n for (const edit of ancillary) await applyEdit(root, edit);\n await applyEdit(root, edit);\n // Keep the previous command until its replacement is installed. Ownership\n // records the pending command so teardown/reinstallation can resume either side.\n await writeStoreJson(root, AUTOMATION_PATH, record);\n await applyEdit(root, await completedHookOwnership(root, file, newCommand));\n return {\n version: 1,\n host,\n configPath: file,\n status: \"configured\",\n command: newCommand,\n events: HOOK_EVENTS,\n next:\n host === \"codex\"\n ? \"Review/trust these hooks using Codex /hooks and start a new session. mason status reports observed events separately from configuration.\"\n : \"Start a new Claude Code session. mason status reports observed events separately from configuration.\",\n note: \"Install mason-context in the project before using the default command. Ignore .mason/reports/ to keep local evidence out of commits. Hooks preserve evidence and suggest scoped repairs; they do not approve edits or decisions.\",\n };\n}\n\nexport async function installedAutomation(dir: string) {\n const ws = await workspace(dir);\n const record = await installationRecord(ws.root);\n const result: Record<string, unknown> = {};\n for (const host of [\"claude\", \"codex\"] as const) {\n const expected = record.hosts[host];\n if (!expected) continue;\n const current = automationConfigSchema.parse(\n (await readStoreJson(ws.root, configPath(host))) ?? {},\n );\n const configuredEvents = HOOK_EVENTS.filter((event) =>\n current.hooks?.[event]?.some((group) =>\n group.hooks.some(\n (handler) => handler.type === \"command\" && handler.command === expected.command,\n ),\n ),\n );\n result[host] = {\n configPath: configPath(host),\n configuredEvents,\n status:\n current.disableAllHooks === true\n ? \"disabled\"\n : configuredEvents.length === HOOK_EVENTS.length\n ? \"configured\"\n : \"incomplete\",\n runtime:\n \"Host version, trust, policy, and tool coverage still determine execution; inspect observed events.\",\n };\n }\n return result;\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse, stringify } from \"smol-toml\";\nimport fg from \"fast-glob\";\nimport { z } from \"zod\";\nimport { git, hash, workspace } from \"../automation/evidence.js\";\nimport { withLock, type Host } from \"../automation/store.js\";\nimport {\n AUTOMATION_PATH,\n automationConfigSchema,\n configPath,\n recordSchema,\n} from \"../automation/install.js\";\nimport { hookConfig, knownManagedHookCommands } from \"../automation/adapters.js\";\nimport { DOC_CANDIDATES } from \"../audit/docs.js\";\nimport { CLAUDE_MD_SECTION } from \"../mcp/init.js\";\nimport { applyEdit, managedBlock, readText, type FileEdit, type RemovalEdit } from \"./files.js\";\nimport { mcpPath } from \"./config.js\";\nimport { hookCommand, mcpCommand } from \"./launcher.js\";\nimport {\n loadSetupReceipt,\n SETUP_PATH,\n setupSchema,\n INACTIVE_HOSTS_PATH,\n inactiveHostsSchema,\n} from \"./model.js\";\nimport { BLOCKS, blockSpan, OWNERSHIP_PATH, ownershipSchema, type Ownership } from \"./ownership.js\";\n\ntype Edit = FileEdit | RemovalEdit;\nconst hosts = [\"codex\", \"claude\"] as const;\nconst object = z.record(z.unknown());\nconst json = (value: unknown) => JSON.stringify(value, null, 2) + \"\\n\";\n\nasync function planProjectTeardown(root: string, selected: readonly Host[]) {\n const edits: Edit[] = [],\n diagnostics: Array<{ path: string; message: string }> = [];\n const inputs = new Map<string, string | null>();\n const read = async (file: string) => {\n if (!inputs.has(file)) inputs.set(file, await readText(root, file));\n return inputs.get(file)!;\n };\n const attempt = async (file: string, action: () => Promise<void>) => {\n try {\n await action();\n } catch (error) {\n diagnostics.push({\n path: file,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n };\n // Invalid local ownership is not a license to guess. Fail before any edits.\n const ownershipBefore = await read(OWNERSHIP_PATH);\n const ownership: Ownership =\n ownershipBefore === null\n ? { version: 1, files: {} }\n : ownershipSchema.parse(JSON.parse(ownershipBefore));\n const setupBefore = await read(SETUP_PATH);\n const setup = setupBefore === null ? null : setupSchema.parse(JSON.parse(setupBefore));\n const linked =\n (await workspace(root)).gitDir !==\n (await fs.realpath(\n path.resolve(root, (await git(root, \"rev-parse\", \"--git-common-dir\")).trim()),\n ));\n const inactiveBefore = linked && !setup ? await read(INACTIVE_HOSTS_PATH) : null;\n const inactive =\n inactiveBefore === null\n ? { version: 1 as const, hosts: [] as Host[] }\n : inactiveHostsSchema.parse(JSON.parse(inactiveBefore));\n const automationBefore = await read(AUTOMATION_PATH);\n const automation =\n automationBefore === null ? null : recordSchema.parse(JSON.parse(automationBefore));\n const commands = (host: Host) =>\n new Set(\n [\n automation?.hosts[host]?.command,\n ...(ownership.files[configPath(host)]?.hookCommands ?? []),\n ...knownManagedHookCommands(host),\n hookConfig(host, hookCommand(host)).hooks.SessionStart[0].hooks[0].command,\n hookConfig(host).hooks.SessionStart[0].hooks[0].command,\n ].filter((command): command is string => !!command),\n );\n const possibleHook = (command: string, host: Host) =>\n commands(host).has(command) || /\\bmason(?:-auto|-hook)?\\b/.test(command);\n const add = (file: string, before: string, after: string, empty: boolean) => {\n edits.push({\n path: file,\n before,\n after:\n ownership.files[file]?.created &&\n (empty || ownership.files[file].initialHash === hash(before))\n ? null\n : after,\n });\n };\n\n let remainingHost = hosts.some(\n (host) =>\n !selected.includes(host) &&\n (setup?.hosts[host] ||\n automation?.hosts[host] ||\n ownership.files[mcpPath(host)] ||\n ownership.files[configPath(host)]),\n );\n // A clone or manually configured second host can still need the shared guidance.\n for (const host of hosts.filter((host) => !selected.includes(host))) {\n await attempt(mcpPath(host), async () => {\n const text = await read(mcpPath(host));\n const config = host === \"codex\" ? parse(text ?? \"\") : object.parse(JSON.parse(text ?? \"{}\"));\n const servers = object.parse(\n (host === \"codex\" ? config.mcp_servers : config.mcpServers) ?? {},\n );\n remainingHost ||= servers.mason !== undefined;\n });\n await attempt(configPath(host), async () => {\n const config = automationConfigSchema.parse(\n JSON.parse((await read(configPath(host))) ?? \"{}\"),\n );\n remainingHost ||= Object.values(config.hooks ?? {}).some((groups) =>\n groups.some((group) =>\n group.hooks.some((handler) => handler.command && possibleHook(handler.command, host)),\n ),\n );\n });\n }\n\n for (const host of selected) {\n const mcpFile = mcpPath(host);\n await attempt(mcpFile, async () => {\n const before = await read(mcpFile);\n if (before === null) return;\n const config = host === \"codex\" ? parse(before) : object.parse(JSON.parse(before));\n const key = host === \"codex\" ? \"mcp_servers\" : \"mcpServers\";\n const servers = object.parse(config[key] ?? {});\n if (servers.mason === undefined) {\n if (host === \"codex\" && BLOCKS[2].some((marker) => before.includes(marker)))\n throw new Error(\n \"The marked Mason MCP entry was removed or renamed; inspect the retained block manually.\",\n );\n return;\n }\n const ownedHash = ownership.files[mcpFile]?.mcpHash;\n const expected = ownedHash\n ? [ownedHash]\n : [\n hash(mcpCommand(host)),\n ...(host === \"claude\" ? [hash({ type: \"stdio\", ...mcpCommand(host) })] : []),\n ];\n if (!expected.includes(hash(servers.mason)))\n throw new Error(\n \"The Mason MCP entry was edited or its ownership is uncertain; retained for manual cleanup.\",\n );\n delete servers.mason;\n const desired = { ...config, [key]: servers };\n if (!Object.keys(servers).length) delete desired[key];\n if (host === \"claude\") {\n add(mcpFile, before, json(desired), !Object.keys(desired).length);\n return;\n }\n const [start, end] = BLOCKS[2],\n block = blockSpan(before, start, end);\n if (!block) throw new Error(\"Mason MCP markers are missing; retained for manual cleanup.\");\n const expectedBlock = ownership.files[mcpFile]?.blocks[start];\n const canonicalBlock = managedBlock(\n \"\",\n start,\n end,\n stringify({ mcp_servers: { mason: mcpCommand(host) } }).trimEnd(),\n ).trimEnd();\n if (\n expectedBlock\n ? hash(block.text) !== expectedBlock\n : block.text.replace(/\\r\\n/g, \"\\n\") !== canonicalBlock\n ) {\n throw new Error(\"The Mason MCP block was edited; retained for manual cleanup.\");\n }\n const after = before.slice(0, block.from) + before.slice(block.to).replace(/^\\r?\\n/, \"\");\n const parsed = parse(after);\n // An existing empty parent table is meaningful user text; retain it.\n if (!Object.keys(servers).length && parsed[key] !== undefined) desired[key] = {};\n if (!isDeepStrictEqual(parsed, desired))\n throw new Error(\n \"Removing the marked block would change other TOML settings; retained for manual cleanup.\",\n );\n add(mcpFile, before, after, !after.trim());\n });\n const hookFile = configPath(host);\n await attempt(hookFile, async () => {\n const before = await read(hookFile);\n if (before === null) return;\n const config = automationConfigSchema.parse(JSON.parse(before));\n let changed = false;\n for (const [event, groups] of Object.entries(config.hooks ?? {})) {\n const known = ownership.files[hookFile]?.hooks?.[event];\n const handlers = groups.flatMap((group) => group.hooks);\n if (\n known &&\n !handlers.some(\n (handler) =>\n handler.type === \"command\" && handler.command && commands(host).has(handler.command),\n ) &&\n handlers.some((handler) => !known.includes(hash(handler)))\n ) {\n diagnostics.push({\n path: hookFile,\n message:\n \"A recorded Mason hook is missing beside a new or edited handler (\" +\n event +\n \"); inspect ownership manually.\",\n });\n }\n const kept = groups.flatMap((group) => {\n const handlers = group.hooks.filter((handler) => {\n if (\n handler.type === \"command\" &&\n handler.command &&\n commands(host).has(handler.command)\n ) {\n changed = true;\n return false;\n }\n if (handler.command && possibleHook(handler.command, host))\n diagnostics.push({\n path: hookFile,\n message:\n \"An unrecognized Mason hook was retained for manual cleanup (\" + event + \").\",\n });\n return true;\n });\n return handlers.length === group.hooks.length\n ? [group]\n : handlers.length\n ? [{ ...group, hooks: handlers }]\n : [];\n });\n if (kept.length || !groups.length) config.hooks![event] = kept;\n else delete config.hooks![event];\n }\n if (!changed) return;\n if (!Object.keys(config.hooks ?? {}).length) delete config.hooks;\n add(hookFile, before, json(config), !Object.keys(config).length);\n });\n }\n\n // Keep instructions and ownership until all selected integration removals are unambiguous.\n const instructionEditStart = edits.length;\n if (!remainingHost && !diagnostics.length)\n for (const file of DOC_CANDIDATES)\n await attempt(file, async () => {\n const before = await read(file);\n if (before === null) return;\n let after = before;\n for (const [start, end] of BLOCKS.slice(0, 2)) {\n const block = blockSpan(after, start, end);\n if (!block) continue;\n const pointer =\n \"Mason project knowledge and shared project instructions:\\n@\" +\n (file.startsWith(\".claude/\") ? \"../AGENTS.md\" : \"AGENTS.md\");\n const canonical = [CLAUDE_MD_SECTION, managedBlock(\"\", start, end, pointer).trimEnd()];\n const expected = ownership.files[file]?.blocks[start];\n if (\n expected\n ? hash(block.text) !== expected\n : !canonical.includes(block.text.replace(/\\r\\n/g, \"\\n\"))\n ) {\n throw new Error(\n \"The Mason instruction block was edited or is unrecognized; retained for manual cleanup.\",\n );\n }\n after = after.slice(0, block.from) + after.slice(block.to).replace(/^\\r?\\n/, \"\");\n }\n if (after !== before) add(file, before, after, !after.trim());\n });\n // Do not leave a retained native import pointing at a document we just removed.\n if (diagnostics.length) edits.splice(instructionEditStart);\n\n if (!diagnostics.length) {\n const cleanup: Edit[] = [];\n const receiptFiles = await fg(\n selected.map((host) => \".mason/reports/automation/*/setup-\" + host + \".json\"),\n { cwd: root, dot: true, onlyFiles: false, followSymbolicLinks: false },\n );\n if (receiptFiles.length > 1000)\n throw new Error(\"Too many setup receipts; inspect local setup history before teardown.\");\n for (const file of receiptFiles.sort())\n await attempt(file, async () => {\n const host = file.endsWith(\"setup-codex.json\") ? \"codex\" : \"claude\";\n await loadSetupReceipt(root, file.slice(0, file.lastIndexOf(\"/\")), host);\n cleanup.push({ path: file, before: await read(file), after: null });\n });\n if (!remainingHost)\n await attempt(\".mason/local/project.json\", async () => {\n const before = await read(\".mason/local/project.json\");\n if (before === null) return;\n z.object({ version: z.literal(1), initializedAt: z.string() })\n .strict()\n .parse(JSON.parse(before));\n cleanup.push({ path: \".mason/local/project.json\", before, after: null });\n });\n // Final bookkeeping is last. On interruption, original ownership can safely resume removals.\n if (!diagnostics.length) {\n for (const host of selected) {\n if (setup) delete setup.hosts[host];\n if (automation) delete automation.hosts[host];\n delete ownership.files[mcpPath(host)];\n delete ownership.files[configPath(host)];\n }\n if (!remainingHost) for (const file of DOC_CANDIDATES) delete ownership.files[file];\n if (setupBefore !== null)\n cleanup.push({\n path: SETUP_PATH,\n before: setupBefore,\n after: linked || Object.keys(setup!.hosts).length ? json(setup) : null,\n });\n else if (linked)\n cleanup.push({\n path: INACTIVE_HOSTS_PATH,\n before: inactiveBefore,\n after: json({ version: 1, hosts: [...new Set([...inactive.hosts, ...selected])].sort() }),\n });\n if (automationBefore !== null)\n cleanup.push({\n path: AUTOMATION_PATH,\n before: automationBefore,\n after: Object.keys(automation!.hosts).length ? json(automation) : null,\n });\n if (ownershipBefore !== null)\n cleanup.push({\n path: OWNERSHIP_PATH,\n before: ownershipBefore,\n after: Object.keys(ownership.files).length ? json(ownership) : null,\n });\n edits.push(...cleanup);\n }\n }\n return {\n edits: edits.filter((edit) => edit.before !== edit.after),\n diagnostics,\n remainingHost,\n inputs,\n };\n}\n\nasync function planLocalTeardown(root: string, selected: readonly Host[]) {\n const inputs = new Map<string, string | null>();\n const read = async (file: string) => {\n const value = await readText(root, file);\n inputs.set(file, value);\n return value;\n };\n const edits: Edit[] = [];\n const setupBefore = await read(SETUP_PATH);\n const setup = setupBefore === null ? null : setupSchema.parse(JSON.parse(setupBefore));\n const automationBefore = await read(AUTOMATION_PATH);\n const automation =\n automationBefore === null ? null : recordSchema.parse(JSON.parse(automationBefore));\n for (const host of selected) {\n if (setup) delete setup.hosts[host];\n if (automation) delete automation.hosts[host];\n }\n if (setup) edits.push({ path: SETUP_PATH, before: setupBefore, after: json(setup) });\n if (automation)\n edits.push({ path: AUTOMATION_PATH, before: automationBefore, after: json(automation) });\n // A local opt-out must also suppress activation inherited from the primary checkout.\n const linked =\n (await workspace(root)).gitDir !==\n (await fs.realpath(\n path.resolve(root, (await git(root, \"rev-parse\", \"--git-common-dir\")).trim()),\n ));\n if (linked && !setup) {\n const before = await read(INACTIVE_HOSTS_PATH);\n const inactive =\n before === null\n ? { version: 1, hosts: [] as Host[] }\n : inactiveHostsSchema.parse(JSON.parse(before));\n edits.push({\n path: INACTIVE_HOSTS_PATH,\n before,\n after: json({ version: 1, hosts: [...new Set([...inactive.hosts, ...selected])].sort() }),\n });\n }\n const receipts = await fg(\n selected.map((host) => \".mason/reports/automation/*/setup-\" + host + \".json\"),\n { cwd: root, dot: true, onlyFiles: false, followSymbolicLinks: false },\n );\n if (receipts.length > 1000)\n throw new Error(\"Too many setup receipts; inspect local setup history before teardown.\");\n for (const file of receipts) {\n const host = file.endsWith(\"setup-codex.json\") ? \"codex\" : \"claude\";\n await loadSetupReceipt(root, file.slice(0, file.lastIndexOf(\"/\")), host);\n edits.push({ path: file, before: await read(file), after: null });\n }\n return {\n edits: edits.filter((edit) => edit.before !== edit.after),\n inputs,\n diagnostics: [] as Array<{ path: string; message: string }>,\n remainingHost: true,\n };\n}\n\nexport async function teardownProject(\n dir: string,\n options: { host?: Host; dryRun?: boolean; project?: boolean } = {},\n) {\n const { root } = await workspace(dir);\n const selected = options.host ? [options.host] : [...hosts];\n const run = async (apply: boolean) => {\n const plan = options.project\n ? await planProjectTeardown(root, selected)\n : await planLocalTeardown(root, selected);\n if (apply) {\n // Include the other host and shared instructions in the concurrency check.\n for (const [file, before] of plan.inputs)\n if ((await readText(root, file)) !== before)\n throw new Error(\"Input changed during teardown: \" + file + \". Rerun teardown.\");\n for (const edit of plan.edits) await applyEdit(root, edit);\n }\n return {\n version: 1,\n action: \"teardown\",\n scope: options.project ? \"project\" : \"local\",\n status: plan.diagnostics.length ? \"incomplete\" : \"complete\",\n root,\n hosts: selected,\n dryRun: !!options.dryRun,\n changes: plan.edits.map((edit) => ({\n path: edit.path,\n action: edit.after === null ? \"delete\" : \"update\",\n })),\n diagnostics: plan.diagnostics,\n sharedInstructionsRetained: plan.remainingHost || !!plan.diagnostics.length,\n next: plan.diagnostics.length\n ? \"Inspect the retained entries, remove or correct them, then rerun teardown.\"\n : options.project\n ? \"Review and commit shared removals. Run mason init to restore shared configuration.\"\n : \"Restart running assistants to unload the local integration. Shared configuration is retained; run mason setup to reconnect.\",\n };\n };\n // A preview (including an untouched project) must not create local state or locks.\n const preview = await run(false);\n if (options.dryRun || !preview.changes.length) return preview;\n if (\n (\n await git(\n root,\n \"ls-files\",\n \"--\",\n \".mason/local\",\n \".mason/reports/setup-lock\",\n ...preview.changes\n .filter((change) => change.path.startsWith(\".mason/reports/\"))\n .map((change) => change.path),\n )\n ).trim()\n )\n throw new Error(\"Mason local state must be untracked before teardown.\");\n return withLock(root, \".mason/reports/setup-lock\", () => run(true));\n}\n\nexport function summarizeTeardown(result: Awaited<ReturnType<typeof teardownProject>>) {\n return [\n `Mason ${result.scope} teardown${result.dryRun ? \" preview\" : \"\"}: ${result.status}.`,\n ...result.changes.map(\n (change) => ` ${result.dryRun ? \"Would \" : \"\"}${change.action}: ${change.path}`,\n ),\n ...result.diagnostics.map((item) => ` Retained ${item.path}: ${item.message}`),\n ...(!result.changes.length ? [\"No changes.\"] : []),\n \"Shared knowledge, repair evidence, ignore rules and the installed Mason command are retained.\",\n ...(result.scope === \"project\" && result.sharedInstructionsRetained\n ? [\n \"Shared instruction cleanup is deferred while another host or incomplete removal needs inspection.\",\n ]\n : []),\n ...(result.dryRun ? [\"Preview only; no files were changed.\"] : [result.next]),\n ].join(\"\\n\");\n}\n","import { hash, workspace } from \"../automation/evidence.js\";\nimport { events } from \"../automation/store.js\";\nimport { automationStatus } from \"../automation/runtime.js\";\nimport { loadDecisionStore } from \"../decisions/decisions.js\";\nimport { effectiveSetup, loadSetupReceipt } from \"./model.js\";\nimport { inspectIntegration } from \"./config.js\";\nimport { installedCommand } from \"./launcher.js\";\nimport { readObservation } from \"./observations.js\";\n\nexport async function setupStatus(dir: string) {\n const ws = await workspace(dir);\n const activation = await effectiveSetup(ws.root);\n const setup = activation.setup;\n if (!setup || !Object.keys(setup.hosts).length) {\n const partial = await Promise.all(\n ([\"codex\", \"claude\"] as const).map(async (host) => ({\n host,\n receipt: await loadSetupReceipt(ws.root, ws.directory, host),\n })),\n );\n const pending = partial.filter((item) => item.receipt !== null).map((item) => item.host);\n const configuration: Record<\n string,\n { compatible: boolean; disabled?: boolean; diagnostic?: string }\n > = {};\n await Promise.all(\n ([\"codex\", \"claude\"] as const).map(async (host) => {\n try {\n const inspected = await inspectIntegration(ws.root, host);\n configuration[host] = {\n compatible: inspected.compatible,\n disabled: inspected.disabled || inspected.mcpDisabled,\n };\n } catch (error) {\n configuration[host] = {\n compatible: false,\n diagnostic: error instanceof Error ? error.message : String(error),\n };\n }\n }),\n );\n return {\n version: 1,\n status: pending.length ? \"incomplete\" : \"not-configured\",\n hosts: {},\n configuration,\n next: pending.length\n ? \"Setup did not finish. Rerun mason setup --host \" +\n pending[0] +\n \" to resume local activation; use mason init if shared configuration needs updating.\"\n : \"Project hooks are inactive. Run mason setup --host codex or --host claude for compatible shared configuration; a maintainer uses mason init to prepare missing or incompatible configuration.\",\n };\n }\n const hosts: Record<\n string,\n {\n status: string;\n runtime: string;\n mcp: string;\n instructions: string;\n hookConfiguration: string;\n observedEvents: string[];\n contextCalls: number;\n verificationStatus: string;\n verificationScope: string;\n pending: string[];\n updates: string[];\n }\n > = {};\n const installed = await installedCommand();\n const automation = await automationStatus(ws.root);\n for (const host of [\"codex\", \"claude\"] as const) {\n const entry = setup.hosts[host];\n if (!entry) continue;\n const config = await inspectIntegration(ws.root, host);\n const instructionsCurrent = config.instructionsCurrent;\n const mcp =\n config.mcpCompatible && !config.mcpDisabled && hash(config.mcp) === entry.mcpFingerprint;\n const currentHooks = config.hooksCurrent;\n const hooks = config.hooksCompatible && !config.disabled;\n const local = await loadSetupReceipt(ws.root, ws.directory, host);\n const configured =\n activation.root !== ws.root ||\n (local?.status === \"configured\" &&\n local.root === ws.root &&\n local.revision === entry.revision);\n const observation = await readObservation(\n ws.root,\n ws.directory,\n host,\n entry.revision,\n installed.version ?? \"unavailable\",\n );\n // Complete lifecycle evidence must come from one session in this worktree/branch.\n const sessions = Object.values(observation?.sessions ?? {}).sort((a, b) =>\n b.at.localeCompare(a.at),\n );\n const complete = sessions.find((session) =>\n events.every((event) => session.events.includes(event)),\n );\n const observedEvents = complete?.events ?? sessions[0]?.events ?? [];\n const pending: string[] = [];\n if (!installed.available) pending.push(installed.message!);\n if (!mcp || !hooks || !config.instructionCompatible || !configured)\n pending.push(\n \"Run mason setup to activate existing configuration; incompatible shared configuration needs mason init and review. Inspect any disabled host settings.\",\n );\n if (!observation?.contextCalls)\n pending.push(\n \"Start a new assistant session and request task context through Mason's get_context tool.\",\n );\n if (!complete)\n pending.push(\n \"Review/trust the host configuration, then complete a normal task to observe the full hook lifecycle.\",\n );\n if (automation.status === \"unavailable\")\n pending.push(\n \"The latest automation attempt did not establish verification. Run mason check and inspect its diagnostics.\",\n );\n const healthy =\n installed.available &&\n mcp &&\n hooks &&\n config.instructionCompatible &&\n configured &&\n automation.status !== \"unavailable\";\n hosts[host] = {\n status: healthy\n ? complete && observation?.contextCalls\n ? \"active\"\n : \"pending\"\n : \"attention\",\n runtime: installed.available ? \"global (\" + installed.version + \")\" : \"unavailable-on-path\",\n mcp: mcp ? \"configured\" : \"changed\",\n instructions: instructionsCurrent\n ? \"current\"\n : config.instructionCompatible\n ? \"compatible\"\n : \"incompatible\",\n hookConfiguration: hooks\n ? currentHooks\n ? \"configured\"\n : \"compatible\"\n : \"disabled-or-changed\",\n observedEvents,\n contextCalls: observation?.contextCalls ?? 0,\n verificationScope: automation.scope,\n verificationStatus:\n automation.status === \"current\"\n ? (automation.verificationStatus ?? \"unavailable\")\n : \"unavailable\",\n pending,\n updates:\n config.compatible && (!currentHooks || !instructionsCurrent)\n ? [\n \"Updated integration templates are available. A maintainer can run mason init --host \" +\n host +\n \" to update it when convenient; review and commit the configuration changes.\",\n ]\n : [],\n };\n }\n const statuses = Object.values(hosts).map((host) => host.status);\n const decisions = await loadDecisionStore(ws.root);\n return {\n version: 1,\n status:\n statuses.length && statuses.every((status) => status === \"active\")\n ? \"active\"\n : statuses.includes(\"attention\")\n ? \"attention\"\n : \"pending\",\n root: ws.root,\n hosts,\n activationRoot: activation.root,\n decisionRecords: decisions.records.length,\n diagnostics: decisions.diagnostics,\n scope:\n \"Activation receipts record observed use after setup, not complete interception, correct repairs, or measured usefulness. Host trust and higher-priority settings may prevent execution. Receipts are local to this worktree and branch.\",\n };\n}\n\nexport function summarizeActivation(status: Awaited<ReturnType<typeof setupStatus>>): string {\n const lines = [\"Mason setup: \" + status.status + \".\"];\n if (status.activationRoot && status.activationRoot !== status.root) {\n lines.push(\n \"Activation inherited from \" + status.activationRoot + \"; evidence belongs to this worktree.\",\n );\n }\n for (const [host, state] of Object.entries(status.hosts)) {\n lines.push(\n `${host}: ${state.status}`,\n ` Runtime: ${state.runtime}; MCP: ${state.mcp}; instructions: ${state.instructions}.`,\n ` Hooks: ${state.hookConfiguration}; observed: ${state.observedEvents.join(\", \") || \"none\"}.`,\n ` Task context requests: ${state.contextCalls}; verification: ${state.verificationStatus} (${state.verificationScope}).`,\n ...state.pending.map((message) => \" Next: \" + message),\n );\n lines.push(...state.updates.map((message) => \" Optional: \" + message));\n }\n if (\"decisionRecords\" in status) lines.push(`Decision records: ${status.decisionRecords}.`);\n if (status.next) lines.push(status.next);\n return lines.join(\"\\n\");\n}\n","import { randomUUID } from \"node:crypto\";\nimport { git, hash, workspace } from \"../automation/evidence.js\";\nimport { withLock, type Host } from \"../automation/store.js\";\nimport { writeStoreJson } from \"../utils/storage.js\";\nimport { applyEdit, readText } from \"./files.js\";\nimport {\n ancillaryEdits,\n hookEdits,\n instructionEdits,\n mcpEdit,\n inspectIntegration,\n mcpPath,\n} from \"./config.js\";\nimport { hookConfig } from \"../automation/adapters.js\";\nimport { configPath } from \"../automation/install.js\";\nimport { hookCommand, installedCommand } from \"./launcher.js\";\nimport { loadSetup, loadSetupReceipt, SETUP_PATH, type SetupConfig } from \"./model.js\";\nimport { setupStatus } from \"./status.js\";\nimport { ownershipEdit, completedHookOwnership } from \"./ownership.js\";\nimport type { Progress } from \"../utils/progress.js\";\n\nexport async function selectHost(root: string, explicit?: Host): Promise<Host> {\n if (explicit) return explicit;\n if (process.env.MASON_SETUP_HOST === \"codex\" || process.env.MASON_SETUP_HOST === \"claude\")\n return process.env.MASON_SETUP_HOST;\n const found: Host[] = [];\n if (\n (await readText(root, \".codex/config.toml\")) !== null ||\n (await readText(root, \".codex/hooks.json\")) !== null\n )\n found.push(\"codex\");\n if (\n (await readText(root, \".claude/settings.json\")) !== null ||\n (await readText(root, \".mcp.json\")) !== null\n )\n found.push(\"claude\");\n if (found.length === 1) return found[0];\n throw new Error(\"Choose the assistant for setup with --host codex or --host claude.\");\n}\n\nexport async function setupProject(\n dir: string,\n options: { host?: Host; progress?: Progress } = {},\n) {\n options.progress?.step(\"Checking project configuration\");\n const ws = await workspace(dir);\n const host = await selectHost(ws.root, options.host);\n if (\n (\n await git(\n ws.root,\n \"ls-files\",\n \"--\",\n \".mason/local\",\n ws.directory,\n \".mason/reports/setup-lock\",\n )\n ).trim()\n )\n throw new Error(\"Mason local state must be untracked before setup can activate this checkout.\");\n return withLock(ws.root, \".mason/reports/setup-lock\", async () => {\n const existing = await loadSetup(ws.root);\n const previousReceipt = await loadSetupReceipt(ws.root, ws.directory, host);\n const installed = await installedCommand();\n if (!installed.available) throw new Error(installed.message!);\n const configured = await inspectIntegration(ws.root, host);\n if (!configured.compatible)\n throw new Error(\n \"Shared Mason configuration is missing or incompatible. A maintainer should run mason init --host \" +\n host +\n \" and review/commit the changes. Local setup did not edit shared files.\",\n );\n const privatePaths = [SETUP_PATH, ws.directory + \"/setup-\" + host + \".json\"];\n const ignored = (\n await git(ws.root, \"check-ignore\", \"--no-index\", \"--\", ...privatePaths).catch(() => \"\")\n )\n .trim()\n .split(\"\\n\");\n if (!privatePaths.every((file) => ignored.includes(file)))\n throw new Error(\n \"Mason local state must be ignored. A maintainer should run mason init and commit the ignore rules.\",\n );\n const instructions = configured.instructions;\n const sharedInputs = [\n ...instructions.map((edit) => ({ path: edit.path, before: edit.before })),\n { path: mcpPath(host), before: await readText(ws.root, mcpPath(host)) },\n { path: configPath(host), before: await readText(ws.root, configPath(host)) },\n ];\n const hooks = await hookEdits(ws.root, host);\n const edits = hooks.slice(1);\n const setupBefore = await readText(ws.root, SETUP_PATH);\n const mcpFingerprint = hash(configured.mcp);\n const fingerprint = hash({\n command: \"mason\",\n mcp: mcpFingerprint,\n hooks: configured.hooks,\n instructions: instructions.map((edit) => edit.path),\n });\n const previous = existing?.hosts[host];\n const changed =\n edits.some((edit) => edit.before !== edit.after) || previous?.fingerprint !== fingerprint;\n const revision = !changed && previous ? previous.revision : randomUUID();\n const setup: SetupConfig = existing ?? { version: 2, hosts: {} };\n setup.hosts[host] = {\n configuredVersion: installed.version!,\n revision,\n fingerprint,\n mcpFingerprint,\n instructions: instructions.map((e) => e.path),\n };\n\n const receiptPath = ws.directory + \"/setup-\" + host + \".json\";\n // Preserve legacy audit pointers without reading or verifying their artifacts.\n const legacyEvidence = previousReceipt?.initialReportPath\n ? {\n initialReportPath: previousReceipt.initialReportPath,\n initialBaselinePaths: previousReceipt.initialBaselinePaths ?? [],\n }\n : {};\n options.progress?.step(`Activating ${host === \"codex\" ? \"Codex\" : \"Claude Code\"} integration`);\n await writeStoreJson(ws.root, receiptPath, {\n version: 1,\n host,\n status: \"installing\",\n ...legacyEvidence,\n root: ws.root,\n revision,\n });\n const changedFiles: string[] = [];\n for (const edit of edits) if (await applyEdit(ws.root, edit)) changedFiles.push(edit.path);\n if (\n await applyEdit(ws.root, {\n path: SETUP_PATH,\n before: setupBefore,\n after: JSON.stringify(setup, null, 2) + \"\\n\",\n })\n )\n changedFiles.push(SETUP_PATH);\n options.progress?.step(\"Checking agent configuration\");\n for (const input of sharedInputs)\n if ((await readText(ws.root, input.path)) !== input.before)\n throw new Error(input.path + \" changed during setup; inspect it and retry.\");\n await writeStoreJson(ws.root, receiptPath, {\n version: 1,\n host,\n status: \"configured\",\n ...legacyEvidence,\n root: ws.root,\n revision,\n configuredAt: new Date().toISOString(),\n });\n return {\n version: 1,\n action: \"setup\",\n mode: \"activate\",\n status: \"configured\",\n host,\n root: ws.root,\n runtime: { kind: \"global\", command: \"mason\", version: installed.version },\n changedFiles,\n receiptPath,\n activation: await setupStatus(ws.root),\n next:\n configured.disabled || configured.mcpDisabled\n ? \"Mason hooks or MCP are disabled in project configuration. Review that setting before activation.\"\n : host === \"codex\"\n ? \"Review/trust this project's MCP configuration and hooks in Codex (/hooks in the CLI), then start a new session and give it a normal task.\"\n : \"Approve the project MCP server in Claude Code, then start a new session and give it a normal task.\",\n };\n });\n}\n\nexport function summarizeSetup(result: Awaited<ReturnType<typeof setupProject>>): string {\n return [\n `Mason configured for ${result.host}.`,\n \" MCP server and lifecycle hooks use mason from PATH.\",\n \" Existing shared configuration validated; only local activation state was written.\",\n ` ${result.changedFiles.length} files changed.`,\n \"Activation: \" + result.activation.status + \".\",\n result.next,\n \"If the assistant cannot find mason, restart the desktop app so it picks up PATH.\",\n \"After the task finishes, run mason status. Configuration alone does not establish activation.\",\n ].join(\"\\n\");\n}\n\nexport async function initializeProject(\n dir: string,\n options: { host?: Host; dryRun?: boolean; progress?: Progress } = {},\n) {\n const ws = await workspace(dir);\n const host = await selectHost(ws.root, options.host);\n const run = async (apply: boolean) => {\n const instructions = await instructionEdits(ws.root, host);\n const mcp = await mcpEdit(ws.root, host);\n const hooks = await hookEdits(ws.root, host);\n const edits = [...(await ancillaryEdits(ws.root)), ...instructions, mcp, hooks[0]];\n // Ownership is local bookkeeping for safe removal, never an activation receipt.\n const configuredHook = hookConfig(host, hookCommand(host)).hooks.SessionStart[0].hooks[0]\n .command;\n const ownership = await ownershipEdit(ws.root, [...instructions, mcp, hooks[0]], {\n [hooks[0].path]: configuredHook,\n });\n if (apply) {\n options.progress?.step(\"Preparing shared agent configuration\");\n await applyEdit(ws.root, ownership);\n for (const edit of edits) await applyEdit(ws.root, edit);\n await applyEdit(\n ws.root,\n await completedHookOwnership(ws.root, hooks[0].path, configuredHook),\n );\n }\n return {\n version: 1,\n action: \"init\",\n status: options.dryRun ? \"preview\" : \"initialized\",\n host,\n root: ws.root,\n dryRun: !!options.dryRun,\n changes: edits\n .filter((edit) => edit.before !== edit.after)\n .map((edit) => ({\n path: edit.path,\n action: edit.before === null ? \"create\" : \"update\",\n })),\n next:\n \"Review and commit shared configuration, then run mason setup --host \" +\n host +\n \" in each developer's checkout.\",\n };\n };\n if (options.dryRun) return run(false);\n if ((await git(ws.root, \"ls-files\", \"--\", \".mason/local\", \".mason/reports/setup-lock\")).trim())\n throw new Error(\"Mason local bookkeeping must be untracked before initialization.\");\n return withLock(ws.root, \".mason/reports/setup-lock\", () => run(true));\n}\n\nexport function summarizeInitialization(result: Awaited<ReturnType<typeof initializeProject>>) {\n return [\n `Mason initialization${result.dryRun ? \" preview\" : \"\"} for ${result.host}.`,\n ...result.changes.map(\n (change) => ` ${result.dryRun ? \"Would \" : \"\"}${change.action}: ${change.path}`,\n ),\n ...(!result.changes.length ? [\"Shared configuration is current; no changes needed.\"] : []),\n result.dryRun ? \"Preview only; no files were changed.\" : result.next,\n ].join(\"\\n\");\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\n\nconst execute = promisify(execFile);\nexport const pathChangeSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"profile\"),\n file: z.string(),\n block: z.string(),\n created: z.boolean(),\n }),\n z.object({ kind: z.literal(\"windows\"), entry: z.string(), created: z.boolean() }),\n]);\nexport type PathChange = z.infer<typeof pathChangeSchema>;\nexport type PathResult = {\n status: \"configured\" | \"manual\";\n message: string;\n changes: PathChange[];\n};\nexport type PathOptions = {\n platform?: NodeJS.Platform;\n userHome?: string;\n env?: NodeJS.ProcessEnv;\n};\nconst quote = (s: string) => \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n\n// Store the ownership intent before changing settings, so interrupted installs\n// can resume and uninstall can distinguish our addition from existing settings.\nexport async function configurePath(\n bin: string,\n previous: PathChange[],\n save: (changes: PathChange[]) => Promise<void>,\n options: PathOptions = {},\n): Promise<PathResult> {\n const env = options.env ?? process.env,\n platform = options.platform ?? process.platform;\n const changes = [...previous];\n // Profile/registry changes affect future shells. The inherited PATH tells us\n // whether this terminal already has the installation directory available.\n const currentPath =\n platform === \"win32\"\n ? Object.entries(env).find(([key]) => key.toLowerCase() === \"path\")?.[1]\n : env.PATH;\n const alreadyOnPath =\n platform === \"win32\"\n ? hasWindowsEntry(currentPath ?? null, bin, env)\n : (currentPath ?? \"\")\n .split(\":\")\n .some(\n (entry) =>\n path.posix.isAbsolute(entry) && path.posix.resolve(entry) === path.posix.resolve(bin),\n );\n const setupHint =\n \"To prepare a new project for review, run one of these inside its directory (use mason setup to activate existing team configuration):\\n Codex: mason init --host codex\\n Claude Code: mason init --host claude\";\n const message = (alreadyOnPath ? \"\" : \"Open a new terminal to use mason.\\n\") + setupHint;\n const manual = (reason: string): PathResult => ({\n status: \"manual\",\n changes,\n message: `${reason}\\n${alreadyOnPath ? \"\" : `Add ${bin} to your PATH.\\n`}${setupHint}`,\n });\n if (env.MASON_NO_MODIFY_PATH === \"1\")\n return manual(\"Automatic PATH setup is disabled (MASON_NO_MODIFY_PATH=1).\");\n if (/[\\r\\n\\0]/.test(bin) || bin.includes(platform === \"win32\" ? \";\" : \":\"))\n return manual(\"This installation path cannot be represented safely in PATH.\");\n try {\n if (platform === \"win32\") {\n const current = await windowsPath(\"read\");\n if (!hasWindowsEntry(current.value, bin)) {\n if (!changes.some((c) => c.kind === \"windows\" && c.entry === bin)) {\n changes.push({ kind: \"windows\", entry: bin, created: current.value === null });\n await save(changes);\n }\n await windowsPath(\"add\", bin, current);\n }\n return { status: \"configured\", changes, message };\n }\n const shell = path.basename(env.SHELL ?? os.userInfo().shell ?? \"\");\n const userHome = options.userHome ?? os.homedir();\n let profiles: string[];\n if (![\"bash\", \"zsh\", \"sh\"].includes(shell))\n return manual(`Automatic PATH setup is unavailable for ${shell || \"an unknown shell\"}.`);\n if (env.MASON_PROFILE) profiles = [path.resolve(env.MASON_PROFILE)];\n else if (shell === \"zsh\") profiles = [path.join(env.ZDOTDIR || userHome, \".zshrc\")];\n else if (shell === \"sh\") profiles = [path.join(userHome, \".profile\")];\n else {\n const candidates = [\".bash_profile\", \".bash_login\", \".profile\"].map((name) =>\n path.join(userHome, name),\n );\n let login = candidates[2];\n for (const file of candidates)\n if (\n await fs.lstat(file).then(\n () => true,\n (error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return false;\n throw error;\n },\n )\n ) {\n login = file;\n break;\n }\n profiles = [path.join(userHome, \".bashrc\"), login];\n }\n const marker = `# >>> mason PATH ${createHash(\"sha256\").update(bin).digest(\"hex\").slice(0, 12)} >>>`;\n for (const profile of profiles) {\n // Preserve symlinked dotfiles by updating their target. A dangling link is\n // an error, not permission to replace the link with an unrelated file.\n const stat = await fs.lstat(profile).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n const file = stat?.isSymbolicLink() ? await fs.realpath(profile) : path.resolve(profile);\n const original = await fs.readFile(file).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\") && !stat) return null;\n throw error;\n });\n if (original && !Buffer.from(original.toString(\"utf8\")).equals(original))\n return manual(`Shell profile is not UTF-8: ${profile}.`);\n const text = original?.toString(\"utf8\") ?? \"\";\n const owned = changes.find(\n (c): c is Extract<PathChange, { kind: \"profile\" }> =>\n c.kind === \"profile\" && c.file === file,\n );\n if (owned && text.includes(owned.block)) continue;\n if (text.includes(marker) || (owned && text.includes(\"# <<< mason PATH\")))\n return manual(`Mason's PATH block was edited; retained ${profile}.`);\n const newline = text.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const block =\n owned?.block ??\n (\n \"\\n\" +\n marker +\n '\\ncase \":${PATH-}:\" in\\n *:' +\n quote(bin) +\n \":*) ;;\\n *) export PATH=\" +\n quote(bin) +\n ':\"${PATH-}\" ;;\\nesac\\n# <<< mason PATH <<<\\n'\n ).replaceAll(\"\\n\", newline);\n if (!owned) {\n changes.push({ kind: \"profile\", file, block, created: original === null });\n await save(changes);\n }\n await fs.mkdir(path.dirname(file), { recursive: true });\n // Append without rewriting existing bytes, modes or symlinks. Recheck the\n // bytes on the opened file to detect edits since the preflight read.\n const handle = await fs.open(file, original === null ? \"ax+\" : \"a+\", 0o600);\n try {\n if (!(await handle.readFile()).equals(original ?? Buffer.alloc(0)))\n throw new Error(`Shell profile changed during installation: ${profile}`);\n await handle.writeFile(block);\n await handle.sync();\n } finally {\n await handle.close();\n }\n }\n return { status: \"configured\", changes, message };\n } catch (error) {\n return manual(\n `Could not configure PATH: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport async function removePath(changes: PathChange[]): Promise<string[]> {\n const warnings: string[] = [];\n for (const change of changes) {\n try {\n if (change.kind === \"windows\") {\n const current = await windowsPath(\"read\");\n if (\n !(current.value ?? \"\").split(\";\").includes(change.entry) &&\n hasWindowsEntry(current.value, change.entry)\n )\n throw new Error(\"PATH entry was edited\");\n await windowsPath(\"remove\", change.entry, current, change.created);\n continue;\n }\n const stat = await fs.lstat(change.file).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n if (!stat) continue;\n if (!stat.isFile()) throw new Error(\"profile type changed\");\n const bytes = await fs.readFile(change.file),\n text = bytes.toString(\"utf8\");\n if (!Buffer.from(text).equals(bytes)) throw new Error(\"profile encoding changed\");\n const index = text.indexOf(change.block);\n if (index < 0 || text.indexOf(change.block, index + change.block.length) >= 0)\n throw new Error(\"PATH block was edited or removed\");\n const prefix = text.slice(0, index),\n suffix = text.slice(index + change.block.length);\n const separator =\n prefix && suffix && !prefix.endsWith(\"\\n\")\n ? change.block.startsWith(\"\\r\\n\")\n ? \"\\r\\n\"\n : \"\\n\"\n : \"\";\n const next = Buffer.from(prefix + separator + suffix);\n const temporary = change.file + \".mason-\" + randomUUID();\n try {\n if (stat.nlink > 1) throw new Error(\"profile has multiple hard links\");\n const handle = await fs.open(temporary, \"wx\", stat.mode & 0o777);\n try {\n await handle.writeFile(next);\n await handle.chmod(stat.mode & 0o777);\n if (process.platform !== \"win32\") await handle.chown(stat.uid, stat.gid);\n await handle.sync();\n } finally {\n await handle.close();\n }\n const current = await fs.lstat(change.file);\n if (\n !current.isFile() ||\n current.ino !== stat.ino ||\n !(await fs.readFile(change.file)).equals(bytes)\n )\n throw new Error(\"profile changed during uninstall\");\n await fs.rename(temporary, change.file);\n } finally {\n await fs.rm(temporary, { force: true });\n }\n // Empty created profiles are harmless; retain them to avoid masking any\n // dotfile another process created or linked since installation.\n } catch (error) {\n warnings.push(\n `Retained PATH setting ${change.kind === \"profile\" ? change.file : change.entry}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return warnings;\n}\n\nexport type WindowsPath = { value: string | null; kind: string | null };\nconst normalizeWindowsEntry = (value: string) =>\n path.win32\n .normalize(value.trim().replace(/^\"(.*)\"$/, \"$1\"))\n .replace(/[\\\\/]+$/, \"\")\n .toLowerCase();\nexport const hasWindowsEntry = (\n value: string | null,\n entry: string,\n env: NodeJS.ProcessEnv = process.env,\n) => {\n const variables = new Map(Object.entries(env).map(([key, value]) => [key.toLowerCase(), value]));\n const expand = (part: string) =>\n part.replace(/%([^%]+)%/g, (match, key: string) => variables.get(key.toLowerCase()) ?? match);\n return (value ?? \"\")\n .split(\";\")\n .some((part) => normalizeWindowsEntry(expand(part)) === normalizeWindowsEntry(entry));\n};\n\n// Read unexpanded registry text and preserve its value kind. No machine PATH,\n// setx truncation, or expanded copy of the process environment is written.\nexport async function windowsPath(\n action: \"read\" | \"add\" | \"remove\",\n entry = \"\",\n expected?: WindowsPath,\n removeEmpty = false,\n): Promise<WindowsPath> {\n const payload = Buffer.from(JSON.stringify({ action, entry, expected, removeEmpty })).toString(\n \"base64\",\n );\n const script = `$ErrorActionPreference = 'Stop'\n[Console]::OutputEncoding = New-Object Text.UTF8Encoding($false)\n$p = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${payload}')) | ConvertFrom-Json\n$key = [Microsoft.Win32.Registry]::CurrentUser.CreateSubKey('Environment')\ntry {\n $value = $key.GetValue('Path', $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)\n $kind = if ($null -eq $value) { $null } else { $key.GetValueKind('Path').ToString() }\n if ($null -ne $kind -and $kind -notin @('String','ExpandString')) { throw 'User PATH is not a string.' }\n if ($p.action -eq 'read') { @{ value = $value; kind = $kind } | ConvertTo-Json -Compress; exit 0 }\n if ($p.expected -and ($value -cne $p.expected.value -or $kind -cne $p.expected.kind)) { throw 'User PATH changed concurrently; retry the operation.' }\n $parts = if ($null -eq $value -or $value -eq '') { @() } else { @($value.Split(';')) }\n if ($p.action -eq 'add') { $next = (@($p.entry) + $parts) -join ';' }\n else { $next = (@($parts | Where-Object { $_ -cne $p.entry })) -join ';' }\n if ($next -cne $value) {\n $writeKind = if ($kind) { [Microsoft.Win32.RegistryValueKind]$kind } else { [Microsoft.Win32.RegistryValueKind]::ExpandString }\n if ($p.action -eq 'remove' -and $p.removeEmpty -and $next -eq '') { $key.DeleteValue('Path', $false) }\n else { $key.SetValue('Path', $next, $writeKind) }\n Add-Type -TypeDefinition 'using System; using System.Runtime.InteropServices; public class MasonEnvironment { [DllImport(\"user32.dll\", CharSet=CharSet.Unicode, SetLastError=true)] public static extern IntPtr SendMessageTimeout(IntPtr h, uint m, UIntPtr w, string l, uint f, uint t, out UIntPtr r); }'\n $result = [UIntPtr]::Zero\n [void][MasonEnvironment]::SendMessageTimeout([IntPtr]0xffff, 0x1a, [UIntPtr]::Zero, 'Environment', 2, 1000, [ref]$result)\n }\n @{ value = $next; kind = $kind } | ConvertTo-Json -Compress\n} finally { $key.Dispose() }\n`;\n const { stdout } = await execute(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-EncodedCommand\",\n Buffer.from(script, \"utf16le\").toString(\"base64\"),\n ],\n { windowsHide: true, timeout: 15000, maxBuffer: 1024 * 1024 },\n );\n return z\n .object({ value: z.string().nullable(), kind: z.string().nullable() })\n .parse(JSON.parse(stdout.replace(/^\\uFEFF/, \"\").trim()));\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport fs from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport { readStoreJson } from \"../utils/storage.js\";\nimport { pathChangeSchema } from \"./path.js\";\n\nexport const releaseVersion = z.string().regex(/^\\d+\\.\\d+\\.\\d+(?:-[A-Za-z0-9.-]+)?$/);\nconst bundleId = z.string().regex(/^[a-f0-9]{24}$/);\nexport const updatePolicySchema = z.object({\n enabled: z.boolean(),\n revision: z.string(),\n pinnedVersion: releaseVersion.optional(),\n mirror: z.string().optional(),\n});\nexport const recordSchema = z.object({\n format: z.literal(1),\n home: z.string(),\n bin: z.string(),\n current: bundleId,\n version: releaseVersion,\n launchers: z.record(z.string()),\n previousLaunchers: z.record(z.string()).optional(),\n pathChanges: z.array(pathChangeSchema).optional(),\n updates: updatePolicySchema.optional(),\n previous: z.object({ id: bundleId, version: releaseVersion }).optional(),\n pending: z\n .object({ id: bundleId, version: releaseVersion, policyRevision: z.string() })\n .optional(),\n});\nexport type InstallRecord = z.infer<typeof recordSchema>;\nexport const defaultHome = () =>\n process.env.MASON_HOME ??\n (process.platform === \"win32\"\n ? path.join(process.env.LOCALAPPDATA ?? os.homedir(), \"Mason\")\n : path.join(os.homedir(), \".local/share/mason\"));\n\nexport async function readInstallation(home: string): Promise<InstallRecord> {\n const raw = await readStoreJson(home, \"install.json\");\n if (!raw)\n throw new Error(\n \"Run this command from a standalone installation. npm users can upgrade with npm.\",\n );\n const record = recordSchema.parse(raw);\n if (record.home !== (await fs.realpath(home)))\n throw new Error(\"Invalid standalone installation receipt.\");\n return record;\n}\n\nexport function standaloneLocation() {\n // Distribution modules are bundled into app/dist/mason.js (or mason-mcp.js).\n const bundle = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../..\");\n const home = path.dirname(path.dirname(bundle));\n if (\n path.dirname(bundle) !== path.join(home, \"versions\") ||\n !/^[a-f0-9]{24}$/.test(path.basename(bundle))\n ) {\n return null;\n }\n return { home, bundle };\n}\n\nexport async function currentInstallation() {\n const location = standaloneLocation();\n if (!location)\n throw new Error(\n \"Run this command from a standalone installation. npm users can upgrade with npm.\",\n );\n const { home, bundle } = location;\n const record = await readInstallation(home);\n return { home, bundle, record };\n}\n\nexport function automaticUpdatesAllowed(\n record: InstallRecord,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n return (\n record.updates?.enabled === true &&\n !record.updates.pinnedVersion &&\n !record.updates.mirror &&\n !env.CI &&\n env.MASON_NO_AUTO_UPDATE !== \"1\" &&\n !env.MASON_RELEASE_BASE &&\n !env.MASON_VERSION\n );\n}\n\n/** Automatic updates accept stable releases only and never downgrade. */\nexport function newerStableVersion(candidate: string, installed: string): boolean {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(candidate)) return false;\n const a = candidate.split(\".\").map(BigInt),\n b = installed.split(\"-\")[0].split(\".\").map(BigInt);\n for (let i = 0; i < 3; i++) {\n if (a[i] !== b[i]) return a[i] > b[i];\n }\n return installed.includes(\"-\");\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { storePath } from \"../utils/storage.js\";\n\nexport const targets = [\n \"darwin-arm64\",\n \"darwin-x64\",\n \"linux-arm64\",\n \"linux-x64\",\n \"win32-arm64\",\n \"win32-x64\",\n] as const;\nconst digest = z.string().regex(/^[a-f0-9]{64}$/);\nexport const bundleSchema = z\n .object({\n format: z.literal(1),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+(?:-[A-Za-z0-9.-]+)?$/),\n target: z.enum(targets),\n nodeVersion: z.string(),\n files: z.record(digest),\n })\n .strict();\nexport const sha256 = (bytes: Buffer | string) => createHash(\"sha256\").update(bytes).digest(\"hex\");\n\nexport async function readBundle(root: string) {\n const bytes = await fs.readFile(await storePath(root, \"bundle.json\"));\n const manifest = bundleSchema.parse(JSON.parse(bytes.toString(\"utf8\")));\n const windows = manifest.target.startsWith(\"win32-\");\n for (const file of Object.keys(manifest.files)) {\n if (\n file.includes(\"\\\\\") ||\n file.split(\"/\").some((p) => !p || p === \".\" || p === \"..\") ||\n path.isAbsolute(file)\n ) {\n throw new Error(\"Unsafe path in Mason bundle: \" + file);\n }\n }\n for (const required of [\n windows ? \"node.exe\" : \"node\",\n \"app/package.json\",\n \"app/dist/mason.js\",\n \"app/dist/mason-mcp.js\",\n ]) {\n if (!manifest.files[required]) throw new Error(\"Incomplete Mason bundle: \" + required);\n }\n return { manifest, manifestHash: sha256(bytes) };\n}\n\n/** Verify every shipped file before copying or selecting a standalone distribution. */\nexport async function verifyBundle(root: string, expectedHash?: string) {\n const bundle = await readBundle(root);\n if (expectedHash && bundle.manifestHash !== expectedHash)\n throw new Error(\"Mason bundle manifest changed.\");\n if (bundle.manifest.target !== `${process.platform}-${process.arch}`)\n throw new Error(\n \"Mason bundle is for another platform. Install this platform's bundle and rerun setup.\",\n );\n const files = Object.keys(bundle.manifest.files);\n // Bound concurrent reads; Node itself is a large file.\n for (let i = 0; i < files.length; i += 8)\n await Promise.all(\n files.slice(i, i + 8).map(async (file) => {\n if (sha256(await fs.readFile(await storePath(root, file))) !== bundle.manifest.files[file])\n throw new Error(\"Mason bundle checksum mismatch: \" + file);\n }),\n );\n return bundle;\n}\n","import tls from \"node:tls\";\n\n/** Called by standalone startup before any application network requests. */\nexport function configureSystemTrust() {\n if (process.env.NODE_USE_SYSTEM_CA === \"0\") return;\n // Older runtimes may lack these APIs; the bundled Node supports both.\n if (\n typeof tls.getCACertificates !== \"function\" ||\n typeof tls.setDefaultCACertificates !== \"function\"\n )\n return;\n tls.setDefaultCACertificates([\n ...tls.getCACertificates(\"default\"),\n ...tls.getCACertificates(\"system\"),\n ]);\n}\n\nexport function releaseRequestError(error: unknown): Error {\n const cause = error instanceof Error ? error.cause : undefined;\n const code =\n cause && typeof cause === \"object\" && \"code\" in cause ? String(cause.code) : undefined;\n const detail = code ?? (error instanceof Error ? error.message : String(error));\n const certificateError = code && /CERT|SELF_SIGNED|UNABLE_TO_VERIFY_LEAF_SIGNATURE/.test(code);\n const hint = certificateError\n ? \" Check that your company's CA certificate is trusted by your operating system, or provide its PEM file with NODE_EXTRA_CA_CERTS.\"\n : \" Check network and proxy access to GitHub.\";\n return new Error(`Could not check the latest Mason release on GitHub (${detail}).${hint}`, {\n cause: error,\n });\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport { unlinkSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { withLock } from \"../automation/store.js\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\nimport { readInstallation, standaloneLocation } from \"./state.js\";\nimport { verifyBundle } from \"./bundle.js\";\nimport { configureSystemTrust } from \"./trust.js\";\n\nconst leaseSchema = z.object({\n pid: z.number().int().positive(),\n host: z.string(),\n bundle: z.string().regex(/^[a-f0-9]{24}$/),\n});\n\n/** Every standalone entry point registers before executing application code. */\nexport async function registerRuntime() {\n const location = standaloneLocation();\n if (!location) return;\n configureSystemTrust();\n const { home, bundle } = location;\n const name = `runtimes/${randomUUID()}.json`;\n await withLock(home, \".install-lock\", async () => {\n await readInstallation(home);\n await fs.access(bundle);\n await writeStoreJson(home, name, {\n pid: process.pid,\n host: os.hostname(),\n bundle: path.basename(bundle),\n });\n });\n const file = await storePath(home, name);\n process.once(\"exit\", () => {\n try {\n unlinkSync(file);\n } catch {\n /* Stale leases are recovered by the next worker. */\n }\n });\n}\n\n/** Caller holds the update lock, before staging starts; startup shares the install lock. */\nexport async function pruneUnusedVersions(home: string) {\n // Full bundle verification and recursive deletion can be slow. Keep them\n // outside the lock needed by commands and new MCP sessions.\n const versions = await storePath(home, \"versions\");\n const candidates: { id: string; directory: string; retired: boolean }[] = [];\n const initial = await readInstallation(home);\n const initialKeep = new Set([initial.current, initial.previous?.id, initial.pending?.id]);\n for (const name of await fs.readdir(versions)) {\n const retired = /^\\.retired-([a-f0-9]{24})-[a-f0-9-]+$/.exec(name);\n const id = retired?.[1] ?? name;\n if (!/^[a-f0-9]{24}$/.test(id) || initialKeep.has(id)) continue;\n try {\n const directory = await storePath(home, `versions/${name}`);\n await fs.access(await storePath(directory, \"app/dist/mason-runtime.js\"));\n const bundle = await verifyBundle(directory);\n if (\n bundle.manifestHash.slice(0, 24) === id &&\n bundle.manifest.files[\"app/dist/mason-runtime.js\"]\n )\n candidates.push({ id, directory, retired: !!retired });\n } catch {\n /* Legacy, edited, or unknown bundles remain untouched. */\n }\n }\n if (!candidates.length) return;\n const garbage: string[] = [];\n await withLock(home, \".install-lock\", async () => {\n const record = await readInstallation(home);\n const keep = new Set([record.current, record.previous?.id, record.pending?.id]);\n const directory = await storePath(home, \"runtimes\");\n const leases = await fs.readdir(directory).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return [];\n throw error;\n });\n for (const name of leases) {\n if (!/^[a-f0-9-]+\\.json$/.test(name)) return;\n try {\n const raw = await readStoreJson(home, `runtimes/${name}`);\n if (raw === null) continue;\n const lease = leaseSchema.parse(raw);\n if (lease.host !== os.hostname()) return;\n try {\n process.kill(lease.pid, 0);\n keep.add(lease.bundle);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ESRCH\") return;\n await fs.rm(await storePath(home, `runtimes/${name}`), { force: true });\n }\n } catch {\n return;\n } // Uncertain process ownership means no deletion.\n }\n for (const candidate of candidates) {\n if (keep.has(candidate.id)) continue;\n try {\n const retired = candidate.retired\n ? candidate.directory\n : await storePath(home, `versions/.retired-${candidate.id}-${randomUUID()}`);\n if (!candidate.retired) await fs.rename(candidate.directory, retired);\n garbage.push(retired);\n } catch {\n /* Busy files remain available for the next check. */\n }\n }\n });\n for (const directory of garbage) await fs.rm(directory, { recursive: true }).catch(() => {});\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\n\nconst leaseSchema = z.object({ pid: z.number().int().positive(), host: z.string() });\n\n/** Called under the installation lock; uncertain ownership defers activation. */\nexport async function hasRunningMcp(home: string): Promise<boolean> {\n const directory = await storePath(home, \"sessions\");\n const files = await fs.readdir(directory).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return [];\n throw error;\n });\n for (const name of files) {\n if (!/^[a-f0-9-]+\\.json$/.test(name)) return true;\n const relative = \"sessions/\" + name;\n try {\n const raw = await readStoreJson(home, relative);\n if (raw === null) continue;\n const lease = leaseSchema.parse(raw);\n if (lease.host !== os.hostname()) return true;\n try {\n process.kill(lease.pid, 0);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ESRCH\") return true;\n }\n await fs.rm(await storePath(home, relative), { force: true });\n } catch {\n return true;\n }\n }\n return false;\n}\n\nexport async function registerMcp(home: string): Promise<() => Promise<void>> {\n const name = `sessions/${randomUUID()}.json`;\n await writeStoreJson(home, name, { pid: process.pid, host: os.hostname() });\n return async () => {\n await fs.rm(await storePath(home, name), { force: true }).catch(() => {});\n };\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { execFile, spawn } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { randomUUID } from \"node:crypto\";\nimport { verifyBundle } from \"./bundle.js\";\nimport { storePath, readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport { withLock } from \"../automation/store.js\";\nimport { configurePath, removePath } from \"./path.js\";\nimport type { Progress } from \"../utils/progress.js\";\nimport {\n automaticUpdatesAllowed,\n currentInstallation,\n defaultHome,\n newerStableVersion,\n readInstallation,\n recordSchema,\n type InstallRecord,\n} from \"./state.js\";\nimport { hasRunningMcp, registerMcp } from \"./sessions.js\";\nimport { releaseRequestError } from \"./trust.js\";\n\nexport { defaultHome } from \"./state.js\";\nconst shQuote = (s: string) => \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\nconst psQuote = (s: string) => \"'\" + s.replace(/'/g, \"''\") + \"'\";\n// Leave batch context before invoking PowerShell, as npm's cmd-shim does. A\n// continuing batch can lose the child exit code or reopen its deleted launcher.\n// https://github.com/npm/cmd-shim/blob/main/lib/index.js\nexport const WINDOWS_BATCH_LAUNCHER =\n '@echo off\\r\\ngoto #_mason_handoff_# 2>NUL || title %COMSPEC% & powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File \"%~dp0mason-launcher.ps1\" %*\\r\\n';\nconst launcherNames = [\"mason\", \"mason.cmd\", \"mason.ps1\", \"mason-launcher.ps1\"];\n\nasync function replace(file: string, content: string, mode = 0o600) {\n const temp = file + \".tmp-\" + randomUUID();\n try {\n await fs.writeFile(temp, content, { mode, flag: \"wx\" });\n await fs.rename(temp, file);\n } finally {\n await fs.rm(temp, { force: true });\n }\n}\n\n/** User installation only. Project runtimes and host trust remain independent. */\nexport interface InstallOptions {\n stageOnly?: boolean;\n policyRevision?: string;\n preservePolicy?: boolean;\n rollback?: boolean;\n}\n\nexport async function installStandalone(\n source: string,\n progress?: Progress,\n options: InstallOptions = {},\n) {\n progress?.step(\"Checking installation files and location\");\n const bundle = await verifyBundle(source);\n const selectedHome = path.resolve(defaultHome());\n if (!options.stageOnly) await fs.mkdir(selectedHome, { recursive: true });\n const home = await fs.realpath(selectedHome);\n if (options.stageOnly) {\n assertUpdatePolicy(\n await readInstallation(home),\n bundle.manifest.version,\n options.policyRevision,\n );\n const destination = await storePath(home, \"versions/\" + bundle.manifestHash.slice(0, 24));\n // Copying and starting the candidate must not hold the lock MCP startup needs.\n // The worker's update lock serializes downloads; recheck policy at publication.\n await copyBundle(home, source, destination, bundle);\n const { stdout } = await promisify(execFile)(\n path.join(destination, process.platform === \"win32\" ? \"node.exe\" : \"node\"),\n [path.join(destination, \"app/dist/mason.js\"), \"--version\"],\n { timeout: 30000, windowsHide: true, env: { ...process.env, MASON_NO_AUTO_UPDATE: \"1\" } },\n );\n if (stdout.trim() !== bundle.manifest.version)\n throw new Error(\"Downloaded Mason failed its version health check.\");\n }\n return withLock(home, \".install-lock\", () =>\n installLocked(home, source, bundle, progress, options),\n );\n}\n\nfunction assertUpdatePolicy(record: InstallRecord | null, version: string, revision?: string) {\n if (\n !record ||\n !automaticUpdatesAllowed(record, { ...process.env, MASON_VERSION: \"\" }) ||\n record.updates?.revision !== revision ||\n !newerStableVersion(version, record.version)\n ) {\n throw new Error(\"Update policy or installed version changed; download was not activated.\");\n }\n}\n\nasync function installLocked(\n home: string,\n source: string,\n bundle: Awaited<ReturnType<typeof verifyBundle>>,\n progress: Progress | undefined,\n options: InstallOptions,\n alreadyStaged = false,\n) {\n const raw = await readStoreJson(home, \"install.json\");\n const previous = raw === null ? null : recordSchema.parse(raw);\n if (options.stageOnly)\n assertUpdatePolicy(previous, bundle.manifest.version, options.policyRevision);\n if (!previous)\n for (const file of await fs.readdir(home)) {\n if (file === \".install-lock\") continue;\n // An interrupted preflight may leave an empty scaffold, never unowned content.\n const directory = path.join(home, file);\n const stat = await fs.lstat(directory);\n if (\n ![\"versions\", \"bin\"].includes(file) ||\n !stat.isDirectory() ||\n (await fs.readdir(directory)).length\n ) {\n throw new Error(\"Mason installation directory is not empty and has no ownership receipt.\");\n }\n }\n const selectedBin = path.resolve(\n process.env.MASON_BIN_DIR ??\n previous?.bin ??\n (process.platform === \"win32\"\n ? path.join(home, \"bin\")\n : path.join(os.homedir(), \".local/bin\")),\n );\n await fs.mkdir(selectedBin, { recursive: true });\n const bin = await fs.realpath(selectedBin);\n if (previous && (previous.home !== home || previous.bin !== bin))\n throw new Error(\"Installation paths differ from the existing Mason receipt.\");\n const id = bundle.manifestHash.slice(0, 24);\n const destination = await storePath(home, \"versions/\" + id);\n if (options.stageOnly) {\n const receipt: InstallRecord = {\n ...previous!,\n pending: { id, version: bundle.manifest.version, policyRevision: options.policyRevision! },\n };\n await writeStoreJson(home, \"install.json\", receipt);\n return {\n home,\n bin,\n version: bundle.manifest.version,\n previousVersion: previous!.version,\n path: { message: \"Update staged for a future MCP launch.\" },\n };\n }\n const launchers: Record<string, string> =\n process.platform === \"win32\"\n ? {\n \"mason.cmd\": WINDOWS_BATCH_LAUNCHER,\n \"mason-launcher.ps1\": `$ErrorActionPreference = 'Stop'\n$previousToken = $env:MASON_UNINSTALL_TOKEN\n$token = [Guid]::NewGuid().ToString()\n$env:MASON_UNINSTALL_TOKEN = $token\ntry {\n & ${psQuote(path.join(destination, \"node.exe\"))} ${psQuote(path.join(destination, \"app/dist/mason.js\"))} @args\n $code = $LASTEXITCODE\n if ($code -eq 0 -and $args.Count -eq 1 -and $args[0] -eq 'uninstall') {\n if ([IO.File]::ReadAllText(${psQuote(path.join(home, \".uninstall-request.txt\"))}) -cne $token) { throw 'Mason did not authorize installation cleanup.' }\n Remove-Item -LiteralPath ${psQuote(home)} -Recurse -Force\n Write-Output ${psQuote(\"Removed standalone installation: \" + home)}\n }\n exit $code\n} catch { [Console]::Error.WriteLine($_.Exception.Message); exit 2 }\nfinally { $env:MASON_UNINSTALL_TOKEN = $previousToken }\n`,\n }\n : {\n mason: `#!/bin/sh\\nexec ${shQuote(path.join(destination, \"node\"))} ${shQuote(path.join(destination, \"app/dist/mason.js\"))} \"$@\"\\n`,\n };\n for (const [name, content] of Object.entries(launchers)) {\n const file = await storePath(bin, name);\n const old = await fs.readFile(file, \"utf8\").catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n if (\n old !== null &&\n old !== previous?.launchers[name] &&\n old !== previous?.previousLaunchers?.[name] &&\n old !== content\n )\n throw new Error(\"Refusing to replace an unrelated or edited launcher: \" + file);\n }\n // The 0.14.0 mason.ps1 shadows mason.cmd in PowerShell, where default script\n // policy can block it. Keep the helper under a different command name and\n // remove the old one only when its recorded ownership still matches.\n const retired = Object.entries({ ...previous?.previousLaunchers, ...previous?.launchers }).filter(\n ([name]) => !(name in launchers),\n );\n const checkRetired = async (name: string, expected: string) => {\n if (!launcherNames.includes(name)) throw new Error(\"Invalid owned launcher name.\");\n const actual = await fs.readFile(await storePath(bin, name), \"utf8\").catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n if (actual !== null && actual !== expected)\n throw new Error(\"Retired launcher was edited; retained: \" + name);\n };\n for (const [name, expected] of retired) await checkRetired(name, expected);\n progress?.step(`Installing Mason ${bundle.manifest.version}`);\n const updates =\n options.preservePolicy && previous?.updates\n ? { ...previous.updates }\n : {\n ...(previous?.updates ?? {\n enabled: !previous && !process.env.CI && process.env.MASON_NO_AUTO_UPDATE !== \"1\",\n }),\n revision: randomUUID(),\n pinnedVersion: process.env.MASON_VERSION?.replace(/^v/, \"\") || undefined,\n mirror: process.env.MASON_RELEASE_BASE || previous?.updates?.mirror,\n };\n if (options.rollback) {\n updates.pinnedVersion = bundle.manifest.version;\n updates.revision = randomUUID();\n }\n const receipt: InstallRecord = {\n format: 1,\n home,\n bin,\n current: id,\n version: bundle.manifest.version,\n launchers,\n pathChanges: previous?.pathChanges ?? [],\n updates,\n previous:\n previous && previous.current !== id\n ? { id: previous.current, version: previous.version }\n : previous?.previous,\n };\n // Claim only the preflighted installation, retaining old launchers for interrupted upgrades.\n await writeStoreJson(\n home,\n \"install.json\",\n previous ? { ...previous, previousLaunchers: launchers } : receipt,\n );\n try {\n if (!alreadyStaged) await copyBundle(home, source, destination, bundle);\n for (const [name, content] of Object.entries(launchers))\n await replace(await storePath(bin, name, true), content, 0o755);\n for (const [name, expected] of retired) {\n await checkRetired(name, expected);\n await fs.rm(await storePath(bin, name), { force: true });\n }\n await writeStoreJson(home, \"install.json\", receipt);\n } catch (error) {\n // Preserve the working version when an unattended activation fails.\n if (previous) {\n for (const [name, content] of Object.entries(previous.launchers))\n await replace(await storePath(bin, name, true), content, 0o755);\n await writeStoreJson(home, \"install.json\", previous);\n }\n throw error;\n }\n if (options.preservePolicy)\n return {\n home,\n bin,\n version: receipt.version,\n previousVersion: previous?.version,\n path: { message: \"Installation selected.\" },\n };\n progress?.step(\"Checking terminal command availability\");\n const pathResult = await configurePath(bin, receipt.pathChanges ?? [], async (changes) => {\n receipt.pathChanges = changes;\n await writeStoreJson(home, \"install.json\", receipt);\n });\n return {\n home,\n bin,\n version: bundle.manifest.version,\n previousVersion: previous?.version,\n path: pathResult,\n };\n}\n\nasync function copyBundle(\n home: string,\n source: string,\n destination: string,\n bundle: Awaited<ReturnType<typeof verifyBundle>>,\n) {\n const exists = await fs.lstat(destination).then(\n () => true,\n (error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return false;\n throw error;\n },\n );\n if (exists) {\n await verifyBundle(destination, bundle.manifestHash);\n return;\n }\n const stage = await storePath(home, \"versions/.install-\" + randomUUID(), true);\n await fs.mkdir(stage);\n try {\n for (const file of [\"bundle.json\", ...Object.keys(bundle.manifest.files)]) {\n const from = await storePath(source, file),\n to = await storePath(stage, file, true);\n await fs.copyFile(from, to);\n await fs.chmod(to, (await fs.stat(from)).mode & 0o777);\n }\n await verifyBundle(stage, bundle.manifestHash);\n try {\n await fs.rename(stage, destination);\n } catch (error) {\n // A manual upgrade can finish the same immutable bundle while we stage it.\n try {\n await verifyBundle(destination, bundle.manifestHash);\n } catch {\n throw error;\n }\n }\n } finally {\n await fs.rm(stage, { recursive: true, force: true });\n }\n}\n\n/** Activation and lease registration share a lock, including concurrent host launches. */\nexport async function prepareStandaloneMcp(home: string) {\n const before = await readInstallation(home),\n candidate = before.pending;\n let verified: Awaited<ReturnType<typeof verifyBundle>> | undefined, verificationError: unknown;\n if (candidate && automaticUpdatesAllowed(before) && !(await hasRunningMcp(home))) {\n try {\n verified = await verifyBundle(await storePath(home, \"versions/\" + candidate.id));\n if (\n verified.manifestHash.slice(0, 24) !== candidate.id ||\n verified.manifest.version !== candidate.version\n )\n throw new Error(\"Staged update changed.\");\n } catch (error) {\n verificationError = error;\n }\n }\n return withLock(home, \".install-lock\", async () => {\n let record = await readInstallation(home);\n const pending = record.pending;\n if (\n pending &&\n candidate?.id === pending.id &&\n (verified || verificationError) &&\n automaticUpdatesAllowed(record) &&\n pending.policyRevision === record.updates?.revision &&\n newerStableVersion(pending.version, record.version) &&\n !(await hasRunningMcp(home))\n ) {\n try {\n if (verificationError) throw verificationError;\n const source = await storePath(home, \"versions/\" + pending.id);\n await installLocked(home, source, verified!, undefined, { preservePolicy: true }, true);\n record = await readInstallation(home);\n } catch (error) {\n // A bad staged version must not repeatedly delay host startup.\n record = await readInstallation(home);\n delete record.pending;\n await writeStoreJson(home, \"install.json\", record);\n await writeStoreJson(home, \"update-status.json\", {\n lastAttempt: Date.now(),\n error: String(error),\n });\n }\n }\n const release = await registerMcp(home);\n return { bundle: await storePath(home, \"versions/\" + record.current), release };\n });\n}\n\nexport async function rollbackStandalone() {\n const { home } = await currentInstallation();\n return withLock(home, \".install-lock\", async () => {\n const record = await readInstallation(home);\n if (!record.previous) throw new Error(\"No previous installation is available.\");\n if (await hasRunningMcp(home))\n throw new Error(\"Close running Mason MCP sessions before rolling back.\");\n const source = await storePath(home, \"versions/\" + record.previous.id);\n const bundle = await verifyBundle(source);\n if (\n bundle.manifestHash.slice(0, 24) !== record.previous.id ||\n bundle.manifest.version !== record.previous.version\n )\n throw new Error(\"Previous installation changed.\");\n return installLocked(home, source, bundle, undefined, { preservePolicy: true, rollback: true });\n });\n}\n\nexport async function upgradeStandalone(version?: string, progress?: Progress) {\n if (version && !/^v?\\d+\\.\\d+\\.\\d+(?:-[A-Za-z0-9.-]+)?$/.test(version))\n throw new Error(\"Expected a release version such as 0.14.0.\");\n progress?.step(\"Checking current installation\");\n const { home, bundle, record } = await currentInstallation();\n await verifyBundle(bundle);\n const mirror = process.env.MASON_RELEASE_BASE || record.updates?.mirror || \"\";\n if (mirror && !version)\n throw new Error(\n \"Specify a version when upgrading from a company mirror; no public latest-version lookup was made.\",\n );\n let selected = version?.replace(/^v/, \"\");\n if (!selected) {\n progress?.step(\"Checking the latest release\");\n const response = await fetch(\"https://github.com/adrianczuczka/mason/releases/latest\", {\n method: \"HEAD\",\n redirect: \"follow\",\n signal: AbortSignal.timeout(30000),\n }).catch((error: unknown) => {\n throw releaseRequestError(error);\n });\n if (!response.ok) throw new Error(`Latest release request failed (HTTP ${response.status}).`);\n selected = new URL(response.url).pathname.split(\"/\").pop()?.replace(/^v/, \"\");\n if (!selected || !/^\\d+\\.\\d+\\.\\d+(?:-[A-Za-z0-9.-]+)?$/.test(selected))\n throw new Error(\"Invalid Mason release version.\");\n }\n const alreadyInstalled = await withLock(home, \".install-lock\", async () => {\n const current = await readInstallation(home);\n if (current.version !== selected) return false;\n await verifyBundle(await storePath(home, \"versions/\" + current.current));\n current.updates = {\n ...(current.updates ?? { enabled: false }),\n revision: randomUUID(),\n pinnedVersion: version ? selected : undefined,\n mirror: mirror || undefined,\n };\n delete current.pending;\n await writeStoreJson(home, \"install.json\", current);\n return true;\n });\n if (alreadyInstalled) {\n progress?.stop();\n console.log(`Mason ${selected} is already installed.`);\n return 0;\n }\n const windows = process.platform === \"win32\";\n const script = path.join(bundle, windows ? \"install.ps1\" : \"install.sh\");\n // The installer owns progress from here; do not animate over its inherited IO.\n progress?.stop();\n const code = await new Promise<number>((resolve, reject) => {\n const child = spawn(\n windows ? \"powershell.exe\" : \"sh\",\n windows\n ? [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-File\",\n script,\n selected!,\n ]\n : [script, selected!],\n {\n stdio: \"inherit\",\n windowsHide: true,\n env: {\n ...process.env,\n MASON_HOME: home,\n MASON_BIN_DIR: record.bin,\n MASON_RELEASE_BASE: process.env.MASON_RELEASE_BASE || record.updates?.mirror || \"\",\n MASON_VERSION: version ?? \"\",\n MASON_UPDATE_POLICY_REVISION: \"\",\n MASON_EXPECTED_SHA256: \"\",\n },\n },\n );\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => resolve(code ?? 2));\n });\n if (code === 0)\n console.log(\n \"Restart running assistants to use this installation. Existing project integrations use mason from PATH.\",\n );\n return code;\n}\n\nexport async function uninstallStandalone() {\n const { home, record } = await currentInstallation();\n const token = process.env.MASON_UNINSTALL_TOKEN;\n if (process.platform === \"win32\" && (!token || !/^[a-f0-9-]{36}$/i.test(token))) {\n throw new Error(\n \"Run mason uninstall through the installed Windows launcher so it can remove Node after exit.\",\n );\n }\n await withLock(home, \".install-lock\", async () => {\n for (const [name, expected] of Object.entries(record.launchers)) {\n if (!launcherNames.includes(name)) throw new Error(\"Invalid owned launcher name.\");\n const file = await storePath(record.bin, name);\n const actual = await fs.readFile(file, \"utf8\").catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n if (actual !== null && actual !== expected)\n throw new Error(\"Launcher was edited; retained: \" + file);\n }\n for (const warning of await removePath(record.pathChanges ?? [])) console.error(warning);\n if (process.platform === \"win32\")\n await replace(await storePath(home, \".uninstall-request.txt\", true), token!);\n for (const name of Object.keys(record.launchers))\n await fs.rm(await storePath(record.bin, name), { force: true });\n });\n // The Windows launcher supervises Node and removes its locked executable only\n // after this process exits. Its exit status includes cleanup failures. Detached\n // PowerShell did not start reliably: https://github.com/nodejs/node/issues/51018\n if (process.platform !== \"win32\") await fs.rm(home, { recursive: true, force: true });\n return home;\n}\n","import { isRecord } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { withLock } from \"../automation/store.js\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\nimport {\n standaloneLocation,\n automaticUpdatesAllowed,\n currentInstallation,\n newerStableVersion,\n readInstallation,\n type InstallRecord,\n} from \"./state.js\";\nimport { verifyBundle } from \"./bundle.js\";\nimport { pruneUnusedVersions } from \"./runtime.js\";\nimport { prepareStandaloneMcp } from \"./install.js\";\n\nexport const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\nexport const RELEASE_AGE_MS = 24 * 60 * 60 * 1000;\nconst releaseBase = \"https://github.com/adrianczuczka/mason/releases\";\nconst releaseListSchema = z.array(\n z.object({\n tag_name: z.string(),\n draft: z.boolean(),\n prerelease: z.boolean(),\n published_at: z.string().nullable(),\n }),\n);\nexport const updateManifestSchema = z\n .object({\n format: z.literal(1),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/),\n publishedAt: z.string().datetime(),\n assets: z.record(z.string().regex(/^[a-f0-9]{64}$/)),\n })\n .strict();\nconst statusSchema = z.object({\n lastAttempt: z.number(),\n availableVersion: z.string().optional(),\n error: z.string().optional(),\n});\n\nasync function boundedDownload(url: string): Promise<Buffer> {\n const response = await fetch(url, { signal: AbortSignal.timeout(15000), redirect: \"follow\" });\n if (!response.ok || !response.body)\n throw new Error(`Update metadata request failed (HTTP ${response.status}).`);\n if (Number(response.headers.get(\"content-length\")) > 1024 * 1024)\n throw new Error(\"Update metadata is too large.\");\n const reader = response.body.getReader(),\n chunks: Uint8Array[] = [];\n let size = 0;\n try {\n for (;;) {\n const chunk: unknown = await reader.read();\n if (!isRecord(chunk) || typeof chunk.done !== \"boolean\")\n throw new Error(\"Invalid update metadata stream.\");\n const { value, done } = chunk;\n if (done) break;\n if (!(value instanceof Uint8Array)) throw new Error(\"Invalid update metadata stream.\");\n size += value.length;\n if (size > 1024 * 1024) throw new Error(\"Update metadata is too large.\");\n chunks.push(value);\n }\n } finally {\n await reader.cancel();\n }\n return Buffer.concat(chunks);\n}\n\n/** Bind both the release contents and exact tag workflow identity before using a download hash. */\nexport async function fetchVerifiedRelease(home: string, now = Date.now()) {\n // Select the newest eligible release, not just /latest: daily releases must\n // not keep every automatic update perpetually inside the waiting period.\n const releases = releaseListSchema.parse(\n JSON.parse(\n (\n await boundedDownload(\n \"https://api.github.com/repos/adrianczuczka/mason/releases?per_page=30\",\n )\n ).toString(\"utf8\"),\n ),\n );\n const installed = (await readInstallation(home)).version;\n let selected: string | undefined;\n for (const release of releases) {\n const version = release.tag_name.replace(/^v/, \"\");\n if (\n release.tag_name !== \"v\" + version ||\n release.draft ||\n release.prerelease ||\n !release.published_at ||\n !(now - Date.parse(release.published_at) >= RELEASE_AGE_MS) ||\n !newerStableVersion(version, installed)\n )\n continue;\n if (!selected || newerStableVersion(version, selected)) selected = version;\n }\n if (!selected) return null;\n const bytes = await boundedDownload(`${releaseBase}/download/v${selected}/update.json`);\n const manifest = updateManifestSchema.parse(JSON.parse(bytes.toString(\"utf8\")));\n if (manifest.version !== selected)\n throw new Error(\"Signed manifest does not match the selected release.\");\n const signature: unknown = JSON.parse(\n (\n await boundedDownload(`${releaseBase}/download/v${manifest.version}/update.sigstore.json`)\n ).toString(\"utf8\"),\n );\n // DSSE verifies its embedded payload, ignoring an external artifact argument.\n // Accept only detached message signatures that bind these exact manifest bytes.\n if (\n !isRecord(signature) ||\n !isRecord(signature.messageSignature) ||\n signature.dsseEnvelope !== undefined\n )\n throw new Error(\"Update metadata requires a detached message signature.\");\n const { bundleFromJSON, bundleToJSON } = await import(\"@sigstore/bundle\");\n const bundle = bundleToJSON(bundleFromJSON(signature));\n const { verify } = await import(\"sigstore\");\n await verify(bundle, bytes, {\n certificateIdentityURI: `https://github.com/adrianczuczka/mason/.github/workflows/publish.yml@refs/tags/v${manifest.version}`,\n certificateIssuer: \"https://token.actions.githubusercontent.com\",\n tufCachePath: await storePath(home, \"sigstore-cache\"),\n timeout: 10000,\n retry: 0,\n ctLogThreshold: 1,\n tlogThreshold: 1,\n });\n return manifest;\n}\n\nasync function runInstaller(home: string, version: string, digest: string, revision: string) {\n const record = await readInstallation(home);\n const bundle = await storePath(home, \"versions/\" + record.current);\n await verifyBundle(bundle);\n const windows = process.platform === \"win32\",\n script = path.join(bundle, windows ? \"install.ps1\" : \"install.sh\");\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n windows ? \"powershell.exe\" : \"sh\",\n windows\n ? [\"-NoProfile\", \"-NonInteractive\", \"-ExecutionPolicy\", \"Bypass\", \"-File\", script]\n : [script],\n {\n cwd: home,\n windowsHide: true,\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n timeout: 10 * 60 * 1000,\n env: {\n ...process.env,\n MASON_HOME: home,\n MASON_BIN_DIR: record.bin,\n MASON_VERSION: version,\n MASON_RELEASE_BASE: \"\",\n MASON_EXPECTED_SHA256: digest,\n MASON_UPDATE_POLICY_REVISION: revision,\n },\n },\n );\n let diagnostic = \"\";\n child.stderr!.on(\"data\", (bytes) => {\n diagnostic = (diagnostic + bytes).slice(-4000);\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`Update download failed (${code}): ${diagnostic.trim()}`)),\n );\n });\n}\n\n/** Separate worker: no inherited MCP/hook streams, one attempt per installation per day. */\nexport async function runAutomaticUpdate(\n home: string,\n dependencies = { fetchRelease: fetchVerifiedRelease, install: runInstaller },\n now = Date.now(),\n) {\n await withLock(\n home,\n \".update-lock\",\n async () => {\n const record = await readInstallation(home);\n if (!automaticUpdatesAllowed(record)) return;\n const old = statusSchema.safeParse(await readStoreJson(home, \"update-status.json\"));\n if (\n old.success &&\n now - old.data.lastAttempt < CHECK_INTERVAL_MS &&\n old.data.lastAttempt <= now\n )\n return;\n const status: z.infer<typeof statusSchema> = { lastAttempt: now };\n await writeStoreJson(home, \"update-status.json\", status);\n try {\n await pruneUnusedVersions(home).catch(() => {});\n const release = await dependencies.fetchRelease(home);\n if (!release) return;\n status.availableVersion = release.version;\n const age = now - Date.parse(release.publishedAt);\n if (\n age >= RELEASE_AGE_MS &&\n newerStableVersion(release.version, record.version) &&\n (!record.pending || newerStableVersion(release.version, record.pending.version))\n ) {\n const asset = `mason-${process.platform}-${process.arch}.${process.platform === \"win32\" ? \"zip\" : \"tar.gz\"}`;\n const digest = release.assets[asset];\n if (!digest) throw new Error(\"Signed release has no archive for this platform.\");\n // Users may disable, pin, manually upgrade, or uninstall while network requests run.\n const fresh = await readInstallation(home);\n if (\n automaticUpdatesAllowed(fresh) &&\n fresh.updates?.revision === record.updates!.revision &&\n newerStableVersion(release.version, fresh.version)\n ) {\n await dependencies.install(home, release.version, digest, record.updates!.revision);\n }\n }\n } catch (error) {\n status.error = error instanceof Error ? error.message : String(error);\n }\n // Do not recreate an installation removed while the worker was downloading.\n if (\n await fs.access(path.join(home, \"install.json\")).then(\n () => true,\n () => false,\n )\n )\n await writeStoreJson(home, \"update-status.json\", status);\n },\n 0,\n );\n}\n\nexport async function scheduleAutomaticUpdate(): Promise<void> {\n try {\n const { home, record } = await currentInstallation();\n if (!automaticUpdatesAllowed(record)) return;\n const status = statusSchema.safeParse(await readStoreJson(home, \"update-status.json\"));\n const now = Date.now();\n if (\n status.success &&\n status.data.lastAttempt <= now &&\n now - status.data.lastAttempt < CHECK_INTERVAL_MS\n )\n return;\n const bundle = await storePath(home, \"versions/\" + record.current);\n const child = spawn(\n path.join(bundle, process.platform === \"win32\" ? \"node.exe\" : \"node\"),\n [path.join(bundle, \"app/dist/mason.js\"), \"internal-update\"],\n { cwd: home, env: process.env, stdio: \"ignore\", detached: true, windowsHide: true },\n );\n child.on(\"error\", () => {});\n child.unref();\n } catch {\n /* npm, offline, read-only, or damaged installations must still run. */\n }\n}\n\nexport async function updateSettings(home: string, action: \"enable\" | \"disable\" | \"pin\" | \"unpin\") {\n return withLock(home, \".install-lock\", async () => {\n const record = await readInstallation(home);\n const updates: NonNullable<InstallRecord[\"updates\"]> = {\n ...(record.updates ?? { enabled: false }),\n revision: randomUUID(),\n };\n if (action === \"enable\") updates.enabled = true;\n if (action === \"disable\") updates.enabled = false;\n if (action === \"pin\") updates.pinnedVersion = record.version;\n if (action === \"unpin\") delete updates.pinnedVersion;\n record.updates = updates;\n delete record.pending;\n await writeStoreJson(home, \"install.json\", record);\n return record;\n });\n}\n\nexport async function updateStatus(home: string) {\n const record = await readInstallation(home);\n const lastCheck = statusSchema.parse(\n (await readStoreJson(home, \"update-status.json\")) ?? { lastAttempt: 0 },\n );\n return {\n version: record.version,\n enabled: record.updates?.enabled ?? false,\n effective: automaticUpdatesAllowed(record),\n pinnedVersion: record.updates?.pinnedVersion ?? null,\n mirror: record.updates?.mirror ?? null,\n pendingVersion: record.pending?.version ?? null,\n lastCheck: lastCheck.lastAttempt ? lastCheck : null,\n };\n}\n\n/** The MCP process holds a lease for its lifetime; pending versions activate before the first new server. */\nexport async function startMcpWithUpdates(start: (onClose?: () => void) => Promise<void>) {\n const current = standaloneLocation();\n if (!current) {\n await start();\n return;\n }\n // A standalone server must never run without a lease: another process could\n // otherwise treat it as idle and activate an update underneath that server.\n const session = await prepareStandaloneMcp(current.home);\n if (session.bundle !== current.bundle) {\n const child = spawn(\n path.join(session.bundle, process.platform === \"win32\" ? \"node.exe\" : \"node\"),\n [path.join(session.bundle, \"app/dist/mason-mcp.js\"), ...process.argv.slice(2)],\n { stdio: \"inherit\", windowsHide: true },\n );\n const interrupt = () => {\n child.kill(\"SIGINT\");\n },\n terminate = () => {\n child.kill(\"SIGTERM\");\n };\n process.on(\"SIGINT\", interrupt);\n process.on(\"SIGTERM\", terminate);\n try {\n process.exitCode = await new Promise<number>((resolve, reject) => {\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => resolve(code ?? 1));\n });\n } finally {\n process.off(\"SIGINT\", interrupt);\n process.off(\"SIGTERM\", terminate);\n await session.release();\n }\n return;\n }\n const timer = setInterval(\n () => {\n void scheduleAutomaticUpdate();\n },\n 60 * 60 * 1000,\n );\n timer.unref();\n const stop = () => {\n clearInterval(timer);\n void session?.release();\n };\n try {\n await start(stop);\n void scheduleAutomaticUpdate();\n } catch (error) {\n stop();\n throw error;\n }\n}\n","import { fileURLToPath } from \"node:url\";\nimport { runAutomationCli, isHookCommand } from \"../src/automation/cli.js\";\nimport { createProgress, type Progress } from \"../src/utils/progress.js\";\n\ndeclare const PKG_VERSION: string;\nconst inputArgs = process.argv.slice(2);\nconst managedLaunch = inputArgs[0] === \"--setup-host\";\nconst setupHost = managedLaunch ? inputArgs.splice(0, 2)[1] : undefined;\nconst [command, ...args] = inputArgs;\nconst usage = `Mason ${PKG_VERSION}\n\nUsage: mason <command> [options]\n\n setup --host codex|claude Activate this checkout without editing shared files\n init --host codex|claude Prepare shared configuration for review\n teardown [--host codex|claude] Disconnect locally; --project removes shared configuration\n status Show configuration, observed use and verification\n stats Show local stats and feedback\n install --host codex|claude Install lifecycle hooks\n config Configure lifecycle hooks and Stop behavior\n hook --host codex|claude Process an assistant lifecycle event\n check Resume and verify retained documentation findings\n audit Audit project instructions\n review --base <ref> Review committed changes\n drift Check an optional architecture map\n mcp Run the MCP server (stdio)\n upgrade [version] Upgrade the standalone user installation\n updates [status|enable|disable|pin|unpin]\n Manage automatic standalone updates\n rollback Restore and pin the previous standalone version\n uninstall Remove that installation; retain project data\n\nUse mason <command> --help for options. npm users can also use\nmason-audit, mason-review, mason-drift, mason-hook and mason-mcp.`;\n\n// Bare hook and --print-config retain the standalone decision injector.\nconst lifecycleHook =\n (command === \"auto\" && isHookCommand(args)) ||\n (command === \"hook\" && !args.includes(\"--print-config\") && (managedLaunch || args.length > 0));\nlet progress: Progress | undefined;\ntry {\n if (managedLaunch) {\n if (\n !setupHost ||\n ![\"codex\", \"claude\"].includes(setupHost) ||\n !([\"mcp\", \"auto\"].includes(command) || lifecycleHook)\n )\n throw new Error(\"Invalid setup invocation.\");\n // Hook setup is checked against the parsed payload's checkout, after stdin\n // is read. MCP can explain missing setup over the protocol in a fresh clone.\n if (!lifecycleHook) {\n const { prepareLaunch } = await import(\"../src/setup/launcher.js\");\n await prepareLaunch(setupHost as \"codex\" | \"claude\", { allowInactive: command === \"mcp\" });\n }\n }\n if (command === \"internal-integration-version\")\n console.log(JSON.stringify({ protocol: 1, version: PKG_VERSION }));\n else if (!command || [\"--help\", \"-h\", \"help\"].includes(command)) console.log(usage);\n else if ([\"--version\", \"-v\"].includes(command)) console.log(PKG_VERSION);\n else if (command === \"internal-update\") {\n if (args.length) throw new Error(\"internal-update takes no arguments.\");\n const { currentInstallation } = await import(\"../src/distribution/state.js\");\n const { runAutomaticUpdate } = await import(\"../src/distribution/updates.js\");\n await runAutomaticUpdate((await currentInstallation()).home);\n } else if (command === \"internal-install\") {\n if (args.length) throw new Error(\"internal-install takes no arguments.\");\n const { installStandalone } = await import(\"../src/distribution/install.js\");\n const bundleRoot = fileURLToPath(new URL(\"../..\", import.meta.url));\n progress = createProgress();\n const policyRevision = process.env.MASON_UPDATE_POLICY_REVISION;\n if (policyRevision && !/^[a-f0-9]{64}$/.test(process.env.MASON_EXPECTED_SHA256 ?? \"\"))\n throw new Error(\"Automatic staging requires a verified release checksum.\");\n const installed = await installStandalone(bundleRoot, progress, {\n stageOnly: !!policyRevision,\n policyRevision,\n });\n progress.stop();\n const outcome =\n installed.previousVersion && installed.previousVersion !== installed.version\n ? `Updated Mason ${installed.previousVersion} → ${installed.version}`\n : `Installed Mason ${installed.version}`;\n if (policyRevision)\n console.log(\n `Staged Mason ${installed.version}. It will activate at a future MCP launch after existing servers exit.`,\n );\n else {\n const { updateStatus } = await import(\"../src/distribution/updates.js\");\n const status = await updateStatus(installed.home);\n const policy = status.pinnedVersion\n ? `pinned to ${status.pinnedVersion}`\n : status.mirror\n ? \"managed by your mirror\"\n : status.enabled\n ? \"enabled\"\n : \"disabled\";\n console.log(\n `${outcome} in ${installed.home}.\\n${installed.path.message}\\nAutomatic updates: ${policy}. Manage with mason updates.`,\n );\n }\n } else if (command === \"updates\") {\n if (args.includes(\"--help\"))\n console.log(\n \"Usage: mason updates [status|enable|disable|pin|unpin] [--json]. Pin holds the installed version; mason upgrade <version> installs and pins a specific release. Environment and mirror restrictions still apply.\",\n );\n else {\n const action = args.filter((arg) => arg !== \"--json\")[0] ?? \"status\";\n if (\n args.filter((arg) => arg !== \"--json\").length > 1 ||\n ![\"status\", \"enable\", \"disable\", \"pin\", \"unpin\"].includes(action)\n )\n throw new Error(\"Usage: mason updates [status|enable|disable|pin|unpin] [--json]\");\n const { currentInstallation } = await import(\"../src/distribution/state.js\");\n const { updateSettings, updateStatus, scheduleAutomaticUpdate } =\n await import(\"../src/distribution/updates.js\");\n const { home } = await currentInstallation();\n if (action !== \"status\")\n await updateSettings(home, action as \"enable\" | \"disable\" | \"pin\" | \"unpin\");\n const status = await updateStatus(home);\n if (args.includes(\"--json\")) console.log(JSON.stringify(status));\n else {\n console.log(\n `Mason ${status.version}\\nAutomatic updates: ${status.effective ? \"enabled\" : \"inactive\"} (preference: ${status.enabled ? \"enabled\" : \"disabled\"}).`,\n );\n if (status.pinnedVersion)\n console.log(\n `Pinned to ${status.pinnedVersion}. Run mason updates unpin to follow stable releases.`,\n );\n if (status.mirror)\n console.log(\"Company mirror installation: automatic public updates are disabled.\");\n if (!status.effective && status.enabled && !status.pinnedVersion && !status.mirror)\n console.log(\n \"Suppressed by CI, MASON_NO_AUTO_UPDATE, MASON_VERSION, or MASON_RELEASE_BASE.\",\n );\n if (status.pendingVersion)\n console.log(\n `Downloaded ${status.pendingVersion}; activates on a future MCP launch after existing servers exit.`,\n );\n if (status.lastCheck) {\n console.log(`Last check: ${new Date(status.lastCheck.lastAttempt).toISOString()}`);\n if (status.lastCheck.availableVersion)\n console.log(`Available stable release: ${status.lastCheck.availableVersion}`);\n if (status.lastCheck.error) console.log(`Last update problem: ${status.lastCheck.error}`);\n }\n }\n if (action === \"enable\" || action === \"unpin\") void scheduleAutomaticUpdate();\n }\n } else if (command === \"rollback\") {\n if (args.includes(\"--help\"))\n console.log(\n \"Usage: mason rollback. Close running Mason MCP servers, then restore and pin the previous installed version.\",\n );\n else {\n if (args.length) throw new Error(\"rollback takes no arguments.\");\n const { rollbackStandalone } = await import(\"../src/distribution/install.js\");\n const restored = await rollbackStandalone();\n console.log(\n `Restored Mason ${restored.version} and pinned it. Run mason updates unpin to resume automatic updates.`,\n );\n }\n } else if (command === \"upgrade\" || command === \"uninstall\") {\n if (args.includes(\"--help\"))\n console.log(\n command === \"upgrade\"\n ? \"Usage: mason upgrade [version]. Configured projects use the upgraded command on their next launch. Restart running assistants.\"\n : \"Usage: mason uninstall. Removes the standalone user installation; project configuration and knowledge are retained. Run mason teardown in each project first to disconnect its integrations.\",\n );\n else {\n const { upgradeStandalone, uninstallStandalone } =\n await import(\"../src/distribution/install.js\");\n if (args.length > (command === \"upgrade\" ? 1 : 0)) throw new Error(\"Unexpected arguments.\");\n if (command === \"upgrade\") {\n progress = createProgress();\n process.exitCode = await upgradeStandalone(args[0], progress);\n } else\n console.log(\n (process.platform === \"win32\"\n ? \"Finishing installation cleanup after runtime exit: \"\n : \"Removed standalone installation: \") +\n (await uninstallStandalone()) +\n \". Project configuration and knowledge were retained. Reinstall Mason to use its integrations.\",\n );\n }\n } else if (\n [\"init\", \"setup\", \"teardown\", \"status\", \"check\", \"stats\", \"install\", \"config\", \"auto\"].includes(\n command,\n ) ||\n lifecycleHook\n ) {\n const forwarded = command === \"auto\" ? args : [command, ...args];\n let input = \"\";\n if (isHookCommand(forwarded) && !process.stdin.isTTY)\n for await (const chunk of process.stdin) {\n const value: unknown = chunk;\n if (typeof value === \"string\") input += value;\n else if (value instanceof Uint8Array) input += Buffer.from(value).toString();\n else throw new Error(\"Unsupported stdin chunk.\");\n if (Buffer.byteLength(input) > 1024 * 1024) break;\n }\n process.exitCode = await runAutomationCli(forwarded, input, undefined, {\n managedHost: managedLaunch ? (setupHost as \"codex\" | \"claude\") : undefined,\n });\n } else if ([\"audit\", \"review\", \"drift\", \"hook\", \"mcp\"].includes(command)) {\n const binary = new URL(`./mason-${command}.js`, import.meta.url);\n process.argv = [process.execPath, fileURLToPath(binary), ...args];\n await import(binary.href);\n } else throw new Error(\"Unknown command: \" + command + \". Run mason --help.\");\n} catch (error) {\n progress?.stop(false);\n const message = \"Mason: \" + (error instanceof Error ? error.message : String(error));\n if (lifecycleHook) {\n console.log(JSON.stringify({ systemMessage: message + \" Verification was not established.\" }));\n process.exitCode = 0;\n } else {\n console.error(message);\n process.exitCode = 2;\n }\n}\n","import { configureStopBlock } from \"./config.js\";\nimport {\n configureUsefulness,\n rateUsefulness,\n usefulnessRating,\n usefulnessStatus,\n summarizeUsefulness,\n} from \"./usefulness.js\";\nimport { automationFailure, failureMessage } from \"./execution.js\";\nimport { parseArgs } from \"node:util\";\nimport { automate, automationStatus, summarize } from \"./runtime.js\";\nimport { runAutomationHook, hookConfig } from \"./adapters.js\";\nimport { installAutomation, installedAutomation } from \"./install.js\";\nimport { hostSchema } from \"./store.js\";\nimport { createProgress, type Progress } from \"../utils/progress.js\";\nimport { withProfile } from \"../utils/profile.js\";\n\nconst TEARDOWN_USAGE = `Usage: mason teardown [--project] [options]\n\nDisconnect Mason locally. Defaults to all locally configured hosts.\n\n --host codex|claude Disconnect only this host\n --project Remove shared integration files for review and commit\n --dir <path> Project directory (defaults to cwd; subdirectories work)\n --dry-run Preview changes without writing\n --json Machine-readable changes and diagnostics\n\nKeeps shared knowledge, repair evidence, ignore rules and the Mason installation.\nEdited or ambiguous entries are retained for manual cleanup. Restart assistants\nafter teardown. Run mason setup --host codex or --host claude to reconnect.\nExit 0: complete/no-op. Exit 2: cleanup needs attention (also in dry runs).`;\n\nconst STATS_USAGE = `Usage: mason stats [options]\n\nShow aggregate local observations, or inspect one session.\n\n --enable | --disable Enable/disable collection (disabled by default)\n --json Include session/finding IDs and evidence paths\n --dir <path> Project directory (defaults to cwd)\n --session <id> Filter to one retained session\n --session <id> --finding <id> --rating helpful|already-knew|irrelevant|deferred\n Supply feedback without changing audit status\n\nNo uploads. Observed resolution does not establish causation.`;\n\nconst USAGE = `Usage: mason <init|setup|teardown|install|config|status|check|hook|stats> [options]\n\n setup [--host claude|codex] Activate existing shared configuration locally\n init --host claude|codex Prepare shared configuration for review and commit\n teardown [--host claude|codex] Disconnect locally; --project removes shared configuration\n install --host claude|codex Merge lifecycle hooks into this project's host config\n config --host claude|codex Print the host config without writing\n config --stop-block off|drift Set local Claude Stop review behavior (default: drift)\n status Read configured hooks and observed runtime events\n stats Aggregate local observations; --enable/--disable to configure\n Rate with --session <id> --finding <id> --rating helpful|already-knew|irrelevant|deferred\n check Capture/resume and verify retained audit evidence\n hook --host claude|codex Handle host JSON on stdin\n\n --dir <path> Project directory (defaults to cwd)\n --command <prefix> Installed executable prefix for install/config\n --dry-run Preview init or teardown without writing\n --json Machine-readable output (status also uses JSON when piped)\n --profile Local phase timings on stderr for check/hook; no file contents\n\ncheck exits 0 for verified checks, 1 for issues, 2 for incomplete/unavailable.\nteardown exits 0 for complete/no-op, 2 when cleanup needs attention (also in dry runs).\nHooks check decision anchors only, without creating or verifying repair baselines.\nHooks exit 0; Claude Stop can block once for uninspected session anchor edits.\nRe-entry and Codex remain advisory; failed captures are reported explicitly.\nLocal evidence is written under .mason/reports/. No LLM calls or source edits.`;\n\nconst parseCli = (argv: string[]) =>\n parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n dir: { type: \"string\" },\n host: { type: \"string\" },\n command: { type: \"string\" },\n \"stop-block\": { type: \"string\" },\n json: { type: \"boolean\" },\n help: { type: \"boolean\", short: \"h\" },\n \"dry-run\": { type: \"boolean\" },\n project: { type: \"boolean\" },\n profile: { type: \"boolean\" },\n enable: { type: \"boolean\" },\n disable: { type: \"boolean\" },\n session: { type: \"string\" },\n finding: { type: \"string\" },\n rating: { type: \"string\" },\n },\n });\nexport function isHookCommand(argv: string[]): boolean {\n try {\n const parsed = parseCli(argv);\n return parsed.positionals[0] === \"hook\" && !parsed.values.help;\n } catch {\n return false;\n }\n}\n\nconst defaultIo = {\n out: (s: string) => process.stdout.write(s + \"\\n\"),\n err: (s: string) => process.stderr.write(s + \"\\n\"),\n};\nexport async function runAutomationCli(\n argv: string[],\n stdin = \"\",\n io = defaultIo,\n options: { managedHost?: \"codex\" | \"claude\" } = {},\n): Promise<number> {\n let action = \"\";\n let progress: Progress | undefined;\n try {\n const { values, positionals } = parseCli(argv);\n if (values.help || !positionals.length) {\n io.out(\n positionals[0] === \"teardown\"\n ? TEARDOWN_USAGE\n : positionals[0] === \"stats\"\n ? STATS_USAGE\n : USAGE,\n );\n return 0;\n }\n if (positionals.length !== 1) throw new Error(\"Expected one command.\");\n [action] = positionals;\n if (values.profile && ![\"check\", \"hook\"].includes(action))\n throw new Error(\"--profile applies only to check/hook.\");\n if (values.project !== undefined && action !== \"teardown\")\n throw new Error(\"--project applies only to teardown.\");\n const trackingOptions = [\n values.enable,\n values.disable,\n values.session,\n values.finding,\n values.rating,\n ].some((v) => v !== undefined);\n if (trackingOptions && action !== \"stats\")\n throw new Error(\"Tracking options apply only to stats.\");\n const measured = <T>(run: () => Promise<T>) =>\n values.profile ? withProfile(run, io.err) : run();\n const dir = values.dir ?? process.cwd();\n if (values[\"dry-run\"] !== undefined && ![\"init\", \"teardown\"].includes(action))\n throw new Error(\"--dry-run applies only to init/teardown.\");\n if (values[\"stop-block\"] !== undefined) {\n if (action !== \"config\" || values.host || values.command)\n throw new Error(\n \"--stop-block applies only to config, separately from host hook generation.\",\n );\n io.out(JSON.stringify(await configureStopBlock(dir, values[\"stop-block\"]), null, 2));\n return 0;\n }\n if (action === \"teardown\") {\n if (values.command !== undefined)\n throw new Error(\"--command applies only to install/config.\");\n const { teardownProject, summarizeTeardown } = await import(\"../setup/teardown.js\");\n const result = await teardownProject(dir, {\n host: values.host === undefined ? undefined : hostSchema.parse(values.host),\n dryRun: values[\"dry-run\"],\n project: values.project,\n });\n io.out(values.json ? JSON.stringify(result, null, 2) : summarizeTeardown(result));\n return result.status === \"complete\" ? 0 : 2;\n }\n if (action === \"hook\") {\n const host = hostSchema.parse(values.host);\n if (options.managedHost && options.managedHost !== host)\n throw new Error(\"Managed hook --host does not match its launcher.\");\n const output = await measured(() =>\n runAutomationHook(host, stdin, { managed: !!options.managedHost }),\n );\n if (output) io.out(JSON.stringify(output));\n return 0;\n }\n if (action === \"setup\" || action === \"init\") {\n if (values.command)\n throw new Error(\"--command applies to install/config, not managed setup.\");\n const { setupProject, summarizeSetup, initializeProject, summarizeInitialization } =\n await import(\"../setup/setup.js\");\n const host = values.host ? hostSchema.parse(values.host) : undefined;\n if (!values.json)\n progress = createProgress(\n io === defaultIo\n ? {}\n : {\n write: (text) => io.err(text.replace(/\\n$/, \"\")),\n interactive: false,\n },\n );\n if (action === \"init\") {\n const result = await initializeProject(dir, { host, dryRun: values[\"dry-run\"], progress });\n progress?.stop();\n io.out(values.json ? JSON.stringify(result, null, 2) : summarizeInitialization(result));\n } else {\n const result = await setupProject(dir, { host, progress });\n progress?.stop();\n io.out(values.json ? JSON.stringify(result, null, 2) : summarizeSetup(result));\n }\n return 0;\n }\n if (action === \"install\" || action === \"config\") {\n const host = hostSchema.parse(values.host);\n io.out(\n JSON.stringify(\n action === \"install\"\n ? await installAutomation(dir, host, values.command)\n : hookConfig(host, values.command),\n null,\n 2,\n ),\n );\n return 0;\n }\n if (values.host || values.command)\n throw new Error(\"--host and --command apply only to install/config/hook.\");\n if (action === \"stats\") {\n const configuring = values.enable !== undefined || values.disable !== undefined;\n const rating = values.finding !== undefined || values.rating !== undefined;\n if (\n (values.enable !== undefined && values.disable !== undefined) ||\n (configuring && (rating || values.session !== undefined))\n )\n throw new Error(\"Choose tracking configuration or session inspection/feedback separately.\");\n if (rating && (!values.session || !values.finding || !values.rating))\n throw new Error(\"Rating requires --session, --finding, and --rating.\");\n if (configuring) {\n const result = await configureUsefulness(dir, !!values.enable);\n io.out(\n values.json\n ? JSON.stringify(result, null, 2)\n : `Local stats ${result.enabled ? \"enabled\" : \"disabled\"}. Existing observations retained. View with mason stats.`,\n );\n return 0;\n }\n if (rating)\n await rateUsefulness(\n dir,\n values.session!,\n values.finding!,\n usefulnessRating.parse(values.rating),\n );\n const result = await usefulnessStatus(dir, values.session);\n io.out(values.json ? JSON.stringify(result, null, 2) : summarizeUsefulness(result));\n return 0;\n }\n if (action === \"status\") {\n const { setupStatus, summarizeActivation } = await import(\"../setup/status.js\");\n const setup = await setupStatus(dir);\n const result = {\n ...(await automationStatus(dir)),\n configured: await installedAutomation(dir),\n setup,\n };\n io.out(\n values.json || !process.stdout.isTTY\n ? JSON.stringify(result, null, 2)\n : [\n summarizeActivation(setup),\n `Claude Stop review blocking: ${result.stopBlock}`,\n result.knowledge,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\"),\n );\n return 0;\n }\n if (action !== \"check\") throw new Error(\"Unknown automation command: \" + action);\n const { report } = await measured(() => automate(dir, { event: \"task_end\" }));\n io.out(values.json ? JSON.stringify(report, null, 2) : summarize(report));\n return report.status === \"verified\" ? 0 : report.status === \"issues-remain\" ? 1 : 2;\n } catch (error) {\n progress?.stop(false);\n const message =\n action === \"setup\"\n ? \"Mason setup incomplete: \" +\n automationFailure(error).message +\n \". Rerun the same setup command to resume configuration.\"\n : action === \"teardown\"\n ? \"Mason teardown incomplete: \" +\n automationFailure(error).message +\n \". Inspect the reported input, then rerun teardown; knowledge and repair evidence are retained.\"\n : failureMessage(error);\n if (action === \"hook\" || isHookCommand(argv)) {\n io.out(JSON.stringify({ systemMessage: message }));\n return 0;\n }\n if (argv.includes(\"--json\"))\n io.out(\n JSON.stringify({\n version: 1,\n ...([\"init\", \"setup\", \"teardown\"].includes(action)\n ? {\n action,\n status: \"incomplete\",\n next: \"Inspect the reported input, then rerun the same command to resume.\",\n }\n : { status: \"unavailable\" }),\n failure: automationFailure(error),\n }),\n );\n else io.err(message);\n return 2;\n }\n}\n","/** Optional human-facing progress. Core callers stay silent unless supplied. */\nexport type Progress = {\n step: (message: string) => void;\n stop: (success?: boolean) => void;\n};\n\nexport function createProgress(\n options: {\n write?: (text: string) => void;\n interactive?: boolean;\n columns?: () => number;\n } = {},\n): Progress {\n const write =\n options.write ??\n ((text) => {\n process.stderr.write(text);\n });\n const interactive =\n options.interactive ??\n (!!process.stderr.isTTY && process.env.TERM !== \"dumb\" && !process.env.CI);\n const columns = options.columns ?? (() => process.stderr.columns || 80);\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let message = \"\",\n started = 0,\n frame = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n const elapsed = () => {\n const seconds = Math.floor((Date.now() - started) / 1000);\n return seconds ? ` (${seconds}s)` : \"\";\n };\n const render = (prefix: string) => {\n // Keep updates on one terminal line, including when the window narrows.\n const text = `${prefix} ${message}${elapsed()}`;\n const width = Math.max(1, columns() - 1);\n write(\"\\r\\u001b[2K\" + (text.length > width ? text.slice(0, width - 1) + \"…\" : text));\n };\n const stop = (success = true) => {\n if (timer) clearInterval(timer);\n timer = undefined;\n if (message && interactive) {\n render(success ? \"✓\" : \"✗\");\n write(\"\\n\");\n }\n message = \"\";\n };\n return {\n step(next) {\n stop();\n message = next.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \");\n started = Date.now();\n frame = 0;\n if (!interactive) {\n write(`Mason: ${message}…\\n`);\n return;\n }\n render(frames[frame]);\n timer = setInterval(() => {\n render(frames[++frame % frames.length]);\n }, 100);\n timer.unref();\n },\n stop,\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,OAAO,UAAU;AAGV,SAAS,kBAAkB,OAA8B;AAC9D,QAAM,QAAQ,MAAM,QAAQ,OAAO,GAAG;AACtC,MAAI,CAAC,SAAS,MAAM,SAAS,IAAI,KAAK,KAAK,MAAM,WAAW,KAAK,KAAK,aAAa,KAAK,KAAK;AAC3F,WAAO;AACT,MAAI,MAAM,MAAM,GAAG,EAAE,SAAS,IAAI,EAAG,QAAO;AAC5C,QAAM,aAAa,KAAK,MAAM,UAAU,KAAK,EAAE,QAAQ,OAAO,EAAE;AAChE,SAAO,eAAe,MAAM,OAAO;AACrC;AAMO,SAAS,aAAa,MAAc,WAA4B;AACrE,QAAM,WAAW,KAAK,SAAS,MAAM,SAAS;AAC9C,SAAO,aAAa,QAAQ,CAAC,SAAS,WAAW,KAAK,KAAK,GAAG,EAAE,KAAK,CAAC,KAAK,WAAW,QAAQ;AAChG;AAEO,SAAS,cAAc,QAAgB,MAAuB;AACnE,QAAM,IAAI,kBAAkB,MAAM;AAClC,QAAM,IAAI,kBAAkB,IAAI;AAChC,SAAO,MAAM,QAAQ,MAAM,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG,CAAC,GAAG;AACrE;AAEO,SAAS,cAAc,SAAmB,OAAmC;AAClF,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE;AAAA,IAAO,CAAC,SACjC,QAAQ,KAAK,CAAC,WAAW,cAAc,QAAQ,IAAI,CAAC;AAAA,EACtD;AACF;AAGO,SAAS,mBACdA,SACA,OACY;AAKZ,QAAM,OAAO,OAAa,EAAE,UAAU,oBAAI,IAAI,GAAG,QAAQ,oBAAI,IAAI,EAAE;AACnE,QAAM,OAAO,KAAK;AAClB,QAAM,UAAsBA,QAAO,IAAI,MAAM,CAAC,CAAC;AAC/C,EAAAA,QAAO,QAAQ,CAAC,SAAS,UAAU;AACjC,eAAW,UAAU,SAAS;AAC5B,YAAM,aAAa,kBAAkB,MAAM;AAC3C,UAAI,CAAC,WAAY;AACjB,UAAI,UAAU;AACd,iBAAW,QAAQ,WAAW,MAAM,GAAG,GAAG;AACxC,YAAI,CAAC,QAAQ,SAAS,IAAI,IAAI,EAAG,SAAQ,SAAS,IAAI,MAAM,KAAK,CAAC;AAClE,kBAAU,QAAQ,SAAS,IAAI,IAAI;AAAA,MACrC;AACA,cAAQ,OAAO,IAAI,KAAK;AAAA,IAC1B;AAAA,EACF,CAAC;AACD,aAAW,QAAQ,IAAI,IAAI,KAAK,GAAG;AACjC,UAAM,aAAa,kBAAkB,IAAI;AACzC,QAAI,CAAC,WAAY;AACjB,UAAM,WAAW,oBAAI,IAAY;AACjC,QAAI,UAA4B;AAChC,eAAW,QAAQ,WAAW,MAAM,GAAG,GAAG;AACxC,gBAAU,QAAQ,SAAS,IAAI,IAAI;AACnC,UAAI,CAAC,QAAS;AACd,iBAAW,SAAS,QAAQ,OAAQ,UAAS,IAAI,KAAK;AAAA,IACxD;AACA,eAAW,SAAS,SAAU,SAAQ,KAAK,EAAE,KAAK,IAAI;AAAA,EACxD;AACA,SAAO;AACT;AAtEA;AAAA;AAAA;AAAA;AAAA;;;ACCO,SAAS,SAAS,OAAkD;AACzE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAAS,cAAc,OAAmC;AAC/D,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,SAAkB,OAAO,SAAS,QAAQ;AACxF;AAEO,SAAS,aAAa,OAAgB,MAAuB;AAClE,SAAO,SAAS,KAAK,KAAK,MAAM,SAAS;AAC3C;AAXA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,yBAAyB;AAMlC,eAAsB,aAAgB,OAAe,KAAmC;AACtF,QAAM,SAAS,SAAS,SAAS;AACjC,MAAI,CAAC,OAAQ,QAAO,IAAI;AACxB,QAAM,QAAQ,YAAY,IAAI;AAC9B,MAAI;AACF,WAAO,MAAM,IAAI;AAAA,EACnB,UAAE;AACA,UAAM,SAAU,OAAO,KAAK,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE;AACzD,WAAO;AACP,WAAO,WAAW,YAAY,IAAI,IAAI;AAAA,EACxC;AACF;AAEA,eAAsB,YACpB,KACA,MACY;AACZ,QAAM,SAAiC,CAAC;AACxC,QAAM,QAAQ,YAAY,IAAI;AAC9B,SAAO,SAAS,IAAI,QAAQ,YAAY;AACtC,QAAI;AACF,aAAO,MAAM,IAAI;AAAA,IACnB,UAAE;AACA;AAAA,QACE,KAAK,UAAU;AAAA,UACb,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,YAAY,IAAI,IAAI;AAAA,UAC7B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAvCA,IAGM;AAHN;AAAA;AAAA;AAGA,IAAM,WAAW,IAAI,kBAA0C;AAAA;AAAA;;;ACH/D,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAyBnB,SAAS,QAAQC,OAAgB,SAAyB;AAC/D,QAAMC,WAAUD,MAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC,KAAK;AAC5D,SAAO,aAAa,UAAU,SAAS,IAAIC,QAAO,IAAIA,WAAU,UAAU,YAAY;AACpF,UAAM,EAAE,OAAO,GAAG,eAAe,IAAI;AACrC,UAAM,YAAY,QAAQ,OAAOD,OAAM,cAAc;AACrD,QAAI,UAAU,QAAW;AACvB,gBAAU,MAAM,MAAO,GAAG,SAAS,MAAM;AAAA,MAEzC,CAAC;AACD,gBAAU,MAAM,MAAO,IAAI,KAAK;AAAA,IAClC;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAvCA,IAIM,SACA;AALN;AAAA;AAAA;AAEA;AAEA,IAAM,UAAU,UAAU,QAAQ;AAClC,IAAM,WAAW,oBAAI,IAAI;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;ACjBD;AAAA;AAAA;AAAA;AAAA,IAQa;AARb;AAAA;AAAA;AAQO,IAAM,aAA0B;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACbA,OAAO,QAAQ;AACf,SAAS,iBAAiB;AAC1B,OAAOE,WAAU;AACjB,OAAO,QAAQ;AAsER,SAAS,gBAAgB,MAAuB;AACrD,SAAO,KACJ,MAAM,OAAO,EACb;AAAA,IAAK,CAAC,SACL,2HAA2H;AAAA,MACzH;AAAA,IACF;AAAA,EACF;AACJ;AAGA,eAAsB,gBAAgB,MAAc,UAA0C;AAE5F,QAAM,SAAS,MAAM,GAAG;AAAA,IACtB;AAAA,IACA,UAAU,WAAW,UAAU,aAAa,UAAU;AAAA,EACxD;AACA,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,CAAC,KAAK,OAAO,KAAK,KAAK,OAAO,SAAU,QAAO;AACnD,UAAM,SAAS,OAAO,MAAM,KAAK,IAAI,WAAW,GAAG,KAAK,OAAO,CAAC,CAAC;AACjE,QAAI,QAAQ;AACZ,WAAO,QAAQ,OAAO,QAAQ;AAC5B,YAAM,SAAS,MAAM,OAAO,KAAK,QAAQ,OAAO,OAAO,SAAS,OAAO,IAAI;AAC3E,UAAI,OAAO,cAAc,EAAG;AAC5B,eAAS,OAAO;AAAA,IAClB;AACA,WAAO,UAAU,OAAO,SAAS,OAAO,OAAO,SAAS,GAAG,KAAK,EAAE,SAAS,MAAM;AAAA,EACnF,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;AAEA,eAAsB,kBAAkB,MAAsC;AAC5E,MAAI;AACF,UAAM,gBAAgB,MAAM,GAAG,SAAS,IAAI;AAC5C,UAAMC,cAAa,MAAM,GAAG,SAASD,MAAK,KAAK,MAAM,oBAAoB,CAAC;AAC1E,QAAI,CAAC,aAAa,eAAeC,WAAU;AACzC,YAAM,IAAI,MAAM,uDAAuD;AACzE,UAAM,MAAM,MAAM,gBAAgBA,aAAY,KAAK,IAAI;AACvD,QAAI,QAAQ;AACV,YAAM,IAAI,MAAM,+DAA+D;AACjF,UAAM,QAAiB,KAAK,MAAM,GAAG;AACrC,QAAI,CAAC,SAAS,KAAK,EAAG,OAAM,IAAI,MAAM,iCAAiC;AACvE,UAAM,SAAwB,CAAC;AAC/B,eAAW,OAAO,CAAC,YAAY,iBAAiB,QAAQ,GAAY;AAClE,UAAI,MAAM,GAAG,MAAM,OAAW;AAC9B,UAAI,CAAC,cAAc,MAAM,GAAG,CAAC,GAAG;AAC9B,cAAM,IAAI,MAAM,iBAAiB,GAAG,8BAA8B;AAAA,MACpE;AACA,aAAO,GAAG,IAAI,MAAM,GAAG;AAAA,IACzB;AACA,QAAI,MAAM,UAAU,QAAW;AAC7B,YAAM,QAAQ,MAAM;AACpB,UAAI,CAAC,SAAS,KAAK,EAAG,OAAM,IAAI,MAAM,uCAAuC;AAC7E,YAAM,WAAW,CAACC,SAA2B;AAC3C,YACE,CAAC,cAAcA,IAAG,KAClBA,KAAI,SAAS,OACb,CAACA,KAAI;AAAA,UACH,CAAC,MACC,OAAO,MAAM,YACb,kBAAkB,CAAC,MAAM,KACzB,CAAC,EAAE,WAAW,GAAG,KACjB,CAAC,cAAc,KAAK,CAAC;AAAA,QACzB,GACA;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,eAAOA;AAAA,MACT;AACA,aAAO,QAAQ,CAAC;AAChB,UAAI,MAAM,YAAY,OAAW,QAAO,MAAM,UAAU,SAAS,MAAM,OAAO;AAC9E,UAAI,MAAM,YAAY,QAAW;AAC/B,YAAI,CAAC,SAAS,MAAM,OAAO;AACzB,gBAAM,IAAI,MAAM,gDAAgD;AAClE,cAAM,EAAE,YAAAC,YAAW,IAAI,MAAM;AAC7B,eAAO,MAAM,UAAU,CAAC;AACxB,mBAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,MAAM,OAAO,GAAG;AAC1D,cAAI,CAACA,YAAW,SAAS,KAAoC;AAC3D,kBAAM,IAAI,MAAM,0BAA0B,KAAK;AACjD,iBAAO,MAAM,QAAQ,KAAoC,IAAI,SAAS,KAAK;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO,CAAC;AAChE,UAAM,IAAI;AAAA,MACR,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC3F,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF;AACF;AAGA,eAAsB,iBAAiB,SAAiB;AACtD,QAAM,OAAOH,MAAK,QAAQ,OAAO;AACjC,QAAM,gBAAgB,MAAM,GAAG,SAAS,IAAI,EAAE,MAAM,MAAM,IAAI;AAC9D,QAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,QAAM,SAAS,CAAC,GAAG,eAAe,GAAI,OAAO,UAAU,CAAC,CAAE;AAC1D,MAAI,WAA+B;AACnC,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB,CAAC,YAAY,MAAM,YAAY,YAAY,oBAAoB;AAAA,MAC/D,EAAE,KAAK,MAAM,WAAW,KAAK,OAAO,KAAK;AAAA,IAC3C;AACA,eAAW,IAAI,IAAI,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,EACvD,QAAQ;AAEN,QAAI,QAAQ;AACZ,QAAI;AACF,YAAM,QAAQ,CAAC,aAAa,WAAW,GAAG,EAAE,KAAK,KAAK,CAAC;AACvD,cAAQ;AAAA,IACV,QAAQ;AAAA,IAER;AACA,QAAI,MAAO,OAAM,IAAI,MAAM,mCAAmC;AAAA,EAChE;AAEA,iBAAe,QAAQ,MAAsC;AAC3D,UAAM,WAAW,kBAAkB,IAAI;AACvC,QAAI,CAAC,YAAY,gBAAgB,QAAQ,KAAM,YAAY,CAAC,SAAS,IAAI,QAAQ;AAC/E,aAAO;AACT,UAAM,YAAYA,MAAK,KAAK,MAAM,QAAQ;AAC1C,QAAI;AACF,YAAM,OAAO,MAAM,GAAG,SAAS,SAAS;AACxC,UAAI,CAAC,aAAa,eAAe,IAAI,KAAK,gBAAgBA,MAAK,SAAS,eAAe,IAAI,CAAC;AAC1F,eAAO;AACT,YAAM,OAAO,MAAM,GAAG,KAAK,IAAI;AAC/B,UAAI,CAAC,KAAK,OAAO,KAAK,KAAK,OAAO,iBAAkB,QAAO;AAE3D,UAAI,YAAY,CAAC,SAAS,IAAIA,MAAK,SAAS,eAAe,IAAI,EAAE,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG,CAAC;AACxF,eAAO;AACT,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,iBAAe,KACb,WAA8B,aAC9B,UAA4C,CAAC,GAC1B;AACnB,UAAM,QAAQ,MAAM,GAAG,UAAU,EAAE,KAAK,MAAM,QAAQ,qBAAqB,OAAO,GAAG,QAAQ,CAAC;AAC9F,UAAM,OAAO,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAQ,MAAM,QAAQ,CAAC,IAAK,IAAI,IAAK,CAAC;AACtF,WAAO,KAAK,OAAO,CAAC,MAAmB,MAAM,IAAI,EAAE,KAAK;AAAA,EAC1D;AAEA,iBAAe,KAAK,MAA0C;AAC5D,UAAM,WAAW,kBAAkB,IAAI;AACvC,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,OAAO,MAAM,QAAQ,QAAQ;AACnC,QAAI,CAAC,KAAM,QAAO;AAElB,eAAW,OAAO,oBAAI,IAAI;AAAA,MACxB;AAAA,MACAA,MAAK,SAAS,eAAe,IAAI,EAAE,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG;AAAA,IAC7D,CAAC,GAAG;AACF,UAAI,EAAE,MAAM,GAAG,GAAG,WAAW,GAAG,GAAG,EAAE,KAAK,MAAM,QAAQ,KAAK,KAAK,CAAC,GAAG,OAAQ,QAAO;AAAA,IACvF;AACA,QAAI;AACF,YAAMI,WAAU,MAAM,gBAAgB,MAAM,gBAAgB;AAC5D,aAAOA,aAAY,OACf,OACA,EAAE,MAAM,UAAU,SAAAA,UAAS,YAAYA,SAAQ,MAAM,IAAI,EAAE,OAAO;AAAA,IACxE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,WAAW,MAAO,WAAW,CAAC,GAAG,QAAQ,EAAE,KAAK,IAAI,KAAM;AAC/F;AAxPA,IAQa,mBA2BA,aACA,eAuBA;AA3Db;AAAA;AAAA;AAAA;AACA;AAKA;AAEO,IAAM,oBAAoB;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACO,IAAM,cAAc,SAAS,kBAAkB,KAAK,GAAG,CAAC;AACxD,IAAM,gBAAgB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACO,IAAM,mBAAmB,OAAO;AAAA;AAAA;;;AC3DvC,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,kBAAkB;AAU3B,eAAsB,UACpB,MACA,UACA,gBAAgB,OACC;AACjB,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,uBAAuB,QAAQ,EAAE;AAClE,MAAI,UAAU,MAAMD,IAAG,SAAS,IAAI;AACpC,QAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAUC,MAAK,KAAK,SAAS,MAAM,CAAC,CAAC;AACrC,QAAI;AACJ,QAAI;AACF,aAAO,MAAMD,IAAG,MAAM,OAAO;AAAA,IAC/B,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,SAAU,OAAM;AAC9D,UAAI,iBAAiB,IAAI,MAAM,SAAS,GAAG;AACzC,YAAI;AACF,gBAAMA,IAAG,MAAM,OAAO;AAAA,QACxB,SAAS,YAAY;AACnB,cAAK,WAAqC,SAAS,SAAU,OAAM;AAAA,QACrE;AACA,eAAO,MAAMA,IAAG,MAAM,OAAO;AAAA,MAC/B;AAAA,IACF;AACA,QAAI,MAAM,eAAe,EAAG,OAAM,IAAI,MAAM,0BAA0B,QAAQ,EAAE;AAAA,EAClF;AACA,SAAO;AACT;AAEA,eAAsB,cAAc,MAAc,UAA2C;AAC3F,MAAI;AACF,UAAM,OAAO,MAAM,UAAU,MAAM,QAAQ;AAC3C,UAAM,MAAM,MAAM,gBAAgB,MAAM,KAAK,OAAO,IAAI;AACxD,QAAI,QAAQ,KAAM,OAAM,IAAI,MAAM,uCAAuC;AACzE,UAAM,SAAkB,KAAK,MAAM,GAAG;AACtC,QAAI,WAAW,KAAM,OAAM,IAAI,MAAM,uCAAuC;AAC5E,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM,IAAI;AAAA,MACR,uBAAuB,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC1F,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF;AACF;AAEA,eAAsB,eACpB,MACA,UACA,OACe;AACf,QAAM,UAAU,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI;AACjD,MAAI,OAAO,WAAW,OAAO,IAAI,KAAK,OAAO,MAAM;AACjD,UAAM,IAAI,MAAM,eAAe,QAAQ,iBAAiB;AAAA,EAC1D;AACA,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU,IAAI;AACjD,QAAM,YAAYC,MAAK,KAAKA,MAAK,QAAQ,IAAI,GAAG,IAAIA,MAAK,SAAS,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM;AAC7F,MAAI;AACF,UAAM,SAAS,MAAMD,IAAG,KAAK,WAAW,MAAM,GAAK;AACnD,QAAI;AACF,YAAM,OAAO,UAAU,SAAS,MAAM;AACtC,YAAM,OAAO,KAAK;AAAA,IACpB,UAAE;AACA,YAAM,OAAO,MAAM;AAAA,IACrB;AACA,UAAMA,IAAG,OAAO,WAAW,IAAI;AAAA,EACjC,UAAE;AACA,UAAMA,IAAG,GAAG,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,EACxC;AACF;AAlFA;AAAA;AAAA;AAGA;AACA;AAAA;AAAA;;;ACJA,OAAOE,SAAQ;AACf,SAAS,qBAAAC,0BAAyB;AAClC,OAAOC,WAAU;AAWV,SAAS,yBAA4B,MAAc,KAAmC;AAC3F,SAAO,YAAY,IAAI,EAAE,MAAMA,MAAK,QAAQ,IAAI,GAAG,OAAO,oBAAI,IAAI,EAAE,GAAG,GAAG;AAC5E;AAGO,SAAS,eAAkB,MAAc,KAAa,MAAoC;AAC/F,QAAM,aAAa,YAAY,SAAS;AACxC,MAAI,CAAC,cAAc,WAAW,SAASA,MAAK,QAAQ,IAAI,EAAG,QAAO,KAAK;AACvE,MAAI,CAAC,WAAW,MAAM,IAAI,GAAG,GAAG;AAC9B,UAAM,UAAU,KAAK;AACrB,eAAW,MAAM,IAAI,KAAK,OAAO;AAEjC,SAAK,QAAQ,MAAM,MAAM;AACvB,UAAI,WAAW,MAAM,IAAI,GAAG,MAAM,QAAS,YAAW,MAAM,OAAO,GAAG;AAAA,IACxE,CAAC;AAAA,EACH;AACA,SAAO,WAAW,MAAM,IAAI,GAAG;AACjC;AAWO,SAAS,cAAcC,OAAgB,SAAyB;AACrE,SAAO;AAAA,IAAe,QAAQ;AAAA,IAAK,SAAS,KAAK,UAAU,CAACA,OAAM,OAAO,CAAC;AAAA,IAAG,MAC3E,QAAQA,OAAM,OAAO;AAAA,EACvB;AACF;AAWA,eAAsB,cACpB,MACA,MACmB;AACnB,QAAM,UAAU,MAAM,kBAAkB,IAAI,GAAG,OAAO,WAAW,CAAC;AAClE,QAAM,SAAS,YAAY,SAAS,GAAG,SAASD,MAAK,QAAQ,IAAI,KAAK,CAAC,OAAO;AAC9E,QAAM,WAAWF,IAAG,cAAc,MAAM,EAAE,QAAQ,CAAC,SAAS,KAAK,QAAQ;AACzE,MAAI,SAAS,SAAS;AACpB,UAAM,IAAI,MAAM,wDAAwD;AAC1E,QAAM,gBAAgB,CAAC,GAAG,UAAU,GAAG,SAAS,IAAI,CAAC,YAAY,UAAU,OAAO,EAAE,CAAC;AACrF,QAAM,QAAQ,SACV,CAAC,GAAG,eAAe,GAAG,WAAW,IACjC,SAAS,cACP,gBACA;AACN,QAAM,QAAQ,SAAS,cAAc,KAAK,OAAO,OAAO,KAAK,OAAO;AACpE,QAAM,EAAE,OAAO,IAAI,MAAM;AAAA,IACvB,CAAC,YAAY,MAAM,YAAY,YAAY,sBAAsB,MAAM,GAAG,KAAK;AAAA,IAC/E,EAAE,KAAK,MAAM,WAAW,SAAS,KAAK,OAAO,OAAO,OAAO,SAAS,IAAM;AAAA,EAC5E;AACA,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC,CAAC,EAAE;AAAA,IAAO,CAAC,SACrE,SAAS,cACL,OAAO,SAAS,KAAK,gCAAgC,KAAKE,MAAK,MAAM,SAAS,IAAI,CAAC;AAAA;AAAA,MAEnF,eAAe,IAAI,KAAK,MAAM,KAAK,YAAY,GAAG,CAAC,CAAC;AAAA;AAAA,EAC1D;AACA,MAAI,OAAO,WAAW,MAAM,KAAK,IAAI,CAAC,IAAI;AACxC,UAAM,IAAI,MAAM,SAAS,OAAO,4CAA4C;AAC9E,SAAO,MAAM,KAAK;AACpB;AArFA,IAUM,aAqCA,aACA,UAKA;AArDN;AAAA;AAAA;AAGA;AACA;AAMA,IAAM,cAAc,IAAID,mBAA8B;AAqCtD,IAAM,cAAc,kBAAkB,IAAI,CAAC,cAAc,eAAe,SAAS,EAAE;AACnF,IAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,IAAM,iBAAiB,IAAI,IAAI,kBAAkB,IAAI,CAAC,cAAc,MAAM,SAAS,CAAC;AAAA;AAAA;;;ACrDpF,SAAS,kBAAkB;AAC3B,OAAOG,SAAQ;AACf,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,SAAS;AAClB,OAAOC,SAAQ;AA0Bf,eAAsB,oBACpB,MACAC,SAC0B;AAC1B,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAIA,QAAO,KAAK,CAAC,CAAC,EAAE,KAAK;AAC/C,MAAI;AACJ,QAAM,iBAAiB,YAAY;AACjC,UAAM,SAAS,MAAM;AAAA,MAAe;AAAA,MAAM;AAAA,MAA0B,MAClE,iBAAiB,IAAI;AAAA,IACvB;AACA,UAAM,YAAY,OAAO,UAAU;AACnC,QAAI,CAAC,UAAW,OAAM,IAAI,MAAM,kCAAkC;AAClE,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG,MAAM,IAAI,CAAC,WAAW,aAAa,MAAM,EAAE;AAAA,MAChD;AAAA,MACA,EAAE,KAAK,MAAM,WAAW,IAAI,OAAO,KAAK;AAAA,IAC1C;AACA,UAAM,QAAQ;AAAA,MACZ,GAAG,oBAAI,IAAI,CAAC,GAAG,WAAW,GAAG,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC,CAAC;AAAA,IAC1E,EAAE,KAAK;AAGP,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,MAAM,IAAI,OAAO,WAAW;AAC1B,cAAMC,WAAUF,IAAG,WAAW,MAAM;AACpC,YAAI;AACF,kBAAQ,MAAMF,IAAG,MAAM,MAAM,UAAU,MAAM,MAAM,CAAC,GAAG,YAAY,IAC/D,GAAGI,QAAO,UACVA;AAAA,QACN,QAAQ;AACN,iBAAOA;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,WAAW,IAAI,IAAI,MAAM,OAAO,KAAK,UAAU,EAAE,KAAK,KAAK,CAAC,CAAC;AACnE,UAAM,UAAU,mBAAmBD,SAAQ,KAAK;AAChD,UAAM,eAAe,IAAI;AAAA,MACvBA,QAAO,IAAI,CAAC,OAAO,UAAU,CAAC,KAAK,UAAU,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC;AAAA,IAC3F;AACA,WAAO,EAAE,cAAc,SAAS;AAAA,EAClC;AACA,SAAO,QAAQ;AAAA,IACbA,QAAO,IAAI,CAAC,UAAU;AACpB,YAAM,UAAU,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK;AACzC,aAAO;AAAA,QACL;AAAA,QACA,6BAA6B,KAAK,UAAU,OAAO;AAAA,QACnD,YAAY;AACV,gBAAM,UAAyB,EAAE,SAAS,OAAO,CAAC,GAAG,UAAU,KAAK;AACpE,cAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,cAAI;AACF,kBAAM,EAAE,UAAU,aAAa,IAAI,OAAO,YAAY,eAAe;AACrE,kBAAM,QAAQ,aAAa,IAAI,KAAK,UAAU,OAAO,CAAC;AACtD,gBAAI,MAAM,SAAS,IAAM,QAAO,EAAE,GAAG,SAAS,UAAU,MAAM;AAC9D,uBAAW,QAAQ,OAAO;AACxB,oBAAM,WAAW,MAAM;AAAA,gBACrB;AAAA,gBACA,0BAA0B;AAAA,gBAC1B,YAAY;AACV,sBAAI;AACF,0BAAM,WAAW,MAAM,UAAU,MAAM,IAAI;AAC3C,0BAAMH,IAAG,MAAM,QAAQ;AACvB,wBAAI,CAAC,SAAS,IAAI,IAAI,EAAG,QAAO,EAAE,UAAU,MAAM;AAClD,0BAAM,SAAS,MAAMA,IAAG;AAAA,sBACtB;AAAA,sBACAC,WAAU,WAAWA,WAAU,aAAaA,WAAU;AAAA,oBACxD;AACA,wBAAI;AACF,4BAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,0BAAI,CAAC,KAAK,OAAO,KAAK,KAAK,OAAO;AAChC,+BAAO,EAAE,UAAU,MAAM;AAC3B,4BAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,KAAK,OAAO,GAAG,mBAAmB,CAAC,CAAC;AACxE,0BAAI,OAAO;AACX,6BAAO,OAAO,MAAM,QAAQ;AAC1B,8BAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,MAAM,SAAS,MAAM,IAAI;AACrE,4BAAI,CAAC,KAAK,UAAW;AACrB,gCAAQ,KAAK;AAAA,sBACf;AACA,0BAAI,SAAS,MAAM,OAAQ,QAAO,EAAE,UAAU,MAAM;AACpD,6BAAO;AAAA,wBACL,UAAU;AAAA,wBACV,MAAM,WAAW,QAAQ,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,OAAO,KAAK;AAAA,sBACzE;AAAA,oBACF,UAAE;AACA,4BAAM,OAAO,MAAM;AAAA,oBACrB;AAAA,kBACF,SAAS,OAAO;AACd,2BAAO,EAAE,UAAW,MAAgC,SAAS,SAAS;AAAA,kBACxE;AAAA,gBACF;AAAA,cACF;AACA,kBAAI,CAAC,SAAS,SAAU,SAAQ,WAAW;AAC3C,kBAAI,SAAS,KAAM,SAAQ,MAAM,IAAI,IAAI,SAAS;AAAA,YACpD;AAAA,UACF,QAAQ;AACN,oBAAQ,WAAW;AAAA,UACrB;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,eAAe,MAAc,SAA2C;AAC5F,UAAQ,MAAM,oBAAoB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;AACvD;AAEO,SAAS,oBAAoB,QAAuB,OAAgC;AACzF,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC,CAAC,EAC5E,OAAO,CAAC,SAAS,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,IAAI,CAAC,EACzD,KAAK;AACV;AArJA,IAUM,UACO;AAXb;AAAA;AAAA;AAKA;AACA;AACA;AACA;AAEA,IAAM,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC;AAC7D,IAAM,sBAAsB,EAChC,OAAO;AAAA,MACN,SAAS,EAAE,MAAM,QAAQ;AAAA,MACzB,OAAO,EAAE,OAAO,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAAA,MAC5D,UAAU,EAAE,QAAQ;AAAA,IACtB,CAAC,EACA;AAAA,MACC,CAAC,YACC,KAAK,UAAU,QAAQ,OAAO,MAAM,KAAK,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,KACvF,cAAc,QAAQ,SAAS,OAAO,KAAK,QAAQ,KAAK,CAAC,EAAE,WACzD,OAAO,KAAK,QAAQ,KAAK,EAAE;AAAA,MAC/B;AAAA,IACF;AAAA;AAAA;;;ACvBF,SAAS,KAAAI,UAAS;AAClB,OAAOC,SAAQ;AACf,OAAO,QAAQ;AAKf,eAAe,eAAe,MAA+B;AAC3D,MAAI;AACJ,MAAI;AACF,UAAM,QAAQ,gBAAgB,UAAU,KAAK,MAAM,MAAMA,IAAG,SAAS,MAAM,MAAM,CAAC,CAAC;AACnF,QAAI,CAAC,MAAM,SAAS;AAClB,eAAS;AAAA,IACX,WAAW,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG;AAC5C,eAAS;AAAA,IACX,OAAO;AACL,UAAI;AACF,gBAAQ,KAAK,MAAM,KAAK,KAAK,CAAC;AAC9B,iBAAS,mBAAmB,MAAM,KAAK,GAAG;AAAA,MAC5C,SAAS,OAAO;AACd,iBACG,MAAgC,SAAS,UACtC,mBAAmB,MAAM,KAAK,GAAG,sDACjC,mBAAmB,MAAM,KAAK,GAAG;AAAA,MACzC;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,aACE,iBAAiB,cACb,gDACA;AAAA,EACR;AACA,MACE,MAAMA,IAAG,MAAM,OAAO,UAAU,EAAE;AAAA,IAChC,MAAM;AAAA,IACN,MAAM;AAAA,EACR,GACA;AACA,cAAU,8CAA8C,OAAO;AAAA,EACjE;AACA,SACE,SACA;AAEJ;AAGA,eAAsB,cACpB,MACAC,YACA,KACA,SAAS,KACT,QAAQ,eACI;AACZ,QAAM,OAAO,MAAM,UAAU,MAAMA,aAAY,SAAS,IAAI;AAC5D,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,MAAI;AACJ,SAAO,CAAC,QAAQ;AACd,QAAI;AACF,eAAS,MAAMD,IAAG,KAAK,MAAM,MAAM,GAAK;AAAA,IAC1C,SAAS,OAAO;AAGd,UAAI,QAAQ,aAAa,WAAY,MAAgC,SAAS,SAAS;AACrF,YAAI,KAAK,IAAI,KAAK,SAAU,OAAM;AAClC,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACtD;AAAA,MACF;AACA,UAAK,MAAgC,SAAS,SAAU,OAAM;AAE9D,UAAI;AACF,cAAM,QAAQ,gBAAgB,MAAM,KAAK,MAAM,MAAMA,IAAG,SAAS,MAAM,MAAM,CAAC,CAAC;AAC/E,YAAI,MAAM,SAAS,GAAG,SAAS,KAAK,OAAO,UAAU,MAAM,GAAG,KAAK,MAAM,MAAM,GAAG;AAChF,cAAI;AACF,oBAAQ,KAAK,MAAM,KAAK,CAAC;AAAA,UAC3B,SAAS,OAAO;AACd,gBAAK,MAAgC,SAAS,SAAS;AAErD,oBAAM,UAAU,OAAO;AACvB,kBAAI;AACJ,kBAAI;AACF,wBAAQ,MAAMA,IAAG,KAAK,SAAS,MAAM,GAAK;AAC1C,sBAAM,UAAU,gBAAgB,MAAM,KAAK,MAAM,MAAMA,IAAG,SAAS,MAAM,MAAM,CAAC,CAAC;AACjF,oBAAI,QAAQ,QAAQ,MAAM,OAAO,QAAQ,SAAS,MAAM,KAAM,OAAMA,IAAG,OAAO,IAAI;AAAA,cACpF,UAAE;AACA,oBAAI,OAAO;AACT,wBAAM,MAAM,MAAM;AAClB,wBAAMA,IAAG,GAAG,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,gBACtC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AACA,UAAI,KAAK,IAAI,KAAK;AAChB,cAAM,IAAI;AAAA,UACR,QACE,4CACA,OACA,OACC,MAAM,eAAe,IAAI;AAAA,UAC5B,EAAE,OAAO,MAAM;AAAA,QACjB;AACF,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,IACxD;AACA,QAAI,QAAQ;AACV,UAAI;AACF,cAAM,OAAO,UAAU,KAAK,UAAU,EAAE,KAAK,QAAQ,KAAK,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC;AAAA,MAClF,SAAS,OAAO;AACd,cAAM,OAAO,MAAM,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACnC,cAAMA,IAAG,GAAG,MAAM,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACjD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,WAAO,MAAM,IAAI;AAAA,EACnB,UAAE;AACA,UAAM,OAAO,MAAM;AACnB,UAAMA,IAAG,OAAO,IAAI;AAAA,EACtB;AACF;AA3HA,IAKM;AALN;AAAA;AAAA;AAGA;AAEA,IAAM,kBAAkBD,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,KAAKA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA;AAAA;;;ACLvF;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,SAAS,KAAAG,UAAS;AA4JlB,eAAsB,kBAAkB,SAAkC;AACxE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,QAAQ,CAAC,aAAa,MAAM,GAAG;AAAA,MACtD,KAAK;AAAA,IACP,CAAC;AACD,WAAO,OAAO,KAAK;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAxKA,IA4EMC,WAGA,oBAQO,eASA,YAGP;AAnGN;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAuEA,IAAMA,YAAWD,GACd,OAAO,EACP,OAAO,CAAC,UAAU,kBAAkB,KAAK,MAAM,MAAM,qCAAqC;AAC7F,IAAM,qBAAqB;AAAA,MACzB,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,MACnC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,MAClC,mBAAmBA,GAAE,OAAO,EAAE,SAAS;AAAA,MACvC,oBAAoBA,GAAE,QAAQ,EAAE,SAAS;AAAA,MACzC,kBAAkBA,GAAE,OAAO,EAAE,SAAS;AAAA,IACxC;AACO,IAAM,gBAAgBA,GAC1B,OAAO;AAAA,MACN,aAAaA,GAAE,OAAO;AAAA,MACtB,OAAOA,GAAE,MAAMC,SAAQ;AAAA,MACvB,OAAOD,GAAE,MAAMC,SAAQ,EAAE,SAAS;AAAA,MAClC,MAAMD,GAAE,KAAK,CAAC,cAAc,gBAAgB,CAAC,EAAE,SAAS;AAAA,MACxD,GAAG;AAAA,IACL,CAAC,EACA,YAAY;AACR,IAAM,aAAaA,GACvB,OAAO,EAAE,aAAaA,GAAE,OAAO,GAAG,OAAOA,GAAE,MAAMC,SAAQ,GAAG,GAAG,mBAAmB,CAAC,EACnF,YAAY;AACf,IAAM,iBAAiBD,GACpB,OAAO;AAAA,MACN,SAASA,GAAE,QAAQ,CAAC;AAAA,MACpB,WAAWA,GAAE,OAAO;AAAA,MACpB,WAAWA,GAAE,OAAO;AAAA,MACpB,SAASA,GAAE,OAAO;AAAA,MAClB,UAAUA,GAAE,OAAO,aAAa;AAAA,MAChC,OAAOA,GAAE,OAAO,UAAU;AAAA,IAC5B,CAAC,EACA,YAAY;AAAA;AAAA;;;AC5Gf,OAAOE,WAAU;AAAjB;AAAA;AAAA;AAAA;AAAA;;;ACWO,SAAS,YACd,OAMA,WACY;AACZ,QAAM,eAAe,MAAM,qBACvB,WACA,MAAM,aACJ,WACA;AACN,QAAM,UAAoB,CAAC;AAC3B,MAAI,cAAc;AAChB,YAAQ;AAAA,MACN;AAAA,IACF;AACF,MAAI,cAAc;AAChB,YAAQ;AAAA,MACN;AAAA,IACF;AACF,MAAI,iBAAiB;AACnB,YAAQ;AAAA,MACN,wBAAwB,MAAM,oBAAoB,wCAAwC;AAAA,IAC5F;AACF,MAAI,iBAAiB,aAAc,SAAQ,KAAK,gDAAgD;AAChG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM;AAAA,IACpB;AAAA,EACF;AACF;AA9CA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,KAAAC,UAAS;AAClB,SAAS,cAAAC,mBAAkB;AAuLpB,SAAS,gBACd,QAIiB;AACjB,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,IACd,GAAI,OAAO,OAAO,UAAU,WAAW,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAClE,SAAS,MAAM,QAAQ,OAAO,OAAO,IAAK,OAAO,UAA+B,CAAC;AAAA,EACnF;AACF;AAGO,SAAS,iBAAiB,QAA0C;AACzE,SAAO,OAAO,YAAY,IAAI,eAAe,OAAO;AACtD;AAMO,SAAS,kBAAkB,QAAwC;AACxE,MAAI,OAAO,YAAY,KAAK,OAAO,WAAW,YAAY,OAAO,aAAa;AAC5E,WAAO;AACT,MAAI,QAAQ,OAAO,QAAQ,SAAS;AACpC,SAAO,SAAS,KAAK,CAAC,CAAC,YAAY,YAAY,EAAE,SAAS,OAAO,QAAQ,KAAK,EAAE,IAAI,EAAG;AACvF,MAAI,QAAQ,EAAG,QAAO;AACtB,QAAM,QAAQ,OAAO,QAAQ,KAAK;AAClC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,MAAM;AAAA,IACT,OAAO,MAAM,QAAQ;AAAA,IACrB,UAAU;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,eAAe,MAAM;AAAA,IACrB,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,SAAS,OAAO,QAAQ,MAAM,GAAG,QAAQ,CAAC;AAAA,EAC5C;AACF;AAGO,SAAS,gBAAgB,QAAkC;AAChE,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,kBAAkB,MAAM,EAAE,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC;AAC3E;AAqCO,SAAS,mBAAmB,QAAwB,YAAuB,WAAW;AAC3F,QAAM,WAAW,iBAAiB,MAAM;AACxC,QAAM,SACJ,OAAO,YAAY,IACf,CAAC,GAAG,OAAO,OAAO,EACf,QAAQ,EACR;AAAA,IACC,CAAC,MAAM,CAAC,YAAY,YAAY,EAAE,SAAS,EAAE,IAAI,KAAK,EAAE,aAAa,OAAO;AAAA,EAC9E,IACF;AACN,SAAO;AAAA,IACL;AAAA,IACA,UAAU,OAAO,YAAY,IAAI,OAAO,WAAW;AAAA,IACnD,OAAO,OAAO,YAAY,IAAK,OAAO,SAAS,OAAQ;AAAA,IACvD,SAAS,OAAO,YAAY,IAAI,OAAO,UAAU,CAAC;AAAA,IAClD,UACE,OAAO,WAAW,WACd,eACA,aAAa,aACX,eACA,aAAa,aACX,aACA;AAAA,IACV,gBACE,OAAO,WAAW,aAAa,aAAa,cAAc,cAAc;AAAA,IAC1E,YAAY,SACR;AAAA,MACE,UAAU,OAAO;AAAA,MACjB,IAAI,OAAO;AAAA,MACX,MAAM,OAAO;AAAA,MACb,SAAS,OAAO;AAAA,IAClB,IACA;AAAA,EACN;AACF;AAEO,SAAS,cAAc,QAAwB,WAAsB;AAC1E,QAAM,SAAS,mBAAmB,QAAQ,SAAS,EAAE;AACrD,SAAO;AAAA,IACL,SAAS,EAAE,YAAY,OAAO,IAAI,cAAc,OAAO,QAAQ,IAAI,CAAC;AAAA,IACpE;AAAA,EACF;AACF;AAKO,SAAS,yBACd,QACA,QAAyB,OACjB;AACR,QAAM,YAAY,kBAAkB,MAAM;AAC1C,MAAI,UAAU;AACZ,WAAOA,YAAW,QAAQ,EACvB;AAAA,MACC,KAAK,UAAU;AAAA,QACb;AAAA,QACA,OAAO;AAAA,QACP,iBAAiB,SAAS;AAAA,QAC1B,UAAU,YAAY,IAAI,UAAU,WAAW;AAAA,QAC/C,gBAAgB,SAAS;AAAA,QACzB,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,EACC,OAAO,KAAK;AACjB,SAAOA,YAAW,QAAQ,EACvB;AAAA,IACC,KAAK,UAAU;AAAA,MACb,OAAO;AAAA,MACP,iBAAiB,MAAM;AAAA,MACvB,OAAO,YAAY,IAAI,OAAO,WAAW;AAAA,MACzC,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,SAAS;AAAA,MACzB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,EACC,OAAO,KAAK;AACjB;AAEO,SAAS,yBAAyB,QAAwB,QAAyB,OAAO;AAC/F,SAAO,OAAO,YAAY,IACtB,OAAO,aACH;AAAA,IACA,CAAC,OACE,UAAU,eAAe,EAAE,UAAU,gBACtC,EAAE,mBAAmB,yBAAyB,QAAQ,EAAE,SAAS,KAAK;AAAA,EAC1E,EACC,GAAG,EAAE,IACR;AACN;AAEA,SAAS,kBAAkB,QAAwB,WAAsB;AACvE,SAAO;AAAA,IACL,GAAG,gBAAgB,MAAM;AAAA,IACzB,GAAG,mBAAmB,QAAQ,SAAS;AAAA,IACvC,OAAO,cAAc,QAAQ,SAAS;AAAA,EACxC;AACF;AAGO,SAAS,kBACd,QACA,YAAuB,WACvB,oBAA+B,WAC/B;AACA,QAAM,YAAY,kBAAkB,MAAM;AAC1C,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,iBAAiB,SAAS,MAAM,aAAa,cAAc;AAAA,EAC7D;AACA,SAAO;AAAA,IACL,GAAG,kBAAkB,WAAW,SAAS;AAAA,IACzC,GAAI,aACA;AAAA,MACE,YAAY;AAAA,QACV;AAAA,QACA,IAAI,WAAW;AAAA,QACf,WAAW,WAAW;AAAA,QACtB,MAAM,WAAW;AAAA,QACjB,SAAS,WAAW;AAAA,QACpB,OAAO,WAAW,SAAS;AAAA,QAC3B,UAAU,WAAW;AAAA,MACvB;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,cAAc,SACd;AAAA,MACE,iBAAiB;AAAA,QACf,GAAG,kBAAkB,QAAQ,iBAAiB;AAAA,QAC9C,YAAY,yBAAyB,MAAM,IACvC,2BACA;AAAA,MACN;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;AArZA,IAMM,MACO,sBAQA,mBAKP,eAQA,gBACA,cACO,sBAOP,aAyBA,cAeA,eAuGO,gBA0OA;AA9Zb;AAAA;AAAA;AAEA;AACA;AACA;AAEA,IAAM,OAAO,CAAC,QAAgBD,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AACvD,IAAM,uBAAuBA,GACjC,OAAO;AAAA,MACN,MAAMA,GAAE,KAAK,CAAC,gBAAgB,SAAS,YAAY,cAAc,YAAY,OAAO,CAAC;AAAA,MACrF,WAAW,KAAK,GAAI;AAAA,MACpB,MAAM,KAAK,GAAG,EAAE,SAAS;AAAA,IAC3B,CAAC,EACA,OAAO;AAEH,IAAM,oBAAoBA,GAAE,OAAO;AAAA,MACxC,OAAO,KAAK,GAAG,EAAE,SAAS,EAAE,SAAS;AAAA,MACrC,SAASA,GAAE,MAAM,oBAAoB,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,MACxD,OAAO,KAAK,GAAG,EAAE,SAAS;AAAA,IAC5B,CAAC;AACD,IAAM,gBAAgBA,GAAE,OAAO;AAAA,MAC7B,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACvB,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,UAAUA,GAAE,KAAK,CAAC,YAAY,UAAU,eAAe,YAAY,CAAC;AAAA,MACpE,OAAOA,GAAE,MAAMA,GAAE,OAAO,EAAE,OAAO,CAAC,MAAM,kBAAkB,CAAC,MAAM,IAAI,CAAC;AAAA,MACtE,OAAO,KAAK,GAAG,EAAE,SAAS;AAAA,MAC1B,SAASA,GAAE,MAAM,oBAAoB,EAAE,IAAI,EAAE;AAAA,IAC/C,CAAC;AACD,IAAM,iBAAiBA,GAAE,KAAK,CAAC,cAAc,YAAY,UAAU,CAAC;AACpE,IAAM,eAAeA,GAAE,KAAK,CAAC,UAAU,cAAc,SAAS,CAAC;AACxD,IAAM,uBAAuBA,GAAE,OAAO;AAAA,MAC3C,UAAUA,GAAE,OAAO;AAAA,MACnB,UAAUA,GAAE,OAAO;AAAA,MACnB,kBAAkBA,GAAE,QAAQ;AAAA,MAC5B,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,MAChC,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,IAClC,CAAC;AACD,IAAM,cAAcA,GAAE,OAAO;AAAA,MAC3B,MAAMA,GAAE,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,MACxB,OAAO,KAAK,GAAG,EAAE,SAAS;AAAA,MAC1B,MAAM,KAAK,IAAI,EAAE,SAAS;AAAA,MAC1B,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MACpC,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,eAAeA,GAAE,OAAO;AAAA,MACxB,UAAU,qBAAqB,SAAS;AAAA,MACxC,SAAS,oBAAoB,SAAS;AAAA,IACxC,CAAC;AAKD,IAAM,eAAeA,GAClB,OAAO;AAAA,MACN,SAASA,GAAE,QAAQ,CAAC;AAAA,MACpB,IAAIA,GAAE,OAAO,EAAE,MAAM,kBAAkB;AAAA,MACvC,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACvB,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,UAAU,cAAc,MAAM;AAAA,MAC9B,OAAO,cAAc,MAAM;AAAA,MAC3B,WAAWA,GAAE,OAAO;AAAA,MACpB,WAAWA,GAAE,OAAO;AAAA,MACpB,eAAeA,GAAE,OAAO;AAAA,MACxB,QAAQA,GAAE,KAAK,CAAC,UAAU,YAAY,CAAC;AAAA,MACvC,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,IACpC,CAAC,EACA,YAAY;AACf,IAAM,gBAAgB,aACnB,OAAO;AAAA,MACN,SAASA,GAAE,QAAQ,CAAC;AAAA,MACpB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MACpC,OAAO,KAAK,GAAG,EAAE,SAAS;AAAA,MAC1B,SAASA,GAAE,MAAM,oBAAoB,EAAE,IAAI,EAAE;AAAA,MAC7C,SAASA,GAAE,MAAM,WAAW,EAAE,IAAI,CAAC;AAAA,MACnC,SAAS,oBAAoB,SAAS;AAAA,MACtC,aAAaA,GACV;AAAA,QACCA,GAAE,OAAO;AAAA,UACP,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,UACxB,WAAW,KAAK,GAAG;AAAA,UACnB,MAAM,KAAK,IAAI;AAAA,UACf,SAASA,GAAE,QAAQ,wBAAwB;AAAA,UAC3C,OAAOA,GAAE,QAAQ,WAAW,EAAE,SAAS;AAAA,UACvC,gBAAgBA,GAAE,OAAO,EAAE,MAAM,gBAAgB;AAAA,UACjD,UAAUA,GAAE,OAAO;AAAA,UACnB,SAAS;AAAA,QACX,CAAC;AAAA,MACH,EACC,IAAI,GAAG,EACP,SAAS;AAAA,IACd,CAAC,EACA,YAAY,CAAC,QAAQ,QAAQ;AAC5B,YAAM,UAAU,CAAC,YAAoB,IAAI,SAAS,EAAE,MAAM,UAAU,QAAQ,CAAC;AAC7E,YAAM,OAAO,CAAC,GAAY,MAAe,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;AAC/E,UAAI;AACJ,iBAAW,SAAS,OAAO,SAAS;AAClC,YAAI,CAAC,UAAU;AACb,cAAI,CAAC,CAAC,WAAW,UAAU,EAAE,SAAS,MAAM,IAAI,KAAK,MAAM,aAAa;AACtE,oBAAQ,iEAAiE;AAC3E,cAAI,MAAM,cAAc,MAAM,SAAS,YAAY,aAAa;AAC9D,oBAAQ,yCAAyC;AAAA,QACrD,OAAO;AACL,cAAI,CAAC,WAAW,UAAU,EAAE,SAAS,MAAM,IAAI,EAAG,SAAQ,wBAAwB;AAClF,cAAI,SAAS,WAAW,SAAU,SAAQ,sCAAsC;AAChF,cAAI,MAAM,aAAa,SAAS,YAAY,MAAM,SAAS,YAAY,IAAI;AACzE,oBAAQ,2BAA2B;AACrC,cAAI,MAAM,SAAS,aAAa,CAAC,KAAK,MAAM,SAAS,SAAS,OAAO;AACnE,oBAAQ,kDAAkD;AAC5D,cAAI,MAAM,SAAS,gBAAgB,SAAS,aAAa;AACvD,oBAAQ,2CAA2C;AACrD,cAAI,MAAM,SAAS,cAAc,SAAS,aAAa;AACrD,oBAAQ,4CAA4C;AACtD,gBAAM,WACJ,MAAM,SAAS,YACX,aACA,CAAC,YAAY,YAAY,EAAE,SAAS,MAAM,IAAI,IAC5C,aACA,SAAS;AACjB,cAAI,MAAM,aAAa,SAAU,SAAQ,wCAAwC;AACjF,cACE,CAAC,CAAC,YAAY,YAAY,EAAE,SAAS,MAAM,IAAI,KAC/C,MAAM,kBAAkB,SAAS;AAEjC,oBAAQ,iDAAiD;AAAA,QAC7D;AACA,YACE,MAAM,SAAS,cACf,MAAM,YACH,MAAM,SAAS,YACZ,YACA,MAAM,SAAS,eACb,eACA;AAER,kBAAQ,kCAAkC;AAC5C,YACE,CAAC,YAAY,cAAc,SAAS,EAAE,SAAS,MAAM,IAAI,MACxD,CAAC,MAAM,SAAS,CAAC,MAAM,QAAQ,CAAC,MAAM;AAEvC,kBAAQ,6DAA6D;AACvE,YAAI,CAAC,YAAY,YAAY,EAAE,SAAS,MAAM,IAAI,GAAG;AACnD,cAAI,CAAC,MAAM,QAAQ,SAAS,CAAC,MAAM,QAAQ,QAAQ;AACjD,oBAAQ,gDAAgD;AAC1D,cACE,CAAC,MAAM,YACP,CAAC,oBAAoB,KAAK,MAAM,SAAS,QAAQ,KACjD,MAAM,kBAAkB,MAAM,SAAS,YACvC,MAAM,SAAS,aAAa;AAE5B,oBAAQ,mDAAmD;AAAA,QAC/D;AACA,YAAI,MAAM,WAAW,CAAC,KAAK,CAAC,GAAG,MAAM,QAAQ,KAAK,EAAE,KAAK,GAAG,MAAM,QAAQ,OAAO;AAC/E,kBAAQ,+CAA+C;AACzD,mBAAW;AAAA,MACb;AACA,UAAI,YAAY,CAAC,KAAK,SAAS,SAAS,OAAO,OAAO;AACpD,gBAAQ,gDAAgD;AAC1D,UACE,CAAC,YACD,CAAC,KAAK,SAAS,SAAS,gBAAgB,MAAM,CAAC,KAC/C,SAAS,aAAa,OAAO,YAC7B,SAAS,WAAW,OAAO,UAC3B,SAAS,aAAa,OAAO,YAC7B,SAAS,kBAAkB,OAAO;AAElC,gBAAQ,iDAAiD;AAAA,IAC7D,CAAC;AAEI,IAAM,iBAAiBA,GAAE,MAAM,CAAC,cAAc,aAAa,CAAC;AA0O5D,IAAM,oBACX;AAAA;AAAA;;;AC5ZF,OAAOE,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,KAAAC,UAAS;AAwDlB,eAAsB,mBACpB,SACqF;AACrF,SAAO;AAAA,IACL,MAAM,eAAe,SAAS,yBAAyB,YAAY;AACjE,YAAM,SAAyC,CAAC;AAChD,YAAM,cAAiC,CAAC;AACxC,UAAI;AACJ,UAAI;AACF,kBAAU,MAAMH,IAAG,QAAQ,MAAM,UAAU,SAAS,kBAAkB,CAAC;AAAA,MACzE,SAAS,OAAO;AACd,YAAK,MAAgC,SAAS;AAC5C,sBAAY,KAAK,EAAE,MAAM,oBAAoB,SAAS,OAAO,KAAK,EAAE,CAAC;AACvE,eAAO,EAAE,QAAQ,YAAY;AAAA,MAC/B;AACA,iBAAW,SAAS,QAAQ,KAAK,GAAG;AAClC,YAAI,CAAC,MAAM,SAAS,OAAO,EAAG;AAC9B,cAAM,WAAW,oBAAoB,KAAK;AAC1C,YAAI;AACF,gBAAM,MAAM,MAAM,gBAAgB,MAAM,UAAU,SAAS,QAAQ,GAAG,KAAK,OAAO,IAAI;AACtF,cAAI,QAAQ,KAAM,OAAM,IAAI,MAAM,uCAAuC;AACzE,iBAAO,KAAK,CAAC,UAAU,GAAG,CAAC;AAAA,QAC7B,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,SAAU,QAAO,KAAK,CAAC,UAAU,IAAI,CAAC;AAAA;AAElF,wBAAY,KAAK;AAAA,cACf,MAAM;AAAA,cACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAChE,CAAC;AAAA,QACL;AAAA,MACF;AACA,aAAO,EAAE,QAAQ,YAAY;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,kBACpB,SACwE;AAGxE,SAAO;AAAA,IACL,MAAM,eAAe,SAAS,yBAAyB,YAAY;AACjE,YAAM,MAAM,MAAM,mBAAmB,OAAO;AAC5C,YAAM,UAA4B,CAAC;AACnC,YAAM,cAAc,CAAC,GAAG,IAAI,WAAW;AACvC,iBAAW,CAAC,UAAUI,QAAO,KAAK,IAAI,QAAQ;AAC5C,YAAI;AACF,gBAAM,SAAS,eAAe,MAAMA,aAAY,OAAO,OAAO,KAAK,MAAMA,QAAO,CAAC;AACjF,cAAI,aAAa,oBAAoB,OAAO,EAAE;AAC5C,kBAAM,IAAI,MAAM,uCAAuC;AACzD,kBAAQ,KAAK,MAAM;AAAA,QACrB,SAAS,OAAO;AACd,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAChE,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO,EAAE,SAAS,YAAY;AAAA,IAChC,CAAC;AAAA,EACH;AACF;AA5HA,IA2Ba,iBACA,wBACA,gBAIP,aAcO,qBAKA;AApDb;AAAA;AAAA;AAAA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AAgBO,IAAM,kBAAkB;AACxB,IAAM,yBAAyB;AAC/B,IAAM,iBAAiB;AAI9B,IAAM,cAAc,CAAC,OAAe,KAAa,SAC/CD,GACG,OAAO;AAAA,MACN,UAAU,CAAC,OAAO,SAAS;AAAA,QACzB,SACE,MAAM,SAAS,aAAa,OAAO,IAAI,SAAS,WAC5C,GAAG,KAAK,QAAQ,IAAI,KAAK,MAAM,2BAA2B,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,WAAW,IAAI,KACtG,IAAI;AAAA,MACZ;AAAA,IACF,CAAC,EACA,KAAK,EACL,IAAI,GAAG,GAAG,KAAK,oBAAoB,EACnC,IAAI,GAAG;AAEL,IAAM,sBAAsB;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACO,IAAM,qBAAqB;AAAA,MAChC;AAAA,MACA;AAAA,MACA,WAAW,sBAAsB;AAAA,IACnC;AAAA;AAAA;;;ACxDA,OAAOE,SAAQ;AACf,YAAY,cAAc;AAC1B,OAAOC,WAAU;AAEjB,OAAOC,SAAQ;AASf,eAAsB,eAAe,MAAc,MAA+B;AAChF,MAAI,SAAS,IAAK,QAAOF,IAAG,SAAS,IAAI;AACzC,MAAI;AACF,WAAO,MAAM,UAAU,MAAM,IAAI;AAAA,EACnC,SAAS,OAAO;AACd,QAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,SAAS,GAAG;AACjE,YAAM,IAAI;AAAA,QACR,yCAAyC,IAAI;AAAA,QAC7C,EAAE,OAAO,MAAM;AAAA,MACjB;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,eAAe,MAAc,MAAsC;AACvF,MAAI;AACF,UAAM,QAAQ,MAAM,gBAAgB,MAAM,eAAe,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI;AACtF,QAAI,UAAU,KAAM,OAAM,IAAI,MAAM,wCAAwC,IAAI,EAAE;AAClF,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,CAAC,UAAU,SAAS,EAAE,SAAU,MAAgC,QAAQ,EAAE,EAAG,QAAO;AACxF,UAAM;AAAA,EACR;AACF;AAGA,eAAsB,UACpB,MACA,UACA,SAOmB;AACnB,MAAI,MAAM,QAAQ,QAAQ,KAAK,CAAC,SAAS,OAAQ,QAAO,CAAC;AACzD,QAAM,cAAc,oBAAI,IAAY;AAIpC,QAAMG,YAAW,CACfC,YACA,MACA,aACG;AACH,UAAM,WAAWH,MAAK,SAAS,MAAMG,UAAS,EAAE,MAAMH,MAAK,GAAG,EAAE,KAAK,GAAG,KAAK;AAC7E,gBAAY,IAAI,QAAQ;AACxB,QAAI,YAAY,OAAO,YAAY;AACjC;AAAA,QACE,IAAI;AAAA,UACF,GAAG,QAAQ,KAAK,YAAY,WAAW,eAAe,OAAO,CAAC,iCAAiC,QAAQ;AAAA,QACzG;AAAA,MACF;AACA;AAAA,IACF;AACA,mBAAe,MAAM,QAAQ,EAAE,KAAK,MAAM;AACxC,MAAS;AAAA,QACPG;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAGA,QAAMC,UAAS,CAAC,MAAc,aAA8D;AAC1F,UAAM,WAAWJ,MAAK,SAAS,MAAM,IAAI,EAAE,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG,KAAK;AACxE,mBAAe,MAAM,QAAQ,EAAE,KAAK,MAAe,eAAM,MAAM,QAAQ,GAAG,QAAQ;AAAA,EACpF;AACA,QAAM,SAASC,IAAG,OAAO,UAAU;AAAA,IACjC,KAAK;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,WAAW;AAAA,IACX,iBAAiB,QAAQ;AAAA,IACzB,YAAY;AAAA,IACZ,qBAAqB,QAAQ,uBAAuB;AAAA,IACpD,IAAI,EAAE,SAAAC,UAAS,OAAAE,OAAM;AAAA,IACrB,aAAa;AAAA,EACf,CAAC;AACD,QAAM,UAAoB,CAAC;AAC3B,MAAI;AACF,qBAAiB,SAAS,QAAQ;AAChC,YAAM,QAAQ;AACd,YAAM,OAAO,MAAM;AACnB,UAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO,IAAI,EAAG;AAC7C,YAAM,eAAe,MAAM,IAAI;AAC/B,UAAI,CAAC,QAAQ,mBAAmB,CAAC,MAAM,OAAO,OAAO,EAAG;AACxD,cAAQ,KAAK,IAAI;AACjB,UAAI,QAAQ,SAAS,YAAY;AAC/B,cAAM,UAAU;AAAA,UACd,GAAG,QAAQ,OAAO,CAAC,QAAQ,SAAS;AAClC,kBAAM,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC;AAC7B,mBAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAC1C,mBAAO;AAAA,UACT,GAAG,oBAAI,IAAoB,CAAC;AAAA,QAC9B,EACG,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC;AACb,cAAM,IAAI;AAAA,UACR,GAAG,QAAQ,KAAK,YAAY,WAAW,eAAe,OAAO,CAAC,yCAAyC,QAAQ,IAAI,CAAC,CAAC,KAAKC,MAAK,MAAM,GAAG,GAAG,KAAKA,MAAK,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,QACtK;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO,QAAQ,KAAK;AACtB;AAGA,eAAsB,eAAe,MAAiC;AACpE,SAAO,cAAc,MAAM,SAAS;AACtC;AAGA,eAAsB,gBAAgB,MAAc,OAAuC;AACzF,MAAI,CAAC,MAAM,OAAQ,QAAO,oBAAI,IAAI;AAClC,QAAM,UAAU,oBAAI,IAAY;AAChC,WAAS,SAAS,GAAG,SAAS,MAAM,QAAQ,UAAU,KAAM;AAC1D,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,MAAM,QAAQ,CAAC,gBAAgB,MAAM,SAAS,GAAG;AAAA,QAClE,KAAK;AAAA,QACL,WAAW,IAAI,OAAO;AAAA,QACtB,SAAS;AAAA,QACT,OAAO,MAAM,MAAM,QAAQ,SAAS,GAAI,EAAE,KAAK,IAAI,IAAI;AAAA,MACzD,CAAC;AACD,iBAAW,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO,EAAG,SAAQ,IAAI,IAAI;AAAA,IACzE,SAAS,OAAO;AACd,UAAK,MAA4B,SAAS,EAAG,OAAM;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AApJA,IAUM;AAVN;AAAA;AAAA;AAKA;AACA;AACA;AACA;AAEA,IAAM,aAAa;AAAA;AAAA;;;ACVnB,OAAOC,SAAQ;AAIf,eAAsB,mBACpB,MACA,OACA,SACsB;AACtB,MAAI,CAAC,QAAQ,OAAQ,QAAO,IAAI,IAAI,KAAK;AACzC,QAAM,WAAW,oBAAI,IAAY;AACjC,WAAS,SAAS,GAAG,SAAS,MAAM,QAAQ,UAAU,KAAK;AACzD,eAAW,QAAQ,MAAM;AAAA,MACvB;AAAA,MACA,MAAM,MAAM,QAAQ,SAAS,GAAG,EAAE,IAAI,CAACC,UAASD,IAAG,WAAWC,KAAI,CAAC;AAAA,MACnE;AAAA,QACE,QAAQ;AAAA,QACR,qBAAqB;AAAA,QACrB,OAAO;AAAA,MACT;AAAA,IACF;AACE,eAAS,IAAI,IAAI;AAAA,EACrB;AACA,SAAO;AACT;AAxBA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA,OAAOC,WAAU;AAejB,SAAS,cAAc,MAAwB;AAC7C,QAAM,QAAkB,CAAC;AACzB,MAAIC,SAAQ,IACV,QAAQ;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,OAAO,KAAK,CAAC;AACnB,QAAI,SAAS,MAAM;AACjB;AACA;AAAA,IACF;AACA,QAAIA,QAAO;AACT,UAAI,SAASA,OAAO,CAAAA,SAAQ;AAC5B;AAAA,IACF;AACA,QAAI,SAAS,OAAO,SAAS,KAAK;AAChC,MAAAA,SAAQ;AACR;AAAA,IACF;AACA,QAAI,SAAS,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,MAAM;AACjD,YAAM,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC;AAC/B,UAAI,SAAS,IAAK;AAClB,cAAQ,IAAI;AAAA,IACd;AAAA,EACF;AACA,QAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AAC5B,SAAO;AACT;AAGO,SAAS,cACd,MACA,QACA,KACA,QAAQ,OACoD;AAC5D,QAAM,SAAyB,CAAC;AAChC,QAAM,WAAW,cAAc,IAAI;AACnC,aAAW,WAAW,UAAU;AAC9B,UAAMC,QAAO,QAAQ,KAAK,EAAE,QAAQ,UAAU,EAAE;AAChD,QAAIA,MAAK,WAAW,GAAG,KAAK,qBAAqB,KAAKA,KAAI,EAAG;AAC7D,UAAM,KAAKA,MAAK,MAAM,aAAa;AACnC,QAAI,IAAI;AACN,YAAMC,aAAY,QAAQ,GAAG,CAAC,CAAC;AAC/B,YACEA,eAAc,QAAQ,QAAQ,QAAS,KAAK,KAAKA,UAAS,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,IAC9E,OACAH,MAAK,MAAM,KAAK,OAAO,KAAKG,UAAS;AAC3C;AAAA,IACF;AACA,eAAW,SAASD,MAAK,SAAS,OAAO,GAAG;AAC1C,YAAM,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC5B,YAAM,WAAW,MAAM,MAAM,sCAAsC;AACnE,UAAIC,aAAY;AAChB,UAAI;AACJ,UAAK,SAAS,MAAM,UAAU,KAAM,MAAM,CAAC,EAAE,WAAW,GAAG;AACzD,uBAAe;AACjB,UAAI,UAAU;AACZ,cAAM,WAAW,QAAQ,SAAS,CAAC,CAAC;AACpC,QAAAA,aACE,aAAa,QAAQ,QAAQ,OAAO,OAAOH,MAAK,MAAM,KAAK,OAAO,KAAK,QAAQ;AAAA,MACnF,WAAW,MAAO,gBAAe,qDAAqD;AACtF,YAAM,OAAOE,MAAK,MAAM,MAAM,QAAS,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,cAAc,EAAE,CAAC;AAC/E,UACE,wFAAwF;AAAA,QACtF;AAAA,MACF,GACA;AACA,uBAAe;AAAA,MACjB;AACA,UACE,QAAQ,KAAKA,KAAI,KACjB,kCAAkC,KAAKA,KAAI,KAC3CC,eAAc,MACd;AACA,uBACE;AAAA,MACJ;AACA,aAAO,KAAK;AAAA,QACV,YAAY,MAAM,CAAC;AAAA,QACnB,YAAY,MAAM,CAAC;AAAA,QACnB,SAAS,MAAM,CAAC;AAAA,QAChB,MAAM;AAAA,QACN,GAAIA,eAAc,UAAaA,eAAc,OAAO,EAAE,WAAAA,WAAU,IAAI,CAAC;AAAA,QACrE,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAEA,QAAI,wBAAwB,KAAKD,KAAI,EAAG,OAAM;AAAA,EAChD;AACA,SAAO,EAAE,QAAQ,IAAI;AACvB;AAzGA,IAGM,OACA,SAIA;AARN;AAAA;AAAA;AAGA,IAAM,QAAQ;AACd,IAAM,UAAU,IAAI;AAAA,MAClB,gCAAgC,KAAK;AAAA,MACrC;AAAA,IACF;AACA,IAAM,UAAU,CAAC,UAAkB;AACjC,YAAM,WAAW,MAAM,QAAQ,kBAAkB,IAAI;AACrD,aAAO,0BAA0B,KAAK,QAAQ,KAAKF,MAAK,MAAM,WAAW,QAAQ,IAC7E,OACA;AAAA,IACN;AAAA;AAAA;;;ACHA,SAAS,WAAW,MAAsB;AACxC,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,KAAK,QAAQ,KAAK;AAC9B,QAAI,QAAQ,GAAI,QAAO;AAAA,EACzB;AACA,SAAO;AACT;AAGA,SAAS,aAAa,MAAuB;AAC3C,SAAO,YAAY,KAAK,IAAI;AAC9B;AAMA,SAAS,UAAU,YAAmC;AACpD,MAAI,OAAO,WAAW,QAAQ,QAAQ,EAAE;AACxC,QAAMI,QAAO,KAAK,OAAO,MAAM;AAC/B,MAAIA,UAAS,GAAI,QAAO,KAAK,MAAM,GAAGA,KAAI;AAC1C,QAAM,UAAU,KAAK,OAAO,QAAQ;AACpC,MAAI,YAAY,GAAI,QAAO,KAAK,MAAM,GAAG,OAAO;AAChD,SAAO,KAAK,KAAK;AAGjB,MAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,EAAG,QAAO;AACrC,SAAO;AACT;AAYO,SAAS,kBAAkB,YAAsB,gBAAqC;AAC3F,QAAM,aAAa,WAAW,OAAO,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE;AAClE,MAAI,aAAa,gBAAiB,QAAO,CAAC;AAE1C,QAAM,SAAsB,CAAC;AAG7B,QAAM,QAA8C,CAAC;AACrD,MAAI,aAAa;AACjB,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAM,OAAO,WAAW,CAAC;AACzB,UAAM,MAAM,WAAW,IAAI;AAE3B,QAAI,QAAQ,IAAI;AACd,UAAI,aAAa,IAAI,EAAG;AACxB,UAAI,CAAC,SAAS;AAEZ,cAAM,YAAY,KAAK,KAAK;AAC5B,YAAI,UAAU,SAAS,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,GAAG;AACpD,uBAAa,UAAU,QAAQ,QAAQ,EAAE;AACzC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM,iBAAiB;AAAA,YACvB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,cAAU;AACV,UAAM,OAAO,UAAU,KAAK,MAAM,MAAM,OAAO,CAAC,EAAE,MAAM,CAAC;AACzD,QAAI,SAAS,KAAM,QAAO;AAE1B,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAE,OAAO,KAAK;AAC7D,YAAM,IAAI;AAAA,IACZ;AAEA,UAAM,QAAQ,KAAK,SAAS,GAAG;AAC/B,UAAM,YAAY,KAAK,QAAQ,QAAQ,EAAE;AACzC,UAAM,WAAW,CAAC,GAAI,aAAa,CAAC,UAAU,IAAI,CAAC,GAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS;AAC7F,WAAO,KAAK;AAAA,MACV,MAAM,SAAS,KAAK,GAAG;AAAA,MACvB,MAAM,iBAAiB;AAAA,MACvB,SAAS;AAAA,IACX,CAAC;AAED,QAAI,MAAO,OAAM,KAAK,EAAE,KAAK,MAAM,UAAU,CAAC;AAAA,EAChD;AAEA,SAAO;AACT;AAzGA,IAMM,iBAEA;AARN;AAAA;AAAA;AAMA,IAAM,kBAAkB;AAExB,IAAM,SAAS,CAAC,sBAAO,oBAAK;AAAA;AAAA;;;ACR5B,OAAO,gBAAgB;AA0DhB,SAAS,mBAAmB,OAA8B;AAC/D,MAAI,IAAI,MAAM,KAAK;AACnB,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,KAAK,KAAK,CAAC,EAAG,QAAO;AACzB,MAAI,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,IAAI,EAAG,QAAO;AAClD,MAAI,gBAAgB,KAAK,CAAC,EAAG,QAAO;AACpC,MAAI,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,KAAK,GAAG;AACvF,WAAO;AAAA,EACT;AAEA,MAAI,EAAE,QAAQ,kBAAkB,EAAE;AAClC,MAAI,EAAE,SAAS,GAAG,EAAG,QAAO;AAC5B,QAAM,aAAa,EAAE,QAAQ,QAAQ,EAAE;AACvC,MAAI,CAAC,WAAY,QAAO;AAGxB,MAAI,WAAW,MAAM,GAAG,EAAE,KAAK,CAAC,QAAQ,QAAQ,KAAK,GAAG,CAAC,EAAG,QAAO;AACnE,MAAI,WAAW,SAAS,GAAG,EAAG,QAAO;AACrC,SAAO,gBAAgB,IAAI,UAAU,IAAI,aAAa;AACxD;AAGA,SAAS,eAAe,MAA6B;AACnD,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,WAAW,KAAK,KAAK,OAAO,KAAK,CAAC,QAAQ,SAAS,GAAG,EAAG,QAAO;AACrE,SAAO,mBAAmB,OAAO;AACnC;AAEA,SAAS,oBAAoB,OAA4B;AACvD,QAAM,UAAU,IAAI,MAAe,MAAM,MAAM,EAAE,KAAK,KAAK;AAC3D,MAAI,WAAW;AACf,MAAI,aAAa;AAEjB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,KAAK,SAAS,YAAY,GAAG;AAC/B,iBAAW;AACX,cAAQ,CAAC,IAAI;AACb;AAAA,IACF;AACA,QAAI,KAAK,SAAS,UAAU,GAAG;AAC7B,iBAAW;AACX,cAAQ,CAAC,IAAI;AACb;AAAA,IACF;AACA,QAAI,UAAU;AACZ,cAAQ,CAAC,IAAI;AACb;AAAA,IACF;AACA,QAAI,YAAY;AACd,UAAI,KAAK,KAAK,EAAE,WAAW,EAAG;AAC9B,cAAQ,CAAC,IAAI;AACb,mBAAa;AACb;AAAA,IACF;AACA,QAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,cAAQ,CAAC,IAAI;AACb,YAAM,OAAO,KAAK,QAAQ,aAAa,EAAE,EAAE,KAAK;AAChD,UAAI,KAAK,WAAW,EAAG,cAAa;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,cAAcC,UAA4B;AACxD,QAAM,QAAQA,SAAQ,MAAM,IAAI;AAChC,QAAM,UAAU,oBAAoB,KAAK;AAEzC,QAAM,QAAQ,oBAAI,IAAuB;AACzC,QAAM,SAAuB,CAAC;AAC9B,QAAMC,YAAW,oBAAI,IAA0B;AAE/C,QAAM,UAAU,CAAC,UAA2B;AAC1C,UAAM,MAAM,CAAC,MAAM,cAAc,SAAS,MAAM,IAAI,EAAE,KAAK,GAAG;AAC9D,QAAI,CAAC,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,KAAK,KAAK;AAAA,EAC3C;AACA,QAAM,aAAa,CAAC,UAA8B;AAChD,UAAM,MAAM,KAAK,UAAU,CAAC,MAAM,YAAY,MAAM,WAAW,MAAM,YAAY,CAAC;AAClF,QAAI,CAACA,UAAS,IAAI,GAAG,EAAG,CAAAA,UAAS,IAAI,KAAK,KAAK;AAAA,EACjD;AAIA,QAAM,SAAS,SAAS,MAAM,MAAM,IAAI,CAAC,MAAM,MAAO,QAAQ,CAAC,IAAI,KAAK,IAAK,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC;AAC7F,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,YAAY,CAAC,MAAM,IAAK;AAC3C,QAAI,OAAO,MAAM,IAAI,CAAC,IAAI;AAC1B,eAAW,SAAS,MAAM,YAAY,CAAC,GAAG;AACxC,YAAM,SACJ,MAAM,SAAS,cACX,MAAM,QAAQ,MAAM,IACpB,MAAM,SAAS,UACb,MAAM,QAAQ,KAAK,IACnB;AACR,UAAI,UAAU,CAAC,iCAAiC,KAAK,MAAM,GAAG;AAC5D,YAAI,WAA0B;AAC9B,YAAI;AACF,qBAAW,mBAAmB,OAAO,MAAM,MAAM,EAAE,CAAC,CAAC;AAAA,QACvD,QAAQ;AAAA,QAER;AACA,YAAI,YAAY,CAAC,uBAAuB,KAAK,QAAQ,GAAG;AACtD,kBAAQ,EAAE,MAAM,UAAU,MAAM,SAAS,QAAQ,YAAY,WAAW,CAAC;AAAA,QAC3E;AAAA,MACF;AACA,UAAI,MAAM,SAAS,eAAe,MAAM,SAAS,YAAa;AAAA,UACzD,SAAQ,MAAM,QAAQ,MAAM,IAAI,EAAE,SAAS;AAAA,IAClD;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,UAAU;AACd,MAAI,YAAY;AAChB,MAAI,cAAc;AAClB,MAAI,aAAuB,CAAC;AAC5B,MAAI,iBAAiB;AAErB,QAAM,eAAe,MAAY;AAC/B,eAAW,SAAS,kBAAkB,YAAY,cAAc,GAAG;AACjE,cAAQ,KAAK;AAAA,IACf;AACA,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAM,QAAQ,eAAe,WAAW,CAAC,CAAC;AAC1C,UAAI,OAAO;AACT,gBAAQ;AAAA,UACN,MAAM;AAAA,UACN,MAAM,iBAAiB;AAAA,UACvB,SAAS,WAAW,CAAC,EAAE,KAAK;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,SAAS,IAAI;AACnB,UAAM,aAAa,KAAK,MAAM,sBAAsB;AAEpD,QAAI,YAAY;AACd,UAAI,CAAC,SAAS;AACZ,kBAAU;AACV,sBAAc,WAAW,CAAC,EAAE,CAAC;AAC7B,oBAAY,WAAW,CAAC,EAAE,KAAK,EAAE,YAAY;AAC7C,qBAAa,CAAC;AACd,mBAAW;AACX,yBAAiB,SAAS;AAAA,MAC5B,WAAW,WAAW,CAAC,EAAE,CAAC,MAAM,aAAa;AAC3C,kBAAU;AACV,qBAAa;AAAA,MACf;AACA;AAAA,IACF;AAEA,QAAI,SAAS;AAEX,iBAAW,KAAK,QAAQ,CAAC,IAAI,KAAK,IAAI;AACtC,UAAI,CAAC,QAAQ,CAAC,KAAK,kBAAkB,IAAI,SAAS,GAAG;AACnD,cAAM,UAAU,cAAc,MAAM,QAAQ,UAAU,IAAI;AAC1D,mBAAW,QAAQ;AACnB,mBAAW,SAAS,QAAQ,OAAQ,YAAW,KAAK;AAAA,MACtD;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,CAAC,EAAG;AAEhB,eAAW,KAAK,KAAK,SAAS,YAAY,GAAG;AAC3C,YAAM,aAAa,mBAAmB,EAAE,CAAC,CAAC;AAC1C,UAAI,YAAY;AACd,gBAAQ,EAAE,MAAM,YAAY,MAAM,QAAQ,SAAS,EAAE,CAAC,EAAE,CAAC;AAAA,MAC3D;AAAA,IACF;AACA,eAAW,KAAK,KAAK,SAAS,yCAAyC,GAAG;AACxE,YAAM,aAAa,mBAAmB,EAAE,CAAC,CAAC;AAC1C,UAAI,YAAY;AACd,gBAAQ,EAAE,MAAM,YAAY,MAAM,QAAQ,SAAS,EAAE,CAAC,EAAE,CAAC;AAAA,MAC3D;AAAA,IACF;AACA,eAAW,KAAK,KAAK,SAAS,QAAQ,GAAG;AACvC,YAAM,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,EAAE,CAAC,EAAE,MAAM;AACpD,UAAI,kBAAkB,KAAK,IAAI,EAAG;AAClC,aAAO,KAAK;AAAA,QACV,OAAO,OAAO,SAAS,EAAE,CAAC,GAAG,EAAE;AAAA,QAC/B,MAAM,EAAE,CAAC,EAAE,YAAY;AAAA,QACvB,MAAM;AAAA,QACN,SAAS,EAAE,CAAC;AAAA,MACd,CAAC;AAAA,IACH;AACA,eAAW,SAAS,KAAK,SAAS,YAAY,GAAG;AAC/C,iBAAW,SAAS,cAAc,MAAM,CAAC,GAAG,QAAQ,QAAW,IAAI,EAAE;AACnE,mBAAW,KAAK;AAAA,IACpB;AACA,eAAW,SAAS,cAAc,KAAK,QAAQ,YAAY,EAAE,GAAG,MAAM,EAAE;AACtE,iBAAW,KAAK;AAAA,EACpB;AAIA,MAAI,QAAS,cAAa;AAE1B,SAAO;AAAA,IACL,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC;AAAA,IACzB;AAAA,IACA,UAAU,CAAC,GAAGA,UAAS,OAAO,CAAC;AAAA,EACjC;AACF;AA5QA,IAUM,iBAgCA,mBAEA,UACA,UAEA,mBAEA,aACA,cACA;AAnDN;AAAA;AAAA;AACA;AAEA;AAOA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,IAAM,oBAAoB,oBAAI,IAAI,CAAC,IAAI,QAAQ,MAAM,SAAS,WAAW,KAAK,CAAC;AAE/E,IAAM,WAAW,IAAI,WAAW,cAAc,EAAE,MAAM,MAAM,CAAC;AAC7D,IAAM,WAAW;AAEjB,IAAM,oBAAoB;AAE1B,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,IAAM,aAAa;AAAA;AAAA;;;AC9CnB,SAAS,gBAAgB,MAAgC;AACvD,QAAM,QAAQ,KAAK,MAAM,GAAI;AAC7B,MAAI,MAAM,SAAS,KAAK,CAAC,MAAM,CAAC,EAAG,QAAO;AAC1C,SAAO,EAAE,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,SAAS,MAAM,MAAM,CAAC,EAAE,KAAK,GAAI,EAAE;AAC9E;AAGA,eAAsB,aACpB,cACA,SAC2B;AAC3B,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB,CAAC,OAAO,MAAM,YAAY,aAAa,IAAI,MAAM,aAAa,OAAO,EAAE;AAAA,MACvE,EAAE,KAAK,aAAa;AAAA,IACtB;AACA,UAAM,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;AACxC,WAAO,OAAO,gBAAgB,IAAI,IAAI;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,iBACpB,cACA,SAC2B;AAC3B,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB,CAAC,OAAO,MAAM,mBAAmB,YAAY,aAAa,IAAI,MAAM,aAAa,OAAO,EAAE;AAAA,MAC1F,EAAE,KAAK,aAAa;AAAA,IACtB;AACA,UAAM,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;AACxC,WAAO,OAAO,gBAAgB,IAAI,IAAI;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,cACpB,cACA,SAC2B;AAC3B,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB,CAAC,OAAO,aAAa,YAAY,aAAa,IAAI,MAAM,aAAa,OAAO,EAAE;AAAA,MAC9E,EAAE,KAAK,cAAc,WAAW,KAAK,OAAO,KAAK;AAAA,IACnD;AACA,UAAM,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;AACxC,WAAO,OAAO,gBAAgB,IAAI,IAAI;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaA,eAAsB,qBACpB,cACA,UACA,WAC8B;AAC9B,MAAI,CAAC,YAAY,aAAa,UAAW,QAAO;AAChD,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB;AAAA,QACE;AAAA,QACA,GAAG,QAAQ;AAAA,QACX,gBAAgB,aAAa;AAAA,QAC7B;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL;AAAA,MACA,EAAE,KAAK,cAAc,WAAW,KAAK,OAAO,KAAK;AAAA,IACnD;AAEA,UAAM,UAAkD,CAAC;AAGzD,eAAW,SAAS,OAAO,MAAM,GAAM,GAAG;AACxC,UAAI,CAAC,MAAM,KAAK,EAAG;AACnB,YAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AACjE,YAAM,MAAM,gBAAgB,MAAM,CAAC,CAAC;AACpC,UAAI,CAAC,IAAK;AACV,cAAQ,KAAK,EAAE,GAAG,KAAK,OAAO,MAAM,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;AAAA,IACrE;AACA,WAAO,EAAE,SAAS,OAAO,QAAQ,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA1GA,IAGM;AAHN;AAAA;AAAA;AAAA;AAGA,IAAM,gBAAgB;AAAA;AAAA;;;ACDtB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGjB,OAAOC,SAAQ;AA2Bf,eAAe,UAAU,cAAsB,OAAuC;AACpF,MAAI,CAAC,MAAM,OAAQ,QAAO,oBAAI,IAAI;AAClC,MAAI;AACF,UAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAS,SAAS,GAAG,SAAS,MAAM,QAAQ,UAAU,KAAK;AACzD,YAAM,EAAE,OAAO,IAAI,MAAM;AAAA,QACvB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG,MAAM,MAAM,QAAQ,SAAS,GAAG,EAAE,IAAI,CAAC,SAAS,aAAa,IAAI,EAAE;AAAA,QACxE;AAAA,QACA,EAAE,KAAK,cAAc,WAAW,KAAK,OAAO,MAAM,SAAS,IAAM;AAAA,MACnE;AACA,YAAM,UAAU,OAAO,MAAM,IAAI;AACjC,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAI,CAAC,QAAQ,CAAC,EAAG;AACjB,cAAM,SAAS,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC;AACpC,cAAM,IAAI,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;AAE7B,YAAI,OAAO,KAAK,MAAM,KAAK,QAAQ,IAAI,CAAC,EAAG,OAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;AAAA,MACnE;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,IAAI,IAAI,KAAK;AAAA,EACtB;AACF;AAGA,eAAsB,iBAAiB,MAAiC;AACtE,MAAI;AACJ,MAAI;AACF,iBAAa,MAAM,cAAc,MAAM,WAAW;AAAA,EACpD,SAAS,OAAO;AAEd,QAAI;AACF,YAAM,QAAQ,CAAC,aAAa,WAAW,GAAG,EAAE,KAAK,KAAK,CAAC;AAAA,IACzD,QAAQ;AACN,aAAO,cAAc,IAAI;AAAA,IAC3B;AACA,UAAM;AAAA,EACR;AACA,aAAW,KAAK,GAAI,MAAM,cAAc,IAAI,CAAE;AAC9C,QAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,OAAO,UAAU,CAAC;AAAA,EACxB;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,EAAE,KAAK;AAC7C,WAAS,SAAS,GAAG,SAAS,OAAO,QAAQ,UAAU,KAAK;AAC1D,UAAM;AAAA,MACJ,GAAI,MAAM;AAAA,QACR;AAAA,QACA,OAAO,MAAM,QAAQ,SAAS,GAAG,EAAE,IAAI,CAAC,MAAMA,IAAG,WAAW,CAAC,CAAC;AAAA,QAC9D;AAAA,UACE,QAAQ;AAAA,UACR,qBAAqB;AAAA,UACrB,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,SAAS;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,EACJ;AACA,QAAMC,YAAW,CAAC,SAAiB;AACjC,UAAM,QAAS,eAAqC;AAAA,MAClD,CAAC,MAAM,EAAE,YAAY,MAAM,KAAK,YAAY;AAAA,IAC9C;AACA,WAAO,QAAQ,IAAI,eAAe,SAAS;AAAA,EAC7C;AACA,SAAO,MAAM,KAAK,CAAC,GAAG,MAAMA,UAAS,CAAC,IAAIA,UAAS,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AAC7E;AAGA,eAAe,cAAc,MAAiC;AAC5D,QAAM,QAAkB,CAAC;AACzB,aAAW,OAAO,CAAC,KAAK,SAAS,GAAG;AAClC,QAAI;AACJ,QAAI;AACF,gBAAU,MAAMH,IAAG,QAAQ,MAAM,eAAe,MAAM,GAAG,GAAG,EAAE,eAAe,KAAK,CAAC;AAAA,IACrF,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,SAAU;AACxD,YAAM;AAAA,IACR;AACA,eAAW,SAAS;AAClB,UAAI,kCAAkC,KAAK,MAAM,IAAI,GAAG;AACtD,cAAM,KAAKC,MAAK,MAAM,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,MAC7C;AAAA,EACJ;AACA,SAAO;AACT;AAEO,SAAS,cAAc,MAAsB;AAElD,MAAI,CAAC,gCAAgC,KAAKA,MAAK,MAAM,SAAS,IAAI,CAAC,EAAG,QAAO;AAC7E,QAAM,SAASA,MAAK,MAAM,QAAQ,IAAI;AACtC,SAAOA,MAAK,MAAM,SAAS,MAAM,EAAE,YAAY,MAAM,YACjDA,MAAK,MAAM,QAAQ,MAAM,IACzB;AACN;AAEA,eAAsB,aAAa,cAA2C;AAC5E,SAAO,aAAa,mBAAmB,MAAM,SAAS,YAAY,CAAC;AACrE;AAEA,eAAe,SAAS,cAA2C;AACjE,QAAM,OAAmB,CAAC;AAC1B,QAAM,QAAQ,MAAM,iBAAiB,YAAY;AACjD,QAAM,QAAQ,MAAM,UAAU,cAAc,KAAK;AAEjD,WAAS,SAAS,GAAG,SAAS,MAAM,QAAQ,UAAU,GAAG;AACvD,SAAK;AAAA,MACH,GAAI,MAAM,QAAQ;AAAA,QAChB,MAAM,MAAM,QAAQ,SAAS,CAAC,EAAE,IAAI,OAAO,cAAiC;AAC1E,gBAAM,CAACG,UAAS,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,YAC9C,eAAe,cAAc,SAAS;AAAA,YACtC,aAAa,0BAA0B,MAAM,aAAa,cAAc,SAAS,CAAC;AAAA,UACpF,CAAC;AACD,cAAIA,aAAY;AACd,kBAAM,IAAI,MAAM,4CAA4C,SAAS;AACvE,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAAA;AAAA,YACA,OAAO,cAAc,SAAS;AAAA,YAC9B,MAAM,gBAAgB,KAAKH,MAAK,MAAM,SAAS,SAAS,CAAC,IACrD,WACA,yBAAyB,KAAKA,MAAK,MAAM,SAAS,SAAS,CAAC,IAC1D,iBACA;AAAA,YACN,WAAWG,SAAQ,MAAM,IAAI,EAAE;AAAA,YAC/B;AAAA,YACA,OAAO,MAAM,IAAI,SAAS;AAAA,YAC1B,QAAQ,cAAcA,QAAO;AAAA,UAC/B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AA3LA,IAgBa;AAhBb;AAAA;AAAA;AAAA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAOO,IAAM,iBAAiB,CAAC,aAAa,aAAa,mBAAmB;AAAA;AAAA;;;AChB5E,OAAOC,SAAQ;AACf,OAAOC,YAAU;AAMV,SAAS,WAAWC,YAAmB,OAA8B;AAC1E,MAAID,OAAK,MAAM,WAAW,KAAK,KAAK,MAAM,SAAS,IAAI,KAAK,cAAc,KAAK,KAAK;AAClF,WAAO;AACT,QAAM,WAAWA,OAAK,MAAM,UAAUA,OAAK,MAAM,KAAKC,YAAW,KAAK,CAAC;AACvE,SAAO,aAAa,QAAQ,SAAS,WAAW,KAAK,IAAI,OAAO;AAClE;AAEO,SAAS,eAAe,KAAa,OAAqC;AAC/E,QAAMA,aAAY,MAAM,eAAe,aAAaD,OAAK,MAAM,QAAQ,GAAG,IAAI,cAAc,GAAG;AAC/F,QAAM,QAAQ,WAAWC,YAAW,MAAM,IAAI;AAC9C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aACJ,MAAM,eAAe,cAAcA,eAAc,MAC7C,CAAC,KAAK,IACN,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,WAAW,KAAK,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,MAAmB,MAAM,IAAI,CAAC,CAAC;AAC9F,SAAO;AAAA,IACL,OACE,MAAM,eAAe,aACjB,kBACAA,eAAc,MACZ,eACA;AAAA,IACR,WAAAA;AAAA,IACA;AAAA,EACF;AACF;AAGA,eAAsB,WAAW,MAAc,MAAgC;AAC7E,MAAI;AACF,UAAMF,IAAG,OAAO,MAAM,eAAe,MAAM,IAAI,CAAC;AAChD,WAAO;AAAA,EACT,SAAS,OAAO;AAGd,QAAI,CAAC,UAAU,SAAS,EAAE,SAAU,MAAgC,QAAQ,EAAE,EAAG,QAAO;AACxF,UAAM;AAAA,EACR;AACF;AAEO,SAAS,gBAAgB,MAAuB;AACrD,SAAO,KAAK,MAAM,GAAG,EAAE,SAAS,MAAM;AACxC;AAEO,SAAS,kBAAkB,MAAuB;AACvD,SAAO,KAAK,MAAM,GAAG,EAAE,SAAS,QAAQ;AAC1C;AArDA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACFA,OAAOG,SAAQ;AACf,OAAOC,YAAU;AA8DjB,SAAS,aAAa,QAA8B;AAClD,QAAM,SAAS,OAAO,MAAM,IAAI;AAChC,QAAM,UAAwB,CAAC;AAC/B,WAAS,IAAI,GAAG,IAAI,OAAO,UAAU,OAAO,CAAC,KAAI;AAC/C,UAAM,OAAO,OAAO,GAAG;AACvB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,CAAC,MAAO;AACZ,UAAM,SAAS,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG,IAAI;AAClD,UAAM,SAAqB,SACvB,KAAK,WAAW,GAAG,IACjB,EAAE,QAAQ,WAAW,MAAM,QAAQ,cAAc,MAAM,IACvD,EAAE,QAAQ,SAAS,MAAM,OAAO,IAClC,EAAE,QAAQ,SAAS,MAAM,UAAU,SAAS,MAAM,YAAY,YAAY,MAAM,MAAM;AAC1F,QACE,OAAO,KAAK,WAAW,SAAS,MAC/B,CAAC,OAAO,gBAAgB,OAAO,aAAa,WAAW,SAAS;AAEjE;AACF,YAAQ,KAAK,MAAM;AAAA,EACrB;AACA,SAAO;AACT;AAEO,SAAS,aAAa,SAAiC;AAC5D,SAAO;AAAA,IACL,GAAG,IAAI,IAAI,QAAQ,QAAQ,CAAC,MAAO,EAAE,eAAe,CAAC,EAAE,cAAc,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,CAAE,CAAC;AAAA,EAC3F,EAAE,KAAK;AACT;AAEA,eAAsB,qBACpB,cACA,UACA,SAAS,QACqB;AAC9B,MACE,CAAC,YACD,aAAa,aACb,SAAS,WAAW,GAAG,KACvB,CAAC,UACD,WAAW,aACX,OAAO,WAAW,GAAG;AAErB,WAAO;AACT,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB,CAAC,QAAQ,iBAAiB,MAAM,MAAM,UAAU,QAAQ,IAAI;AAAA,MAC5D,EAAE,KAAK,cAAc,WAAW,KAAK,OAAO,KAAK;AAAA,IACnD;AACA,WAAO,aAAa,MAAM;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,eAAe,cAAkD;AACrF,MAAI;AACF,UAAM,CAAC,MAAM,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC1C,QAAQ,CAAC,QAAQ,iBAAiB,MAAM,MAAM,QAAQ,IAAI,GAAG;AAAA,QAC3D,KAAK;AAAA,QACL,WAAW,KAAK,OAAO;AAAA,MACzB,CAAC;AAAA,MACD,QAAQ,CAAC,YAAY,MAAM,YAAY,oBAAoB,GAAG;AAAA,QAC5D,KAAK;AAAA,QACL,WAAW,KAAK,OAAO;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AACD,UAAM,iBAAiB,UAAU,OAC9B,MAAM,IAAI,EACV,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,WAAW,SAAS,CAAC;AAC9C,WAAO;AAAA,MACL,WAAW;AAAA,MACX,cAAc;AAAA,QACZ,GAAG,oBAAI,IAAI,CAAC,GAAG,aAAa,aAAa,KAAK,MAAM,CAAC,GAAG,GAAG,cAAc,CAAC;AAAA,MAC5E,EAAE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,WAAW,OAAO,cAAc,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,EAClE;AACF;AA/IA;AAAA;AAAA;AAAA;AAGA;AAGA;AAAA;AAAA;;;ACNA,OAAOC,YAAU;AAQjB,eAAsB,uBAAuB,KAAyC;AACpF,QAAM,SAAS,YAAY;AAC3B,aAAW,OAAO,IAAI,MAAM;AAC1B,UAAM,UAAU,IAAI,gBAAgB,IAAI,IAAI,IAAI;AAChD,UAAM,UAAU,IAAI;AAAA,OACjB,WAAW,CAAC,GACV,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,YAAY,EACtD,IAAI,CAAC,MAAM,CAAC,EAAE,cAAe,EAAE,IAAI,CAAC;AAAA,IACzC;AACA,eAAW,SAAS,IAAI,OAAO,OAAO;AACpC,YAAM,QAAQ,eAAe,IAAI,MAAM,KAAK;AAC5C,UAAI,CAAC,OAAO;AACV,eAAO,QAAQ,KAAK;AAAA,UAClB,OAAO;AAAA,UACP,KAAK,IAAI;AAAA,UACT,QAAQ,aAAa,MAAM,OAAO;AAAA,QACpC,CAAC;AACD;AAAA,MACF;AACA,UAAI,MAAM,WAAW,KAAK,iBAAiB,EAAG;AAC9C,UAAI,MAAM,WAAW,KAAK,eAAe,GAAG;AAC1C,eAAO,QAAQ,KAAK;AAAA,UAClB,OAAO;AAAA,UACP,KAAK,IAAI;AAAA,UACT,QAAQ,aAAa,MAAM,IAAI;AAAA,QACjC,CAAC;AACD;AAAA,MACF;AACA,WACG,MAAM,QAAQ,IAAI,MAAM,WAAW,IAAI,CAAC,SAAS,WAAW,IAAI,MAAM,IAAI,CAAC,CAAC,GAAG;AAAA,QAC9E;AAAA,MACF;AAEA;AAEF,YAAM,aAAa,MAAM,QAAQ;AAAA,QAC/B,MAAM,WAAW,IAAI,OAAO,UAAU;AAAA,UACpC;AAAA,UACA,SAAS,MAAM,aAAa,IAAI,MAAM,IAAI;AAAA,UAC1C,QAAQ,MAAM,WAAW,IAAI,MAAMA,OAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,QAC7D,EAAE;AAAA,MACJ;AACA,YAAM,YACJ,WAAW,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,IAAI,EAAE,IAAI,CAAC,KACvD,WAAW,KAAK,CAAC,MAAM,EAAE,MAAM;AAEjC,UAAI,CAAC,aAAa,MAAM,eAAe,WAAY;AACnD,YAAM,eAAe,WAAW,QAAQ,MAAM,WAAW,CAAC;AAC1D,YAAM,YAAY,QAAQ,IAAI,YAAY,KAAK;AAC/C,YAAM,kBACJ,WAAW,WAAW,CAAC,YAAY,MAAM,iBAAiB,IAAI,MAAM,YAAY,IAAI;AACtF,YAAM,WAAqB;AAAA,QACzB,MAAM;AAAA,QACN,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,CAAC,CAAC,WAAW,WAAW,CAAC,CAAC;AAAA,QACvC,iBAAiB,WAAW,UAAU;AAAA,MACxC;AACA,YAAM,SAAS,EAAE,KAAK,IAAI,MAAM,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ;AACzE,YAAM,UAAU,YACZ,KAAK,YAAY,uBAAuB,SAAS,OACjD,KAAK,YAAY,uBAChB,kBACG,sBAAiB,gBAAgB,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,gBAAgB,OAAO,MAAM,gBAAgB,KAAK,MAAM,GAAG,EAAE,CAAC,MACpH;AACR,UAAI,MAAM,UAAU,eAAe,aAAa,WAAW,UAAU;AACnE,eAAO,OAAO,KAAK;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,eAAO,WAAW,KAAK;AAAA,UACrB,YAAY;AAAA,UACZ,MAAM;AAAA,UACN,SACE,WACC,MAAM,UAAU,aACb,8DACA;AAAA,UACN;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AApGA;AAAA;AAAA;AACA;AACA;AAGA;AAAA;AAAA;;;ACJA,OAAOC,SAAQ;AACf,OAAOC,UAAQ;AACf,OAAOC,YAAU;AAoCjB,SAAS,aAAaC,OAAsB;AAC1C,SAAOA,MAAK,QAAQ,uBAAuB,MAAM;AACnD;AAOA,SAAS,YAAY,cAAsB,MAAuB;AAChE,QAAM,KAAK,IAAI,OAAO,qBAAqB,aAAa,IAAI,CAAC,wBAAwB,IAAI;AACzF,SAAO,GAAG,KAAK,YAAY;AAC7B;AAEA,eAAsB,gBAAgB,KAAyC;AAC7E,QAAM,SAAS,YAAY;AAC3B,MAAI,IAAI,KAAK,WAAW,EAAG,QAAO;AAElC,QAAM,eAAe,oBAAoB,IAAI,IAAI;AACjD,QAAM,aAAa,IAAI,KAAK,CAAC,EAAE;AAC/B,QAAM,cAAc,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI;AAE9C,QAAM,OAAO,OAAO,KAAa,oBAA2C;AAC1E,WAAO,WAAW,KAAK;AAAA,MACrB,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,eAAe,GAAG,gBAAgB,eAAe,eAAe,oBAAoB,IAAI,KAAK,GAAG;AAAA,MACzG,QAAQ,EAAE,KAAK,YAAY,MAAM,MAAM,SAAS,IAAI;AAAA,MACpD,UAAU;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,aAAa,MAAM,cAAc,IAAI,MAAM,GAAG;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,aAAa,MAAM,iBAAiB,IAAI,MAAM,YAAY,GAAG;AACtE,UAAM,KAAK,UAAU,KAAK,UAAU,eAAe;AAAA,EACrD;AAEA,SAAO;AACT;AAIO,SAAS,oBAAoB,MAAwD;AAC1F,SAAO,KACJ;AAAA,IACC,CAAC,QACC,IAAI,UACJ,QACCD,OAAK,MAAM,QAAQ,IAAI,IAAI,MAAM,MAAM,KAAKA,OAAK,MAAM,QAAQ,IAAI,IAAI,IAAI;AAAA,EAChF,EACC,KAAK,IAAI;AACd;AAGO,SAAS,iBAAiB,MAAc,cAAsB;AACnE,SAAO;AAAA,IAAe;AAAA,IAAM,aAAa;AAAA,IAAc,MACrD,wBAAwB,MAAM,YAAY;AAAA,EAC5C;AACF;AAEA,eAAe,wBAAwB,MAAc,cAAsB;AACzE,QAAM,CAAC,QAAQ,WAAW,IAAI,MAAM,QAAQ,IAAI,CAAC,kBAAkB,IAAI,GAAG,eAAe,IAAI,CAAC,CAAC;AAC/F,QAAM,SAAS,CAAC,GAAG,eAAe,GAAI,OAAO,UAAU,CAAC,CAAE;AAC1D,QAAM,UAAU,YAAY;AAAA,IAC1B,CAAC,SAAS,CAAC,KAAK,MAAM,GAAG,EAAE,KAAK,CAAC,SAAS,KAAK,WAAW,GAAG,CAAC;AAAA,EAChE;AACA,QAAM,cAAc,OAAO,YAAsD;AAC/E,UAAM,WAAW,oBAAI,IAAsB;AAE3C,aAAS,SAAS,GAAG,SAAS,QAAQ,QAAQ,UAAU,IAAI;AAC1D,YAAM,QAAQ;AAAA,QACZ,QAAQ,MAAM,QAAQ,SAAS,EAAE,EAAE,IAAI,OAAO,QAAQ;AACpD,gBAAM,UAAU,MAAMD,KAAG,QAAQ,MAAM,eAAe,MAAM,GAAG,GAAG;AAAA,YAChE,eAAe;AAAA,UACjB,CAAC;AAGD,gBAAM,OAAO,QACV;AAAA,YACC,CAAC,WACE,MAAM,YAAY,KAChB,MAAM,eAAe,KACpB,QAAQ;AAAA,cAAK,CAAC,SACZ,KAAK,WAAWC,OAAK,MAAM,KAAK,KAAK,MAAM,IAAI,IAAI,GAAG;AAAA,YACxD,MACJ,CAAC,MAAM,KAAK,WAAW,GAAG,KAC1B,CAAC,aAAa,IAAI,MAAM,IAAI;AAAA,UAChC,EACC,IAAI,CAAC,UAAUA,OAAK,MAAM,KAAK,KAAK,MAAM,IAAI,CAAC;AAClD,mBAAS,IAAI,KAAK,IAAI;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,UAAU,MAAM,gBAAgB,MAAM,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,CAAC;AACzE,UAAM,SAAS,oBAAI,IAAsB;AACzC,eAAW,OAAO,SAAS;AAEzB,YAAM,UAAU,IAAI;AAAA,QAClB,SACG,IAAI,GAAG,EACP;AAAA,UACC,CAAC,cACC,CAAC,QAAQ,IAAI,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,KAAK,WAAW,YAAY,GAAG,CAAC;AAAA,QACtF;AAAA,MACJ;AACA,aAAO;AAAA,QACL;AAAA,SAEE,MAAM,UAAU,MAAM,QAAQ,MAAM,MAAM,GAAGF,IAAG,WAAW,GAAG,CAAC,MAAM;AAAA,UACnE;AAAA,UACA,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ,CAAC,SAAS,QAAQ,IAAI,IAAI;AAAA,QACpC,CAAC,GACD,IAAI,CAAC,SAASE,OAAK,MAAM,SAAS,IAAI,CAAC;AAAA,MAC3C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,mBAAmB,OAAO,QAAiC;AAC/D,UAAM,QAAQ,QAAQ,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM,GAAG,CAAC;AACjE,QAAIE,SAAQ;AAGZ,aAAS,SAAS,GAAG,SAAS,MAAM,QAAQ,UAAU,KAAK;AACzD,MAAAA,WACE,MAAM;AAAA,QACJ;AAAA,QACA,MAAM,MAAM,QAAQ,SAAS,GAAG,EAAE,IAAI,CAAC,SAASJ,IAAG,WAAW,IAAI,CAAC;AAAA,QACnE;AAAA,UACE;AAAA,UACA,qBAAqB;AAAA,UACrB,OAAO,uBAAuB,GAAG;AAAA,QACnC;AAAA,MACF,GACA;AACF,UAAII,SAAQ;AACV,cAAM,IAAI;AAAA,UACR,uBAAuB,GAAG;AAAA,QAC5B;AAAA,IACJ;AACA,WAAOA;AAAA,EACT;AACA,QAAM,aAA8D,CAAC;AACrE,QAAM,WAAW,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG;AAClD,QAAM,SAAS,MAAM,YAAY,QAAQ,OAAO,CAAC,QAAQ,YAAY,cAAc,GAAG,CAAC,CAAC;AACxF,aAAW,UAAU,SAAS;AAC5B,UAAM,eAAe,YAAY,cAAc,MAAM;AAErD,QAAI,CAAC,cAAc;AACjB,YAAMA,SAAQ,MAAM,iBAAiB,MAAM;AAC3C,UAAIA,UAAS,EAAG,YAAW,KAAK,EAAE,KAAK,QAAQ,iBAAiBA,OAAM,CAAC;AACvE;AAAA,IACF;AAKA,UAAM,UAAU,OAAO,IAAI,MAAM;AACjC,UAAM,YAAY,QAAQ,OAAO,CAAC,MAAM,YAAY,cAAc,CAAC,CAAC;AACpE,QAAI,UAAU,SAAS,sBAAuB;AAE9C,eAAW,OAAO,SAAS;AACzB,UAAI,YAAY,cAAc,GAAG,EAAG;AACpC,YAAMA,SAAQ,MAAM,iBAAiB,GAAG,MAAM,IAAI,GAAG,EAAE;AACvD,UAAIA,UAAS,+BAA+B;AAC1C,mBAAW,KAAK,EAAE,KAAK,GAAG,MAAM,IAAI,GAAG,IAAI,iBAAiBA,OAAM,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAxNA,IAWM,cAqBA,+BAKA;AArCN;AAAA;AAAA;AAAA;AAIA;AACA;AACA;AAEA;AAGA,IAAM,eAAe,oBAAI,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,IAAM,gCAAgC;AAKtC,IAAM,wBAAwB;AAAA;AAAA;;;ACpC9B,OAAOC,YAAU;AAejB,eAAe,mBAAmB,MAA2C;AAC3E,aAAW,QAAQ,CAAC,uBAAuB,iBAAiB,GAAG;AAC7D,UAAMC,WAAU,MAAM,eAAe,MAAM,IAAI;AAC/C,QAAIA,aAAY,KAAM;AAEtB,UAAM,UAAoB,CAAC;AAC3B,eAAW,QAAQA,SAAQ,SAAS,wBAAwB,GAAG;AAC7D,iBAAW,QAAQ,KAAK,CAAC,EAAE,SAAS,mBAAmB,GAAG;AACxD,gBAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,MACtB;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,WAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAa,MAAM,QAAQ;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,eAAe,mBAAmB,MAA2C;AAC3E,QAAM,SAAS,MAAM,eAAe,MAAM,cAAc;AACxD,MAAI,WAAW,MAAM;AACnB,QAAI,QAAkB,CAAC;AACvB,QAAI;AACF,YAAM,MAAe,KAAK,MAAM,MAAM;AACtC,UAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,YAAM,aAAa,SAAS,IAAI,UAAU,IAAI,IAAI,WAAW,WAAW,IAAI;AAE5E,UAAI,eAAe,UAAa,CAAC,cAAc,UAAU,EAAG,QAAO;AACnE,cAAQ,cAAc,CAAC;AAAA,IACzB,QAAQ;AAAA,IAER;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,QAAQ,EAAE,CAAC,eAAe;AAAA,QACxD,EAAE,QAAQ,CAAC,oBAAoB,GAAG,OAAO,0BAA0B;AAAA,MACrE;AACA,aAAO;AAAA,QACL,QAAQ,QAAQ;AAAA,QAChB,aAAa;AAAA,QACb,SAAS,QAAQ,IAAI,CAAC,MAAMD,OAAK,QAAQ,CAAC,CAAC,EAAE,KAAK;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,eAAe,MAAM,qBAAqB;AAChE,MAAI,YAAY,MAAM;AACpB,UAAM,QAAkB,CAAC;AACzB,QAAI,aAAa;AACjB,eAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAI,gBAAgB,KAAK,IAAI,GAAG;AAC9B,qBAAa;AACb;AAAA,MACF;AACA,UAAI,YAAY;AACd,cAAM,QAAQ,KAAK,MAAM,0BAA0B;AACnD,YAAI,OAAO;AACT,cAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,EAAG,OAAM,KAAK,MAAM,CAAC,CAAC;AAAA,QACpD,WAAW,KAAK,KAAK,EAAE,SAAS,KAAK,CAAC,KAAK,WAAW,GAAG,GAAG;AAC1D,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,QAAQ,EAAE,CAAC,eAAe;AAAA,QACxD,EAAE,QAAQ,CAAC,oBAAoB,GAAG,OAAO,2BAA2B;AAAA,MACtE;AACA,aAAO;AAAA,QACL,QAAQ,QAAQ;AAAA,QAChB,aAAa;AAAA,QACb,SAAS,QAAQ,IAAI,CAAC,MAAMA,OAAK,QAAQ,CAAC,CAAC,EAAE,KAAK;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,iBAAiB,MAA2C;AACzE,QAAMC,WAAU,MAAM,eAAe,MAAM,YAAY;AACvD,MAAIA,aAAY,KAAM,QAAO;AAC7B,QAAM,eAAeA,SAAQ,MAAM,8BAA8B;AACjE,MAAI,CAAC,aAAc,QAAO;AAC1B,QAAM,UAAU,CAAC,GAAG,aAAa,CAAC,EAAE,SAAS,mBAAmB,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAClF,MAAI,QAAQ,WAAW,EAAG,QAAO;AAIjC,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,SAAS,SAAS;AAC3B,QAAI,YAAY,KAAK,KAAK,GAAG;AAC3B,YAAM,UAAU,MAAM,UAAU,MAAM,GAAG,MAAM,QAAQ,QAAQ,EAAE,CAAC,eAAe;AAAA,QAC/E,QAAQ,CAAC,cAAc;AAAA,QACvB,OAAO;AAAA,MACT,CAAC;AACD,iBAAW,KAAK,QAAS,SAAQ,IAAID,OAAK,QAAQ,CAAC,CAAC;AAAA,IACtD,WAAY,MAAM,eAAe,MAAMA,OAAK,MAAM,KAAK,OAAO,YAAY,CAAC,MAAO,MAAM;AACtF,cAAQ,IAAI,KAAK;AAAA,IACnB;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,EAAG,QAAO;AAC/B,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,aAAa;AAAA,IACb,SAAS,CAAC,GAAG,OAAO,EAAE,KAAK;AAAA,EAC7B;AACF;AAOA,eAAsB,mBACpB,MACA,OAC6B;AAC7B,QAAM,OAAO,MAAM,KAAK,QAAQ,MAAM,EAAE;AACxC,MAAI,SAAS,SAAU,QAAO,mBAAmB,IAAI;AACrD,MAAI,SAAS,YAAa,QAAO,mBAAmB,IAAI;AACxD,MAAI,SAAS,QAAS,QAAO,iBAAiB,IAAI;AAElD,SACG,MAAM,mBAAmB,IAAI,KAC7B,MAAM,iBAAiB,IAAI,KAC3B,MAAM,mBAAmB,IAAI;AAElC;AAGA,eAAsB,sBACpB,MACA,KACA,OAC6B;AAC7B,QAAM,QAAQ,cAAc,GAAG;AAC/B,QAAM,SAAS,MAAM,mBAAmBA,OAAK,KAAK,MAAM,KAAK,GAAG,KAAK;AACrE,MAAI,CAAC,UAAU,UAAU,IAAK,QAAO;AACrC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,QAAQ,MAAM,OAAO;AAAA,IAClC,SAAS,OAAO,QAAQ,IAAI,CAAC,WAAW,QAAQ,MAAM,MAAM;AAAA,EAC9D;AACF;AAEA,eAAsB,iBAAiB,KAAyC;AAC9E,QAAM,SAAS,YAAY;AAE3B,aAAW,OAAO,IAAI,MAAM;AAC1B,eAAW,SAAS,IAAI,OAAO,QAAQ;AACrC,YAAM,SAAS,MAAM,sBAAsB,IAAI,MAAM,IAAI,MAAM,KAAK;AACpE,UAAI,WAAW,MAAM;AACnB,eAAO,QAAQ,KAAK;AAAA,UAClB,OAAO;AAAA,UACP,KAAK,IAAI;AAAA,UACT,QAAQ,GAAG,IAAI,IAAI,8CAA8C,MAAM,OAAO;AAAA,QAChF,CAAC;AACD;AAAA,MACF;AACA,UAAI,OAAO,WAAW,MAAM,MAAO;AACnC,aAAO,OAAO,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,SAAS,SAAS,MAAM,OAAO,SAAS,OAAO,WAAW,gBAAgB,OAAO,MAAM;AAAA,QACvF,QAAQ,EAAE,KAAK,IAAI,MAAM,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ;AAAA,QAClE,YAAY;AAAA,QACZ,UAAU;AAAA,UACR,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,UACf,QAAQ,OAAO;AAAA,UACf,MAAM,MAAM;AAAA,UACZ,aAAa,OAAO;AAAA,UACpB,SAAS,OAAO,QAAQ,MAAM,GAAG,WAAW;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAnMA,IAQM;AARN;AAAA;AAAA;AAAA;AAEA;AACA;AAGA;AAEA,IAAM,cAAc;AAAA;AAAA;;;ACPpB,OAAOE,YAAU;AASjB,SAAS,UAAU,KAA8B;AAC/C,MAAI;AACF,UAAM,MAAe,KAAK,MAAM,GAAG;AACnC,QAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,QAAI,IAAI,YAAY,OAAW,QAAO,CAAC;AACvC,WAAO,SAAS,IAAI,OAAO,KACzB,OAAO,OAAO,IAAI,OAAO,EAAE,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,IACnE,OAAO,KAAK,IAAI,OAAO,IACvB;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaA,eAAsB,cACpB,MACA,MACA;AACA,QAAM,WAAW,oBAAI,IAA2B;AAChD,QAAM,OAAO,OAAO,SAAiB;AACnC,QAAI,CAAC,SAAS,IAAI,IAAI,EAAG,UAAS,IAAI,MAAM,MAAM,eAAe,MAAM,IAAI,CAAC;AAC5E,WAAO,SAAS,IAAI,IAAI;AAAA,EAC1B;AACA,QAAM,KAAK,cAAc;AACzB,MAAI;AACJ,QAAM,cAA4B,CAAC;AACnC,aAAW,OAAO;AAChB,eAAW,SAAS,IAAI,OAAO,UAAU;AACvC,YAAM,OAAO,cAAc,IAAI,IAAI;AACnC,YAAMC,aAAY,WAAW,MAAM,MAAM,aAAa,GAAG;AACzD,YAAM,QAAoB;AAAA,QACxB,OAAO,MAAM,cAAc,SAAY,aAAa;AAAA,QACpD,WAAWA,cAAa;AAAA,QACxB,YAAY,CAAC;AAAA,MACf;AACA,YAAM,aAAyB;AAAA,QAC7B,KAAK,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,QACV,WAAW,CAAC;AAAA,MACd;AACA,kBAAY,KAAK,UAAU;AAC3B,UAAI,MAAM,gBAAgBA,eAAc,MAAM;AAC5C,mBAAW,UAAU,MAAM,gBAAgB;AAC3C;AAAA,MACF;AACA,UAAI,SAASA;AACb,aAAO,MAAM;AACX,cAAM,WAAWD,OAAK,MAAM,KAAK,QAAQ,cAAc;AACvD,cAAM,WAAW,KAAK,QAAQ;AAC9B,cAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,YAAI,QAAQ,MAAM;AAChB,qBAAW,WAAW;AACtB,gBAAM,UAAU,UAAU,GAAG;AAC7B,cAAI,YAAY,KAAM,YAAW,UAAU,+BAA+B;AAAA,cACrE,YAAW,UAAU;AAC1B;AAAA,QACF;AAEA,YAAI,MAAM,cAAc,UAAa,WAAW,IAAK;AACrD,iBAASA,OAAK,MAAM,QAAQ,MAAM;AAAA,MACpC;AACA,UAAI,CAAC,WAAW,YAAY,CAAC,WAAW,SAAS;AAC/C,mBAAW,UAAU,4CAA4CC,UAAS;AAAA,MAC5E;AACA,UACE,WAAW,WACX,WAAW,QAAQ,SAAS,MAAM,UAAU,KAC5C,MAAM,cAAc;AAEpB;AACF,oBAAc,MAAM,iBAAiB,IAAI;AACzC,iBAAW,YAAY,CAAC,GAAG,oBAAI,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG;AAC1E,YAAI,MAAM,WAAW,SAAS,QAAQ,EAAG;AACzC,cAAM,WAAW,KAAK,QAAQ;AAC9B,cAAM,MAAM,MAAM,KAAK,QAAQ;AAC/B,YAAI,QAAQ,KAAM;AAClB,cAAM,UAAU,UAAU,GAAG;AAC7B,YAAI,YAAY;AACd,qBAAW,UAAU,4DAA4D;AAAA,iBAC1E,QAAQ,SAAS,MAAM,UAAU,EAAG,YAAW,UAAU,KAAK,QAAQ;AAAA,MACjF;AAAA,IACF;AACF,SAAO,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG,YAAY;AACxF;AAEA,eAAsB,kBAAkB,KAAyC;AAC/E,QAAM,SAAS,YAAY;AAC3B,QAAM,EAAE,YAAY,IAAI,MAAM,cAAc,IAAI,MAAM,IAAI,IAAI;AAC9D,aAAW,EAAE,KAAK,OAAO,OAAO,SAAS,WAAW,SAAS,SAAS,KAAK,aAAa;AACtF,QAAI,SAAS;AACX,aAAO,QAAQ,KAAK,EAAE,OAAO,gBAAgB,KAAK,QAAQ,QAAQ,CAAC;AACnE;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,MAAM,UAAU,EAAG;AACxC,UAAM,WAAW;AAAA,MACf,MAAM;AAAA,MACN,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,kBAAkB,MAAM;AAAA,MACxB,kBAAkB,QAAQ,MAAM,GAAG,qBAAqB;AAAA,MACxD;AAAA,IACF;AACA,UAAM,SAAS,EAAE,KAAK,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ;AAC/D,UAAM,UAAU,KAAK,MAAM,UAAU,oBAAoB,MAAM,UAAU,2BAA2B,QAAQ;AAE5G,UAAM,UAAU,cAAc,GAAG,MAAM,QAAQ,MAAM,UAAU,cAAc,CAAC,UAAU;AACxF,QAAI;AACF,aAAO,OAAO,KAAK;AAAA,QACjB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACF,CAAC;AAAA;AAED,aAAO,WAAW,KAAK;AAAA,QACrB,YAAY;AAAA,QACZ,MAAM;AAAA,QACN,SACE,WACC,UAAU,SACP,kBAAkB,UAAU,KAAK,IAAI,CAAC,8CACtC;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,EACL;AACA,SAAO;AACT;AAGO,SAAS,iBAAiB,MAAiC;AAChE,SAAO,UAAU,MAAM,mBAAmB;AAAA,IACxC,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AACH;AAtKA,IASM;AATN;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AAGA;AAEA,IAAM,wBAAwB;AAAA;AAAA;;;ACR9B,OAAOC,YAAU;AACjB,SAAS,SAAS,iBAAiB;AAa5B,SAAS,eAAeC,UAAyB;AACtD,SAAOA,SACJ;AAAA,IAAQ;AAAA,IAAmD,CAACC,UAC3DA,MAAK,QAAQ,UAAU,GAAG;AAAA,EAC5B,EACC,QAAQ,oBAAoB,CAACA,UAASA,MAAK,QAAQ,UAAU,GAAG,CAAC;AACtE;AAGA,SAAS,aAAa,MAAc,QAAqC;AACvE,QAAM,SAAS,oBAAI,IAAoB;AACvC,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAIF,OAAK,MAAM,SAAS,IAAI,MAAM,gBAAgB;AAChD,UAAMG,QAAgB,KAAK,MAAM,MAAM;AACvC,QAAI,CAAC,SAASA,KAAI,EAAG,OAAM,IAAI,MAAM,0BAA0B;AAC/D,eAAW,WAAW;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAAG;AACD,YAAM,UAAUA,MAAK,OAAO;AAC5B,UAAI,YAAY,OAAW;AAC3B,UAAI,CAAC,SAAS,OAAO,KAAK,CAAC,OAAO,OAAO,OAAO,EAAE,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ;AAC1F,cAAM,IAAI,MAAM,sCAAsC,OAAO;AAC/D,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,YAAI,OAAO,UAAU;AACnB,iBAAO,IAAI,MAAM,CAAC,GAAI,OAAO,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAI,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,MACxF;AAAA,IACF;AAAA,EACF,WAAW,KAAK,SAAS,oBAAoB,GAAG;AAC9C,UAAM,UAAU,UAAU,MAAM;AAChC,UAAM,WAAW,QAAQ;AACzB,eAAW,WAAW,CAAC,aAAa,SAAS,GAAG;AAC9C,YAAM,UAAU,QAAQ,OAAO;AAC/B,UAAI,YAAY,OAAW;AAC3B,UAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,MAAM,8BAA8B,OAAO;AAC7E,iBAAW,SAAS,OAAO,OAAO,OAAO,GAAG;AAC1C,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,cAAI,MAAM,UAAU,EAAG,QAAO,IAAI,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,GAAG,MAAM,GAAG,EAAE,CAAE;AAAA,QAC/E,WAAW,SAAS,KAAK,GAAG;AAC1B,gBAAM,OACJ,MAAM,WACL,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,SAAS,WACtD,GAAG,MAAM,KAAK,IAAI,MAAM,IAAI,KAC5B,MAAM;AACZ,gBAAM,UACJ,OAAO,MAAM,YAAY,WACrB,MAAM,UACN,SAAS,MAAM,OAAO,KACpB,OAAO,MAAM,QAAQ,QAAQ,YAC7B,SAAS,QAAQ,IACjB,SAAS,MAAM,QAAQ,GAAG,IAC1B;AACR,cAAI,OAAO,SAAS;AAClB,mBAAO,IAAI,MAAM,OAAO,YAAY,WAAW,UAAU,aAAa;AAAA,cACnE,OAAM,IAAI,MAAM,+BAA+B;AAAA,QACtD,MAAO,OAAM,IAAI,MAAM,+BAA+B;AAAA,MACxD;AAAA,IACF;AAAA,EACF,WAAW,2BAA2B,KAAK,IAAI,GAAG;AAChD,eAAW,SAAS,OAAO,SAAS,uCAAuC;AACzE,aAAO,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAC/B,eAAW,SAAS,OAAO;AAAA,MACzB;AAAA,IACF;AACE,aAAO,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,EACjC;AACA,SAAO;AACT;AAEA,eAAsB,uBACpB,MACA,MACA,MACA,OACAF,UACA;AACA,QAAM,UAA6B,CAAC;AACpC,QAAM,QAAQ,eAAeA,QAAO,EAAE,MAAM,IAAI;AAChD,MAAI,aAAa,MAAM,SAAS;AAChC,aAAW,QAAQ,MAAM,MAAM,GAAG,EAAE,GAAG;AACrC,QAAI,CAAC,0EAA0E,KAAK,IAAI,GAAG;AACzF,mBAAa;AACb;AAAA,IACF;AACA,QAAI;AACF,YAAM,OAAO,OAAO,aAAqB;AAEvC,cAAM,EAAE,QAAQ,MAAM,IAAI,MAAM;AAAA,UAC9B,CAAC,WAAW,UAAU,MAAM,aAAa,IAAI,EAAE;AAAA,UAC/C,EAAE,KAAK,MAAM,SAAS,IAAM;AAAA,QAC9B;AACA,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI,CAAC,MAAM,WAAW,SAAS,KAAK,CAAC,MAAM,WAAW,SAAS;AAC7D,gBAAM,IAAI,MAAM,2BAA2B;AAC7C,gBACE,MAAM,cAAc,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,EAAE,GAAG;AAAA,UACnD,KAAK;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,SAAS;AAAA,QACX,CAAC,GACD;AAAA,MACJ;AACA,YAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;AAClE,YAAM,MAAM,aAAa,MAAM,MAAM,GACnC,OAAO,aAAa,MAAM,KAAK;AACjC,iBAAW,cAAc,oBAAI,IAAI,CAAC,GAAG,IAAI,KAAK,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,GAAG;AACjE,YAAI,IAAI,IAAI,UAAU,MAAM,KAAK,IAAI,UAAU,EAAG;AAClD,cAAM,UAAU,WAAW,QAAQ,uBAAuB,MAAM;AAChE,cAAM,UAAU,IAAI;AAAA,UAClB,wBAAwB,OAAO;AAAA,UAC/B;AAAA,QACF;AACA,cAAM,OAAO,MAAM,UAAU,CAACC,UAAS,QAAQ,KAAKA,KAAI,CAAC;AACzD,YAAI,OAAO,EAAG;AACd,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,UAAU;AAAA,UACV,QAAQ,IAAI,IAAI,UAAU,KAAK;AAAA,UAC/B,OAAO,KAAK,IAAI,UAAU,KAAK;AAAA,UAC/B,MAAM,OAAO;AAAA,UACb,SAAS,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG;AAAA,QAC1C,CAAC;AACD,YAAI,QAAQ,UAAU,IAAK,QAAO,EAAE,SAAS,YAAY,KAAK;AAAA,MAChE;AAAA,IACF,QAAQ;AACN,mBAAa;AAAA,IACf;AAAA,EACF;AACA,SAAO,EAAE,SAAS,WAAW;AAC/B;AApJA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;;;ACAA,eAAe,IAAI,MAAcE,OAAgB;AAC/C,UAAQ,MAAM,QAAQA,OAAM,EAAE,KAAK,MAAM,SAAS,KAAO,WAAW,IAAI,OAAO,KAAK,CAAC,GAAG;AAC1F;AAGA,SAAS,4BAA4BC,OAA6B;AAChE,MACE,eAAe,KAAKA,KAAI,KACxB,CAAC,yDAAyD,KAAKA,KAAI;AAEnE,WAAO;AACT,QAAMC,UAAmB,CAAC;AAC1B,QAAM,aAAuB,CAAC;AAC9B,MAAI,cAAc;AAClB,aAAW,QAAQD,MAAK,MAAM,IAAI,GAAG;AAEnC,UAAM,OAAO,KAAK;AAAA,MAAQ;AAAA,MAAgD,CAAC,UACzE,MAAM,WAAW,IAAI,IAAI,KAAK;AAAA,IAChC;AACA,UAAM,aAAa,KAAK;AAAA,MACtB;AAAA,IACF;AACA,QACE,cACAC,QAAO,KAAK,GAAG,MAAM,4BACpB,WAAW,CAAC,MAAM,gBAAgB,QAAQ,KAAK,WAAW,CAAC,CAAC,IAAI,QAAQ,KAAK,WAAW,CAAC,CAAC,IAC3F;AACA,iBAAW;AAAA,QACT,WAAW,CAAC,IAAI,WAAW,CAAC,IAAI,WAAW,CAAC,IAAI,oBAAoB,WAAW,CAAC;AAAA,MAClF;AACA;AAAA,IACF,OAAO;AAEL,UAAI,2BAA2B,KAAK,IAAI,EAAG,QAAO;AAClD,iBAAW,KAAK,IAAI;AAAA,IACtB;AACA,UAAM,QAAQ,KAAK,MAAM,sCAAsC,IAAI,CAAC;AACpE,eAAW,SAAS,KAAK,SAAS,OAAO,GAAG;AAC1C,UAAI,MAAM,CAAC,MAAM,IAAK,CAAAA,QAAO,KAAK,SAAS,SAAS;AAAA,eAC3C,CAACA,QAAO,OAAQ,QAAO;AAAA,UAC3B,CAAAA,QAAO,IAAI;AAAA,IAClB;AAAA,EACF;AACA,SAAO,eAAe,CAACA,QAAO,SAAS,WAAW,KAAK,IAAI,IAAI;AACjE;AAGA,eAAsB,oBACpB,MACA,QACkB;AAClB,MACE,CAAC,OAAO,MAAM,UACd,CAAC,OAAO,MAAM,MAAM,CAAC,SAAS,iCAAiC,KAAK,IAAI,CAAC;AAEzE,WAAO;AACT,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,MAAM,CAAC,YAAY,aAAa,MAAM,KAAK,OAAO,IAAI,CAAC,GAC/E,KAAK,EACL,MAAM,KAAK;AACd,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,MAAM,MAAM,IAAI,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,CAAC;AAAA,QACT,OAAO;AAAA,QACP;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,CAAC,+CAA+C,KAAK,GAAG,EAAG,QAAO;AACtE,YAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,QACxC,IAAI,MAAM,CAAC,QAAQ,QAAQ,CAAC,IAAI,MAAM,IAAI,CAAC;AAAA,QAC3C,IAAI,MAAM,CAAC,QAAQ,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,MAC9C,CAAC;AACD,YAAM,WAAW,4BAA4B,MAAM;AACnD,UAAI,aAAa,QAAQ,aAAa,4BAA4B,KAAK,EAAG,QAAO;AAAA,IACnF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAzFA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACWO,SAAS,qBAAqBC,UAA0B;AAC7D,QAAMC,QAAOD,SACV,QAAQ,mDAAmD,EAAE,EAC7D,QAAQ,oBAAoB,EAAE;AACjC,SACE,2GAA2G;AAAA,IACzGC;AAAA,EACF,KACA,8KAA8K;AAAA,IAC5KA;AAAA,EACF,KACA,sLAAsL;AAAA,IACpLA;AAAA,EACF,KACA,4EAA4E,KAAKA,KAAI;AAEzF;AAsBO,SAAS,kBAAkB,KAAuB;AACvD,QAAM,QAAQ,cAAc,GAAG;AAC/B,MAAI,UAAU,IAAK,QAAO;AAC1B,QAAM,UAAU,MAAM,QAAQ,cAAc,MAAM;AAClD,SAAO,mBAAmB;AAAA,IAAI,CAAC,SAC7B,KAAK,WAAW,SAAS,IACrB,YAAY,UAAU,MAAM,KAAK,MAAM,UAAU,MAAM,IACvD,eAAe,QAAQ,MAAM;AAAA,EACnC;AACF;AAMA,eAAsB,iBAAiB,KAAyC;AAC9E,QAAM,SAAS,YAAY;AAC3B,SAAO,uBAAuB,CAAC;AAC/B,QAAM,cAAc,oBAAI,IAAqB;AAE7C,aAAW,OAAO,IAAI,MAAM;AAC1B,QAAI,CAAC,IAAI,YAAY;AACnB,aAAO,QAAQ,KAAK;AAAA,QAClB,OAAO;AAAA,QACP,KAAK,IAAI;AAAA,QACT,QAAQ,GAAG,IAAI,IAAI;AAAA,MACrB,CAAC;AACD;AAAA,IACF;AAIA,QAAID,WAAU,IAAI;AAClB,QAAI,IAAI,OAAO;AACb,UAAI;AACF,QAAAA,YACE,MAAM,cAAc,CAAC,QAAQ,GAAG,IAAI,WAAW,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG;AAAA,UAClE,KAAK,IAAI;AAAA,UACT,WAAW,KAAK,OAAO;AAAA,UACvB,SAAS;AAAA,QACX,CAAC,GACD;AAAA,MACJ,QAAQ;AACN,eAAO,QAAQ,KAAK;AAAA,UAClB,OAAO;AAAA,UACP,KAAK,IAAI;AAAA,UACT,QAAQ,GAAG,IAAI,IAAI;AAAA,QACrB,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM;AAAA,MAClB,IAAI;AAAA,MACJ,IAAI,WAAW;AAAA,MACf,kBAAkB,IAAI,IAAI;AAAA,IAC5B;AACA,QAAI,UAAU,MAAM;AAClB,aAAO,QAAQ,KAAK;AAAA,QAClB,OAAO;AAAA,QACP,KAAK,IAAI;AAAA,QACT,QAAQ,GAAG,IAAI,IAAI;AAAA,MACrB,CAAC;AACD;AAAA,IACF;AAEA,UAAM,WAAW,CAAC;AAClB,eAAW,UAAU,MAAM,SAAS;AAClC,UAAI,CAAC,YAAY,IAAI,OAAO,IAAI,KAAK,YAAY,OAAO,KAAK;AAC3D,oBAAY,IAAI,OAAO,MAAM,MAAM,oBAAoB,IAAI,MAAM,MAAM,CAAC;AAAA,MAC1E;AACA,UAAI,CAAC,YAAY,IAAI,OAAO,IAAI,EAAG,UAAS,KAAK,MAAM;AAAA,IACzD;AACA,UAAM,UAAU;AAChB,UAAM,QAAQ,SAAS;AACvB,QAAI,MAAM,UAAU,EAAG;AAEvB,UAAM,YAAY,MAAM;AAAA,MACtB,IAAI;AAAA,MACJ,IAAI,WAAW;AAAA,MACf,IAAI;AAAA,MACJ,CAAC,GAAG,IAAI,IAAI,MAAM,QAAQ,QAAQ,CAAC,WAAW,OAAO,KAAK,CAAC,CAAC;AAAA,MAC5DA;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,QAAQ,UAAU,CAAC,qBAAqBA,QAAO,EAAG;AACjE,UAAM,QAAQ,UAAU,QAAQ,CAAC;AACjC,QAAI,IAAI,SAAS;AACf,aAAO,QAAQ,KAAK;AAAA,QAClB,OAAO;AAAA,QACP,KAAK,IAAI;AAAA,QACT,QAAQ,GAAG,IAAI,IAAI;AAAA,MACrB,CAAC;AACH,KAAC,IAAI,QAAQ,OAAO,uBAAuB,OAAO,YAAY,KAAK;AAAA,MACjE,MAAM;AAAA,MACN,GAAI,QAAQ,CAAC,IAAI,EAAE,YAAY,gBAAyB;AAAA,MACxD,SAAS,QACL,GAAG,MAAM,UAAU,iBAAiB,MAAM,UAAU,QAAQ,OAAO,MAAM,SAAS,SAAS,OAAO,MAAM,QAAQ,YAAY,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO,GAAG,UAAU,QAAQ,SAAS,IAAI,KAAK,UAAU,QAAQ,SAAS,CAAC,+BAA+B,EAAE,KACxQ,4DAA4D,IAAI,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,WAAW,KAAK,MAAM,GAAG,EAAE,CAAC,uEAAuE,UAAU,aAAa,sDAAsD,EAAE;AAAA,MAC1R,QAAQ,EAAE,KAAK,IAAI,MAAM,MAAM,OAAO,QAAQ,MAAM,SAAS,OAAO,WAAW,KAAK;AAAA,MACpF,UAAU;AAAA,QACR,MAAM;AAAA,QACN,eAAe,IAAI;AAAA,QACnB,iBAAiB,MAAM,QAAQ,MAAM,GAAG,oBAAoB;AAAA,QAC5D,cAAc,MAAM;AAAA,QACpB,SAAS,UAAU;AAAA,QACnB,oBAAoB,UAAU;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAjKA,IAQM,sBAyBA;AAjCN;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAEA,IAAM,uBAAuB;AAyB7B,IAAM,qBAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;AC7CA,OAAOE,YAAU;AAgCjB,eAAsB,qBACpB,SACA,WAC8B;AAC9B,QAAM,eAAeA,OAAK,QAAQ,OAAO;AACzC,QAAM,QAAQ,YACV,EAAE,SAAS,WAAW,aAAa,CAAC,EAAE,IACtC,MAAM,kBAAkB,YAAY;AACxC,QAAM,SAA8B;AAAA,IAClC,kBAAkB;AAAA,IAClB,gBAAgB,MAAM,QAAQ;AAAA,IAC9B,gBAAgB,CAAC;AAAA,IACjB,WAAW,CAAC;AAAA,IACZ,aAAa,MAAM;AAAA,EACrB;AACA,QAAM,CAAC,MAAM,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC5C,kBAAkB,YAAY;AAAA,IAC9B,eAAe,YAAY;AAAA,EAC7B,CAAC;AACD,QAAM,gBAAgB,oBAAI,IAA6B;AACvD,QAAM,YAAY,MAAM,QACrB,OAAO,CAAC,WAAW,OAAO,WAAW,QAAQ,EAC7C,QAAQ,CAAC,WAAW;AACnB,UAAM,YAAY,kBAAkB,MAAM;AAC1C,WAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,WAAW,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc;AAC9D,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,cAAc,aAAa,iBAAiB,SAAS,MAAM,aACvD,cACA;AAAA,MACN;AACA,YAAM,UACJ,YAAY,YAAY,UAAU,YAAY,IAAI,UAAU,UAAU;AACxE,aAAO,UAAU,CAAC,OAAO,IAAI,CAAC;AAAA,IAChC,CAAC;AAAA,EACH,CAAC;AACH,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA,UAAU,IAAI,CAAC,aAAa,SAAS,OAAO;AAAA,EAC9C;AACA,QAAM,kBAAkB,IAAI;AAAA,IAC1B,UAAU,IAAI,CAAC,UAAU,UAAU,CAAC,KAAK,UAAU,SAAS,OAAO,GAAG,SAAS,KAAK,CAAC,CAAC;AAAA,EACxF;AACA,QAAM,UAAU,OACd,QACA,sBAC8D;AAC9D,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO,EAAE,WAAW,WAAW,cAAc,CAAC,EAAE;AAC/E,UAAM,WAAW,sBAAsB,OAAO,YAAY,IAAI,OAAO,UAAU;AAC/E,QAAI,UAAU;AACZ,YAAM,UAAU,gBAAgB,IAAI,KAAK,UAAU,SAAS,OAAO,CAAC;AACpE,YAAMC,QAAO,oBAAoB,UAAU,OAAO,EAAE;AAAA,QAClD,CAAC,SAAS,cAAc,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE;AAAA,MAChD;AACA,aAAO;AAAA,QACL,WACE,CAAC,SAAS,YAAY,CAAC,QAAQ,WAAW,YAAYA,MAAK,SAAS,YAAY;AAAA,QAClF,cAAcA;AAAA,MAChB;AAAA,IACF;AACA,QAAI,UAAU,cAAc,IAAI,OAAO,aAAa;AACpD,QAAI,YAAY,QAAW;AACzB,YAAM,UACJ,OAAO,kBAAkB,QAAQ,SAAS,YACtC,CAAC,IACD,MAAM,qBAAqB,cAAc,OAAO,aAAa;AACnE,gBAAU,YAAY,OAAO,OAAO,aAAa,OAAO;AACxD,oBAAc,IAAI,OAAO,eAAe,OAAO;AAAA,IACjD;AACA,QAAI,YAAY,KAAM,QAAO,mBAAmB;AAChD,UAAM,OAAO,UAAU,cAAc,OAAO,OAAO,OAAO,IAAI,CAAC;AAC/D,UAAM,YAAY,cAAc,OAAO,OAAO,YAAY,YAAY;AACtE,WAAO;AAAA,MACL,WACE,YAAY,QAAQ,CAAC,YAAY,YAC7B,YACA,KAAK,UAAU,UAAU,SACvB,YACA;AAAA,MACR,cAAc,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,KAAK;AAAA,IAC3D;AAAA,EACF;AACA,aAAW,UAAU,MAAM,SAAS;AAClC,QAAI,OAAO,WAAW,SAAU;AAChC,UAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,iBAAiB,SAAS,MAAM,aAAa,cAAc;AAAA,IAC7D;AACA,UAAM,QAAQ,MAAM,QAAQ,WAAW,YAAY,OAAO;AAC1D,WAAO,UAAW,OAAO,EAAE,IAAI,MAAM;AACrC,QAAI,MAAM,aAAa,OAAQ,QAAO,eAAe,OAAO,EAAE,IAAI,MAAM;AACxE,QAAI,cAAc;AAChB,OAAC,OAAO,qBAAqB,CAAC,GAAG,OAAO,EAAE,IAAI,MAAM;AAAA,QAClD;AAAA,QACA,yBAAyB,MAAM,GAAG;AAAA,MACpC;AAAA,EACJ;AACA,SAAO;AACT;AApIA,IAAAC,cAAA;AAAA;AAAA;AAAA;AAEA;AACA;AAGA;AACA;AAEA;AAAA;AAAA;;;ACEA,eAAsB,qBAAqB,KAAyC;AAClF,QAAM,SAAS,YAAY;AAC3B,MAAI,CAAC,IAAI,iBAAkB,QAAO;AAElC,QAAM,QAAQ,MAAM,kBAAkB,IAAI,IAAI;AAC9C,QAAM,UAAU,MAAM;AACtB,aAAW,cAAc,MAAM;AAC7B,WAAO,QAAQ,KAAK;AAAA,MAClB,OAAO;AAAA,MACP,QAAQ,GAAG,WAAW,IAAI,KAAK,WAAW,OAAO;AAAA,IACnD,CAAC;AACH,QAAM,QAAQ,MAAM,qBAAqB,IAAI,MAAM,OAAO;AAC1D,MAAI,CAAC,MAAM,kBAAkB;AAC3B,WAAO,QAAQ,KAAK;AAAA,MAClB,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,QACb,OAAO,CAAC,WAAW,OAAO,WAAW,QAAQ,EAC7C;AAAA,IACC,CAAC,WACC;AAAA,MACE;AAAA,QACE,QAAQ,kBAAkB,MAAM;AAAA,QAChC,cAAc,MAAM,eAAe,OAAO,EAAE,KAAK,CAAC;AAAA,QAClD,WAAW,MAAM,YAAY,OAAO,EAAE,KAAK;AAAA,MAC7C;AAAA,MACA,GAAI,MAAM,mBAAmB,OAAO,EAAE,IAClC,CAAC,EAAE,QAAQ,GAAG,MAAM,iBAAiB,OAAO,EAAE,EAAE,CAAC,IACjD,CAAC;AAAA,IACP;AAAA,EACJ;AACF,aAAW,EAAE,QAAQ,cAAc,UAAU,KAAK,SAAS;AACzD,QAAI,cAAc,aAAa,OAAO,MAAM,QAAQ;AAClD,aAAO,QAAQ,KAAK;AAAA,QAClB,OAAO;AAAA,QACP,QAAQ,gCAAgC,OAAO,EAAE;AAAA,MACnD,CAAC;AACD;AAAA,IACF;AACA,QAAI,CAAC,aAAa,OAAQ;AAC1B,UAAM,KAAK,OAAO;AAClB,UAAM,aAAa,mBAAmB,QAAQ,SAAS;AACvD,WAAO,WAAW,KAAK;AAAA,MACrB,MAAM;AAAA,MACN,SAAS,aAAa,OAAO,KAAK,MAAM,WAAW,QAAQ;AAAA,MAC3D,QAAQ;AAAA,QACN,KAAK,oBAAoB,EAAE;AAAA,QAC3B,MAAM;AAAA,QACN,SAAS,OAAO;AAAA,MAClB;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd;AAAA,QACA,eAAe,OAAO;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AA5EA;AAAA;AAAA;AAAA,IAAAC;AACA;AACA;AAEA;AAAA;AAAA;;;ACkCO,SAAS,cAA2B;AACzC,SAAO,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC,EAAE;AACnD;AAxCA,IA6Ba;AA7Bb;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AAqBO,IAAM,SAAqC;AAAA,MAChD,qBAAqB;AAAA,MACrB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,IAC3B;AAAA;AAAA;;;ACpCA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,KAAAC,UAAS;AA+GX,SAAS,UAAU,SAA0B;AAClD,QAAM,IAAI,QAAQ;AAClB,MAAI;AACJ,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,YACE,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,YAAY,IAAI,EAAE;AACnF;AAAA,IACF,KAAK;AACH,YAAM,EAAE;AACR;AAAA,IACF,KAAK;AACH,YAAM,CAAC,EAAE,KAAK,QAAQ,MAAM,EAAE,GAAG,EAAE,WAAW;AAC9C;AAAA,IACF,KAAK;AACH,YAAM,EAAE,SAAS,EAAE,MAAM,cAAc,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,SAAS,IAAI,EAAE;AACnF;AAAA,IACF,KAAK;AACH,YAAM;AACN;AAAA,IACF,KAAK;AACH,YAAM,CAAC,EAAE,YAAY,EAAE,YAAY,UAAU,EAAE,YAAY,QAAQ;AACnE;AAAA,EACJ;AACA,SAAO,OAAO,CAAC,QAAQ,MAAM,QAAQ,OAAO,KAAK,GAAG,CAAC;AACvD;AAzIA,IAIa,QAEA,aAQA,cAKP,cAKA,OACA,aAKA,gBA8DA,eAKO,aAIA,gBAIA;AAzGb;AAAA;AAAA;AAIO,IAAM,SAAS,CAAC,UACrBD,YAAW,QAAQ,EAAE,OAAO,KAAK,UAAU,KAAK,CAAC,EAAE,OAAO,KAAK;AAC1D,IAAM,cAAcC,GAAE,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACM,IAAM,eAAeA,GAAE,OAAO;AAAA,MACnC,MAAMA,GAAE,OAAO,EAAE,MAAM,mBAAmB;AAAA,MAC1C,MAAMA,GAAE,OAAO;AAAA,MACf,SAASA,GAAE,OAAO;AAAA,IACpB,CAAC;AACD,IAAM,eAAeA,GAAE,OAAO;AAAA,MAC5B,KAAKA,GAAE,OAAO;AAAA,MACd,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,MAC3C,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,CAAC;AACD,IAAM,QAAQA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAC3C,IAAM,cAAcA,GAAE,OAAO;AAAA,MAC3B,OAAOA,GAAE,KAAK,CAAC,cAAc,YAAY,iBAAiB,UAAU,CAAC;AAAA,MACrE,WAAWA,GAAE,OAAO;AAAA,MACpB,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,IAChC,CAAC;AACD,IAAM,iBAAiBA,GAAE,mBAAmB,QAAQ;AAAA,MAClDA,GAAE,OAAO;AAAA,QACP,MAAMA,GAAE,QAAQ,cAAc;AAAA,QAC9B,SAASA,GAAE,OAAO;AAAA,QAClB,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,QAC/B,iBAAiB,aAAa,SAAS;AAAA,QACvC,aAAaA,GAAE,QAAQ;AAAA,QACvB,iBAAiBA,GAAE,QAAQ;AAAA,QAC3B,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,QAClC,OAAO,YAAY,SAAS;AAAA,MAC9B,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,MAAMA,GAAE,QAAQ,iBAAiB;AAAA,QACjC,KAAKA,GAAE,OAAO;AAAA,QACd,iBAAiB;AAAA,QACjB,aAAa,aAAa,SAAS;AAAA,QACnC,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,MACjC,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,MAAMA,GAAE,QAAQ,gBAAgB;AAAA,QAChC,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,MAAMA,GAAE,OAAO;AAAA,QACf,aAAaA,GAAE,OAAO;AAAA,QACtB,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,MAC7B,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,MAAMA,GAAE,QAAQ,gBAAgB;AAAA,QAChC,YAAYA,GAAE,OAAO;AAAA,QACrB,YAAYA,GAAE,OAAO;AAAA,QACrB,kBAAkBA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,QACpC,kBAAkBA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,QACpC,OAAO,YAAY,SAAS;AAAA,MAC9B,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,MAAMA,GAAE,QAAQ,sBAAsB;AAAA,QACtC,eAAe;AAAA,QACf,iBAAiBA,GAAE,MAAM,aAAa,OAAO,EAAE,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AAAA,QAC5E,cAAc;AAAA,QACd,SAASA,GACN;AAAA,UACCA,GAAE,OAAO;AAAA,YACP,YAAYA,GAAE,OAAO;AAAA,YACrB,UAAUA,GAAE,OAAO;AAAA,YACnB,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,YAC5B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,YAC3B,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,YAChC,SAASA,GAAE,OAAO;AAAA,UACpB,CAAC;AAAA,QACH,EACC,SAAS;AAAA,QACZ,oBAAoBA,GAAE,QAAQ,EAAE,SAAS;AAAA,MAC3C,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,MAAMA,GAAE,QAAQ,iBAAiB;AAAA,QACjC,YAAYA,GAAE,OAAO;AAAA,QACrB,OAAOA,GAAE,OAAO;AAAA,QAChB,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,QAChC,eAAeA,GAAE,OAAO;AAAA,QACxB,YAAYA,GAAE,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS;AAAA,MAClD,CAAC;AAAA,IACH,CAAC;AACD,IAAM,gBAAgBA,GAAE,OAAO;AAAA,MAC7B,SAASA,GAAE,OAAO;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ,CAAC;AACM,IAAM,cAAc,cAAc,OAAO;AAAA,MAC9C,MAAMA,GAAE,KAAK,CAAC,qBAAqB,cAAc,eAAe,cAAc,CAAC;AAAA,MAC/E,YAAYA,GAAE,KAAK,CAAC,WAAW,QAAQ,CAAC;AAAA,IAC1C,CAAC;AACM,IAAM,iBAAiB,cAAc,OAAO;AAAA,MACjD,MAAM;AAAA,MACN,YAAYA,GAAE,KAAK,CAAC,WAAW,eAAe,CAAC,EAAE,SAAS;AAAA,IAC5D,CAAC;AACM,IAAM,oBAAoBA,GAAE,OAAO;AAAA,MACxC,QAAQA,GAAE,MAAM,WAAW;AAAA,MAC3B,YAAYA,GAAE,MAAM,cAAc;AAAA,MAClC,sBAAsBA,GAAE,MAAM,cAAc,EAAE,SAAS;AAAA,MACvD,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,GAAG,QAAQA,GAAE,OAAO,GAAG,KAAKA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAAA,IAClG,CAAC;AAAA;AAAA;;;AC9GD,SAAS,KAAAC,UAAS;AAiBX,SAAS,qBAAqB,SAAkB,QAAgB,OAAwB;AAC7F,MAAI,MAAM,SAAS,YAAY,CAAC,MAAM,YAAY,CAAC,MAAM,OAAQ;AACjE,QAAM,QAAS,QAAQ,eAAe,MAAM;AAC5C,MAAI,MAAM,UAAU,eAAe;AACjC,UAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,MAAM,OAAO,MAAM,UAAU,OAAO,iBAAiB;AAAA,EACvF,WAAW,MAAM,UAAU,cAAc;AACvC,UAAM,SAAS,MAAM,QAAQ,MAAM,MAAM;AACzC,WAAO,MAAM,QAAQ,MAAM,MAAM;AAGjC,QAAI,CAAC,UAAU,OAAO,SAAS,OAAO,KAAM;AAC5C,eAAW,CAAC,IAAI,QAAQ,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAC5D,YAAM,UAAU,OAAO,iBAAiB,EAAE;AAC1C,UACE,CAAC,WACD,CAAC,SAAS,QAAQ,YAClB,CAAC,QAAQ,QAAQ,YACjB,OAAO,SAAS,QAAQ,OAAO,MAAM,OAAO,QAAQ,QAAQ,OAAO;AAEnE;AACF,YAAM,SAAU,MAAM,OAAO,EAAE,MAAM,CAAC;AACtC,iBAAW,QAAQ,oBAAoB,SAAS,SAAS,QAAQ,OAAO,GAAG;AACzE,eAAO,IAAI,IAAI,QAAQ,QAAQ,MAAM,IAAI,KAAK;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,yBAAyB,UAA6B,QAA0B;AAC9F,MACE,OAAO,WAAW,iBAClB,OAAO,OAAO,QAAQ,KAAK,CAAC,UAAU,MAAM,UAAU,uBAAuB;AAE7E;AACF,QAAM,SAAS,IAAI;AAAA,IACjB,OAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,YAAM,YAAY,QAAQ,WAAW,QAAQ,UAAU;AACvD,aAAO,SAAS,SAAS,qBACvB,QAAQ,WAAW,eAClB,QAAQ,WAAW,QAAQ,WAAW,gBACrC,CAAC,SAAS,UAAU,IACpB,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AACA,aAAW,WAAW,OAAO,OAAO,QAAQ,GAAG;AAC7C,QAAI,CAAC,QAAQ,WAAY;AACzB,eAAW,MAAM,OAAO,KAAK,QAAQ,WAAW,SAAS,GAAG;AAC1D,UAAI,CAAC,OAAO,IAAI,EAAE,EAAG,QAAO,QAAQ,WAAW,UAAU,EAAE;AAAA,IAC7D;AAAA,EACF;AACF;AAEO,SAAS,mBACd,SACA,QACA,QACA,SACA;AACA,QAAM,QAAS,QAAQ,eAAe,MAAM;AAC5C,QAAM,YAAY,oBAAI,IAGpB;AACF,aAAW,WAAW,OAAO,UAAU;AACrC,UAAM,WAAW,QAAQ,SAAS;AAClC,QACE,QAAQ,WAAW,cACnB,QAAQ,WAAW,gBACnB,UAAU,SAAS;AAEnB;AACF,UAAM,UAAU,OAAO,iBAAiB,SAAS,UAAU;AAC3D,UAAM,SAAS,MAAM,OAAO,SAAS,UAAU;AAC/C,QACE,CAAC,SAAS,QAAQ,YAClB,CAAC,UACD,CAAC,SAAS,aAAa;AAAA,MACrB,CAAC,SACC,OAAO,OAAO,QAAQ,IAAI,KAAK,OAAO,IAAI,OAAO,QAAQ,QAAQ,MAAM,IAAI,KAAK;AAAA,IACpF;AAEA;AACF,UAAM,QAAQ,UAAU,IAAI,SAAS,UAAU,KAAK;AAAA,MAClD,OAAO,SAAS;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,OAAO,CAAC;AAAA,IACV;AACA,eAAW,QAAQ,SAAS,cAAc;AACxC,UAAI,OAAO,OAAO,QAAQ,IAAI,KAAK,OAAO,IAAI,OAAO,QAAQ,QAAQ,MAAM,IAAI,KAAK;AAClF,cAAM,MAAM,IAAI,IAAI,OAAO,IAAI;AAAA,IACnC;AACA,cAAU,IAAI,SAAS,YAAY,KAAK;AAAA,EAC1C;AACA,MAAI,CAAC,UAAU,KAAM,QAAO,EAAE,QAAQ,MAAM,OAAO,MAAM;AACzD,MAAI,QAAQ;AACZ,aAAW,CAAC,IAAI,KAAK,KAAK,WAAW;AACnC,UAAM,WAAW,MAAM,UAAU,EAAE;AACnC,QACE,UAAU,WAAW,MAAM,UAC3B,OAAO,QAAQ,MAAM,KAAK,EAAE;AAAA,MAC1B,CAAC,CAAC,MAAMC,OAAM,MAAM,CAAC,OAAO,OAAO,SAAS,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,MAAMA;AAAA,IACvF;AAEA,cAAQ;AAEV,UAAM,UAAU,EAAE,IAAI;AAAA,MACpB,QAAQ,MAAM;AAAA,MACd,OAAO,EAAE,GAAI,UAAU,WAAW,MAAM,SAAS,SAAS,QAAQ,CAAC,GAAI,GAAG,MAAM,MAAM;AAAA,IACxF;AAAA,EACF;AACA,QAAM,OAAO,CAAC,UAAkB,MAAM,QAAQ,iCAAiC,GAAG,EAAE,MAAM,GAAG,GAAG;AAChG,QAAM,SAAS;AAAA,IACb;AAAA,IACA,GAAG,CAAC,GAAG,SAAS,EAAE;AAAA,MAChB,CAAC,CAAC,IAAI,KAAK,MACT,YAAY,KAAK,UAAU,KAAK,MAAM,KAAK,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,6CAA6C,KAAK,UAAU,EAAE,CAAC;AAAA,IAC7H;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,OAAO,UAAU;AAAA,EAChC,EAAE,KAAK,IAAI;AACX,SAAO,EAAE,QAAQ,OAAO,CAAC,WAAW,MAAM;AAC5C;AA5IA,IAOMC,iBACO,kBAMP;AAdN;AAAA;AAAA;AACA;AAEA;AAIA,IAAMA,kBAAiBF,GAAE,OAAOA,GAAE,OAAO,EAAE,QAAQA,GAAE,OAAO,GAAG,SAAS,oBAAoB,CAAC,CAAC;AACvF,IAAM,mBAAmBA,GAAE,OAAO;AAAA,MACvC,SAASA,GAAE,OAAOA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,UAAUE,gBAAe,CAAC,CAAC;AAAA,MAC1E,QAAQF,GAAE,OAAOA,GAAE,OAAOA,GAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAAA,MAChD,WAAWA,GAAE,OAAOA,GAAE,OAAO,EAAE,QAAQA,GAAE,OAAO,GAAG,OAAOA,GAAE,OAAOA,GAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;AAAA,IAC9F,CAAC;AAED,IAAM,QAAQ,OAAyC,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC,EAAE;AAAA;AAAA;;;ACdhG,SAAS,KAAAG,UAAS;AAsBlB,SAAS,UAAU,SAA8D;AAC/E,QAAM,SAAS,QAAQ,WAAW,QAAQ;AAC1C,QAAM,IAAI,OAAO;AAEjB,QAAM,KACJ,EAAE,SAAS,oBACP,OAAO,CAAC,OAAO,MAAM,OAAO,OAAO,KAAK,EAAE,UAAU,CAAC,IACrD,QAAQ;AACd,QAAM,SAAoB,EAAE,OAAO,gBAAgB,SAAS,IAAI,GAAG,OAAO,CAAC,EAAE;AAC7E,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE,OAAO;AAChD;AAAA,IACF,KAAK;AACH,aAAO,YAAY,EAAE;AACrB;AAAA,IACF,KAAK;AACH,aAAO,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK;AACxC;AAAA,IACF,KAAK;AACH,aAAO,SAAS,EAAE,WAAW,CAAC,GAC3B,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,EAC9D,KAAK;AACR;AAAA,EAEJ;AACA,SAAO,EAAE,IAAI,WAAW,OAAO;AACjC;AAEO,SAAS,uBAAuB,UAAsD;AAC3F,QAAM,SAAS,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU;AAC7D,QAAM,aAAa,IAAI,IAAI,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,CAAC;AACtF,QAAM,SAAoC,CAAC;AAC3C,aAAW,KAAK,QAAQ;AACtB,UAAM,QAAQ,UAAU,CAAC;AAEzB,QAAI,CAAC,EAAE,WAAW,WAAW,IAAI,MAAM,EAAE,EAAG;AAC5C,UAAM,WAAW,OAAO,MAAM,EAAE;AAChC,WAAO,MAAM,EAAE,IAAI,WACf;AAAA,MACE,OAAO,KAAK,IAAI,SAAS,OAAO,MAAM,UAAU,KAAK;AAAA,MACrD,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,OAAO,GAAG,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,KAAK;AAAA,MACxE,GAAI,SAAS,cAAc,UAAa,MAAM,UAAU,cAAc,SAClE,EAAE,WAAW,KAAK,IAAI,SAAS,aAAa,GAAG,MAAM,UAAU,aAAa,CAAC,EAAE,IAC/E,CAAC;AAAA,IACP,IACA,MAAM;AAAA,EACZ;AACA,SAAO;AACT;AAEO,SAAS,wBACd,UACA,MACmB;AACnB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU,uBAAuB,QAAQ;AAAA,IACzC,WAAW,CAAC;AAAA,IACZ,SAAS,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,SAAS,SAAoB,UAA+B;AACnE,SACE,CAAC,YACD,QAAQ,QAAQ,SAAS,UACxB,QAAQ,aAAa,MAAM,SAAS,aAAa,MAClD,QAAQ,MAAM,KAAK,CAAC,SAAS,CAAC,SAAS,MAAM,SAAS,IAAI,CAAC;AAE/D;AAGO,SAAS,mBACd,OACA,UACiB;AACjB,QAAM,UAAU,uBAAuB,QAAQ;AAC/C,QAAM,UAAU,IAAI,IAAI,MAAM,OAAO;AACrC,QAAM,cAAc,IAAI;AAAA,IACtB,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE,IAAI,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE;AAAA,EAC5E;AACA,aAAW,MAAM,OAAO,KAAK,MAAM,QAAQ;AACzC,QAAI,YAAY,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAG,SAAQ,IAAI,EAAE;AACzD,QAAM,UAAU,CAAC,GAAG,OAAO;AAE3B,QAAM,WAA4B,CAAC;AACnC,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,YAAuC,EAAE,GAAG,MAAM,UAAU;AAClE,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,UAAU,OAAO;AAC/B,UAAM,WAAW,MAAM,UAAU,MAAM,EAAE;AACzC,UAAM,YAAY,QAAQ,MAAM,EAAE,KAAK,MAAM;AAE7C,QAAI,QAAQ,WAAW,gBAAiB,CAAC,QAAQ,WAAW,QAAQ,WAAW,YAAa;AAC1F;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,YAAY;AACjC,UAAI,CAAC,QAAQ,MAAM,EAAE,EAAG,QAAO,UAAU,MAAM,EAAE;AACjD;AAAA,IACF;AACA,UAAM,WAAW,QAAQ,IAAI,MAAM,EAAE,KAAK,SAAS,MAAM,WAAW,MAAM,SAAS,MAAM,EAAE,CAAC;AAC5F,QAAI,CAAC,SAAU;AACf,QAAI,CAAC,YAAY,IAAI,MAAM,EAAE,KAAK,SAAS,MAAM,WAAW,QAAQ,GAAG;AACrE,kBAAY,IAAI,MAAM,EAAE;AACxB,YAAM,SAAS,QAAQ;AACvB,eAAS;AAAA,QACP,OAAO,SAAS,SAAS,oBACrB;AAAA,UACE,GAAG;AAAA,UACH,SAAS;AAAA,YACP,GAAG;AAAA,YACH,UAAU,EAAE,GAAG,OAAO,UAAU,cAAc,MAAM,UAAU,MAAM;AAAA,UACtE;AAAA,QACF,IACA;AAAA,MACN;AAGA,UAAI,SAAS,UAAU,wBAAyB,WAAU,MAAM,EAAE,IAAI,MAAM;AAAA,IAC9E;AAAA,EACF;AACA,QAAM,YAAY;AAClB,SAAO;AACT;AAEO,SAAS,kBAAkB,UAA2B,YAAmC;AAC9F,MAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,QAAM,OAAO,CAAC,UAAkB,MAAM,QAAQ,iCAAiC,GAAG,EAAE,MAAM,GAAG,GAAG;AAChG,SAAO;AAAA,IACL,UAAU,SAAS,MAAM;AAAA,IACzB,GAAG,SAAS,MAAM,GAAG,uBAAuB,EAAE,IAAI,CAAC,MAAM;AACvD,YAAM,SAAS,EAAE,WAAW,EAAE;AAC9B,UAAI,OAAO,SAAS,SAAS,mBAAmB;AAC9C,cAAM,WAAW,OAAO;AACxB,eAAO;AAAA,UACL,wBAAwB,KAAK,SAAS,KAAK,CAAC,SAAS,SAAS,aAAa,MAAM;AAAA,UACjF,6EAA6E,KAAK,UAAU,SAAS,UAAU,CAAC;AAAA,UAChH,kBAAkB,KAAK,SAAS,aAAa,KAAK,IAAI,CAAC,CAAC;AAAA,QAC1D,EAAE,KAAK,IAAI;AAAA,MACb;AACA,aAAO,IAAI,EAAE,WAAW,eAAe,UAAU,UAAU,KAAK,KAAK,OAAO,OAAO,GAAG,CAAC,KAAK,KAAK,OAAO,OAAO,CAAC;AAAA,IAClH,CAAC;AAAA,IACD,GAAI,SAAS,SAAS,0BAClB,CAAC,GAAG,SAAS,SAAS,uBAAuB,8CAA8C,IAC3F,CAAC;AAAA,IACL,aAAa,UAAU;AAAA,IACvB;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AA5KA,IAKM,iBAKA,yBAGO;AAbb;AAAA;AAAA;AAEA;AAGA,IAAM,kBAAkBA,GAAE,OAAO;AAAA,MAC/B,OAAOA,GAAE,OAAO;AAAA,MAChB,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,MACzB,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,CAAC;AACD,IAAM,0BAA0B;AAGzB,IAAM,0BAA0BA,GAAE,OAAO;AAAA,MAC9C,SAASA,GAAE,QAAQ,CAAC;AAAA,MACpB,cAAcA,GAAE,OAAO;AAAA,MACvB,UAAUA,GAAE,OAAO,eAAe;AAAA,MAClC,WAAWA,GAAE,OAAO,eAAe;AAAA,MACnC,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,IAC7B,CAAC;AAAA;AAAA;;;ACnBD,SAAS,KAAAC,UAAS;AA+CX,SAAS,WAAW,KAAqB;AAC9C,MAAI;AACF,WAAO,YAAY,MAAM,GAAG;AAAA,EAC9B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,6DAA6D,EAAE,OAAO,MAAM,CAAC;AAAA,EAC/F;AACF;AAGO,SAAS,SACd,MACAC,YACA,KACA,SAAS,KACG;AACZ,SAAO,cAAc,MAAMA,YAAW,KAAK,QAAQ,YAAY;AACjE;AA/DA,IAKa,YAEA,QAQA;AAfb;AAAA;AAAA;AACA;AACA;AACA;AAEO,IAAM,aAAaD,GAAE,KAAK,CAAC,UAAU,OAAO,CAAC;AAE7C,IAAM,SAAS;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEO,IAAM,cAAcA,GAAE,OAAO;AAAA,MAClC,SAASA,GAAE,QAAQ,CAAC;AAAA,MACpB,MAAMA,GAAE,OAAO;AAAA,MACf,QAAQA,GAAE,OAAO;AAAA,MACjB,QAAQA,GAAE,OAAO;AAAA,MACjB,WAAWA,GACR;AAAA,QACCA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,IAAIA,GAAE,OAAO,GAAG,OAAOA,GAAE,OAAO,GAAG,aAAaA,GAAE,OAAO,EAAE,CAAC;AAAA,MAC3F,EACC,IAAI,GAAG;AAAA,MACV,UAAUA,GAAE;AAAA,QACVA,GAAE,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAUA,GAAE,OAAO;AAAA,UACnB,qBAAqBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,UACnD,SAASA,GAAE,OAAOA,GAAE,OAAO,CAAC;AAAA,UAC5B,YAAY,iBAAiB,SAAS;AAAA,UACtC,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,UAChC,QAAQA,GAAE,OAAOA,GAAE,OAAO,EAAE,IAAIA,GAAE,OAAO,GAAG,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AAAA,QACnF,CAAC;AAAA,MACH;AAAA,MACA,WAAWA,GAAE,OAAO;AAAA,MACpB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,UAAUA,GAAE,OAAO,EAAE,aAAaA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,EAAE,CAAC,EAAE,SAAS;AAAA,MAC3E,eAAe,wBAAwB,SAAS;AAAA,MAChD,oBAAoB,wBAAwB,SAAS;AAAA,MACrD,UAAUA,GACP,OAAO,EAAE,IAAIA,GAAE,OAAO,GAAG,aAAaA,GAAE,OAAO,GAAG,aAAaA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,EAAE,CAAC,EAC7F,SAAS;AAAA,IACd,CAAC;AAAA;AAAA;;;AC3CD,OAAOE,UAAQ;AACf,SAAS,KAAAC,WAAS;AAqFlB,eAAe,WAAW,MAAc,IAA0C;AAChF,QAAM,MAAM,MAAM,cAAc,MAAM,WAAW,EAAE,CAAC;AACpD,MAAI,QAAQ,KAAM,QAAO;AACzB,QAAM,SAAS,aAAa,MAAM,GAAG;AACrC,QAAM,EAAE,QAAQ,QAAQ,GAAG,QAAQ,IAAI;AACvC,MACE,OAAO,OAAO,MACd,OAAO,OAAO,MAAM,UACpB,OAAO,OAAO;AAAA,IACZ,CAAC,UACC,UAAU,MAAM,OAAkB,MAAM,OACvC,MAAM,YAAY,cACf,CAAC,MAAM,cAAc,MAAM,QAAQ,SAAS,iBAC5C,CAAC,MAAM,YAAY,CAAC,CAAC,MAAM,eAC/B,MAAM,SAAS,gBAAgB,oBAAoB,MAAM,UAAU,MAAM,UAAU;AAAA,EACvF,GACA;AACA,UAAM,IAAI,MAAM,0EAA0E;AAAA,EAC5F;AACA,SAAO;AACT;AAEA,SAAS,oBACP,UACA,QACQ;AACR,SAAO,OAAO;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,GAAI,WAAW,yBAAyB,CAAC,IAAI,CAAC,SAAS,eAAe;AAAA,IACtE,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,OAAO,SAAkB,QAA0D;AAC1F,QAAM,QAAQ,CAAC,QAAQ,OAAO,GAAG,GAC/B,IAAI,QAAQ;AACd,MAAI,EAAE,SAAS;AACb,UAAM,IAAI,MAAM,2EAA2E;AAC7F,MAAI,WAAW,0BAA0B,EAAE,SAAS;AAClD,WAAO,CAAC,aAAa,QAAQ,OAAO,GAAG,EAAE;AAC3C,MAAI,EAAE,SAAS;AACb,WAAO,CAAC,aAAa,QAAQ,OAAO,GAAG,IAAI,GAAG,kBAAkB,QAAQ,OAAO,GAAG,CAAC;AACrF,MAAI,EAAE,SAAS;AACb,UAAM,KAAK,GAAI,EAAE,OAAO,cAAc,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAE;AAAA,WAC7D,EAAE,SAAS;AAClB,UAAM,KAAK,GAAG,EAAE,kBAAkB,GAAI,EAAE,OAAO,cAAc,CAAC,CAAE;AAAA,WACzD,EAAE,SAAS,kBAAmB,OAAM,KAAK,EAAE,KAAK,GAAG,EAAE,WAAW;AAAA,MACpE,OAAM,IAAI,MAAM,8CAA8C;AACnE,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EACtB,IAAI,CAAC,SAAS;AACb,QAAI,kBAAkB,IAAI,MAAM;AAC9B,YAAM,IAAI,MAAM,+CAA+C,IAAI;AACrE,WAAO,aAAa,IAAI;AAAA,EAC1B,CAAC,EACA,KAAK;AACV;AAGA,eAAe,eACb,MACA,SACA,QACA;AACA,MAAI,kBAAkB,QAAQ,OAAO,GAAG,MAAM,QAAQ,OAAO;AAC3D,UAAM,IAAI,MAAM,iCAAiC;AACnD,QAAM,QAAQ,OAAO,SAAS,MAAM;AACpC,QAAM,QAAQ,MAAMC,KAAI,MAAM,aAAa,MAAM,GAAG,KAAK;AACzD,QAAM,WAAW,MAAMA,KAAI,MAAM,YAAY,YAAY,MAAM,MAAM,GAAG,KAAK,GAC1E,MAAM,IAAI,EACV,OAAO,OAAO;AACjB,MAAI,QAAQ,SAAS,IAAQ,OAAM,IAAI,MAAM,8CAA8C;AAC3F,QAAM,CAAC,MAAM,QAAQ,iBAAiB,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAClE,QAAQ,SACJA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,QAAQ,IAAI,CAAC,SAAS,aAAa,IAAI,EAAE;AAAA,IAC9C,IACA;AAAA,IACJA,KAAI,MAAM,UAAU,kBAAkB,MAAM,yBAAyB,MAAM,GAAG,KAAK;AAAA,IACnFA,KAAI,MAAM,OAAO,MAAM,eAAe,QAAQ,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC;AAAA,IAC1F,eAAe,MAAM,QAAQ,OAAO,GAAG;AAAA,EACzC,CAAC;AACD,MAAI,CAAC,UAAU,KAAK;AAClB,UAAM,IAAI,MAAM,6DAA6D;AAC/E,MAAI,KAAK,SAAS,IAAI,OAAO,QAAQ,KAAK,MAAM,IAAI,EAAE,SAAS;AAC7D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAEF,aAAW,SAAS,KAAK,MAAM,IAAI,EAAE,OAAO,OAAO,GAAG;AACpD,UAAM,MAAM,MAAM,QAAQ,GAAI,GAC5B,OAAO,MAAM,MAAM,MAAM,CAAC;AAC5B,QAAI,MAAM,WAAW,SAAS,KAAK,MAAM,WAAW,SAAS;AAC3D,YAAM,IAAI,MAAM,oDAAoD,IAAI;AAC1E,UAAM,UAAU,MAAM,IAAI;AAAA,EAC5B;AAGA,QAAM,QACJ,QAAQ,SAAS,SAAS,iBACtB,MAAM,QAAQ;AAAA,KAEV,QAAQ,SAAS,OAAO,cAAc;AAAA,MACpC,QAAQ,SAAS,gBAAgB,QAAQ,SAAS;AAAA,IACpD,GACA,IAAI,OAAO,UAAU,EAAE,MAAM,MAAM,QAAQ,MAAM,WAAW,MAAM,IAAI,EAAE,EAAE;AAAA,EAC9E,IACA,CAAC;AACP,MAAI,QAAQ,OAAO,SAAS;AAC5B,MAAI,QAAQ,SAAS,SAAS,kBAAkB;AAC9C,eAAW,QAAQ;AAAA,MACjB,GAAG,QAAQ,SAAS;AAAA,MACpB,GAAI,QAAQ,SAAS,OAAO,cAAc,CAAC;AAAA,IAC7C,GAAG;AACD,UAAI,CAAC,QAAQ,SAAS,IAAI,KAAM,MAAM,WAAW,MAAM,IAAI,EAAI,SAAQ;AAAA,IACzE;AAAA,EACF;AACA,QAAM,cAAc;AAAA,IAClB,EAAE,MAAM,OAAO,MAAM,iBAAiB,OAAO,aAAa,GAAG;AAAA,IAC7D;AAAA,EACF;AACA,OAAK,MAAMA,KAAI,MAAM,aAAa,MAAM,GAAG,KAAK,MAAM;AACpD,UAAM,IAAI,MAAM,gDAAgD;AAClE,SAAO;AAAA,IACL,GAAGC,gBAAe,MAAM,EAAE,MAAM,OAAO,MAAM,iBAAiB,OAAO,YAAY,CAAC;AAAA,IAClF;AAAA,IACA,gBAAgB,OAAO,QAAQ;AAAA,EACjC;AACF;AAEA,eAAe,mBACb,MACA,SACA,cACuC;AACvC,QAAM,WAAW,QAAQ;AACzB,MAAI,SAAS,SAAS,kBAAmB,QAAO;AAChD,QAAM,KAAK,UAAU,OAAO;AAC5B,QAAM,QAAQ,MAAM,kBAAkB,IAAI;AAC1C,MAAI,MAAM,YAAY;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,SAAS,MAAM,QAAQ,KAAK,CAACC,YAAWA,QAAO,OAAO,SAAS,UAAU;AAC/E,MAAI,CAAC,UAAU,OAAO,YAAY,EAAG,QAAO;AAC5C,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,SAAS,YAAY,aAAa,aAAa,cAAc;AAAA,EAC/D;AACA,MAAI,cAAc,OAAO,WAAW,UAAU;AAC5C,UAAM,UAAU,MAAM,eAAe,MAAM,WAAW,QAAQ,OAAO;AACrE,QAAI,WAAW;AACf,QAAI;AACF,YAAMF,KAAI,MAAM,cAAc,iBAAiB,cAAc,WAAW,QAAQ;AAAA,IAClF,QAAQ;AACN,iBAAW;AAAA,IACb;AACA,QAAI;AACF,aAAO;AAAA,QACL;AAAA,QACA,QACE,CAAC,QAAQ,YAAY,CAAC,WAAW,QAAQ,WACrC,eACA,oBAAoB,WAAW,SAAS,OAAO,EAAE,SAC/C,aACA;AAAA,QACR,SAAS;AAAA,QACT,UAAU,WAAW;AAAA,QACrB,MAAM,WAAW;AAAA,QACjB,cAAc,WAAW;AAAA,QACzB,YAAY,oBAAoB,OAAO,EAAE;AAAA,QACzC,QACE;AAAA,MACJ;AAAA,EACJ;AACA,QAAMG,UAAS,OAAO,QAAQ;AAAA,IAAO,CAACC,WACpC,CAAC,YAAY,cAAc,SAAS,EAAE,SAASA,OAAM,IAAI;AAAA,EAC3D;AACA,QAAM,QAAQD,QAAO,GAAG,EAAE;AAC1B,MACE,CAAC,OAAO,YACR,CAAC,MAAM,SACP,CAAC,MAAM,QACP,CAAC,MAAM,SAAS,oBAChB,MAAM,SAAS,aAAa;AAE5B,WAAO;AACT,MAAI;AACF,UAAMH,KAAI,MAAM,cAAc,iBAAiB,cAAc,MAAM,SAAS,QAAQ;AAAA,EACtF,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,qBAAqB,MAAM,CAAC,MAAM,CAAC;AACvD,MAAI,CAAC,MAAM,iBAAkB,OAAM,IAAI,MAAM,yCAAyC;AACtF,QAAM,UAAU,OAAO,WAAW,aAAa,MAAM,SAAS;AAC9D,QAAM,UACJ,WACC,OAAO,WAAW,YACjB,OAAO,aAAa,cACpB,MAAM,YAAY,OAAO,EAAE,MAAM,aACjC,CAAC,MAAM,mBAAmB,OAAO,EAAE;AACvC,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,UAAU,YAAY;AAAA,IAC9B,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM;AAAA,IACZ,cAAc,MAAM,SAAS;AAAA,IAC7B,YAAY,oBAAoB,OAAO,EAAE;AAAA,IACzC,QAAQ,UACJ,gHACA;AAAA,EACN;AACF;AAEA,eAAsB,eACpB,MACA,SACA,cACuC;AACvC,MAAI,gBAAgB,QAAS,QAAO;AACpC,QAAM,KAAK,UAAU,OAAO;AAC5B,MAAI;AACF,QAAI,QAAQ,SAAS,SAAS;AAC5B,aAAO,MAAM,mBAAmB,MAAM,SAAS,YAAY;AAC7D,UAAM,SAAS,MAAM,WAAW,MAAM,EAAE;AACxC,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,OAAO,OAAO,GAAG,EAAE;AAEjC,UAAM,UAAU,MAAM,eAAe,MAAM,MAAM,SAAoB,MAAM,UAAU;AACrF,UAAMA,KAAI,MAAM,cAAc,iBAAiB,MAAM,SAAS,MAAM,QAAQ,IAAI;AAChF,UAAM,OAAO;AAAA,MACX;AAAA,MACA,YAAY,WAAW,EAAE;AAAA,MACzB,UAAU,MAAM;AAAA,MAChB,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,cAAc,MAAM,SAAS;AAAA,IAC/B;AACA,QACE,QAAQ,SACR,QAAQ,gBAAgB,MAAM,SAAS,eACvC,OAAO,OAAO,SAAS,MAAM,UAAU,CAAC,MAAM,OAAO,MAAM,SAAS,KAAK;AAEzE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,QACE;AAAA,MACJ;AACF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,MAAM,YAAY,aAAa,aAAa;AAAA,MACpD,QACE,MAAM,YAAY,aACd,qDACA;AAAA,IACR;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC/D;AAAA,EACF;AACF;AAGA,eAAsB,wBAAwB,MAAc;AAC1D,MAAI;AACJ,MAAI;AACF,YAAQ,MAAMF,KAAG,QAAQ,MAAM,UAAU,MAAM,2BAA2B,CAAC;AAAA,EAC7E,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO,CAAC;AAChE,UAAM;AAAA,EACR;AACA,MAAI,MAAM,SAAS,IAAM,OAAM,IAAI,MAAM,kDAAkD;AAC3F,SAAO,QAAQ;AAAA,IACb,MACG,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,CAAC,EACvC,KAAK,EACL,IAAI,OAAO,SAAS,CAAC,MAAM,MAAM,eAAe,MAAM,+BAA+B,IAAI,CAAC,CAAC;AAAA,EAChG;AACF;AAzXA,IAgBME,MAMA,YACAK,eACAJ,iBAQA,uBACAK,cAYA,cAOO,qBAsBA,uBAYP;AAtFN;AAAA;AAAA;AAAA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AAEA,IAAMP,OAAM,OAAO,SAAiBQ,WAEhC,OACE,CAAC,OAAO,WAAW,YAAY,YAAY,EAAE,SAASA,MAAK,CAAC,CAAC,IAAI,gBAAgB,SACjFA,OAAM,EAAE,KAAK,MAAM,SAAS,KAAQ,WAAW,IAAI,OAAO,KAAK,CAAC,GAClE;AACJ,IAAM,aAAaT,IAAE,OAAO,EAAE,MAAM,gBAAgB;AACpD,IAAMM,gBAAeN,IAAE,OAAO,EAAE,MAAM,mBAAmB;AACzD,IAAME,kBAAiBF,IAAE,OAAO;AAAA,MAC9B,MAAMM;AAAA,MACN,aAAa;AAAA,MACb,OAAON,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI;AAAA,MAC1C,MAAMA,IAAE,OAAO,EAAE,IAAI,IAAI,OAAO,IAAI;AAAA,MACpC,iBAAiBM;AAAA,MACjB,OAAON,IAAE,MAAMA,IAAE,OAAO,EAAE,MAAMA,IAAE,OAAO,GAAG,QAAQA,IAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,GAAI;AAAA,IAC9E,CAAC;AACD,IAAM,wBAAwBA,IAAE,KAAK,CAAC,wBAAwB,2BAA2B,CAAC;AAC1F,IAAMO,eAAcP,IAAE,OAAO;AAAA,MAC3B,IAAIA,IAAE,OAAO,EAAE,SAAS;AAAA,MACxB,UAAUA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,MACrD,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI;AAAA,MACvC,SAASA,IAAE,KAAK,CAAC,aAAa,gBAAgB,YAAY,WAAW,CAAC;AAAA,MACtE,YAAY,sBAAsB,SAAS;AAAA,MAC3C,SAAS,eAAe;AAAA,QACtB,CAAC,YAAY,QAAQ,SAAS,SAAS;AAAA,QACvC;AAAA,MACF;AAAA,MACA,UAAUE;AAAA,IACZ,CAAC;AACD,IAAM,eAAeF,IAAE,OAAO;AAAA,MAC5B,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,IAAI;AAAA,MACJ,QAAQA,IAAE,MAAMO,YAAW,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,MAC3C,QAAQ;AAAA,IACV,CAAC;AAEM,IAAM,sBAAsBP,IAAE,OAAO;AAAA,MAC1C,IAAI;AAAA,MACJ,QAAQA,IAAE,KAAK,CAAC,WAAW,YAAY,YAAY,YAAY,CAAC;AAAA,MAChE,QAAQA,IAAE,OAAO;AAAA,MACjB,YAAYA,IAAE,OAAO,EAAE,SAAS;AAAA,MAChC,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,SAASA,IACN,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,SAAS;AAAA,MACZ,cAAcA,IAAE,OAAO,EAAE,SAAS;AAAA,IACpC,CAAC;AAEM,IAAM,wBAAwBA,IAAE,OAAO;AAAA,MAC5C,cAAcA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC9B,WAAW;AAAA,MACX,QAAQA,IACL,KAAK,CAAC,WAAW,aAAa,gBAAgB,YAAY,SAAS,CAAC,EACpE,QAAQ,SAAS;AAAA,MACpB,YAAY,sBAAsB,SAAS;AAAA,MAC3C,UAAUO,aAAY,MAAM,SAAS,SAAS;AAAA,MAC9C,MAAMA,aAAY,MAAM,KAAK,SAAS;AAAA,MACtC,aAAa,WAAW,SAAS;AAAA,IACnC,CAAC;AAED,IAAM,aAAa,CAAC,OAAe,6BAA6B,WAAW,MAAM,EAAE,CAAC;AAAA;AAAA;;;ACnFpF,OAAOG,UAAQ;AACf,OAAOC,YAAU;AAwBjB,eAAsB,aACpB,SACA,UAAwB,CAAC,GACI;AAC7B,SAAO,aAAa,iBAAiB,MAAM,aAAa,SAAS,OAAO,CAAC;AAC3E;AAEA,eAAe,aAAa,SAAiB,SAAoD;AAC/F,QAAM,eAAeA,OAAK,QAAQ,OAAO;AACzC,QAAM,CAAC,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzC,aAAa,YAAY;AAAA,IACzB,kBAAkB,YAAY;AAAA,EAChC,CAAC;AACD,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,SAAsB;AAAA,IAC1B,SAAS;AAAA,IACT,MAAM;AAAA,IACN,cAAc,aAAa;AAAA,IAC3B;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,MAAM,KAAK,IAAI,CAAC,OAAO;AAAA,MACrB,MAAM,EAAE;AAAA,MACR,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,YAAY,EAAE;AAAA,MACd,OAAO,EAAE;AAAA,MACT,WAAW,EAAE;AAAA,IACf,EAAE;AAAA,IACF,kBAAkB;AAAA,IAClB,QAAQ,CAAC;AAAA,IACT,YAAY,CAAC;AAAA,IACb,sBAAsB,CAAC;AAAA,IACvB,eAAe,CAAC;AAAA,IAChB,OAAO;AAAA,EACT;AAIA,MAAI,CAAC,OAAO,aAAc,QAAO;AAEjC,QAAM,kBAAkB,oBAAI,IAAiC;AAC7D,QAAM,kBAAkB,oBAAI,IAAiC;AAC7D,aAAW,OAAO,MAAM;AACtB,UAAMC,QAAO,IAAI,YAAY;AAC7B,QAAIA,SAAQ,CAAC,gBAAgB,IAAIA,KAAI;AACnC,sBAAgB,IAAIA,OAAM,MAAM,qBAAqB,cAAcA,KAAI,CAAC;AAC1E,oBAAgB,IAAI,IAAI,MAAMA,QAAO,gBAAgB,IAAIA,KAAI,IAAK,IAAI;AAAA,EACxE;AAEA,MAAI,mBAAmB;AACvB,MAAI;AACF,UAAMF,KAAG,OAAOC,OAAK,KAAK,cAAc,UAAU,WAAW,CAAC;AAC9D,uBAAmB;AAAA,EACrB,QAAQ;AAAA,EAER;AACA,SAAO,mBAAmB;AAE1B,QAAM,MAAoB;AAAA,IACxB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,kBAAkB,YAAY,GAAG;AACvD,QAAM,WAAW,QAAQ,UAAU;AACnC,aAAW,QAAQ,YAAY;AAC7B,QAAI,CAAC,SAAS,SAAS,IAAI,EAAG;AAC9B,UAAM,aAAa,QAAQ,UAAU,IAAI,KAAK,CAAC;AAC/C,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,WAAW,KACd,OAAO,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,EACvC,IAAI,CAAC,SAAS,EAAE,OAAO,MAAM,KAAK,IAAI,KAAK,EAAE;AAChD,QAAI,SAAS,OAAQ,EAAC,OAAO,mBAAmB,CAAC,GAAG,KAAK,GAAG,QAAQ;AACpE,UAAM,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,OAAO,CAAC,QAAQ,SAAS,IAAI,IAAI,IAAI,CAAC,EAAE;AAC5E,UAAM,EAAE,QAAQ,YAAY,sBAAsB,QAAQ,IAAI,OAAO,QAAQ,WACzE,QAAQ,SAAS,MAAM,MAAM,IAC7B,OAAO,IAAI,EAAE,MAAM;AACvB,WAAO,UAAW,KAAK,IAAI;AAC3B,WAAO,OAAO,KAAK,GAAG,MAAM;AAC5B,UAAM,gBAAgB,MAAM;AAAA,MAC1B;AAAA,MACA,CAAC,GAAG,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,MAChD;AAAA,IACF;AACA,WAAO,WAAW,KAAK,GAAG,WAAW,OAAO,CAAC,MAAM,cAAc,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC;AACnF,eAAW,KAAK;AACd,UAAI,CAAC,cAAc,IAAI,EAAE,OAAO,GAAG;AACjC,SAAC,OAAO,mBAAmB,CAAC,GAAG,KAAK,EAAE,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI,CAAC;AAC1E,WAAO,qBAAsB,KAAK,GAAI,wBAAwB,CAAC,CAAE;AACjE,WAAO,cAAc,KAAK,GAAG,OAAO;AAAA,EACtC;AAEA,SAAO,QAAQ,OAAO,OAAO,WAAW;AACxC,QAAM,WACJ,MAAM,QAAQ;AAAA,IACZ,CAAC,GAAG,OAAO,YAAY,GAAG,OAAO,oBAAqB,EAAE;AAAA,MAAI,CAAC,YAC3D,eAAe,cAAc,SAAS,QAAQ;AAAA,IAChD;AAAA,EACF,GACA,OAAO,CAAC,WAAW,WAAW,IAAI;AACpC,MAAI,QAAQ,OAAQ,QAAO,kBAAkB;AAC7C,SAAO;AACT;AA1IA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAAA;;;ACXA,OAAOE,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,KAAAC,WAAS;AAiGlB,SAAS,YAAY,SAA2B;AAC9C,SACE,EAAE,gBAAgB,YAClB,QAAQ,eAAe,aACvB,CAAC,qBAAqB,gBAAgB,YAAY,EAAE,SAAS,QAAQ,IAAI,KACzE,CAAC,gBAAgB,kBAAkB,iBAAiB,EAAE,SAAS,QAAQ,SAAS,IAAI;AAExF;AACA,SAAS,YAAY,QAAgC;AACnD,SAAO,CAAC,GAAG,OAAO,QAAQ,GAAG,OAAO,YAAY,GAAI,OAAO,wBAAwB,CAAC,CAAE;AACxF;AAEA,eAAe,SAAS,MAA+B;AACrD,QAAM,OAAO,CAAC;AACd,aAAW,OAAO,MAAM,iBAAiB,IAAI,GAAG;AAC9C,QAAI;AACF,YAAMC,WAAU,MAAM,gBAAgB,MAAM,UAAU,MAAM,GAAG,GAAG,KAAK,OAAO,IAAI;AAClF,UAAIA,aAAY;AACd,cAAM,IAAI,MAAM,oDAAoD,GAAG;AACzE,WAAK,KAAK,CAAC,KAAK,OAAOA,QAAO,CAAC,CAAC;AAAA,IAClC,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,SAAU,OAAM;AAC9D,WAAK,KAAK,CAAC,KAAK,IAAI,CAAC;AAAA,IACvB;AAAA,EACF;AACA,SAAO,OAAO,CAAC,OAAO,MAAM,kBAAkB,IAAI,GAAG,KAAK,CAAC;AAC7D;AAGA,eAAe,YACb,MACA,QACA,UAAwB,CAAC,GACI;AAC7B,SAAO,aAAa,gBAAgB,MAAM,gBAAgB,MAAM,QAAQ,OAAO,CAAC;AAClF;AAEA,eAAe,gBAAgB,MAAc,QAAqB,SAAuB;AACvF,QAAM,OAAO,MAAM,kBAAkB,IAAI;AACzC,QAAM,SAAS,MAAM,SAAS,IAAI;AAClC,QAAM,SAAS,MAAM,aAAa,MAAM,EAAE,GAAG,SAAS,OAAO,CAAC;AAC9D,MACE,SAAU,MAAM,kBAAkB,IAAI,KACtC,WAAY,MAAM,SAAS,IAAI,KAC9B,UAAU,OAAO,aAAa,MAC/B;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAqBA,eAAsB,kBACpB,MACA,SACA,KAKA,UACA,aACY;AACZ,QAAM,OAAO,MAAM,kBAAkB,IAAI;AACzC,QAAM,SAAS,oBAAI,IAAyC;AAC5D,QAAM,YAAY,oBAAI,IAAoC;AAC1D,QAAM,UAAU,oBAAI,IAAqD;AACzE,QAAM,cAAc,oBAAI,IAA+C;AACvE,QAAM,OAAO,CACX,OACA,KACA,SACe;AACf,QAAI,CAAC,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,KAAK,KAAK,CAAC;AAC1C,WAAO,MAAM,IAAI,GAAG;AAAA,EACtB;AACA,QAAM,UAAyB;AAAA,IAC7B,OAAO,CAAC,WACN,KAAK,QAAQ,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG,YAAY;AACrD,UACE,eACA,YAAY,aAAa,QACzB,YAAY,SAAS,QACrB,OAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,GAAI,YAAY,aAAa,CAAC,CAAE,EAAE,KAAK,CAAC,GAC/E;AAGA,cAAM,UAAU,gBAAgB,WAAW;AAC3C,cAAM,WACJ,MAAM,QAAQ,IAAI,YAAY,OAAO,EAAE,IAAI,CAAC,MAAM,eAAe,MAAM,GAAG,IAAI,CAAC,CAAC,GAChF,OAAO,CAAC,MAAM,MAAM,IAAI;AAC1B,eAAO,QAAQ;AACf,YAAI,QAAQ,OAAQ,SAAQ,kBAAkB;AAC9C,eAAO;AAAA,MACT;AACA,aAAO,aAAa,MAAM,EAAE,GAAG,SAAS,OAAO,CAAC;AAAA,IAClD,CAAC;AAAA,IACH,UAAU,CAAC,SACT;AAAA,MAAK;AAAA,MAAW;AAAA,MAAM,YACpB,gBAAgB,MAAM,UAAU,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI;AAAA,IAC/D;AAAA,IACF,SAAS,CAACC,UAAS,KAAK,SAASA,OAAM,MAAM,qBAAqB,MAAMA,KAAI,CAAC;AAAA,IAC7E,YAAY,CAAC,KAAK,SAASA,UACzB,KAAK,aAAa,OAAO,CAAC,KAAK,SAASA,KAAI,CAAC,GAAG,MAAM,eAAe,KAAK,SAASA,KAAI,CAAC;AAAA,EAC5F;AACA,QAAM,SAAS,MAAM,IAAI;AAAA,IACvB,SAAS,MAAM,gBAAgB,MAAM,YAAY,SAAS,OAAO;AAAA,IACjE,QAAQ,CAAC,aACP,aAAa,iBAAiB,MAAM,eAAe,MAAM,UAAU,SAAS,OAAO,CAAC;AAAA,IACtF,cAAc,MAAM,QAAQ,MAAM,UAAU;AAAA,EAC9C,CAAC;AACD,QAAM,SAAS;AACf,SAAO;AACT;AAEA,eAAe,gBACb,SACA,QACA,SACA,SACA;AACA,QAAM,OAAO,MAAML,KAAG,SAAS,OAAO;AACtC,QAAM,WAAWG,IAAE,MAAM,WAAW,EAAE,SAAS,EAAE,MAAM,MAAM;AAC7D,QAAM,SAAS,OAAO,UAAU,QAAQ,MAAM,QAAQ,IAAI,YAAY,MAAM,UAAU,OAAO;AAC7F,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,6CAA6C;AAC1E,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,uDAAuD;AAEzE,QAAM,eAAe,aAAa,MAAM,MAAM;AAC9C,QAAM,UAAU;AAAA,IACd,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,QAAQ;AAAA,EACV;AACA,QAAM,eAAe,4BAA4BD,YAAW,IAAI;AAChE,QAAM,eAAe,MAAM,cAAc,EAAE,GAAG,SAAS,QAAQ,OAAO,OAAO,EAAE,CAAC;AAChF,SAAO,EAAE,SAAS,GAAY,QAAQ,WAAoB,cAAc,OAAO;AACjF;AAEA,eAAsB,mBAAmB,SAAiB,cAAsB;AAC9E,QAAM,OAAO,MAAMF,KAAG,SAAS,OAAO;AACtC,QAAM,eAAeC,OAAK,QAAQ,OAAO;AACzC,QAAM,WAAWA,OAAK,WAAW,YAAY,IACzCA,OAAK,SAAS,aAAa,cAAc,YAAY,IAAI,eAAe,MAAM,YAAY,IAC1F;AACJ,QAAM,SAAS,eAAe,MAAM,MAAM,cAAc,MAAM,QAAQ,CAAC;AACvE,QAAM,EAAE,QAAQ,aAAa,GAAG,QAAQ,IAAI;AAC5C,MAAI,OAAO,OAAO,MAAM;AACtB,UAAM,IAAI,MAAM,0DAA0D;AAC5E,MAAI,OAAO,OAAO,SAAS;AACzB,UAAM,IAAI,MAAM,oDAAoD;AACtE,QAAM,WAAW,OAAO;AACxB,SAAO,EAAE,MAAM,UAAU,SAAS;AACpC;AAUA,eAAe,eACb,SACA,cACA,SACA,SAC6B;AAC7B,QAAM,EAAE,MAAM,UAAU,SAAS,IAAI,MAAM,mBAAmB,SAAS,YAAY;AACnF,QAAM,cAAwB,CAAC;AAC/B,MAAI;AACJ,MAAI,UAA8B;AAClC,MAAI;AACF,QAAI,CAAC,QAAS,gBAAe,OAAO,MAAM,wBAAwB,IAAI,CAAC;AACvE,cAAU,OAAO,UACb,QAAQ,MAAM,SAAS,SAAU,IACjC,YAAY,MAAM,SAAS,WAAY,OAAO;AAClD,QAAI,CAAC,QAAS,aAAY,KAAK,6CAA6C;AAAA,aACnE,CAAC,QAAQ,aAAc,aAAY,KAAK,6BAA6B;AAC9E,eAAW,OAAO,SAAS,MAAM;AAC/B,UACE,CAAC,YAAY,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,IAAI,IAAI,KAC5D,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI;AAE9C;AACF,YAAMG,WAAU,OAAO,UACnB,QAAQ,SAAS,IAAI,IAAI,IACzB,gBAAgB,MAAM,UAAU,MAAM,IAAI,IAAI,GAAG,KAAK,OAAO,IAAI;AACrE,UAAIA,aAAY,QAAQ,CAACA,SAAQ,KAAK,GAAG;AACvC,oBAAY;AAAA,UACV,2BACE,IAAI,OACJ;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,QACG,OAAO,UACJ,QAAQ,QAAQ,SAAS,QAAS,IAClC,qBAAqB,MAAM,SAAS,QAAS,OAAQ,MACzD;AACA,kBAAY;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,gBAAY,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,EACzE;AACA,QAAM,cAAc,IAAI,KAAK,UAAU,YAAY,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/F,QAAM,mBAAmB,YAAY,QAAQ;AAC7C,QAAM,cAAc,IAAI,IAAI,iBAAiB,IAAI,SAAS,CAAC;AAC3D,QAAM,cAAc,SAAS,KAAK;AAAA,IAChC,CAAC,QAAQ,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI;AAAA,EACzD;AACA,aAAW,OAAO;AAChB,gBAAY;AAAA,MACV,2BACE,IAAI,OACJ;AAAA,IACJ;AACF,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,iBAAiB,IAAI,OAAO,YAAoC;AAC9D,YAAM,KAAK,UAAU,OAAO;AAC5B,YAAM,MAAM,YAAY,IAAI,EAAE;AAC9B,YAAM,OAAO,EAAE,IAAI,UAAU,SAAS,GAAI,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC,EAAG;AACvE,UAAI,YAAY,UAAU,CAAC,SAAS;AAClC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AACA,UAAI,QAAQ,gBAAgB,WAAW,gBAAgB,MAAM;AAC3D,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AACA,UACE,QAAQ,gBAAgB;AAAA,QACtB,CAAC,aAAa,SAAS,UAAU,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,OAAO;AAAA,MACnF,GACA;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,QACE;AAAA,QACJ;AAAA,MACF;AACA,YAAM,UAAU,QAAQ,cAAc;AAAA,QACpC,CAAC,MAAM,EAAE,UAAU,QAAQ,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACzE;AACA,UAAI,CAAC,QAAQ,WAAW,SAAS,QAAQ,IAAI,KAAK,QAAQ,QAAQ;AAChE,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK;AAAA,QACrD;AAAA,MACF;AACA,YAAM,SAAS,OAAO,SAAS,cAAc;AAAA,QAC3C;AAAA,QACA,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AACA,UAAI,QAAQ;AACV,YAAI,OAAO,WAAW;AACpB,iBAAO,EAAE,GAAG,MAAM,QAAQ,QAAQ,cAAc,QAAQ,OAAO,OAAO;AACxE,YAAI,OAAO,WAAW;AACpB,iBAAO,EAAE,GAAG,MAAM,QAAQ,QAAQ,YAAY,QAAQ,OAAO,OAAO;AACtE,eAAO,EAAE,GAAG,MAAM,QAAQ,QAAQ,mBAAmB,QAAQ,OAAO,OAAO;AAAA,MAC7E;AACA,UACE,EAAE,gBAAgB,YAClB,QAAQ,SAAS,SAAS,0BAC1B,CAAC,QAAQ,SAAS,SAAS,WAC1B,CAAC,OAAQ,EAAE,gBAAgB,QAAQ,IAAI,eAAe,kBACvD;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,QACE;AAAA,QACJ;AAAA,MACF;AACA,UAAI,EAAE,gBAAgB,aAAa,CAAC,YAAY,OAAO,KAAK,MAAM;AAChE,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,SACG,MACG,oDACA,QAAQ,SAAS,iBACf,8GACA,6GACN;AAAA,QACJ;AAAA,MACF;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,QACE;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,EACH;AACA,MAAI,CAAC;AACH,QAAI;AACF,UACE,iBAAiB,OAAO,MAAM,wBAAwB,IAAI,CAAC,KAC3D,SAAS,aAAc,MAAM,kBAAkB,IAAI,GACnD;AACA,oBAAY;AAAA,UACV;AAAA,QACF;AACA,mBAAW,WAAW,UAAU;AAC9B,kBAAQ,SAAS;AACjB,kBAAQ,SAAS,YAAY,GAAG,EAAE;AAAA,QACpC;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,KAAK,OAAO,KAAK,CAAC;AAC9B,iBAAW,WAAW,UAAU;AAC9B,gBAAQ,SAAS;AACjB,gBAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AACF,QAAM,cAAc,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAC5F,QAAM,cAAc,IAAI;AAAA,IACtB,SAAS,iBACL,OAAO,CAAC,WAAW,OAAO,WAAW,SAAS,EAC/C,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,EAC9B;AACA,QAAM,SAAuC;AAAA,IAC3C,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,YAAY;AAAA,EACd;AACA,aAAW,KAAK,SAAU,QAAO,EAAE,MAAM;AACzC,QAAM,aACJ,YAAY,SAAS,KACrB,OAAO,aAAa,KACpB,OAAO,iBAAiB,IAAI,MAC3B,SAAS,cAAc,UAAU,KAAK,KACvC,YAAY;AAAA,IACV,CAAC,MACC,EAAE,gBAAgB,MAAM,EAAE,eAAe,mBAAmB,CAAC,YAAY,IAAI,UAAU,CAAC,CAAC;AAAA,EAC7F;AACF,QAAM,eAAe,OAAO,aAAa,KAAK,YAAY,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACvF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,cAAc,SAAS;AAAA,IACvB,aAAa,SAAS,eAAe,QAAQ,WAAY;AAAA,IACzD,QAAQ,aAAa,eAAe,eAAe,kBAAkB;AAAA,IACrE;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,OACE;AAAA,EACJ;AACF;AAzeA,IA8BME,QAEO,cA4BP,gBAkBO;AA9Eb;AAAA;AAAA;AAAA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AASA;AAMA;AACA,IAAMA,SAAQH,IAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAEpC,IAAM,eAAeA,IAAE,OAAO;AAAA,MACnC,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,MAAMA,IAAE,OAAO;AAAA,MACf,cAAcA,IAAE,QAAQ,IAAI;AAAA,MAC5B,UAAU,aAAa,MAAM;AAAA,MAC7B,WAAWA,IAAE,MAAM,WAAW,EAAE,SAAS;AAAA,MACzC,MAAMA,IACH;AAAA,QACCA,IAAE,OAAO;AAAA,UACP,MAAMA,IAAE,OAAO,EAAE,OAAO,CAAC,UAAU,kBAAkB,KAAK,MAAM,KAAK;AAAA,UACrE,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,MAAMA,IAAE,KAAK,CAAC,gBAAgB,UAAU,OAAO,CAAC,EAAE,SAAS;AAAA,UAC3D,YAAY,aAAa,SAAS;AAAA,UAClC,OAAOA,IAAE,QAAQ;AAAA,UACjB,WAAWG;AAAA,QACb,CAAC;AAAA,MACH,EACC,SAAS;AAAA,MACZ,kBAAkBH,IAAE,QAAQ;AAAA,MAC5B,OAAOA,IAAE,QAAQ;AAAA,MACjB,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,EAAE,OAAO,aAAa,KAAKA,IAAE,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS;AAAA,MACpF,QAAQA,IAAE,MAAM,WAAW;AAAA,MAC3B,YAAYA,IAAE,MAAM,cAAc;AAAA,MAClC,sBAAsBA,IAAE,MAAM,cAAc,EAAE,SAAS;AAAA,MACvD,eAAeA,IAAE;AAAA,QACfA,IAAE,OAAO,EAAE,OAAOA,IAAE,OAAO,GAAG,QAAQA,IAAE,OAAO,GAAG,KAAKA,IAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,MAChF;AAAA,IACF,CAAC;AACD,IAAM,iBAAiBA,IAAE,OAAO;AAAA,MAC9B,MAAMA,IAAE,QAAQ,oBAAoB;AAAA,MACpC,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,WAAWA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,QAAQ;AAAA,MACR,QAAQA,IAAE,OAAO,EAAE,MAAM,gBAAgB;AAAA,IAC3C,CAAC;AAYM,IAAM,sBAAsBA,IAAE,OAAO;AAAA,MAC1C,IAAIA,IAAE,OAAO;AAAA,MACb,UAAUA,IAAE,MAAM,CAAC,aAAa,cAAc,CAAC;AAAA,MAC/C,QAAQA,IAAE,KAAK,CAAC,YAAY,cAAc,mBAAmB,YAAY,CAAC;AAAA,MAC1E,QAAQA,IAAE,OAAO;AAAA,MACjB,SAASA,IAAE,MAAM,CAAC,aAAa,cAAc,CAAC,EAAE,SAAS;AAAA,MACzD,QAAQ,oBAAoB,SAAS;AAAA,IACvC,CAAC;AAAA;AAAA;;;ACzED,OAAOI,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,KAAAC,WAAS;AAmBlB,eAAsBC,KAAI,SAAiBC,OAAiC;AAC1E,SAAO;AAAA,IACL;AAAA,IACA,aACG,MAAM,QAAQA,OAAM,EAAE,KAAK,MAAM,WAAW,KAAK,OAAO,MAAM,SAAS,IAAM,CAAC,GAAG;AAAA,EACtF;AACF;AAEA,eAAsB,UAAU,KAAa;AAC3C,QAAM,OAAO,MAAML,KAAG,UAAU,MAAMI,KAAI,KAAK,aAAa,iBAAiB,GAAG,KAAK,CAAC;AACtF,QAAM,CAAC,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzCA,KAAI,MAAM,aAAa,oBAAoB,EAAE,KAAK,CAAC,UAAUJ,KAAG,SAAS,MAAM,KAAK,CAAC,CAAC;AAAA,IACtFI,KAAI,MAAM,gBAAgB,WAAW,MAAM,EAAE;AAAA,MAC3C,CAAC,UAAU,MAAM,KAAK;AAAA,MACtB,MAAM;AAAA,IACR;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,+BAA+B,KAAK,CAAC,MAAM,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE;AAAA,EACpF;AACF;AAYA,eAAe,wBAAwB,MAAc,SAA2B;AAC9E,QAAME,UAAS,IAAI;AAAA,IACjB,QACG,OAAO,CAAC,WAAW,OAAO,WAAW,QAAQ,EAC7C,IAAI,CAAC,WAAW;AACf,YAAM,UAAU,gBAAgB,MAAM,EAAE,KAAK;AAC7C,aAAO,CAAC,KAAK,UAAU,OAAO,GAAG,OAAO;AAAA,IAC1C,CAAC;AAAA,EACL;AAGA,QAAM,WAAW,MAAM,oBAAoB,MAAM,CAAC,GAAGA,QAAO,OAAO,CAAC,CAAC;AACrE,QAAM,kBAAkB,IAAI,IAAI,CAAC,GAAGA,QAAO,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,SAAS,KAAK,CAAC,CAAC,CAAC;AAC9F,QAAM,mBAA+C,CAAC;AACtD,aAAW,UAAU,QAAQ,OAAO,CAACC,YAAWA,QAAO,WAAW,QAAQ,GAAG;AAC3E,UAAM,MAAM,KAAK,UAAU,gBAAgB,MAAM,EAAE,KAAK,CAAC;AACzD,qBAAiB,OAAO,EAAE,IAAI;AAAA,MAC5B,QAAQ,yBAAyB,MAAM;AAAA,MACvC,SAAS,gBAAgB,IAAI,GAAG;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAsB,mBAAmB,MAA+B;AACtE,QAAM,CAAC,MAAM,KAAK,OAAO,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtEH,KAAI,MAAM,aAAa,MAAM,EAAE,KAAK,CAACI,UAASA,MAAK,KAAK,CAAC;AAAA,IACzD,mBAAmB,IAAI;AAAA,IACvB,kBAAkB,IAAI;AAAA,IACtBJ,KAAI,MAAM,aAAa,cAAc,SAAS;AAAA,IAC9CA,KAAI,MAAM,gBAAgB,qCAAqC,cAAc;AAAA,EAC/E,CAAC;AACD,MAAI,IAAI,YAAY,UAAU,MAAM,YAAY;AAC9C,UAAM,IAAI;AAAA,MACR,kCACE,CAAC,GAAG,IAAI,aAAa,GAAG,MAAM,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAAA,IAC9F;AACF,QAAM,mBAAmB,MAAM,wBAAwB,MAAM,MAAM,OAAO;AAC1E,QAAM,UAAU,MAAMJ,KACnB,SAASC,OAAK,QAAQ,MAAM,YAAY,KAAK,CAAC,GAAG,MAAM,EACvD,MAAM,CAAC,UAAmB;AACzB,QAAI,aAAa,OAAO,QAAQ,EAAG,QAAO;AAC1C,UAAM;AAAA,EACR,CAAC;AACH,QAAM,cAAc,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,MACJ,qBAAqB;AAAA,MACrB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,eAAsB,WAAW,MAA+B;AAC9D,SAAO,aAAa,qBAAqB,MAAM,cAAc,IAAI,CAAC;AACpE;AAEA,eAAe,cAAc,MAA+B;AAC1D,QAAM,WAAW,MAAM,iBAAiB,IAAI;AAC5C,QAAM,eAAe,MAAM,kBAAkB,IAAI,GAAG;AACpD,QAAM,UAAU,oBAAI,IAA4B;AAChD,aAAW,QAAQ,CAAC,qBAAqB,cAAc,eAAe,cAAc,GAAY;AAC9F,YAAQ,IAAI,MAAM,MAAM,mBAAmB,MAAM,UAAU,aAAa,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC;AAAA,EAChG;AACA,QAAM,CAAC,UAAU,WAAW,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzEG,KAAI,MAAM,aAAa,MAAM;AAAA,IAC7B,SAAS,SACLA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,SAAS,IAAI,CAAC,MAAM,aAAa,CAAC,EAAE;AAAA,IACzC,IACA;AAAA,IACJA,KAAI,MAAM,aAAa,cAAc,SAAS;AAAA,IAC9CA,KAAI,MAAM,gBAAgB,qCAAqC,cAAc;AAAA,EAC/E,CAAC;AACD,QAAM,OAAO,SAAS,KAAK;AAC3B,MAAI,UAAyB;AAC7B,MAAI;AACF,cAAU,MAAMJ,KAAG,SAASC,OAAK,QAAQ,MAAM,YAAY,KAAK,CAAC,GAAG,MAAM;AAAA,EAC5E,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,OAAM;AAAA,EAChE;AACA,QAAM,OAAsC,CAAC;AAC7C,QAAM,cAA8C,CAAC;AACrD,QAAM,aAAa,CAAC;AACpB,QAAM,SAA4C,CAAC;AACnD,QAAM,WAAW,oBAAI,IAA8B;AACnD,QAAMQ,UAAS,CAAC,SAAiB;AAC/B,QAAI,CAAC,SAAS,IAAI,IAAI,EAAG,UAAS,IAAI,MAAM,WAAW,MAAM,IAAI,CAAC;AAClE,WAAO,SAAS,IAAI,IAAI;AAAA,EAC1B;AACA,aAAW,QAAQ,UAAU;AAC3B,UAAMD,QAAO,MAAM,QAAQ,MAAM,IAAI;AACrC,SAAK,IAAI,IAAIA,UAAS,OAAO,OAAO,KAAKA,KAAI;AAC7C,gBAAY,KAAK,CAAC,MAAMA,KAAI,CAAC;AAC7B,UAAM,SAAS,EAAE,MAAM,MAAM,SAASA,SAAQ,IAAI,QAAQ,cAAcA,SAAQ,EAAE,EAAE;AACpF,eAAW,KAAK,MAAM;AACtB,eAAW,SAAS,QAAQ,IAAI,mBAAmB,EAAG,IAAI,IAAI,IAAI,OAAO,OAAO,QAAQ,CAAC,GAAG;AAC1F,YAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,UAAI,OAAO,WAAW,KAAK,eAAe,EAAG;AAC7C,iBAAW,aAAa,OAAO,cAAc,CAAC,GAAG;AAC/C,YAAI,kBAAkB,SAAS,EAAG;AAClC,cAAM,CAAC,aAAa,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,UACrDC,QAAO,SAAS;AAAA,UAChBA,QAAOR,OAAK,MAAM,QAAQ,SAAS,CAAC;AAAA,QACtC,CAAC;AACD,eAAO,KAAK,CAAC,WAAW,aAAa,aAAa,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACA,QAAM,eAAe;AAAA,IACnB,WAAW,OAAO,CAAC,QAAQ,QAAQ,IAAI,YAAY,EAAG,IAAI,IAAI,IAAI,CAAC;AAAA,EACrE;AACA,QAAM,cAAc,WACjB,OAAO,CAAC,QAAQ,QAAQ,IAAI,aAAa,EAAG,IAAI,IAAI,IAAI,CAAC,EACzD,QAAQ,CAAC,QAAQ,IAAI,OAAO,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,MAAM,MAAM,EAAE,CAAC;AAChF,QAAM,oBAAoB,MAAM,UAAU,MAAM,kBAAkB;AAClE,QAAM,mBAAmB,MAAMD,KAAG,MAAM,iBAAiB,EAAE;AAAA,IACzD,CAAC,SAAU,KAAK,YAAY,IAAI,cAAc;AAAA,IAC9C,CAAC,UAAmB;AAClB,UAAI,aAAa,OAAO,QAAQ,EAAG,QAAO;AAC1C,YAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM,CAAC,SAAS,QAAQU,WAAU,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpE,eAAe,iBAAiB,MAAM,YAAY,IAAI,CAAC;AAAA,IACvD,QAAQ,IAAI,YAAY,IAAI,CAAC,EAAE,KAAK,MAAM,MAAM,sBAAsB,MAAM,KAAK,KAAK,CAAC,CAAC;AAAA,IACxF;AAAA,MACE;AAAA,MACA,WAAW,OAAO,CAAC,QAAQ,QAAQ,IAAI,cAAc,EAAG,IAAI,IAAI,IAAI,CAAC;AAAA,IACvE;AAAA,IACA,mBAAmB,IAAI;AAAA,EACzB,CAAC;AACD,MAAI,eAAe,YAAY;AAC7B,UAAM,IAAI;AAAA,MACR,kCACE,eAAe,YAAY,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAAA,IAC9E;AACF,QAAM,YAAY,eAAe;AAGjC,QAAM,CAAC,QAAQ,KAAK,IAAI,UAAU,SAC9B,MAAM,QAAQ,IAAI;AAAA,IAChBN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACAA,KAAI,MAAM,YAAY,WAAW,MAAM,MAAM,KAAK,0BAA0B;AAAA,EAC9E,CAAC,IACD,CAAC,IAAI,EAAE;AACX,QAAM,UAAU,UAAU,UAAU,MAAM,kBAAkB,IAAI,GAAG,UAAU,CAAC;AAC9E,QAAM,mBAAmB,MAAM,wBAAwB,MAAM,OAAO;AACpE,QAAM,gBAAgB,OAAO,QAAQ,gBAAgB;AACrD,QAAM,SAAS,CAAC,GAAG,eAAe,MAAM,SAAS,cAAc,aAAa,WAAW;AACvF,QAAM,OAAkC;AAAA,IACtC,qBAAqB,KAAK,CAAC,QAAQ,QAAQ,SAAS,CAAC;AAAA,IACrD,cAAc,KAAK,CAAC,QAAQ,OAAO,CAAC;AAAA,IACpC,eAAe,KAAK,CAAC,QAAQ,MAAM,CAAC;AAAA,IACpC,gBAAgB,KAAK,CAAC,QAAQM,SAAQ,CAAC;AAAA,IACvC,gBAAgB,KAAK,CAAC,QAAQ,SAAS,CAAC;AAAA,IACxC,yBAAyB,KAAK;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,aAAa,KAAK,CAAC,MAAM,MAAM,wBAAwB,IAAI,CAAC,CAAC;AAAA,IAC7D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAOO,SAAS,WAAW,KAAc,QAAgB;AACvD,MAAI,UAAgE,CAAC;AACrE,MAAI,aAA4B;AAChC,MAAI,QAAQ,MAAM;AAChB,UAAM,SAAS,YAAY,UAAU,GAAG;AACxC,QAAI,OAAO,WAAW,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,OAAO;AACnE,gBAAU,OAAO,KAAK;AAAA,QACnB,cAAa;AAAA,EACpB;AACA,QAAM,MAAM,oBAAI,IAAe,GAC7B,SAAS,oBAAI,IAAe;AAC9B,QAAM,UAAwB;AAAA,IAC5B,UAAU,OAAO,MAAM,QAAQ;AAC7B,UAAI,QAAQ,IAAI,GAAG,QAAQ,OAAO,KAAK,IAAI,GAAG;AAC5C,eAAO,IAAI,IAAI;AACf,eAAO,gBAAgB,QAAQ,IAAI,EAAE,MAAM;AAAA,MAC7C;AACA,YAAM,SAAS,MAAM,aAAa,WAAW,MAAM,MAAM,OAAO,IAAI,EAAE,GAAG,CAAC;AAC1E,UAAI,IAAI,IAAI;AAEZ,UAAI,CAAC,OAAO,QAAQ,OAAQ,SAAQ,IAAI,IAAI,EAAE,KAAK,OAAO,KAAK,IAAI,GAAG,OAAO;AAAA,UACxE,QAAO,QAAQ,IAAI;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,CAAC,SACJ,QAAQ,IAAI,GAAG,QAAQ,OAAO,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,OAAO,QAAQ;AAAA,IAC5E,WAAW,MAAM;AACf,YAAM,YAAY,YAAY,MAAM,QAAQ,MAAM,OAAO;AACzD,aAAO,EAAE,SAAS,GAAG,SAAS,WAAW,QAAQ,KAAK,SAAS,EAAE;AAAA,IACnE;AAAA,EACF;AACF;AA7TA,IA+BM,eACO,MA2BP,SAwNA;AAnRN;AAAA;AAAA;AAAA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAGA,IAAM,gBAAgB,OAAkC,WAAc;AAC/D,IAAM,OAAO,CAAC,UACnBR,YAAW,QAAQ,EAAE,OAAO,KAAK,UAAU,KAAK,CAAC,EAAE,OAAO,KAAK;AA0BjE,IAAM,UAAU;AAwNhB,IAAM,cAAcC,IAAE,OAAO;AAAA,MAC3B,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,SAASA,IAAE,OAAOA,IAAE,OAAO,EAAE,KAAKA,IAAE,OAAO,GAAG,QAAQ,kBAAkB,CAAC,CAAC;AAAA,MAC1E,QAAQA,IAAE,OAAO;AAAA,IACnB,CAAC;AAAA;AAAA;;;ACvRD,SAAS,KAAAQ,WAAS;AAUlB,eAAsB,qBAAqB,MAAc;AACvD,QAAM,MAAM,MAAM,cAAc,MAAM,UAAU;AAChD,SAAO,QAAQ,OACX,EAAE,SAAS,GAAY,WAAW,QAAiB,IACnD,aAAa,MAAM,GAAG;AAC5B;AAEA,eAAsB,mBAAmB,KAAa,OAAgB;AACpE,QAAM,YAAY,gBAAgB,MAAM,KAAK;AAC7C,QAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,SAAO,SAAS,GAAG,MAAM,WAAW,YAAY;AAC9C,UAAM,SAAS,EAAE,GAAI,MAAM,qBAAqB,GAAG,IAAI,GAAI,UAAU;AACrE,UAAM,eAAe,GAAG,MAAM,YAAY,MAAM;AAChD,WAAO;AAAA,EACT,CAAC;AACH;AAzBA,IAKa,iBACP,cACA,WACA;AARN;AAAA;AAAA;AACA;AACA;AACA;AAEO,IAAM,kBAAkBA,IAAE,KAAK,CAAC,OAAO,OAAO,CAAC;AACtD,IAAM,eAAeA,IAAE,OAAO,EAAE,SAASA,IAAE,QAAQ,CAAC,GAAG,WAAW,gBAAgB,CAAC;AACnF,IAAM,YAAY;AAClB,IAAM,aAAa,YAAY;AAAA;AAAA;;;ACP/B,OAAOC,UAAQ;AACf,SAAS,KAAAC,WAAS;AAqClB,eAAe,QAAQ,MAAc;AACnC,QAAM,MAAM,MAAM,cAAc,MAAMC,WAAU;AAChD,SAAO,QAAQ,QAAQC,cAAa,MAAM,GAAG,EAAE;AACjD;AACA,eAAsB,oBACpB,KACA,OACA,UAAqC,CAAC,GACtC;AACA,QAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,QAAM,aAAa,MAAM,cAAc,GAAG,MAAMC,YAAW,YAAY;AACrE,QAAI,QAAQ,aAAa;AACvB,YAAM,WAAW,MAAM,cAAc,GAAG,MAAMF,WAAU;AACxD,UAAI,aAAa,KAAM,QAAOC,cAAa,MAAM,QAAQ,EAAE;AAAA,IAC7D;AAEA,UAAM,SAAS,MAAM,UAAU,GAAG,MAAMC,aAAY,eAAe,IAAI;AACvE,QAAI;AACF,YAAMJ,KAAG,UAAU,QAAQ,OAAO,EAAE,MAAM,MAAM,MAAM,IAAM,CAAC;AAAA,IAC/D,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,SAAU,OAAM;AAAA,IAChE;AACA,UAAM,eAAe,GAAG,MAAME,aAAY,EAAE,SAAS,GAAG,SAAS,MAAM,CAAC;AACxE,WAAO;AAAA,EACT,CAAC;AACD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAASE;AAAA,IACT,MAAM;AAAA,EACR;AACF;AAGA,eAAsB,kBACpB,MACA,OACA,QACA,OACA,YACA,WACA,cAAa,oBAAI,KAAK,GAAE,YAAY,GACpC;AACA,MAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,aAAa,CAAE,MAAM,QAAQ,IAAI,EAAI;AAC/D,QAAM,KAAK,MAAM,UAAU,IAAI;AAC/B,QAAM,cAAc,GAAG,MAAMA,YAAW,YAAY;AAClD,QAAI,CAAE,MAAM,QAAQ,IAAI,EAAI;AAC5B,UAAM,MAAM,MAAM,cAAc,MAAM,UAAU,EAAE,CAAC;AACnD,UAAM,QAAQ,QAAQ,OAAOC,OAAM,IAAIC,aAAY,MAAM,GAAG;AAC5D,UAAM,MAAM;AACZ,UAAM,MAAM,KAAK,CAAC,MAAM,MAAM,MAAM,SAAS,CAAC;AAC9C,UAAM,UAAW,MAAM,SAAS,GAAG,MAAM;AAAA,MACvC,MAAM,MAAM;AAAA,MACZ,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU,CAAC;AAAA,MACX,WAAW,CAAC;AAAA,MACZ,mBAAmB;AAAA,MACnB,YAAY,CAAC;AAAA,MACb,YAAY,OAAO;AAAA,MACnB,WAAW;AAAA,IACb;AACA,UAAM,QAAQ,OAAO,QAAQ;AAC7B,QAAI,OAAO;AACT,cAAQ,YAAY;AACpB,cAAQ,aAAa,OAAO;AAAA,IAC9B;AACA,YAAQ;AACR,YAAQ,WAAW,KAAK,IAAI,GAAG,SAAS;AACxC,QAAI,OAAO;AACT,UAAI,MAAM,UAAU,WAAY,SAAQ,UAAU;AAAA,UAC7C,QAAO,QAAQ;AAAA,IACtB;AAGA,QAAI,iBAAoF,CAAC;AACzF,QACE,CAAC,SACD,CAAC,GAAG,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,WAAW,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,SAAS,EAAE,EAAE,CAAC,GACrF;AACA,UAAI;AACF,YAAI,CAAC,QAAQ,WAAW,WAAW,GAAG,YAAY,UAAU;AAC1D,gBAAM,IAAI,MAAM,wBAAwB;AAC1C,yBAAiBL,IACd,OAAO;AAAA,UACN,UAAUA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAIA,IAAE,OAAO,GAAG,QAAQM,eAAc,MAAM,OAAO,CAAC,CAAC;AAAA,QACpF,CAAC,EACA,MAAM,MAAM,cAAc,MAAM,QAAQ,UAAU,CAAC,EAAE;AAAA,MAC1D,QAAQ;AAAA,MAER;AAAA,IACF;AACA,eAAW,CAAC,SAAS,QAAQ,KAAK;AAAA,MAChC,CAAC,SAAS,KAAK;AAAA,MACf,CAAC,cAAc,UAAU;AAAA,IAC3B,GAAY;AACV,iBAAW,WAAW,SAAS,MAAM,GAAG,CAAC,GAAG;AAC1C,YAAI,CAAC,QAAQ,SAAS,QAAQ,EAAE,KAAK,OAAO,KAAK,QAAQ,QAAQ,EAAE,UAAU,KAAK;AAChF,kBAAQ,YAAY;AACpB;AAAA,QACF;AACA,cAAM,QAAS,QAAQ,SAAS,QAAQ,EAAE,MAAM;AAAA,UAC9C,MAAM,QAAQ,SAAS;AAAA,UACvB,UAAU,CAAC;AAAA,UACX,QAAQ,QACJ,QAAQ,SACP,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE,GAAG,UAAU;AAAA,UAChE,aAAa;AAAA,UACb,YAAY,QAAQ,MAAM,QAAQ;AAAA,QACpC;AACA,YAAI,CAAC,MAAM,SAAS,SAAS,OAAO,EAAG,OAAM,SAAS,KAAK,OAAO;AAAA,MACpE;AAAA,IACF;AACA,eAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AAC1D,UAAI,MAAM,MAAM,WAAY;AAC5B,YAAM,UAAU,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACvD,YAAM,SAAS,SAAS,UAAU;AAClC,YAAM,aAAa;AAAA,IACrB;AAEA,QAAI,MAAM,yBAAyB,UAAa,MAAM,QAAQ;AAC5D,YAAM,UAAU,KAAK,CAAC,MAAM,MAAM,CAAC;AACnC,UAAI,CAAC,QAAQ,WAAW,SAAS,OAAO,GAAG;AACzC,gBAAQ,oBAAoB;AAC5B,cAAM,YAAY;AAAA,UAChB,GAAG,oBAAI,IAAI,CAAC,GAAG,QAAQ,WAAW,GAAG,MAAM,qBAAqB,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAAA,QAC1F;AACA,YAAI,UAAU,SAAS,IAAK,SAAQ,YAAY;AAChD,gBAAQ,YAAY,UAAU,MAAM,GAAG,GAAG;AAC1C,gBAAQ,aAAa,CAAC,GAAG,QAAQ,YAAY,OAAO,EAAE,MAAM,IAAI;AAAA,MAClE;AAAA,IACF;AACA,UAAM,OAAO,OAAO,KAAK,MAAM,QAAQ,EAAE;AAAA,MAAK,CAAC,GAAG,MAChD,MAAM,SAAS,CAAC,EAAE,UAAU,cAAc,MAAM,SAAS,CAAC,EAAE,SAAS;AAAA,IACvE;AACA,eAAWC,QAAO,KAAK,MAAM,EAAE,EAAG,QAAO,MAAM,SAASA,IAAG;AAC3D,UAAM,eAAe,MAAM,UAAU,EAAE,GAAG,KAAK;AAAA,EACjD,CAAC;AACH;AACA,eAAsB,eACpB,KACA,WACAC,YACA,QACA;AACA,QAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,SAAO,cAAc,GAAG,MAAML,YAAW,YAAY;AACnD,UAAM,QAAQE,aAAY,MAAM,MAAM,cAAc,GAAG,MAAM,UAAU,EAAE,CAAC,CAAC;AAC3E,UAAM,UAAU,MAAM,SAAS,SAAS,GAAG,SAASG,UAAS;AAC7D,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,kEAAkE;AACpF,YAAQ,SAAS,iBAAiB,MAAM,MAAM;AAC9C,UAAM,eAAe,GAAG,MAAM,UAAU,EAAE,GAAG,KAAK;AAClD,WAAO,EAAE,SAAS,WAAW,SAASA,YAAW,OAAO;AAAA,EAC1D,CAAC;AACH;AACA,eAAsB,iBAAiB,KAAa,WAAoB;AACtE,QAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,QAAM,MAAM,MAAM,cAAc,GAAG,MAAM,UAAU,EAAE,CAAC;AACtD,QAAM,QAAQ,QAAQ,OAAOJ,OAAM,IAAIC,aAAY,MAAM,GAAG;AAC5D,MAAI,cAAc,UAAa,CAAC,OAAO,OAAO,MAAM,UAAU,SAAS;AACrE,UAAM,IAAI,MAAM,uEAAuE;AACzF,QAAM,WAAW,OAAO,QAAQ,MAAM,QAAQ,EAC3C,OAAO,CAAC,CAAC,EAAE,MAAM,cAAc,UAAa,OAAO,SAAS,EAC5D,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC,EAC7D,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO;AAAA,IACjB;AAAA,IACA,GAAG;AAAA,IACH,YAAY;AAAA,IACZ,WAAW,OAAO,KAAK,EAAE,QAAQ,EAAE;AAAA,IACnC,UAAU,OAAO,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE;AAAA,IAC3E,SAAS,OAAO,OAAO,EAAE,QAAQ,EAAE;AAAA,MACjC,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW;AAAA,IAChD,EAAE;AAAA,IACF,MAAM,OAAO,OAAO,EAAE,QAAQ,EAAE;AAAA,MAC9B,CAAC,MAAM,EAAE,WAAW,gBAAgB,EAAE,WAAW;AAAA,IACnD,EAAE;AAAA,IACF,SAAS,OAAO;AAAA,MACd,iBAAiB,QAAQ,IAAI,CAAC,WAAW;AAAA,QACvC;AAAA,QACA,OAAO,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,IACA,UAAU,OAAO,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE;AAAA,IAC3E,oBAAoB,EAAE,oBAAoB,EAAE,UAAU,SAAS;AAAA,IAC/D,aAAa;AAAA,IACb,aAAa;AAAA,EACf,EAAE;AACJ,QAAM,MAAM,CAAC,SACX,SAAS,OAAO,CAAC,OAAO,MAAM,QAAQ,KAAK,CAAC,GAAG,CAAC;AAClD,QAAM,4BAA4B,SAAS,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE;AAC9E,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,MAAM,QAAQ,GAAG,IAAI;AAAA,IAC9B,QAAQ,GAAG;AAAA,IACX,WAAW,aAAa;AAAA,IACxB,SAAS;AAAA,MACP,UAAU,SAAS;AAAA,MACnB,WAAW,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,MACjC,UAAU,IAAI,CAAC,MAAM,EAAE,QAAQ;AAAA,MAC/B,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MACvB,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,MAC7B,SAAS,OAAO;AAAA,QACd,iBAAiB,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC;AAAA,MAClF;AAAA,MACA,oBAAoB,4BAA4B,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,IAAI;AAAA,MACxF;AAAA,MACA,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,MAC3B,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,MAC7B,mBAAmB,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE;AAAA,MACvD,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF;AACF;AACO,SAAS,oBAAoB,QAAsD;AACxF,QAAM,IAAI,OAAO;AACjB,SAAO;AAAA,IACL,+BAA0B,OAAO,UAAU,YAAY,UAAU;AAAA,IACjE,GAAG,EAAE,QAAQ,uBAAuB,OAAO,YAAY,cAAc,iBAAiB;AAAA,IACtF,aAAa,EAAE,SAAS,eAAe,EAAE,QAAQ,uBAAuB,EAAE,IAAI,UAAU,EAAE,OAAO;AAAA,IACjG,aAAa,EAAE,QAAQ,OAAO,aAAa,EAAE,QAAQ,cAAc,CAAC,kBAAkB,EAAE,QAAQ,UAAU,gBAAgB,EAAE,QAAQ,QAAQ;AAAA,IAC5I,8BAA8B,EAAE,sBAAsB,SAAS,KAAK,EAAE,yBAAyB,IAAI,EAAE,QAAQ;AAAA,IAC7G,gBAAgB,EAAE,UAAU,KAAM,QAAQ,CAAC,CAAC,mBAAmB,EAAE,MAAM;AAAA,IACvE,GAAI,EAAE,oBACF,CAAC,GAAG,EAAE,iBAAiB,0CAA0C,IACjE,CAAC;AAAA,IACL,GAAI,OAAO,YACP,OAAO,SAAS,QAAQ,CAAC,YAAY;AAAA,MACnC,WAAW,QAAQ,EAAE,KAAK,QAAQ,IAAI,YAAO,QAAQ,UAAU,wBAAwB,QAAQ,UAAU,wBAAwB;AAAA,MACjI,aAAa,QAAQ,UAAU;AAAA,MAC/B,GAAG,OAAO,QAAQ,QAAQ,QAAQ,EAAE;AAAA,QAClC,CAAC,CAAC,IAAI,CAAC,MACL,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE,SAAS,KAAK,GAAG,CAAC,GAAG,EAAE,SAAS,aAAa,EAAE,SAAS,EAAE;AAAA,MACpG;AAAA,IACF,CAAC,IACD;AAAA,MACE,EAAE,WACE,iEACA;AAAA,IACN;AAAA,IACJ;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAGO,SAAS,mBACd,MACA,UACsB;AACtB,MAAI,CAAC,8BAA8B,KAAK,QAAQ,EAAE,EAAG,QAAO;AAC5D,MAAI;AACF,QAAI,QAAiB,OAAO,aAAa,WAAW,KAAK,MAAM,QAAQ,IAAI;AAC3E,QAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,QAAI,MAAM,QAAS,QAAO;AAC1B,QAAI,MAAM,QAAQ,OAAO,OAAO,GAAG;AACjC,YAAM,QAAiB,MAAM,QAAQ;AAAA,QACnC,CAAC,SAAkB,SAAS,IAAI,KAAK,KAAK,SAAS,UAAU,OAAO,KAAK,SAAS;AAAA,MACpF;AACA,UAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,CAAC,MAAM,KAAM,QAAO;AAC9E,YAAMI,QAAO,MAAM;AACnB,cAAQ,KAAK,MAAMA,KAAI;AAAA,IACzB;AACA,QAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,SAAS,EAAG,QAAO;AAC3D,WAAO,OAAO,KAAK,MAAM,SAAS,EAC/B,OAAO,CAAC,OAAO,yBAAyB,KAAK,EAAE,CAAC,EAChD,MAAM,GAAG,GAAG;AAAA,EACjB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAvTA,IASMN,YACAF,aACAC,eACO,kBACPI,gBAQA,eAaAD,cAEAD,QACA;AArCN;AAAA;AAAA;AAAA;AAGA;AACA;AACA;AAIA,IAAMD,aAAY;AAClB,IAAMF,cAAaE,aAAY;AAC/B,IAAMD,gBAAeF,IAAE,OAAO,EAAE,SAASA,IAAE,QAAQ,CAAC,GAAG,SAASA,IAAE,QAAQ,EAAE,CAAC;AACtE,IAAM,mBAAmBA,IAAE,KAAK,CAAC,WAAW,gBAAgB,cAAc,UAAU,CAAC;AAC5F,IAAMM,iBAAgBN,IAAE,OAAO;AAAA,MAC7B,MAAMA,IAAE,OAAO;AAAA,MACf,UAAUA,IAAE,MAAMA,IAAE,KAAK,CAAC,SAAS,YAAY,CAAC,CAAC;AAAA,MACjD,QAAQA,IAAE,KAAK,CAAC,YAAY,cAAc,mBAAmB,cAAc,SAAS,CAAC;AAAA,MACrF,aAAaA,IAAE,OAAO;AAAA,MACtB,YAAYA,IAAE,OAAO;AAAA,MACrB,QAAQ,iBAAiB,SAAS;AAAA,IACpC,CAAC;AACD,IAAM,gBAAgBA,IAAE,OAAO;AAAA,MAC7B,MAAMA,IAAE,OAAO;AAAA,MACf,WAAWA,IAAE,OAAO;AAAA,MACpB,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,QAAQA,IAAE,OAAO;AAAA,MACjB,SAASA,IAAE,OAAO;AAAA,MAClB,UAAUA,IAAE,OAAOM,cAAa;AAAA,MAChC,WAAWN,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,MAC7B,mBAAmBA,IAAE,QAAQ;AAAA,MAC7B,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,MAC9B,YAAYA,IAAE,OAAO;AAAA,MACrB,WAAWA,IAAE,QAAQ;AAAA,IACvB,CAAC;AACD,IAAMK,eAAcL,IAAE,OAAO,EAAE,SAASA,IAAE,QAAQ,CAAC,GAAG,UAAUA,IAAE,OAAO,aAAa,EAAE,CAAC;AAEzF,IAAMI,SAAQ,OAAO,EAAE,SAAS,GAAY,UAAU,CAAC,EAA6B;AACpF,IAAM,YAAY,CAAC,OACjB,GAAGD,UAAS,IAAI,KAAK,CAAC,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA;AAAA;;;ACtCpE,OAAOO,SAAQ;AACf,OAAOC,UAAQ;AAGf,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,KAAAC,WAAS;AAsClB,SAAS,eAAe,KAAc;AACpC,MAAI;AACF,WAAO,gBAAgB,MAAM,GAAG;AAAA,EAClC,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,qEAAqE;AAAA,MACnF,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAGO,SAAS,kBAAkB,OAAmC;AACnE,QAAM,WAAW,cAAc,UAAW,OAAwC,OAAO;AACzF,MAAI,SAAS,QAAS,QAAO,SAAS;AACtC,QAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACnE,QAAQ,iCAAiC,GAAG,EAC5C,MAAM,GAAG,GAAG;AACf,QAAM,QAAQ,oBAAI,IAAY;AAC9B,MAAI,QAAiB;AACrB,WAAS,IAAI,GAAG,SAAS,IAAI,GAAG,KAAK;AACnC,UAAM,IAAI,OAAQ,MAAgC,IAAI,CAAC;AACvD,YAAS,MAAgB;AAAA,EAC3B;AACA,QAAM,OACJ,MAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,IACrC,iBACA,+CAA+C,KAAK,OAAO,IACzD,mBACA,qBAAqB,KAAK,OAAO,IAC/B,SACA,mFAAmF;AAAA,IAC/E;AAAA,EACF,IACA,wBACA,iBAAiBA,IAAE,YACjB,iBAAiB,eACjB,oEAAoE,KAAK,OAAO,IAChF,kBACA,+EAA+E;AAAA,IAC3E;AAAA,EACF,IACA,qBACA,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,IACxC,aACA;AAClB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,CAAC,kBAAkB,gBAAgB,QAAQ,UAAU,EAAE,SAAS,IAAI;AAAA,IAC/E,iBAAiB;AAAA,EACnB;AACF;AAEO,SAAS,eAAe,OAAwB;AACrD,QAAM,UAAU,kBAAkB,KAAK;AACvC,SACE,iCAAiC,QAAQ,IAAI,yDAAyD,QAAQ,OAAO,MACpH,QAAQ,kBAAkB,KAAK;AAEpC;AAeA,eAAsB,qBAAqB,MAAcC,YAAmB;AAC1E,QAAM,MAAM,MAAM,cAAc,MAAMA,aAAY,qBAAqB;AACvE,SAAO,QAAQ,OAAO,EAAE,SAAS,GAAY,UAAU,CAAC,EAAE,IAAI,oBAAoB,MAAM,GAAG;AAC7F;AAGA,eAAsB,mBACpB,KACA,MACA,WACA,OACwB;AACxB,QAAM,UAAU,kBAAkB,KAAK;AACvC,MAAI,CAAC,QAAQ,gBAAiB,QAAO,eAAe,KAAK;AACzD,MAAI;AACF,UAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,WAAO,MAAM,SAAS,GAAG,MAAM,GAAG,YAAY,kBAAkB,YAAY;AAC1E,YAAM,UAAU,MAAM,qBAAqB,GAAG,MAAM,GAAG,SAAS;AAChE,YAAM,MAAM,KAAK,CAAC,MAAM,SAAS,CAAC,GAChC,YAAY,KAAK,CAAC,QAAQ,MAAM,QAAQ,OAAO,CAAC;AAClD,YAAM,WAAW,QAAQ,SAAS,GAAG;AACrC,YAAM,YAAY,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS;AAC7D,YAAM,YACJ,YACA,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,WAAW,eAAe,EAAE,YAAY,SAAS,MAAM;AAC1F,YAAM,SAAS,UAAU,cAAc,aAAa,CAAC;AACrD,cAAQ,SAAS,GAAG,IAAI;AAAA,QACtB;AAAA,QACA,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ;AAAA,QACjB,OAAO,SAAS,SAAS,QAAQ,IAAI;AAAA,QACrC,SAAQ,oBAAI,KAAK,GAAE,YAAY;AAAA,MACjC;AACA,cAAQ,WAAW,OAAO;AAAA,QACxB,OAAO,QAAQ,QAAQ,QAAQ,EAC5B,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC,EACvD,MAAM,GAAG,EAAE;AAAA,MAChB;AACA,YAAM,eAAe,GAAG,MAAM,GAAG,YAAY,uBAAuB,OAAO;AAC3E,aAAO,SACH,OACA,eAAe,KAAK,IAClB;AAAA,IACR,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,eAAe,KAAK;AAAA,EAC7B;AACF;AAKA,eAAe,eACb,MACAA,YACA,UACA;AACA,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,WAAW,UAAW;AAClC,QAAI,QAAQ;AACZ,QAAI;AACF,YAAM,QAAS,MAAM;AAAA,QACnB;AAAA,QACA,QAAQ,QAAQ,UAAUA,YAAW,QAAQ,EAAE,IAAIA,aAAY;AAAA,MACjE;AACA,UACE,QAAQ,SAASJ,IAAG,SAAS,KAC7B,OAAO,QAAQ,QAAQ,OACvB,MAAM,SAAS,QAAQ,MACvB;AACA,YAAI;AACF,kBAAQ,KAAK,QAAQ,KAAK,CAAC;AAC3B,kBAAQ;AAAA,QACV,SAAS,OAAO;AACd,kBAAS,MAAgC,SAAS;AAAA,QACpD;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AACA,QAAI,CAAC,MAAO,SAAQ,SAAS;AAAA,EAC/B;AACF;AAEA,eAAe,cACb,MACAI,YACA,MACA;AACA,SAAO,SAAS,MAAMA,aAAY,mBAAmB,YAAY;AAC/D,UAAM,OAAOA,aAAY;AACzB,UAAM,MAAM,MAAM,cAAc,MAAM,IAAI;AAC1C,UAAM,MACJ,QAAQ,OACJ,EAAE,SAAS,GAAY,UAAU,CAAC,GAAG,mBAAmB,EAAE,IAC1D,eAAe,GAAG;AACxB,UAAM,eAAe,MAAMA,YAAW,IAAI,QAAQ;AAClD,SAAK,GAAG;AAER,UAAM,WAAW,IAAI,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS;AAClE,UAAM,UAAU,IAAI,IAAI,SAAS,MAAM,GAAG,KAAK,IAAI,GAAG,SAAS,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC7F,QAAI,qBAAqB,QAAQ;AACjC,QAAI,WAAW,IAAI,SAAS,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;AAC5D,UAAM,eAAe,MAAM,MAAM,GAAG;AAAA,EACtC,CAAC;AACH;AAEA,eAAsB,gBACpB,MACAA,YACA,OACA,KACY;AACZ,QAAM,UAAU,YAAY,IAAI;AAChC,QAAM,UAAyC;AAAA,IAC7C,IAAIF,YAAW;AAAA,IACf;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,KAAK,QAAQ;AAAA,IACb,MAAMF,IAAG,SAAS;AAAA,IAClB,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACA,QAAM,QAAQ,UAAUI,YAAW,QAAQ,EAAE;AAC7C,QAAM,SAAS,OAAO,YACpB,cAAc,MAAMA,YAAW,CAAC,QAAQ;AACtC,UAAM,UAAU,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE;AAC5D,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,WAAO,OAAO,SAAS,SAAS;AAAA,MAC9B,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,YAAY,YAAY,IAAI,IAAI;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AACH,QAAM,eAAe,MAAM,OAAO,EAAE,KAAK,QAAQ,KAAK,MAAM,QAAQ,KAAK,CAAC;AAC1E,MAAI;AACF,UAAM,cAAc,MAAMA,YAAW,CAAC,QAAQ;AAC5C,UAAI,IAAI,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE,UAAU;AAC/D,cAAM,IAAI,MAAM,yEAAyE;AAC3F,UAAI,SAAS,KAAK,OAAO;AAAA,IAC3B,CAAC;AACD,QAAI;AACF,YAAM,SAAS,MAAM,IAAI;AACzB,YAAM,OAAO;AAAA,QACX,QAAQ;AAAA,QACR,oBAAoB,OAAO,OAAO;AAAA,QAClC,YAAY,OAAO,OAAO;AAAA,MAC5B,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,UAAU,kBAAkB,KAAK;AACvC,UAAI;AACF,cAAM,OAAO,EAAE,QAAQ,UAAU,SAAS,EAAE,GAAG,SAAS,iBAAiB,KAAK,EAAE,CAAC;AACjF,gBAAQ,kBAAkB;AAAA,MAC5B,QAAQ;AAAA,MAER;AACA,YAAM,OAAO,OAAO,IAAI,MAAM,QAAQ,SAAS,EAAE,OAAO,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC;AAAA,IAC/E;AAAA,EACF,UAAE;AACA,UAAMH,KAAG,GAAG,MAAM,UAAU,MAAM,KAAK,GAAG,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC3E;AACF;AAEA,eAAsB,gBAAgB,MAAcG,YAAmB;AACrE,QAAM,MAAM,MAAM,cAAc,MAAMA,aAAY,iBAAiB;AACnE,MAAI,QAAQ,KAAM,QAAO,EAAE,QAAQ,gBAAyB,UAAU,CAAC,EAAE;AACzE,QAAM,MAAM,eAAe,GAAG;AAC9B,QAAM,eAAe,MAAMA,YAAW,IAAI,QAAQ;AAClD,QAAM,YAAY,CAAC,GAAG,IAAI,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,WAAW;AAElF,QAAM,cAAc,CAAC,GAAG,IAAI,QAAQ,EACjC,QAAQ,EACR;AAAA,IACC,CAAC,MACC,CAAC,UAAU,SAAS,EAAE,SAAS,EAAE,MAAM,MACtC,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,UAAU;AAAA,EAC9D;AACF,QAAM,SAAS,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,WAAW,SAAS,IAC1D,YACC,aAAa,UAAU,IAAI,SAAS,GAAG,EAAE,GAAG,UAAU;AAC3D,SAAO,EAAE,QAAQ,UAAU,IAAI,UAAU,mBAAmB,IAAI,kBAAkB;AACpF;AA7SA,IAQM,eAgBA,eAcA,iBAkEA,qBA+DA;AAvKN;AAAA;AAAA;AAEA;AACA;AAGA;AAEA,IAAM,gBAAgBD,IAAE,OAAO;AAAA,MAC7B,MAAMA,IAAE,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,SAASA,IAAE,OAAO;AAAA,MAClB,WAAWA,IAAE,QAAQ;AAAA,MACrB,iBAAiBA,IAAE,QAAQ;AAAA,IAC7B,CAAC;AAED,IAAM,gBAAgBA,IAAE,OAAO;AAAA,MAC7B,IAAIA,IAAE,OAAO,EAAE,MAAM,kBAAkB;AAAA,MACvC,OAAOA,IAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,MAChC,OAAOA,IAAE,OAAO;AAAA,MAChB,WAAWA,IAAE,OAAO;AAAA,MACpB,YAAYA,IAAE,OAAO,EAAE,SAAS;AAAA,MAChC,YAAYA,IAAE,OAAO,EAAE,YAAY,EAAE,SAAS;AAAA,MAC9C,KAAKA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MAC/B,MAAMA,IAAE,OAAO;AAAA,MACf,QAAQA,IAAE,KAAK,CAAC,WAAW,aAAa,UAAU,SAAS,CAAC;AAAA,MAC5D,oBAAoBA,IAAE,OAAO,EAAE,SAAS;AAAA,MACxC,YAAYA,IAAE,OAAO,EAAE,SAAS;AAAA,MAChC,SAAS,cAAc,SAAS;AAAA,IAClC,CAAC;AACD,IAAM,kBAAkBA,IAAE,OAAO;AAAA,MAC/B,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,UAAUA,IAAE,MAAM,aAAa,EAAE,IAAI,GAAG;AAAA,MACxC,mBAAmBA,IAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC;AAAA,IAC7D,CAAC;AA8DD,IAAM,sBAAsBA,IAAE,OAAO;AAAA,MACnC,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,UAAUA,IAAE;AAAA,QACVA,IAAE,OAAO;AAAA,UACP,WAAWA,IAAE,OAAO;AAAA,UACpB,MAAM,cAAc,MAAM;AAAA,UAC1B,SAASA,IAAE,OAAO;AAAA,UAClB,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,UACjC,QAAQA,IAAE,OAAO;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAoDD,IAAM,YAAY,CAACC,YAAmB,OAAe,GAAGA,UAAS,eAAe,EAAE;AAAA;AAAA;;;ACvKlF;AAAA;AAAA;AAAA;AAKA,eAAsB,iBAAiB,MAAc,MAAM,KAAK,IAAI,GAA2B;AAC7F,MAAI;AACF,UAAM,CAAC,OAAO,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MACxC,kBAAkB,IAAI;AAAA,MACtB;AAAA,QACE,CAAC,UAAU,kBAAkB,MAAM,yBAAyB,MAAM,kBAAkB;AAAA,QACpF,EAAE,KAAK,MAAM,SAAS,KAAO,WAAW,OAAO,KAAK;AAAA,MACtD;AAAA,IACF,CAAC;AACD,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,UAAU,OAAO,OAAO,MAAM,IAAI;AACxC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,QAAQ,QAAQ,CAAC;AACvB,UAAI,CAAC,MAAO;AACZ,YAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,UAAI,oCAAoC,KAAK,IAAI,EAAG,SAAQ,IAAI,IAAI;AACpE,UAAI,OAAO,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC,EAAG;AAAA,IACtC;AACA,UAAM,UAAU,IAAI;AAAA,MAClB,MAAM,QAAQ,IAAI,CAAC,WAAW,CAAC,oBAAoB,OAAO,EAAE,SAAS,MAAM,CAAC;AAAA,IAC9E;AACA,UAAM,MAAM,CAAC,OAAgB;AAC3B,YAAM,OAAO,KAAK,KAAK,MAAM,EAAE,IAAI;AACnC,aAAO,OAAO,SAAS,IAAI,IACvB,GAAG,KAAK,IAAI,GAAG,KAAK,OAAO,MAAM,QAAQ,KAAQ,CAAC,CAAC,UACnD;AAAA,IACN;AACA,UAAM,OAAO,CAAC,UAAkB,MAAM,QAAQ,iCAAiC,GAAG;AAClF,UAAM,OAAO,CAAC,UACZ,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,KACpC,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,CAAC,UAAU;AACrD,UAAM,YAAY,MAAM,QACrB,OAAO,CAAC,WAAW,OAAO,WAAW,YAAY,iBAAiB,MAAM,MAAM,UAAU,EACxF,IAAI,CAAC,WAAW;AAEf,YAAM,UAAU,OAAO,YAAY,IAAI,OAAO,UAAU,CAAC;AACzD,UAAI,aAAa;AACjB,cAAQ,QAAQ,CAAC,OAAO,UAAU;AAChC,YAAI,MAAM,SAAS,cAAc,MAAM,SAAS,aAAc,cAAa;AAAA,MAC7E,CAAC;AACD,YAAM,QACJ,QACG,MAAM,aAAa,CAAC,EACpB,KAAK,CAAC,UAAU,MAAM,SAAS,aAAa,MAAM,SAAS,SAAS,GAAG,MAC1E,OAAO;AACT,aAAO,EAAE,QAAQ,MAAM;AAAA,IACzB,CAAC,EACA,KAAK,CAAC,GAAG,MAAM;AACd,YAAM,YAAY,CAAC,UACjB,OAAO,SAAS,KAAK,MAAM,KAAK,CAAC,IAAI,KAAK,MAAM,KAAK,IAAI;AAC3D,aAAO,UAAU,EAAE,KAAK,IAAI,UAAU,EAAE,KAAK,KAAK,EAAE,OAAO,GAAG,cAAc,EAAE,OAAO,EAAE;AAAA,IACzF,CAAC;AACH,UAAM,QAAQ,CAAC;AACf,QAAI,QAAQ;AACV,YAAM;AAAA,QACJ,GAAG,QAAQ,IAAI,oCAAoC;AAAA,UACjD,CAAC,GAAG,OAAO,EACR,KAAK,EACL,IAAI,CAAC,SAAS,GAAG,IAAI,uBAAuB,IAAI,QAAQ,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG;AAAA,QACrF,CAAC;AAAA,MACH;AACF,QAAI,UAAU;AACZ,YAAM;AAAA,QACJ,GAAG,UAAU,MAAM,gDAAgD;AAAA,UACjE,UAAU;AAAA,YACR,CAAC,EAAE,QAAQ,MAAM,MAAM,oBAAoB,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC;AAAA,UAC1E;AAAA,QACF,CAAC;AAAA,MACH;AACF,QAAI,MAAM,YAAY;AACpB,YAAM;AAAA,QACJ,GAAG,MAAM,YAAY,MAAM;AAAA,MAC7B;AACF,WAAO,MAAM,SACT;AAAA,EAA6B,MAAM,KAAK,IAAI,CAAC;AAAA,sGAC7C;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AApFA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;;;ACWA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,KAAAC,WAAS;AA4DlB,eAAsB,oBAAoB,KAAa,OAAwB;AAC7E,QAAM,KAAK,MAAM,aAAa,wBAAwB,MAAM,UAAU,GAAG,CAAC;AAC1E,QAAM,SAAS,GAAG,MAAM,GAAG,WAAW,YAAY;AAChD,UAAMC,aAAY,GAAG,YAAY;AACjC,UAAM,MAAM,MAAM,cAAc,GAAG,MAAMA,UAAS;AAClD,QAAI,QAAQ,KAAM;AAClB,UAAM,QAAQ,WAAW,GAAG;AAC5B,QAAI,MAAM,SAAS,GAAG,QAAQ,MAAM,WAAW,GAAG,UAAU,MAAM,WAAW,GAAG,QAAQ;AACtF,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,UACJ,MAAM,QAAQ,MAAM,YAAY,MAAM,SAAS,KAAK,CAAC,MAAM,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;AACxF,QAAI,CAAC,QAAS;AACd,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,YAAQ,WAAW;AACnB,YAAQ,OAAO,MAAM,KAAK,IAAI,EAAE,IAAI,KAAK,QAAQ,QAAQ,OAAO,MAAM,KAAK,GAAG,SAAS,KAAK,EAAE;AAE9F,UAAM,eAAe,GAAG,MAAMA,YAAW,KAAK;AAAA,EAChD,CAAC;AACD,SAAO,EAAE,MAAM,GAAG,MAAM,WAAW,GAAG,UAAU;AAClD;AAEO,SAAS,UAAU,QAAkC;AAC1D,QAAM,OAAO,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU;AAClE,QAAM,aACJ,OAAO,WAAW,gBAClB,CAAC,OAAO,YAAY,UACpB,CAAC,OAAO,OAAO,cACf,CAAC,OAAO,OAAO,cACf,OAAO,OAAO,iBAAiB,IAAI;AACrC,SAAO;AAAA,IACL,aACI,UAAU,OAAO,OAAO,iBAAiB,CAAC,WAAW,OAAO,OAAO,iBAAiB,MAAM,IAAI,MAAM,KAAK,4CACzG,UAAU,OAAO,MAAM,KAAK,OAAO,OAAO,UAAU,gBAAgB,OAAO,OAAO,iBAAiB,CAAC,iBAAiB,OAAO,OAAO,UAAU;AAAA,IACjJ,GAAG,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM;AAC7B,YAAM,SAAS,EAAE,UACb,EAAE,QAAQ,UACV,EAAE,WAAW,oBACX,GAAG,EAAE,SAAS,IAAI,qCAAqC,EAAE,SAAS,SAAS,iBAAiB,mBAAmB,sBAAsB,6CACrI,sBAAsB,EAAE,SAAS,OAAO,KAAK,EAAE,MAAM;AAC3D,aAAO,IAAI,EAAE,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,GAAG,CAAC,KAAK,UAAU,MAAM,CAAC;AAAA,IAChF,CAAC;AAAA,IACD,GAAI,KAAK,SAAS,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,+BAA+B,IAAI,CAAC;AAAA,IAC7E,GAAG,OAAO,YAAY,MAAM,GAAG,CAAC,EAAE,IAAI,SAAS;AAAA,IAC/C,aAAa,OAAO,UAAU;AAAA,IAC9B;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAIA,eAAe,UAAU,IAA+B;AACtD,QAAM,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,YAAY,aAAa;AACrE,QAAM,QACJ,QAAQ,OACJ;AAAA,IACE,SAAS;AAAA,IACT,MAAM,GAAG;AAAA,IACT,QAAQ,GAAG;AAAA,IACX,QAAQ,GAAG;AAAA,IACX,WAAW,CAAC;AAAA,IACZ,UAAU,CAAC;AAAA,IACX,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,aAAa;AAAA,IACb,QAAQ;AAAA,EACV,IACA,WAAW,GAAG;AACpB,MAAI,MAAM,SAAS,GAAG,QAAQ,MAAM,WAAW,GAAG,UAAU,MAAM,WAAW,GAAG,QAAQ;AACtF,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AA+CA,eAAe,iBACb,IACA,OACA,QAC6D;AAC7D,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,gBAAgB,OAAO,YAAa,QAAO,EAAE,UAAU,KAAK;AACpF,MAAI,QAAQ,SAAS,GAAG,YAAY,sBAAsB,OAAO,cAAc,SAAS;AACtF,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AAIA,QAAM,UAAU;AAAA,IACd,UAAU;AAAA,IACV,YACE;AAAA,EACJ;AACA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,cAAc,GAAG,MAAM,QAAQ,IAAI;AAAA,EACjD,SAAS,OAAO;AACd,UAAM,QAAS,MAAgB;AAC/B,QACE,iBAAiB,eAChB,iBAAiB,SAAS,MAAM,YAAY;AAE7C,aAAO;AACT,UAAM;AAAA,EACR;AACA,MAAI,QAAQ,KAAM,QAAO,EAAE,UAAU,KAAK;AAC1C,QAAM,SAAS,aAAa,UAAU,GAAG;AACzC,MAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,QAAM,SAAS,OAAO;AACtB,QAAM,IAAI,OAAO;AACjB,MACE,OAAO,WAAW,KAAK,CAAC,KACxB,EAAE,OAAO,QAAQ,MACjB,EAAE,gBAAgB,OAAO,eACzB,EAAE,gBAAgB,QAAQ,eAC1B,EAAE,OAAO,SAAS,GAAG,QACrB,EAAE,OAAO,WAAW,GAAG,UACvB,EAAE,OAAO,SAAS,OAAO,QACzB,KAAK,EAAE,OAAO,aAAa,MAAM,KAAK,MAAM,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GACxE;AACA,WAAO;AAAA,EACT;AACA,MAAI,EAAE,mBAAoB,MAAM,eAAe,IAAI,KAAK;AACtD,UAAM,IAAI,MAAM,0DAA0D;AAC5E,SAAO,EAAE,UAAU,EAAE;AACvB;AAEA,eAAe,aAAa,IAAe,QAAgB,WAAW,OAAO;AAC3E,SAAO;AAAA,IAAa;AAAA,IAAyB,MAC3C,yBAAyB,GAAG,MAAM,YAAY;AAC5C,YAAM,CAAC,OAAO,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC3C,WAAW,mBAAmB,GAAG,IAAI,IAAI,WAAW,GAAG,IAAI;AAAA,QAC3D,UAAU,GAAG,IAAI;AAAA,MACnB,CAAC;AACD,UAAI,MAAM,gBAAgB,OAAO,eAAe,UAAU,cAAc,GAAG,WAAW;AACpF,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAGA,eAAe,gBACb,IACA,OACA,QACA,OACA,eACA,iBACA;AACA,QAAM,YAAY,CAAC,GAAG,MAAM,SAAS;AACrC,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAMC,SAA0B;AAAA,IAC9B,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM,GAAG;AAAA,IACT,QAAQ,GAAG;AAAA,IACX,MAAM,OAAO;AAAA,IACb,eAAe,CAAC;AAAA,IAChB,YAAY;AAAA,IACZ,UAAU,CAAC;AAAA,IACX,aAAa;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,IAC3C,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,mBAAmB,GAAG,YAAY,EAAE;AAAA,IAC1E,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,UAAU,OAAO,OAAO,OAAO,IAAI,EAAE,MAAM,CAAC,UAAU,UAAU,IAAI,GAAG;AACpF,UAAM,aAAa,IAAI,MAAM;AAC7B,WAAO,EAAE,WAAW,QAAQA,QAAO,OAAO,KAAK;AAAA,EACjD;AACA,MAAI,GAAG,WAAW,cAAc,MAAM,QAAQ;AAC5C,UAAM,WAAY,MAAM,cAAc,GAAG,MAAM,MAAM,MAAM;AAC3D,QAAI,CAAC,UAAU,QAAQ,CAAC,oBAAoB,KAAK,SAAS,IAAI;AAC5D,YAAM,IAAI,MAAM,yDAAyD;AAC3E,QAAI;AACF,YAAMC,KAAI,GAAG,MAAM,cAAc,iBAAiB,SAAS,MAAM,OAAO,IAAI;AAAA,IAC9E,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAkB;AACtB,QAAM,cAAwB,kBAAkB,CAAC,eAAe,IAAI,CAAC;AACrE,MAAI;AACF,aAAS,MAAM,cAAc,GAAG,MAAM,GAAG,YAAY,aAAa;AAAA,EACpE,QAAQ;AACN,gBAAY,KAAK,2DAA2D;AAAA,EAC9E;AACA,QAAM,QAAQ,WAAW,QAAQ,MAAM;AACvC,MAAI,MAAM,WAAY,aAAY,KAAK,MAAM,UAAU;AAGvD,QAAM,cACJ,eAAe,gBACf,cAAc,aAAa,OAAO,QAClC,cAAc,SAAS,GAAG,QAC1B,CAAC,cAAc,cAAc,UAC7B,WAAW,MAAM,CAAC,SAAS,cAAc,WAAW,SAAS,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IACjF,gBACA;AACN,MAAI,YAAa,YAAW,QAAQ,WAAY,OAAM,OAAO,IAAI,IAAI;AACrE,MAAI,eAAmC;AACvC,QAAM,gBAAgB,MAAM;AAAA,IAC1B,GAAG;AAAA,IACH,MAAM;AAAA,IACN,OAAO,YAAY;AACjB,YAAM,eAAe,YAAY;AAC/B,YAAI,UAAU,UAAU;AACtB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AACF,cAAM,WAAW,MAAM,QAAQ,QAAQ;AACvC,kBAAU,KAAK;AAAA,UACb,MAAM,SAAS;AAAA,UACf,IAAI;AAAA,UACJ,OAAO,MAAM;AAAA,UACb,aAAa,OAAO;AAAA,QACtB,CAAC;AAAA,MACH;AACA,UAAI,CAAC,UAAU,OAAQ,OAAM,aAAa;AAC1C,YAAMC,iBAAsC,CAAC;AAC7C,iBAAW,YAAY,UAAW,CAAAA,eAAc,KAAK,MAAM,QAAQ,OAAO,SAAS,IAAI,CAAC;AACxF,YAAM,QAAQ,IAAI,IAAIA,eAAc,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAG/E,UAAIA,eAAc,KAAK,CAAC,MAAM,EAAE,YAAY,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;AAClF,cAAM,aAAa;AACnB,QAAAA,eAAc,KAAK,MAAM,QAAQ,OAAO,UAAU,GAAG,EAAE,EAAG,IAAI,CAAC;AAAA,MACjE;AACA,qBAAe,MAAM,QAAQ,aAAa;AAC1C,aAAOA;AAAA,IACT;AAAA,IACA,MAAM,aAAa,IAAI,MAAM;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,SAAS,oBAAI,IAA2B;AAC9C,aAAW,gBAAgB,eAAe;AACxC,eAAW,WAAW,aAAa,UAAU;AAC3C,YAAM,WAAW,OAAO,IAAI,QAAQ,EAAE;AACtC,UAAI,CAAC,YAAY,SAAS,QAAQ,MAAM,IAAI,SAAS,SAAS,MAAM;AAClE,eAAO,IAAI,QAAQ,IAAI,OAAO;AAAA,IAClC;AACA,gBAAY,KAAK,GAAG,aAAa,WAAW;AAAA,EAC9C;AAEA,QAAM,SAAS,EAAE,UAAU,GAAG,YAAY,GAAG,mBAAmB,GAAG,YAAY,EAAE;AACjF,aAAW,WAAW,OAAO,OAAO,EAAG,QAAO,QAAQ,MAAM;AAC5D,QAAM,SAA2B;AAAA,IAC/B,SAAS;AAAA,IACT,QACE,YAAY,UAAU,cAAc,KAAK,CAAC,MAAM,EAAE,WAAW,YAAY,IACrE,eACA,OAAO,aACL,kBACA;AAAA,IACR,MAAM,GAAG;AAAA,IACT,QAAQ,GAAG;AAAA,IACX,MAAM,OAAO;AAAA,IACb,eAAe,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC1C,YAAY;AAAA,IACZ,UAAU,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,IAC7B,aAAa,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC;AAAA,IACrC,QAAQ;AAAA,MACN,KAAK,CAAC,GAAG,MAAM,GAAG;AAAA,MAClB,QAAQ,CAAC,GAAG,MAAM,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC;AAAA,MAC/D,SAAS,cAAc,GAAG,EAAE,EAAG,cAAc,iBAAiB,CAAC;AAAA,MAC/D,GAAI,cAAc,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,IAC7C;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM,IAAI,QAAQ,WAAW,QAAQ,MAAM,aAAa,MAAM,UAAU,IAAI;AAAA,EACrF;AACF;AAGA,eAAe,QAAQ,IAAe,QAAgB,OAAwB,WAAmB;AAC/F,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,YAAY,eAAe,OAAO;AAAA,IACrC,YAAY;AACV,YAAM,SAAS,MAAM,UAAU,EAAE;AACjC,YAAM,EAAE,UAAU,UAAU,WAAW,IAAI,MAAM,iBAAiB,IAAI,QAAQ,MAAM;AAGpF,UAAI,YAAY,SAAS,eAAe;AACtC,eAAO,EAAE,UAAU,UAAU,QAAQ,KAAK;AAC5C,YAAM,iBAAiB,MAAM,eAAe,IAAI,MAAM;AACtD,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACF;AACA,UAAI,mBAAoB,MAAM,eAAe,IAAI,MAAM;AACrD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,YAAM,KAAKL,YAAW;AACtB,YAAM,WAAW,eAAe,MAAM;AAAA,QACpC;AAAA,QACA,aAAa,OAAO;AAAA,QACpB,aAAa,KAAK,IAAI;AAAA,QACtB,gBAAgB,MAAM,eAAe,IAAI,EAAE,GAAG,QAAQ,WAAW,SAAS,UAAU,CAAC;AAAA,QACrF,QAAQ,SAAS;AAAA,QACjB,cAAc,SAAS;AAAA,MACzB,CAAC;AACD,YAAM,eAAe,GAAG,YAAY,sBAAsB,OAAO,cAAc;AAC/E,YAAM,SAAS,GAAG,MAAM,GAAG,WAAW,YAAY;AAChD,cAAM,QAAQ,MAAM,UAAU,EAAE;AAEhC,YACE,KAAK,MAAM,SAAS,MAAM,KAAK,OAAO,SAAS,KAC/C,MAAM,UAAU,OAAO,OAAO,UAAU,IACxC;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,cAAM,eAAe,GAAG,MAAM,cAAc,EAAE,UAAU,QAAQ,KAAK,QAAQ,EAAE,CAAC;AAChF,YAAI,SAAS;AACX,gBAAM,eAAe,GAAG,MAAM,GAAG,YAAY,eAAe,SAAS,KAAK;AAC5E,cAAM,YAAY,SAAS;AAC3B,cAAM,WAAW;AAAA,UACf;AAAA,UACA,aAAa,OAAO;AAAA,UACpB,aAAa,SAAS;AAAA,UACtB,MAAM;AAAA,QACR;AACA,cAAM,eAAe,GAAG,MAAM,GAAG,YAAY,eAAe,KAAK;AAAA,MACnE,CAAC;AACD,aAAO,EAAE,UAAU,QAAQ,MAAM;AAAA,IACnC;AAAA,IACA,KAAK,IAAI,GAAG,QAAS,KAAK,IAAI,IAAI,UAAU;AAAA,EAC9C;AACF;AAGA,eAAe,iBAAiB,IAAe,QAAgB;AAC7D,QAAM,UAAU,MAAM,qBAAqB;AAAA,IACzC,MAAM,GAAG;AAAA,IACT,MAAM,CAAC;AAAA,IACP,UAAU,OAAO;AAAA,IACjB,iBAAiB,oBAAI,IAAI;AAAA,IACzB,kBAAkB;AAAA,EACpB,CAAC;AACD,QAAM,WAA4B,QAAQ,WAAW,IAAI,CAAC,aAAa;AAAA,IACrE,IAAI,UAAU,OAAO;AAAA,IACrB,UAAU;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,EAAE;AAEF,QAAM,SAAS,MAAM,UAAU,EAAE;AACjC,MAAI,OAAO,UAAU;AACnB,UAAM,QAAQC,IACX,OAAO,EAAE,UAAUA,IAAE,MAAM,mBAAmB,EAAE,CAAC,EACjD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,SAAS,IAAI,CAAC;AAC3D,UAAM,aAAa,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;AAChE,UAAM,WAAW,MAAM,kBAAkB,GAAG,IAAI,GAAG;AACnD,eAAW,YAAY,MAAM,UAAU;AACrC,UAAI,WAAW,IAAI,SAAS,EAAE,KAAK,SAAS,SAAS,SAAS,SAAS;AACrE;AACF,YAAM,WAAW,SAAS,SAAS;AACnC,YAAM,SAAS,QAAQ,KAAK,CAACK,YAAWA,QAAO,OAAO,SAAS,UAAU;AACzE,YAAM,UAAU,UAAU,OAAO,iBAAiB,OAAO,EAAE,GAAG;AAC9D,YAAM,WACJ,QAAQ,WAAW,aAClB,CAAC,CAAC,UAAU,CAAC,CAAC,SAAS,YAAY,QAAQ,QAAQ,SAAS,KAAK,CAAC,QAAQ,QAAQ;AACrF,eAAS,KAAK;AAAA,QACZ,IAAI,SAAS;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,QAAQ,WAAW,aAAa;AAAA,QAChC,QAAQ,WACJ,+FACA;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,YAAY,QAAQ,QAAQ;AAAA,EAC9B;AACA,aAAW,WAAW,SAAU,QAAO,QAAQ,MAAM;AACrD,QAAM,SAA2B;AAAA,IAC/B,SAAS;AAAA,IACT,QAAQ,OAAO,cAAc,OAAO,iBAAiB,IAAI,eAAe;AAAA,IACxE,MAAM,GAAG;AAAA,IACT,QAAQ,GAAG;AAAA,IACX,MAAM,OAAO;AAAA,IACb,eAAe,CAAC;AAAA,IAChB,YAAY;AAAA,IACZ;AAAA,IACA,aAAa;AAAA,MACX,GAAG,QAAQ,QAAQ,IAAI,CAAC,SAAS,KAAK,MAAM;AAAA,MAC5C,GAAG,SACA,OAAO,CAAC,YAAY,QAAQ,WAAW,YAAY,EACnD,IAAI,CAAC,YAAY,YAAY,QAAQ,EAAE,KAAK,QAAQ,MAAM,EAAE;AAAA,IACjE;AAAA,IACA,QAAQ,EAAE,KAAK,CAAC,uBAAuB,GAAG,QAAQ,CAAC,GAAG,SAAS,QAAQ,QAAQ;AAAA,IAC/E;AAAA,IACA,SAAS;AAAA,IACT,OACE;AAAA,EACJ;AACA,QAAM,aAAa,IAAI,QAAQ,IAAI;AACnC,SAAO,EAAE,UAAU,EAAE,IAAI,YAAY,OAAO,GAAG,QAAQ,MAAe;AACxE;AAEA,eAAsB,SAAS,KAAa,OAAwB;AAClE,SAAO,cAAc,KAAK,OAAO,KAAK;AACxC;AAEA,eAAsB,yBAAyB,KAAa,OAAwB;AAClF,SAAO,cAAc,KAAK,OAAO,IAAI;AACvC;AAGA,eAAe,cAAc,KAAa,OAAwB,UAAmB;AACnF,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,KAAK,MAAM,aAAa,wBAAwB,MAAM,UAAU,GAAG,CAAC;AAC1E,QAAM,SAAS,MAAM,qBAAqB,GAAG,IAAI;AACjD,QAAM,SAAS,MAAM;AAAA,IAAgB,GAAG;AAAA,IAAM,GAAG;AAAA,IAAW,MAAM;AAAA,IAAO,MACvE,yBAAyB,GAAG,MAAM,YAAY;AAC5C,YAAM,SAAS,OAAO,WAAW,mBAAmB,GAAG,IAAI,IAAI,WAAW,GAAG,IAAI;AACjF,YAAM,SAAS,MAAM;AAAA,QAAa;AAAA,QAAuB,YACvD,WAAW,MAAM,iBAAiB,IAAI,MAAM,IAAI,MAAM,QAAQ,IAAI,QAAQ,OAAO,SAAS;AAAA,MAC5F;AACA,UAAI,CAAC,YAAY,OAAO,QAAQ;AAC9B,cAAM,aAAa,IAAI,MAAM;AAC7B,YAAI,OAAO,SAAS,mBAAoB,MAAM,eAAe,IAAI,MAAM,UAAU,EAAE,CAAC,GAAI;AACtF,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QAAa;AAAA,QAAsB,MACxC,SAAS,GAAG,MAAM,GAAG,WAAW,YAAY;AAC1C,gBAAM,QAAQ,MAAM,UAAU,EAAE;AAChC,cAAI,CAAC,YAAY,MAAM,UAAU,OAAO,OAAO,SAAS;AACtD,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AACF,gBAAM,SAAS,gBAAgB,OAAO,SAAS,MAAM;AACrD,cAAI,SAAU,OAAM,aAAa,IAAI,QAAQ,IAAI;AACjD,cAAI,CAAC,MAAM,eAAe;AAGxB,gBAAI,WAAW,EAAE,UAAU,OAAO,UAAU,MAAM,OAAO,KAAK;AAC9D,kBAAMC,gBAAe,WAAW,MAAM,UAAU,OAAO,MAAM;AAC7D,gBAAIA,eAAc;AAChB,kBAAI;AACF,sBAAM,WAAWN,IACd,OAAO,EAAE,UAAUA,IAAE,MAAM,mBAAmB,GAAG,MAAMA,IAAE,OAAO,EAAE,CAAC,EACnE,UAAU,MAAM,cAAc,GAAG,MAAMM,aAAY,CAAC;AACvD,oBAAI,CAAC,SAAS,QAAS,OAAM,IAAI,MAAM,0BAA0B;AACjE,2BAAW,SAAS;AAAA,cACtB,QAAQ;AACN,uBAAO,YAAY;AAAA,kBACjB;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,kBAAM,gBAAgB,wBAAwB,SAAS,UAAU,SAAS,IAAI;AAAA,UAChF;AACA,cAAI,OAAO;AACT,mBAAO,SAAS;AAAA,cACd,GAAG,OAAO;AAAA,cACV,KAAK,CAAC;AAAA,cACN,QAAQ,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,OAAO,KAAK,GAAG,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,cACpE,QAAQ;AAAA,YACV;AACF,iBAAO,aACL,GAAG,YAAY,cAAc,WAAW,cAAc,MAAMP,YAAW,IAAI;AAC7E,gBAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,gBAAM,MAAM,MAAM,QAAQ,MAAM,YAAY,KAAK,CAAC,MAAM,MAAM,MAAM,SAAS,CAAC,IAAI;AAClF,gBAAM,aAAa,QAAQ,QAAQ,CAAC,MAAM,SAAS,GAAG;AACtD,cAAI,OAAO,CAAC,MAAM,SAAS,GAAG,GAAG;AAC/B,kBAAM,OAAO,OAAO,KAAK,MAAM,QAAQ,EAAE;AAAA,cAAK,CAAC,GAAG,MAChD,MAAM,SAAS,CAAC,EAAE,SAAS,cAAc,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,YACrE;AAEA,kBAAM,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM;AACnF,uBAAW,WAAW,UAAU,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;AACpE,qBAAO,MAAM,SAAS,OAAO;AAC/B,gBAAI,OAAO,KAAK,MAAM,QAAQ,EAAE,UAAU;AACxC,oBAAM,IAAI;AAAA,gBACR;AAAA,cACF;AACF,kBAAM,SAAS,GAAG,IAAI;AAAA,cACpB,MAAM,MAAM;AAAA,cACZ,qBAAqB,CAAC;AAAA,cACtB,UAAU;AAAA,cACV,SAAS,CAAC;AAAA,cACV,cAAc,CAAC;AAAA,cACf,QAAQ,CAAC;AAAA,YACX;AAAA,UACF;AACA,gBAAM,UAAU,MAAM,MAAM,SAAS,GAAG,IAAI;AAC5C,mCAAyB,MAAM,UAAU,MAAM;AAC/C,cAAI,SAAS;AACX,iCAAqB,SAAS,QAAQ,KAAK;AAC3C,oBAAQ,WAAW;AACnB,oBAAQ,OAAO,MAAM,KAAK,IAAI;AAAA,cAC5B,IAAI;AAAA,cACJ,QAAQ,QAAQ,OAAO,MAAM,KAAK,GAAG,SAAS,KAAK;AAAA,YACrD;AACA,gBAAI,MAAM,UAAU,iBAAiB,MAAM,YAAY,MAAM,QAAQ;AACnE,kBAAI,OAAO,KAAK,QAAQ,OAAO,EAAE,UAAU;AACzC,sBAAM,IAAI,MAAM,4DAA4D;AAC9E,sBAAQ,QAAQ,MAAM,MAAM,IAAI,OAAO;AAAA,YACzC;AACA,gBAAI,MAAM,UAAU,gBAAgB,MAAM,UAAU;AAClD,kBAAI,CAAC,MAAM,UAAU,CAAC,QAAQ,QAAQ,MAAM,MAAM,GAAG;AACnD,sBAAM,MACJ;AACF,oBAAI,CAAC,QAAQ,aAAa,SAAS,GAAG,EAAG,SAAQ,aAAa,KAAK,GAAG;AAAA,cACxE;AACA,kBAAI,MAAM,OAAQ,QAAO,QAAQ,QAAQ,MAAM,MAAM;AAAA,YACvD;AACA,mBAAO,YAAY,KAAK,GAAG,QAAQ,YAAY;AAC/C,gBAAI,QAAQ,aAAa,UAAU,OAAO,WAAW;AACnD,qBAAO,SAAS;AAClB,mBAAO,UACL,OAAO,WAAW,iBAClB,CAAC,QAAQ,aAAa,WACrB,QAAQ,OAAO,iBAAiB,QAAQ,OAAO,eAC5C,aACA;AAAA,UACR;AAGA,gBAAM,WACJ,WAAW,MAAM,UAAU,aACvB,mBAAmB,MAAM,eAAe,OAAO,QAAQ,IACvD,CAAC;AAEP,gBAAM,uBAAuB,EAAE,GAAG,gBAAgB,MAAM,aAAa,GAAG,WAAW,CAAC,EAAE;AACtF,gBAAM,WACJ,WAAW,CAAC,cAAc,YAAY,EAAE,SAAS,MAAM,KAAK,IACxD,mBAAmB,MAAM,oBAAoB,OAAO,QAAQ,IAC5D,CAAC;AACP,gBAAM,cAAc,UAChB,OAAO,YAAY,OAAO,CAAC,MAAM,CAAC,QAAQ,oBAAoB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IACrF,CAAC;AACL,cAAI;AACF,oBAAQ,sBAAsB;AAAA,cAC5B,GAAG,oBAAI,IAAI;AAAA,gBACT,GAAG,QAAQ,oBAAoB,OAAO,CAAC,MAAM,OAAO,YAAY,SAAS,CAAC,CAAC;AAAA,gBAC3E,GAAG;AAAA,cACL,CAAC;AAAA,YACH;AACF,gBAAM,aACJ,WACA,MAAM,SAAS,YACf,MAAM,UAAU,cAChB,OAAO,cAAc,UACjB,mBAAmB,SAAS,QAAQ,QAAQ,CAAC,CAAC,MAAM,cAAc,IAClE,EAAE,QAAQ,MAAM,OAAO,MAAM;AACnC,gBAAM,UAAU,CAAC,UACb,UAAU,MAAM,IAChB;AAAA,YACE,WAAW;AAAA,YACX,kBAAkB,UAAU,OAAO,UAAU;AAAA,YAC7C,kBAAkB,UAAU,OAAO,UAAU;AAAA,YAC7C,GAAI,YAAY,SACZ;AAAA,cACE,gCAAgC,YAAY,MAAM,GAAG,CAAC,EAAE,IAAI,SAAS,EAAE,KAAK,GAAG,CAAC,cAAc,OAAO,UAAU;AAAA,YACjH,IACA,CAAC;AAAA,UACP,EACG,OAAO,OAAO,EACd,KAAK,IAAI,KAAK;AACrB,gBAAM,SAAS,YAAY;AAE3B,gBAAM,eAAe,WAAW,MAAM,UAAU,OAAO,MAAM;AAC7D,gBAAM,sBAAsB,WAAW,MAAM,UAAU,cAAc,MAAM;AAC3E,gBAAM,gBACJ,CAAC,gBACD,wBAAwB,OAAO,eAC/B,UACA,cACA,MAAM,UAAU;AAClB,cAAI,CAAC,cAAe,QAAO,aAAa;AACxC,gBAAM,YAAY;AAClB,cAAI;AACF,kBAAM,WAAW,EAAE,aAAa,OAAO,aAAa,MAAM,OAAO,WAAW;AAAA,eACzE;AACH,kBAAM,cAAc,OAAO;AAC3B,kBAAM,SAAS,OAAO;AAAA,UACxB;AACA,cAAI,cAAe,OAAM,eAAe,GAAG,MAAM,OAAO,YAAY,MAAM;AAC1E,gBAAM,eAAe,GAAG,MAAM,GAAG,YAAY,eAAe,KAAK;AACjE,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA,iBAAiB,WAAW,QAAQ,WAAW,SAAS;AAAA,YACxD,YAAY;AAAA,YACZ,UAAU,EAAE,OAAO,SAAS,MAAM,GAAG,CAAC,GAAG,YAAY,SAAS,MAAM,GAAG,CAAC,EAAE;AAAA,UAC5E;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACA,MAAI;AACF,UAAM;AAAA,MACJ,GAAG;AAAA,MACH;AAAA,MACA,OAAO;AAAA,MACP,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,KAAK,IAAI,IAAI;AAAA,MACb,OAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAEN,QAAI,MAAM,UAAU;AAClB,aAAO,UAAU;AAAA,QACf,OAAO;AAAA,QACP;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAGA,eAAsB,iBAAiB,KAAa;AAClD,QAAM,EAAE,kBAAAQ,kBAAiB,IAAI,MAAM;AACnC,QAAM,KAAK,MAAM,aAAa,wBAAwB,MAAM,UAAU,GAAG,CAAC;AAC1E,QAAM,SAAS,MAAM,qBAAqB,GAAG,IAAI;AACjD,QAAM,YAAY,MAAMA,kBAAiB,GAAG,IAAI;AAChD,QAAM,YAAY,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS;AAC7D,QAAM,gBAAgB,MAAM,qBAAqB,GAAG,MAAM,GAAG,SAAS;AACtE,QAAM,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,YAAY,aAAa;AACrE,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW,OAAO;AAAA,MAClB,QAAQ,UAAU,WAAW,iBAAiB,iBAAiB;AAAA,MAC/D,MAAM,GAAG;AAAA,MACT,QAAQ,GAAG;AAAA,MACX,eAAe,CAAC;AAAA,MAChB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,OAAO,CAAC;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACF,QAAM,QAAQ,WAAW,GAAG;AAC5B,MAAI,MAAM,SAAS,GAAG,QAAQ,MAAM,WAAW,GAAG,UAAU,MAAM,WAAW,GAAG;AAC9E,UAAM,IAAI,MAAM,gDAAgD;AAClE,QAAM,SAAS,OAAO,MAAM,WAAW,mBAAmB,GAAG,IAAI,IAAI,WAAW,GAAG,IAAI;AACvF,QAAM,aAAa,MAAM,UAAU,QAAQ,MAAM;AACjD,QAAM,SAAS,aACT,MAAM,cAAc,GAAG,MAAM,UAAW,IAC1C;AACJ,QAAMC,SAAwE,CAAC;AAC/E,aAAW,WAAW,OAAO,OAAO,MAAM,QAAQ,GAAG;AACnD,UAAM,OAAQA,OAAM,QAAQ,IAAI,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAAC,EAAE;AACxE,SAAK;AACL,SAAK,iBAAiB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,KAAK,gBAAgB,GAAG,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC,CAAC;AAAA,EAC7F;AACA,QAAM,aAAa,CAAC,UAAU,WAAW,SAAS,EAAE,SAAS,UAAU,MAAM;AAC7E,SAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW,OAAO;AAAA,IAClB,QAAQ,aACJ,gBACA,OAAO,iBAAiB,MAAM,UAAU,eAAe,MAAM,eAC3D,YACA;AAAA,IACN,MAAM,GAAG;AAAA,IACT,QAAQ,GAAG;AAAA,IACX,eAAe,MAAM,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAChD;AAAA,IACA,OAAO,MAAM,WAAW,sBAAsB;AAAA,IAC9C,iBAAiB,MAAM;AAAA,IACvB,oBAAoB,aAAa,gBAAiB,QAAQ,UAAU;AAAA,IACpE,OAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,0BAA0B,MAAM,eAAe,gBAAgB;AAAA,IAC/D,MAAM;AAAA,EACR;AACF;AAzzBA,IAmEM,OAEA,UACA,WAiFA,gBAkCA,cAEA;AA3LN;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AAGA;AAQA;AACA;AACA;AASA;AAiCA,IAAM,QACJ;AACF,IAAM,WAAW,EAAE,UAAU,GAAG,mBAAmB,GAAG,YAAY,GAAG,YAAY,EAAE;AACnF,IAAM,YAAY,CAACC,UACjBA,MAAK,QAAQ,iCAAiC,GAAG,EAAE,MAAM,GAAG,GAAG;AAgFjE,IAAM,iBAAiBT,IAAE,OAAO;AAAA,MAC9B,IAAIA,IAAE,OAAO;AAAA,MACb,aAAaA,IAAE,OAAO;AAAA,MACtB,aAAaA,IAAE,OAAO;AAAA,MACtB,gBAAgBA,IAAE,OAAO;AAAA,MACzB,cAAc,aAAa,SAAS,EAAE,SAAS;AAAA,MAC/C,QAAQA,IAAE,OAAO;AAAA,QACf,SAASA,IAAE,QAAQ,CAAC;AAAA,QACpB,QAAQA,IAAE,KAAK,CAAC,YAAY,iBAAiB,cAAc,aAAa,CAAC;AAAA,QACzE,MAAMA,IAAE,OAAO;AAAA,QACf,QAAQA,IAAE,OAAO;AAAA,QACjB,MAAMA,IAAE,OAAO;AAAA,QACf,eAAeA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,QACjC,YAAYA,IAAE,OAAO;AAAA,QACrB,UAAUA,IAAE,MAAM,mBAAmB;AAAA,QACrC,aAAaA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,QAC/B,QAAQA,IAAE,OAAO;AAAA,UACf,KAAKA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,UACvB,QAAQA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,UAC1B,SAASA,IAAE;AAAA,YACTA,IAAE,OAAO,EAAE,OAAOA,IAAE,OAAO,GAAG,QAAQA,IAAE,OAAO,GAAG,KAAKA,IAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,UAChF;AAAA,UACA,aAAaA,IAAE,QAAQ,EAAE,SAAS;AAAA,QACpC,CAAC;AAAA,QACD,QAAQA,IAAE,OAAO;AAAA,UACf,UAAUA,IAAE,OAAO;AAAA,UACnB,YAAYA,IAAE,OAAO;AAAA,UACrB,mBAAmBA,IAAE,OAAO;AAAA,UAC5B,YAAYA,IAAE,OAAO;AAAA,QACvB,CAAC;AAAA,QACD,SAASA,IAAE,KAAK,CAAC,YAAY,SAAS,CAAC;AAAA,QACvC,OAAOA,IAAE,OAAO;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AACD,IAAM,eAAeA,IAAE,OAAO,EAAE,UAAU,gBAAgB,QAAQA,IAAE,OAAO,EAAE,CAAC;AAE9E,IAAM,iBAAiB,OAAO,IAAe,UAC3C;AAAA,MAAa;AAAA,MAAwB,YACnC;AAAA,QACE,MAAM,QAAQ;AAAA,UACZ,MAAM,UAAU,IAAI,OAAO,MAAM,CAAC,EAAE,MAAM,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AClMF,OAAOU,UAAQ;AACf,OAAOC,YAAU;AAIjB,eAAe,eAAe,KAAqC;AACjE,MAAI,CAACA,OAAK,WAAW,GAAG,EAAG,OAAM,IAAI,MAAM,gDAAgD;AAC3F,MAAI;AACF,WAAO,MAAMD,KAAG,UAAU,MAAME,KAAI,KAAK,aAAa,iBAAiB,GAAG,KAAK,CAAC;AAAA,EAClF,SAAS,OAAO;AACd,QACG,MAAgC,SAAS,YAC1C,uBAAuB,KAAK,OAAQ,MAA8B,MAAM,CAAC;AAEzE,aAAO;AACT,UAAM;AAAA,EACR;AACF;AAGA,eAAsB,gBACpB,MACA,KACA,UAGI,CAAC,GACY;AACjB,QAAM,UAAU,MAAM,eAAe,GAAG;AACxC,MAAI,QAAS,QAAO;AACpB,QAAM,aACJ,QAAQ,eAAe,SAAS,WAAW,QAAQ,IAAI,qBAAqB;AAC9E,QAAM,cAAc,aAAa,MAAM,eAAe,UAAU,IAAI;AACpE,MAAI,cAAc,CAAC;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,aAAa,MAAM,eAAe,QAAQ,aAAa,QAAQ,IAAI,CAAC;AAC1E,QAAM,QAAQ;AAAA,IACZ,GAAG,IAAI,IAAI,CAAC,YAAY,WAAW,EAAE,OAAO,CAAC,SAAyB,SAAS,IAAI,CAAC;AAAA,EACtF;AACA,MAAI,CAAC,MAAM;AACT,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,MAAI,MAAM,SAAS;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAGF,QAAM,aAAa,MAAMA,KAAI,MAAM,CAAC,GAAG,YAAY,QAAQ,eAAe,IAAI,GAC3E,MAAM,IAAI,EACV,OAAO,CAAC,UAAU,MAAM,WAAW,WAAW,CAAC;AAClD,MAAI,UAAU,WAAW;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO,MAAM,CAAC;AAChB;AA3DA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACFA,SAAS,KAAAC,WAAS;AAElB,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,OAAOC,SAAQ;AAIf,SAAS,cAAAC,mBAAkB;AAuC3B,eAAe,OAAO,GAA6B;AACjD,MAAI;AACF,UAAMH,KAAG,OAAO,CAAC;AACjB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,eAAe,cAAc,UAA0C;AACrE,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,QAAI,MAAM,OAAOC,OAAK,KAAK,KAAK,UAAU,WAAW,CAAC,EAAG,QAAO;AAChE,QAAI,MAAM,OAAOA,OAAK,KAAK,KAAK,MAAM,CAAC,EAAG,QAAO;AACjD,UAAM,SAASA,OAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,SAAS,aAAa,QAAwB,SAA0B;AACtE,SAAO,gBAAgB,MAAM,EAAE,KAAK,CAAC,WAAW,cAAc,QAAQ,OAAO,CAAC;AAChF;AAEA,SAAS,YAAY,QAAwB,SAA0B;AACrE,SAAO,gBAAgB,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,QAAQ,EAAE,MAAM,OAAO;AAC9E;AAEA,SAAS,SAAS,OAA0B;AAC1C,QAAM,MAAM,GAAG,MAAM,cAAc,WAAW,GAAG,MAAM,WAAW,IAAI,MAAM,QAAQ,KAAK,EAAE;AAC3F,SAAO,IAAI,QAAQ,mBAAmB,EAAE,EAAE,MAAM,GAAG,GAAG,KAAK;AAC7D;AAEA,eAAe,aAAa,WAAyC;AACnE,MAAI;AACF,UAAM,SAAkB,KAAK,MAAM,MAAMD,KAAG,SAAS,WAAW,OAAO,CAAC;AACxE,WAAO,IAAI,IAAI,cAAc,MAAM,IAAI,SAAS,CAAC,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO,oBAAI,IAAI;AAAA,EACjB;AACF;AAEA,SAAS,cACP,SACA,SACA,OACQ;AACR,QAAM,QAAkB,CAAC;AACzB,QAAM;AAAA,IACJ,yCAAyC,OAAO,mGAAmG,iBAAiB;AAAA,EACtK;AACA,QAAM,SAAS,CACb,IACA,WACA,OACA,cACG;AACH,UAAM,QACJ,cAAc,YACV,KACA,cAAc,YACZ,8FACA;AACR,UAAM;AAAA,MACJ,MAAM,KAAK,MAAM,UAAU,QAAQ,KAAK,UAAU,KAAK,KAAK,UAAU,IAAI,SAAS,EAAE,eAAe,UAAU,QAAQ,cAAc,UAAU,MAAM,KAAK,IAAI,CAAC,YAAY,UAAU,SAAS,SAAS,cACpM,UAAU,QACP,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,EAAE,SAAS,EACtB,KAAK,IAAI,KAAK,YACnB,IAAI,KAAK;AAAA,IACX;AAAA,EACF;AACA,aAAW,UAAU,SAAS;AAC5B,UAAM,YAAY;AAAA,MAChB;AAAA,MACA,MAAM,YAAY,OAAO,EAAE,KAAK;AAAA,MAChC,MAAM,mBAAmB,OAAO,EAAE,GAAG,aAAa;AAAA,IACpD;AACA;AAAA,MACE,OAAO;AAAA,MACP;AAAA,MACA,OAAO,WAAW,WAAW,UAAU,WAAW,OAAO;AAAA,MACzD,UAAU,MAAM;AAAA,IAClB;AACA,QAAI,UAAU;AACZ;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV;AAAA,QACA,UAAU,gBAAgB,MAAM;AAAA,MAClC;AAAA,EACJ;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAUA,eAAsB,QAAQ,WAAmB,MAAe,CAAC,GAA2B;AAC1F,MAAI;AACJ,MAAI;AACF,YAAQ,gBAAgB,MAAM,KAAK,MAAM,SAAS,CAAC;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,MAAI,MAAM,aAAa,CAAC,gBAAgB,IAAI,MAAM,SAAS,EAAG,QAAO;AACrE,QAAM,WAAW,MAAM,YAAY;AACnC,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAEtD,QAAM,UAAUC,OAAK,WAAW,QAAQ,IACpC,WACAA,OAAK,QAAQ,MAAM,OAAO,QAAQ,IAAI,GAAG,QAAQ;AACrD,QAAM,OAAO,MAAM,cAAcA,OAAK,QAAQ,OAAO,CAAC;AACtD,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,IAAI,WAAY,MAAMD,KAAG,SAAS,IAAI,MAAQ,MAAMA,KAAG,SAAS,IAAI,OAAO,EAAI,QAAO;AAC1F,QAAM,UAAUC,OAAK,SAAS,MAAM,OAAO,EAAE,MAAMA,OAAK,GAAG,EAAE,KAAK,GAAG;AACrE,MAAI,QAAQ,WAAW,IAAI,EAAG,QAAO;AAErC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,IAAI;AAEhD,QAAM,WAAW,IAAI,YAAYC,IAAG,OAAO;AAC3C,QAAM,YAAYD,OAAK;AAAA,IACrB;AAAA,IACA,cAAcE,YAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,SAAS,KAAK,CAAC;AAAA,EAC/F;AACA,QAAM,WAAW,MAAM,aAAa,SAAS;AAC7C,QAAM,YAAY,CAAC,WACjB,GAAG,OAAO,EAAE,IAAIA,YAAW,QAAQ,EAAE,OAAO,KAAK,UAAU,MAAM,CAAC,EAAE,OAAO,KAAK,CAAC;AACnF,QAAM,qBAAqB,CAAC,WAC1B,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,QAAQ,QAAQ,OAAO,MAAM,IAAI,WAAW,GAAG,OAAO,EAAE,GAAG,CAAC;AAKlF,QAAM,QAAQ,QAAQ;AAAA,IACpB,CAAC,MACC,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC,MACzB,mBAAmB,CAAC,KAAM,EAAE,WAAW,YAAY,aAAa,GAAG,OAAO;AAAA,EAC/E;AACA,MAAI,MAAM,WAAW,EAAG,QAAO;AAG/B,QAAM,KAAK,CAAC,GAAG,MAAM;AACnB,UAAM,YAAY,OAAO,EAAE,WAAW,QAAQ,IAAI,OAAO,EAAE,WAAW,QAAQ;AAC9E,QAAI,UAAW,QAAO;AACtB,UAAM,YAAY,OAAO,YAAY,GAAG,OAAO,CAAC,IAAI,OAAO,YAAY,GAAG,OAAO,CAAC;AAClF,QAAI,cAAc,EAAG,QAAO;AAC5B,WAAO,EAAE,UAAU,cAAc,EAAE,SAAS;AAAA,EAC9C,CAAC;AACD,QAAM,WAAW,MAAM,MAAM,GAAG,sBAAsB;AAEtD,QAAM,QAAQ,MAAM,qBAAqB,MAAM,QAAQ;AAEvD,aAAW,UAAU,SAAU,UAAS,IAAI,UAAU,MAAM,CAAC;AAC7D,MAAI;AACF,UAAMH,KAAG,UAAU,WAAW,KAAK,UAAU,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO;AAAA,EACtE,QAAQ;AAAA,EAER;AAEA,SAAO,KAAK,UAAU;AAAA,IACpB,oBAAoB;AAAA,MAClB,eAAe,IAAI,iBAAiB;AAAA,MACpC,mBAAmB,cAAc,SAAS,UAAU,KAAK;AAAA,IAC3D;AAAA,EACF,CAAC;AACH;AAlOA,IAcM,wBAEA,aAEA,iBAWA;AA7BN;AAAA;AAAA;AACA;AAIA;AACA;AACA;AAIA,IAAAI;AAGA,IAAM,yBAAyB;AAE/B,IAAM,cAAc;AAEpB,IAAM,kBAAkB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,OAAO,CAAC;AAWzD,IAAM,kBAAkBL,IAAE,OAAO;AAAA,MAC/B,YAAYA,IAAE,OAAO,EAAE,SAAS;AAAA,MAChC,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,KAAKA,IAAE,OAAO,EAAE,SAAS;AAAA,MACzB,iBAAiBA,IAAE,OAAO,EAAE,SAAS;AAAA,MACrC,WAAWA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,YAAYA,IAAE,OAAO,EAAE,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS;AAAA,IACtE,CAAC;AAAA;AAAA;;;ACpCD,SAAS,KAAAM,WAAS;AAClB,OAAOC,UAAQ;AACf,OAAOC,YAAU;AAyBjB,eAAsB,UAAU,MAA2C;AACzE,QAAM,MAAM,MAAM,cAAc,MAAM,UAAU;AAChD,MAAI,QAAQ,KAAM,QAAO;AACzB,SAAO,YAAY,MAAM,GAAG;AAC9B;AAGA,eAAsB,eACpB,MACsD;AACtD,QAAM,QAAQ,MAAM,UAAU,IAAI;AAElC,MAAI,MAAO,QAAO,EAAE,MAAM,OAAO,MAAM;AACvC,QAAM,SAAS,MAAMD,KAAG;AAAA,IACtBC,OAAK,QAAQ,OAAO,MAAMC,KAAI,MAAM,aAAa,kBAAkB,GAAG,KAAK,CAAC;AAAA,EAC9E;AACA,QAAM,MAAM,MAAMF,KAAG,UAAU,MAAME,KAAI,MAAM,aAAa,oBAAoB,GAAG,KAAK,CAAC;AACzF,MAAI,WAAW,IAAK,QAAO,EAAE,MAAM,OAAO,KAAK;AAG/C,QAAM,WAAW,MAAMA,KAAI,MAAM,YAAY,QAAQ,eAAe,IAAI,GACrE,MAAM,MAAM,EAAE,CAAC,EACf,MAAM,IAAI;AACb,QAAM,YAAY,QAAQ,KAAK,CAAC,UAAU,MAAM,WAAW,WAAW,CAAC,GAAG,MAAM,CAAC;AACjF,MAAI,CAAC,aAAa,QAAQ,SAAS,MAAM,EAAG,QAAO,EAAE,MAAM,OAAO,KAAK;AACvE,MAAI;AACJ,MAAI;AACF,oBAAgB,MAAMF,KAAG;AAAA,OACtB,MAAME,KAAI,WAAW,aAAa,iBAAiB,GAAG,KAAK;AAAA,IAC9D;AAAA,EACF,SAAS,OAAO;AAGd,QAAI,6BAA6B,KAAK,OAAQ,MAA8B,MAAM,CAAC;AACjF,aAAO,EAAE,MAAM,OAAO,KAAK;AAC7B,UAAM;AAAA,EACR;AACA,QAAM,kBAAkB,MAAMF,KAAG;AAAA,IAC/BC,OAAK,QAAQ,gBAAgB,MAAMC,KAAI,eAAe,aAAa,kBAAkB,GAAG,KAAK,CAAC;AAAA,EAChG;AACA,MAAI,oBAAoB;AACtB,UAAM,IAAI,MAAM,mEAAmE;AACrF,QAAM,QAAQ,MAAM,UAAU,aAAa;AAC3C,QAAM,WAAW,MAAM,cAAc,MAAM,mBAAmB;AAC9D,MAAI,YAAY;AACd,eAAW,QAAQ,oBAAoB,MAAM,QAAQ,EAAE,MAAO,QAAO,MAAM,MAAM,IAAI;AACvF,SAAO,EAAE,MAAM,eAAe,MAAM;AACtC;AAYA,eAAsB,iBAAiB,MAAcC,YAAmB,MAA0B;AAChG,QAAM,MAAM,MAAM,cAAc,MAAMA,aAAY,YAAY,OAAO,OAAO;AAC5E,MAAI,QAAQ,KAAM,QAAO;AACzB,QAAM,UAAU,cAAc,MAAM,GAAG;AACvC,MAAI,QAAQ,SAAS,QAAQ,QAAQ,SAAS;AAC5C,UAAM,IAAI,MAAM,gDAAgD;AAClE,SAAO;AACT;AA7FA,IAMa,iBAOA,aAOA,YACA,qBACA,qBAsDP;AA5EN;AAAA;AAAA;AAGA;AACA;AAEO,IAAM,kBAAkBJ,IAAE,OAAO;AAAA,MACtC,mBAAmBA,IAAE,OAAO;AAAA,MAC5B,UAAUA,IAAE,OAAO,EAAE,KAAK;AAAA,MAC1B,aAAaA,IAAE,OAAO;AAAA,MACtB,gBAAgBA,IAAE,OAAO;AAAA,MACzB,cAAcA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,IAClC,CAAC;AACM,IAAM,cAAcA,IAAE,OAAO;AAAA,MAClC,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,OAAOA,IAAE,OAAO;AAAA,QACd,OAAO,gBAAgB,SAAS;AAAA,QAChC,QAAQ,gBAAgB,SAAS;AAAA,MACnC,CAAC;AAAA,IACH,CAAC;AACM,IAAM,aAAa;AACnB,IAAM,sBAAsB;AAC5B,IAAM,sBAAsBA,IAAE,OAAO;AAAA,MAC1C,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,OAAOA,IAAE,MAAMA,IAAE,KAAK,CAAC,UAAU,OAAO,CAAC,CAAC;AAAA,IAC5C,CAAC;AAmDD,IAAM,gBAAgBA,IAAE,OAAO;AAAA,MAC7B,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,MAAMA,IAAE,KAAK,CAAC,SAAS,QAAQ,CAAC;AAAA,MAChC,QAAQA,IAAE,KAAK,CAAC,cAAc,YAAY,CAAC;AAAA,MAC3C,mBAAmBA,IAAE,OAAO,EAAE,SAAS;AAAA,MACvC,sBAAsBA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACnD,MAAMA,IAAE,OAAO;AAAA,MACf,UAAUA,IAAE,OAAO,EAAE,KAAK;AAAA,MAC1B,cAAcA,IAAE,OAAO,EAAE,SAAS;AAAA,IACpC,CAAC;AAAA;AAAA;;;ACrFD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,KAAAK,WAAS;AAClB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,aAAAC,kBAAiB;AAC1B,OAAOC,UAAQ;AAUR,SAAS,cAAcC,OAAgB,WAAW,QAAQ,UAAU;AACzE,SAAO,aAAa,UAChB,EAAE,SAAS,WAAW,MAAM,CAAC,MAAM,MAAM,MAAM,SAAS,GAAGA,KAAI,EAAE,IACjE,EAAE,SAAS,SAAS,MAAAA,MAAK;AAC/B;AAKA,eAAsB,mBAAmB;AACvC,QAAM,aAAa,cAAc,CAAC,8BAA8B,CAAC;AACjE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAMF,WAAUD,SAAQ,EAAE,WAAW,SAAS,WAAW,MAAM;AAAA,MAChF,SAAS;AAAA,MACT,WAAW;AAAA,MACX,aAAa;AAAA,IACf,CAAC;AACD,UAAM,SAASD,IACZ,OAAO,EAAE,UAAUA,IAAE,QAAQ,CAAC,GAAG,SAASA,IAAE,OAAO,EAAE,CAAC,EACtD,MAAM,KAAK,MAAM,MAAM,CAAC;AAC3B,QAAI,OAAO,aAAa,KAAK,OAAO,OAAO,YAAY;AACrD,YAAM,IAAI,MAAM,yCAAyC;AAC3D,WAAO,EAAE,WAAW,MAAM,SAAS,OAAO,SAAS,SAAS,KAAK;AAAA,EACnE,QAAQ;AACN,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SACE;AAAA,IACJ;AAAA,EACF;AACF;AAGA,eAAsB,cACpB,MACA,UAAqD,CAAC,GACtD;AACA,QAAM,OAAO,MAAMG,KAAG;AAAA,KACnB,MAAME,KAAI,QAAQ,OAAO,QAAQ,IAAI,GAAG,aAAa,iBAAiB,GAAG,KAAK;AAAA,EACjF;AACA,QAAM,SAAS,MAAM,eAAe,IAAI,GAAG,OAAO,MAAM,IAAI;AAC5D,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,mBAAmB;AAC/B,SAAO,QAAQ,IAAI;AACnB,MAAI,CAAC,OAAO;AACV,QAAI,QAAQ,cAAe,QAAO;AAClC,UAAM,IAAI;AAAA,MACR,uCAAuC,IAAI,4BAA4B,IAAI;AAAA,IAC7E;AAAA,EACF;AACA,UAAQ,IAAI,uBAAuB,MAAM;AACzC,SAAO;AACT;AAEO,SAAS,uBAAsC;AACpD,QAAM,OAAO,QAAQ,IAAI;AACzB,MACE,CAAC,QAAQ,IAAI,oBACb,QAAQ,IAAI,wBACX,SAAS,YAAY,SAAS;AAE/B,WAAO;AACT,SAAO,+DAA+D,QAAQ,IAAI,gBAAgB,4BAA4B,IAAI;AACpI;AA7EA,IASa,kBASA,YACA;AAnBb;AAAA;AAAA;AAKA;AACA;AAGO,IAAM,mBAAmB,MAC9B,OAAkC,WAAc;AAQ3C,IAAM,aAAa,CAAC,SAAe,cAAc,CAAC,gBAAgB,MAAM,KAAK,CAAC;AAC9E,IAAM,cAAc,CAAC,SAAe,sBAAsB,IAAI;AAAA;AAAA;;;ACnBrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAOC,UAAQ;AACf,SAAS,KAAAC,WAAS;AAyBX,SAAS,gBACdC,YACA,MACA,UACA,UAAU,iBAAiB,GAC3B;AACA,SAAO,GAAGA,UAAS,eAAe,IAAI,IAAI,QAAQ,IAAI,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;AAClF;AAEA,eAAsB,gBACpB,MACAA,YACA,MACA,UACA,UAAU,iBAAiB,GACE;AAC7B,QAAM,MAAM,MAAM,cAAc,MAAM,gBAAgBA,YAAW,MAAM,UAAU,OAAO,CAAC;AACzF,MAAI,QAAQ,KAAM,QAAO;AACzB,QAAM,SAAS,kBAAkB,MAAM,GAAG;AAC1C,MACE,OAAO,SAAS,QAChB,OAAO,SAAS,QAChB,OAAO,aAAa,YACpB,OAAO,iBAAiB;AAExB,UAAM,IAAI,MAAM,qDAAqD;AACvE,SAAO;AACT;AAGA,eAAsB,kBACpB,KACA,OACA,UAKI,CAAC,GACmB;AACxB,QAAM,OAAO,QAAQ,IAAI,kBACvB,WAAW,QAAQ,IAAI;AACzB,MAAK,SAAS,WAAW,SAAS,YAAa,CAAC,QAAQ,IAAI,iBAAkB,QAAO;AACrF,MAAI;AACF,QAAI,CAAC,UAAU;AACb,WAAK,MAAM,eAAe,QAAQ,IAAI,gBAAgB,GAAG,OAAO,MAAM,IAAI,GAAG;AAC3E,eAAO;AAAA,MACT;AACA,aAAO,qBAAqB;AAAA,IAC9B;AACA,UAAM,oBACJ,QAAQ,WAAW,MAAM,8CAA8C,IAAI,CAAC,KAC5E,QAAQ,YAAY,MAAM,yDAAyD,IAAI,CAAC;AAC1F,UAAM,KAAK,oBACP,EAAE,MAAM,MAAMF,KAAG,SAAS,GAAG,GAAG,WAAW,kBAAkB,IAC7D,MAAM,UAAU,GAAG;AACvB,QAAI,GAAG,SAAU,MAAMA,KAAG,SAAS,QAAQ,IAAI,gBAAgB,EAAI,QAAO;AAC1E,UAAM,EAAE,MAAM,IAAI,MAAM,eAAe,GAAG,IAAI;AAC9C,QAAI,OAAO,MAAM,IAAI,GAAG,aAAa;AACnC,aAAO;AACT,UAAME,aAAY,GAAG,YAAY;AACjC,UAAM,SAAS,GAAG,MAAMA,YAAW,YAAY;AAC7C,YAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,YAAM,SACH,MAAM,gBAAgB,GAAG,MAAM,GAAG,WAAW,MAAM,QAAQ,KAC3D;AAAA,QACC,SAAS;AAAA,QACT,cAAc,iBAAiB;AAAA,QAC/B,MAAM,GAAG;AAAA,QACT;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,UAAU,CAAC;AAAA,MACb;AACF,UAAI,UAAU,WAAW;AACvB,eAAO;AACP,eAAO,gBAAgB;AAAA,MACzB,WAAW,QAAQ,WAAW;AAC5B,cAAM,MAAM,KAAK,QAAQ,SAAS;AAClC,cAAM,UAAU,OAAO,SAAS,GAAG,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,IAAI;AAE9D,YAAI,UAAU,cAAc,QAAQ,OAAO,SAAS,KAAK,EAAG;AAC5D,gBAAQ,SAAS,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,QAAQ,QAAQ,KAAK,CAAC,CAAC;AACxD,gBAAQ,KAAK;AACb,YAAI,UAAU,YAAY;AACxB,kBAAQ,qBAAqB,QAAQ;AACrC,kBAAQ,aAAa,QAAQ;AAAA,QAC/B;AACA,eAAO,SAAS,GAAG,IAAI;AACvB,cAAM,UAAU,OAAO,QAAQ,OAAO,QAAQ,EAAE;AAAA,UAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAC/D,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,QACzB;AACA,eAAO,WAAW,OAAO,YAAY,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,MAC3D,MAAO;AACP,YAAM,eAAe,GAAG,MAAM,gBAAgB,GAAG,WAAW,MAAM,QAAQ,GAAG,MAAM;AAAA,IACrF,CAAC;AACD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WACE,uFACC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACnD,QAAQ,0BAA0B,GAAG,EACrC,MAAM,GAAG,GAAG;AAAA,EAEnB;AACF;AAnIA,IAQM;AARN;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA,IAAM,oBAAoBD,IAAE,OAAO;AAAA,MACjC,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,cAAcA,IAAE,OAAO;AAAA,MACvB,MAAMA,IAAE,OAAO;AAAA,MACf,UAAUA,IAAE,OAAO;AAAA,MACnB,MAAMA,IAAE,KAAK,CAAC,SAAS,QAAQ,CAAC;AAAA,MAChC,cAAcA,IAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,MAC3C,eAAeA,IAAE,OAAO,EAAE,SAAS;AAAA,MACnC,UAAUA,IAAE;AAAA,QACVA,IAAE,OAAO;AAAA,UACP,QAAQA,IAAE,MAAMA,IAAE,KAAK,MAAM,CAAC;AAAA,UAC9B,IAAIA,IAAE,OAAO;AAAA,UACb,oBAAoBA,IAAE,OAAO,EAAE,SAAS;AAAA,UACxC,YAAYA,IAAE,OAAO,EAAE,SAAS;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA;AAAA;;;ACtBD,SAAS,KAAAE,WAAS;AAiClB,eAAe,gBAAgB,MAAY,KAAc,MAAsC;AAC7F,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,MACE,SAAS,YACT,EACG,MAAM,oBAAoB,iBAAiB,MAAM,cAAc,UAC/D,MAAM,oBAAoB,gBAAgB,CAAC,QAAQ,OAAO,EAAE,SAAS,MAAM,aAAa,EAAE;AAG7F,WAAO;AACT,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,KAAK,UAAU,GAAG,GAAG;AAAA,MAChD,SAAS;AAAA,MACT,eAAe,MAAM;AAAA,IACvB,CAAC;AACD,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,SAAkB,KAAK,MAAM,MAAM;AACzC,WAAOA,IACJ,OAAO,EAAE,oBAAoBA,IAAE,OAAO,EAAE,mBAAmBA,IAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC1E,MAAM,MAAM,EAAE,mBAAmB;AAAA,EACtC,SAAS,OAAO;AAEd,WAAO,eAAe,KAAK,IAAI;AAAA,EACjC;AACF;AAGO,SAAS,cACd,MACA,KAC0E;AAC1E,aAAW,MAAM,IAAI;AACrB,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAM,YACJ,SAAS,WACL,0CACA,oDACJ,KAAK,MAAM,aAAa,EAAE;AAC5B,SAAO;AAAA,IACL,KAAK,MAAM;AAAA,IACX,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,OAAO,UAAU,MAAM,eAAe;AAAA,MACtC;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,gBAAgB,MAAM;AAAA,MACtB,UAAU,CAAC,CAAC,MAAM,aAAa,CAAC;AAAA,MAChC,GAAI,MAAM,oBAAoB,gBAC1B,EAAE,sBAAsB,mBAAmB,MAAM,WAAW,MAAM,aAAa,EAAE,IACjF,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAEA,eAAsB,kBACpB,MACA,OACA,UAAiC,CAAC,GACO;AACzC,MAAI,OAAO;AACX,MAAI;AACJ,MAAI;AACF,QAAI,OAAO,WAAW,KAAK,IAAI,OAAO,KAAM,OAAM,IAAI,MAAM,2BAA2B;AACvF,QAAI;AACJ,QAAI;AACF,YAAM,KAAK,MAAM,KAAK;AAAA,IACxB,QAAQ;AACN,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AACA,UAAM,QAAQ,cAAc,MAAM,GAAG;AACrC,WAAO;AACP,WAAO,MAAM;AACb,QAAI,QAAQ,SAAS;AACnB,YAAM,MAAM,MAAM,gBAAgB,MAAM,MAAM,GAAG;AACjD,YAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,UAAI,CAAE,MAAMA,eAAc,MAAM,EAAE,KAAK,MAAM,KAAK,eAAe,KAAK,CAAC,EAAI,QAAO;AAAA,IACpF;AACA,QAAI,CAAC,eAAe,YAAY,EAAE,SAAS,MAAM,MAAM,KAAK,KAAK,MAAM,UAAU;AAC/E,YAAM,WAAW,MAAM,oBAAoB,MAAM,KAAK,MAAM,KAAK;AACjE,YAAM,EAAE,mBAAAC,mBAAkB,IAAI,MAAM;AACpC,YAAMC,WAAU,MAAMD,mBAAkB,SAAS,MAAM,MAAM,MAAM,OAAO;AAAA,QACxE,WAAW,MAAM,MAAM;AAAA,QACvB,WAAW,SAAS;AAAA,MACtB,CAAC;AACD,YAAME,aAAY,MAAM,gBAAgB,MAAM,KAAK,SAAS,IAAI;AAChE,aAAOA,aACH;AAAA,QACE,GAAID,WAAU,EAAE,eAAeA,SAAQ,IAAI,CAAC;AAAA,QAC5C,oBAAoB,EAAE,eAAe,MAAM,mBAAmBC,WAAU;AAAA,MAC1E,IACAD,WACE,EAAE,eAAeA,SAAQ,IACzB;AAAA,IACR;AACA,UAAM,SAAS,MAAM,yBAAyB,MAAM,KAAK,MAAM,KAAK;AACpE,UAAM,EAAE,mBAAAD,mBAAkB,IAAI,MAAM;AACpC,UAAM,UAAU,MAAMA,mBAAkB,OAAO,OAAO,MAAM,MAAM,MAAM,OAAO;AAAA,MAC7E,WAAW,MAAM,MAAM;AAAA,MACvB,oBAAoB,OAAO,OAAO;AAAA,MAClC,YAAY,OAAO,OAAO;AAAA,IAC5B,CAAC;AACD,QAAI,QAAS,QAAO,UAAU,CAAC,OAAO,SAAS,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACjF,UAAM,YAAY,MAAM,gBAAgB,MAAM,KAAK,OAAO,OAAO,IAAI;AACrE,QAAI,UAAW,QAAO,UAAU,CAAC,OAAO,SAAS,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,MAAM;AACvF,QAAI,SAAS,UAAU,OAAO,iBAAiB;AAC7C,aAAO,EAAE,UAAU,SAAS,QAAQ,OAAO,WAAW,OAAO,gBAAgB;AAAA,IAC/E;AACA,QAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,QAAI,SAAS,QAAQ;AAEnB,aAAO,EAAE,eAAe,OAAO,QAAQ;AAAA,IACzC;AACA,WAAO,EAAE,oBAAoB,EAAE,eAAe,MAAM,mBAAmB,OAAO,QAAQ,EAAE;AAAA,EAC1F,SAAS,OAAO;AACd,UAAM,UAAU,OACZ,MAAM,mBAAmB,KAAK,KAAK,MAAM,KAAK,MAAM,WAAY,KAAK,IACrE,eAAe,KAAK;AACxB,QAAI,CAAC,QAAS,QAAO;AAErB,WAAO;AAAA,MACL,eAAe;AAAA,MACf,GAAI,CAAC,gBAAgB,oBAAoB,cAAc,aAAa,EAAE,SAAS,IAAI,IAC/E,EAAE,oBAAoB,EAAE,eAAe,MAAM,mBAAmB,QAAQ,EAAE,IAC1E,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAUO,SAAS,mBAAmB,MAAY,WAAW,QAAQ,UAAU,SAAS,OAAO;AAC1F,QAAMG,WAAU,sBAAsB,IAAI,GAAG,SAAS,UAAU,EAAE,gBAAgB,IAAI;AACtF,SAAO,aAAa,UAChB,gFAAgFA,QAAO,OACvF,6CAA6CA,QAAO;AAC1D;AACO,SAAS,yBAAyB,MAAY;AACnD,SAAO;AAAA,IACL,qEAAqE;AAAA,IACrE,gEAAgE;AAAA,IAChE,mBAAmB,MAAM,OAAO;AAAA,IAChC,mBAAmB,MAAM,OAAO;AAAA,IAChC,mBAAmB,MAAM,SAAS,IAAI;AAAA,IACtC,mBAAmB,MAAM,SAAS,IAAI;AAAA,IACtC,sBAAsB,IAAI,gBAAgB,IAAI;AAAA,IAC9C,sBAAsB,IAAI,qBAAqB,IAAI;AAAA,EACrD;AACF;AAEO,SAAS,8BAA8B,MAAY,WAAW,QAAQ,UAAU;AACrF,SAAO;AAAA,IACL,mBAAmB,MAAM,QAAQ;AAAA,IACjC,mBAAmB,MAAM,UAAU,IAAI;AAAA,IACvC,sBAAsB,IAAI,gBAAgB,IAAI;AAAA,IAC9C,sBAAsB,IAAI,qBAAqB,IAAI;AAAA,EACrD;AACF;AACO,SAAS,WAAW,MAAYA,WAAU,kDAAkD;AACjG,QAAM,UAAU;AAAA,IACd,MAAM;AAAA,IACN,SAAS,CAAC,sBAAsB,IAAI,IAAI,sBAAsB,IAAI,OAAO,EAAE,SAASA,QAAO,IACvF,mBAAmB,IAAI,IACvBA,WAAU,kBAAkB;AAAA,IAChC,SAAS;AAAA,EACX;AACA,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,MACZ,YAAY,IAAI,CAAC,SAAS;AAAA,QACxB;AAAA,QACA;AAAA,UACE;AAAA,YACE,GAAI,CAAC,cAAc,aAAa,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,YACxE,OAAO,CAAC,EAAE,GAAG,QAAQ,CAAC;AAAA,UACxB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AA7NA,IAQM,aAiBA,WA4IO;AArKb;AAAA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAEA,IAAM,cAAcL,IAAE,OAAO;AAAA,MAC3B,KAAKA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACrB,YAAYA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,MACrC,iBAAiBA,IAAE,KAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,WAAWA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,aAAaA,IAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,MAC1C,eAAeA,IAAE,QAAQ,EAAE,SAAS;AAAA,MACpC,YAAYA,IAAE,QAAQ,EAAE,SAAS;AAAA,MACjC,kBAAkBA,IAAE,QAAQ,EAAE,SAAS;AAAA,MACvC,iBAAiBA,IAAE,OAAO,EAAE,SAAS;AAAA,IACvC,CAAC;AACD,IAAM,YACJ;AAAA,MACE,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAqIK,IAAM,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;AC3KA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAOM,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,cAAAC,mBAAkB;AAc3B,eAAsB,SAAS,MAAc,MAAsC;AACjF,MAAI;AACF,UAAMC,QAAO,MAAM,gBAAgB,MAAM,UAAU,MAAM,IAAI,GAAG,IAAI,OAAO,IAAI;AAC/E,QAAIA,UAAS;AACX,YAAM,IAAI,MAAM,yDAAyD,IAAI;AAC/E,WAAOA;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM;AAAA,EACR;AACF;AAGO,SAAS,aAAaA,OAAc,OAAe,KAAa,MAAsB;AAC3F,QAAM,SAASA,MAAK,MAAM,KAAK,EAAE,SAAS,GACxC,OAAOA,MAAK,MAAM,GAAG,EAAE,SAAS;AAClC,MAAI,WAAW,QAAQ,SAAS,KAAM,WAAW,KAAKA,MAAK,QAAQ,GAAG,IAAIA,MAAK,QAAQ,KAAK,GAAI;AAC9F,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAMA,MAAK,SAAS,MAAM,IAAI,SAAS;AAC7C,QAAM,QAAQ,CAAC,OAAO,KAAK,QAAQ,UAAU,GAAG,GAAG,GAAG,EAAE,KAAK,GAAG;AAChE,MAAI;AACF,WAAOA,MAAK,MAAM,GAAGA,MAAK,QAAQ,KAAK,CAAC,IAAI,QAAQA,MAAK,MAAMA,MAAK,QAAQ,GAAG,IAAI,IAAI,MAAM;AAC/F,SACEA,SAAQA,MAAK,UAAU,CAACA,MAAK,SAAS,IAAI,IAAI,MAAM,OAAOA,MAAK,SAAS,MAAM,MAAM,QAAQ;AAEjG;AAGA,eAAsB,UAAU,MAAc,MAAgD;AAC5F,QAAM,UAAU,MAAM,SAAS,MAAM,KAAK,IAAI;AAC9C,MAAI,YAAY,KAAK,MAAO,QAAO;AACnC,MAAI,YAAY,KAAK;AACnB,UAAM,IAAI;AAAA,MACR,8CACE,KAAK,OACL;AAAA,IACJ;AACF,MAAI,KAAK,UAAU,MAAM;AACvB,UAAMC,QAAO,MAAM,UAAU,MAAM,KAAK,IAAI;AAC5C,QAAK,MAAM,SAAS,MAAM,KAAK,IAAI,MAAO,KAAK;AAC7C,YAAM,IAAI,MAAM,mCAAmC,KAAK,IAAI;AAC9D,UAAMJ,KAAG,OAAOI,KAAI;AACpB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM,UAAU,MAAM,KAAK,MAAM,IAAI;AAClD,QAAM,YAAYH,OAAK,KAAKA,OAAK,QAAQ,IAAI,GAAG,kBAAkBC,YAAW,IAAI,MAAM;AACvF,MAAI;AACF,UAAM,OAAO,MAAMF,KAAG,KAAK,IAAI,EAAE;AAAA,MAC/B,CAAC,MAAM,EAAE,OAAO;AAAA,MAChB,MAAM;AAAA,IACR;AACA,UAAM,SAAS,MAAMA,KAAG,KAAK,WAAW,MAAM,IAAI;AAClD,QAAI;AACF,YAAM,OAAO,UAAU,KAAK,OAAO,MAAM;AACzC,YAAM,OAAO,KAAK;AAAA,IACpB,UAAE;AACA,YAAM,OAAO,MAAM;AAAA,IACrB;AACA,QAAK,MAAM,SAAS,MAAM,KAAK,IAAI,MAAO,KAAK;AAC7C,YAAM,IAAI,MAAM,8CAA8C,KAAK,IAAI;AACzE,UAAMA,KAAG,OAAO,WAAW,IAAI;AAC/B,WAAO;AAAA,EACT,UAAE;AACA,UAAMA,KAAG,GAAG,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,EACxC;AACF;AApFA,IAAAK,cAAA;AAAA;AAAA;AAGA;AACA;AAAA;AAAA;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,KAAAC,WAAS;AAClB,SAAS,aAAa;AAqBf,SAAS,UAAUC,OAAc,OAAe,KAAa;AAClE,QAAM,SAASA,MAAK,MAAM,KAAK,EAAE,SAAS,GACxC,OAAOA,MAAK,MAAM,GAAG,EAAE,SAAS;AAClC,MAAI,CAAC,UAAU,CAAC,KAAM,QAAO;AAC7B,QAAM,OAAOA,MAAK,QAAQ,KAAK,GAC7B,KAAKA,MAAK,QAAQ,GAAG,IAAI,IAAI;AAC/B,MAAI,WAAW,KAAK,SAAS,KAAK,MAAM;AACtC,UAAM,IAAI,MAAM,6DAA6D;AAC/E,SAAO,EAAE,MAAM,IAAI,MAAMA,MAAK,MAAM,MAAM,EAAE,EAAE;AAChD;AAGA,eAAsB,cACpB,MACA,OACA,eAAuC,CAAC,GACrB;AACnB,QAAM,SAAS,MAAM,SAAS,MAAM,cAAc;AAClD,QAAM,SACJ,WAAW,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,EAAE,IAAI,gBAAgB,MAAM,KAAK,MAAM,MAAM,CAAC;AACxF,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,OAAO,MAAM,KAAK,IAAI;AACvC,UAAM,QAAQ;AAAA,MACZ,SAAS,KAAK,WAAW,SAAS,UAAU,WAAW;AAAA,MACvD,aACE,KAAK,WAAW,QAAQ,UAAU,gBAAgB,KAAK,KAAK,MAAM,IAC9D,KAAK,KAAK,KAAK,IACd,UAAU,eAAe,KAAK,KAAK,KAAK;AAAA,MAC/C,QAAQ,OAAO;AAAA,QACb,OAAO,QAAQ,CAAC,CAAC,OAAO,GAAG,MAAM;AAC/B,gBAAM,QAAQ,UAAU,KAAK,OAAO,OAAO,GAAG;AAC9C,iBAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,aAAsB,KAAK,KAAK,SAAS,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI;AACnF,UAAM,aAAaD,IAChB,OAAO;AAAA,MACN,YAAYA,IAAE,OAAOA,IAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,MAC3C,OAAOA,IAAE,OAAOA,IAAE,MAAMA,IAAE,OAAO,EAAE,OAAOA,IAAE,MAAMA,IAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS;AAAA,IAC/E,CAAC,EACA,MAAM,cAAc,CAAC,CAAC;AACzB,UAAM,MACJ,KAAK,SAAS,uBACT,MAAM,KAAK,KAAK,EAAE,aAAyC,QAC5D,KAAK,SAAS,cACZ,WAAW,YAAY,QACvB;AACR,UAAM,QACJ,KAAK,SAAS,uBAAuB,KAAK,SAAS,0BAC/C,WAAW,QACX;AACN,WAAO,MAAM,KAAK,IAAI,IAAI;AAAA,MACxB,GAAG;AAAA,MACH,GAAI,QAAQ,SAAY,CAAC,IAAI,EAAE,SAAS,KAAK,GAAG,EAAE;AAAA,MAClD,GAAI,aAAa,KAAK,IAAI,IACtB;AAAA,QACE,cAAc;AAAA,UACZ,GAAG,oBAAI,IAAI,CAAC,GAAI,UAAU,gBAAgB,CAAC,GAAI,aAAa,KAAK,IAAI,CAAC,CAAC;AAAA,QACzE;AAAA,MACF,IACA,CAAC;AAAA,MACL,GAAI,UAAU,SACV,CAAC,IACD;AAAA,QACE,OAAO,OAAO;AAAA,UACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,MAAM,MAAM;AAAA,YAC7C;AAAA,YACA,OAAO,QAAQ,CAAC,UAAU,MAAM,MAAM,IAAI,IAAI,CAAC;AAAA,UACjD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACN;AAAA,EACF;AACA,SAAO,EAAE,MAAM,gBAAgB,QAAQ,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,KAAK;AACvF;AAGA,eAAsB,uBACpB,MACA,MACAE,UACmB;AACnB,QAAM,SAAS,MAAM,SAAS,MAAM,cAAc;AAClD,QAAM,SAAS,gBAAgB,MAAM,KAAK,MAAM,UAAU,MAAM,CAAC;AACjE,SAAO,MAAM,IAAI,EAAE,eAAe,CAACA,QAAO;AAC1C,SAAO,EAAE,MAAM,gBAAgB,QAAQ,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,KAAK;AACvF;AA7GA,IAKa,gBACA,QAKP,YAQO;AAnBb;AAAA;AAAA;AAEA;AACA,IAAAC;AAEO,IAAM,iBAAiB;AACvB,IAAM,SAAS;AAAA,MACpB,CAAC,wBAAwB,oBAAoB;AAAA,MAC7C,CAAC,+BAA+B,2BAA2B;AAAA,MAC3D,CAAC,qBAAqB,iBAAiB;AAAA,IACzC;AACA,IAAM,aAAaH,IAAE,OAAO;AAAA,MAC1B,SAASA,IAAE,QAAQ;AAAA,MACnB,aAAaA,IAAE,OAAO;AAAA,MACtB,QAAQA,IAAE,OAAOA,IAAE,OAAO,CAAC;AAAA,MAC3B,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,cAAcA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MAC3C,OAAOA,IAAE,OAAOA,IAAE,MAAMA,IAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,IAChD,CAAC;AACM,IAAM,kBAAkBA,IAAE,OAAO,EAAE,SAASA,IAAE,QAAQ,CAAC,GAAG,OAAOA,IAAE,OAAO,UAAU,EAAE,CAAC;AAAA;AAAA;;;ACnB9F,SAAS,KAAAI,WAAS;AAAlB,IAUM,cAoDO,mBAoBP,iBAOA;AAzFN;AAAA;AAAA;AACA;AACA,IAAAC;AAQA,IAAM,eAAeD,IAClB,OAAO;AAAA,MACN,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,eAAeA,IAAE,OAAO;AAAA,MACxB,UAAUA,IAAE,OAAOA,IAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,IAC3C,CAAC,EACA,YAAY;AA8CR,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBjC,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,iBAAiB;AAEnB,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC/FjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,yBAAyB;AAClC,SAAS,SAAAE,QAAO,iBAAiB;AACjC,SAAS,KAAAC,WAAS;AAelB,eAAsB,iBAAiB,MAAc,MAAa;AAChE,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,eAAe,IAAI,OAAO,UAAU,EAAE,MAAM,MAAM,MAAM,MAAM,SAAS,MAAM,IAAI,EAAE,EAAE;AAAA,EACvF;AACA,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAClD,QAAM,UACJ,SAAS,WAAW,MAAM,CAAC,EAAE,SAAS,OAClC,EAAE,MAAM,aAAa,MAAM,KAAK,IAC/B,YAAY,EAAE,MAAM,aAAa,MAAM,KAAK;AACnD,QAAM,mBACJ,QAAQ,SAAS,QAAQ,WACrB,gDAAgD,SAAS,OAAO,QAChE;AACN,QAAM,QAAoB;AAAA,IACxB;AAAA,MACE,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,OAAO;AAAA,QACL,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,QACA,kBAAkB,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,aAAa;AAChC,UAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,SAAS,IAAI;AAC/E,QAAI,SAAS,YAAY,CAAC,UAAU,OAAQ,WAAU,KAAK,EAAE,MAAM,aAAa,MAAM,KAAK,CAAC;AAC5F,eAAW,QAAQ,WAAW;AAC5B,YAAMC,QAAO,KAAK,QAAQ;AAC1B,YAAM,SAASA,MAAK,SAAS,sBAAsB,KAAKA,MAAK,SAAS,oBAAoB;AAC1F,YAAM,WAAW,OAAO,KAAK,KAAK,WAAW,UAAU,IAAI,iBAAiB;AAC5E,UAAIA,MAAK,KAAK,MAAM,SAAU;AAE9B,YAAM,UAAU,+DAA+D;AAC/E,YAAM,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,OAAO;AAAA,UACLA;AAAA,UACA,SAAS,yBAAyB;AAAA,UAClC,SAAS,uBAAuB;AAAA,UAChC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,WAAW,UAAmB,MAAY;AACjD,QAAM,UAAU,aAAa,SAAY,CAAC,IAAI,OAAO,MAAM,QAAQ;AACnE,aAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACE,WAAO,QAAQ,GAAG;AACpB,SAAO,EAAE,GAAG,SAAS,GAAI,SAAS,WAAW,EAAE,MAAM,QAAQ,IAAI,CAAC,GAAI,GAAG,WAAW,IAAI,EAAE;AAC5F;AAEA,eAAsB,QAAQ,MAAc,MAA+B;AACzE,QAAM,OAAO,QAAQ,IAAI,GACvB,SAAS,MAAM,SAAS,MAAM,IAAI;AACpC,MAAI,SAAS,UAAU;AACrB,UAAMC,UAAS,WAAW,OAAO,CAAC,IAAI,OAAO,MAAM,KAAK,MAAM,MAAM,CAAC;AACrE,UAAMC,WAAU,OAAO,MAAMD,QAAO,cAAc,CAAC,CAAC;AAEpD,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OACE,KAAK;AAAA,QACH,EAAE,GAAGA,SAAQ,YAAY,EAAE,GAAGC,UAAS,OAAO,WAAWA,SAAQ,OAAO,IAAI,EAAE,EAAE;AAAA,QAChF;AAAA,QACA;AAAA,MACF,IAAI;AAAA,IACR;AAAA,EACF;AACA,QAAM,SAASJ,OAAM,UAAU,EAAE;AACjC,QAAM,WAAW,UAAU,IAAI,SAAS,UAAU;AAClD,QAAM,UAAU,OAAO;AACvB,QAAM,UAAU,WAAW,SAAS,OAAO,IAAI;AAC/C,MAAI,OAAO,UAAU;AACrB,MAAI,SAAS,SAAS,CAAC,SAAS;AAG9B,UAAM,UAAU,CAAC,GAAG,KAAK,SAAS,wCAAwC,CAAC;AAC3E,UAAM,QAAQ,QAAQ;AAAA,MAAQ,CAAC,QAAQ,UACrC,kDAAkD,KAAK,OAAO,CAAC,CAAC,IAC5D,CAAC,EAAE,OAAO,OAAO,OAAQ,KAAK,QAAQ,QAAQ,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,IACxE,CAAC;AAAA,IACP;AACA,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,eAAW,QAAQ,MAAM,QAAQ,EAAG,QAAO,KAAK,MAAM,GAAG,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG;AAAA,EAC5F;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,EAAE,aAAa,EAAE,OAAO,QAAQ,EAAE,CAAC,EAAE,QAAQ;AAAA,EACzD;AACA,QAAM,SAASA,OAAM,KAAK;AAC1B,QAAM,WAAW,EAAE,GAAG,QAAQ,aAAa,EAAE,GAAI,WAAW,CAAC,GAAI,OAAO,QAAQ,EAAE;AAClF,MAAI,CAAC,kBAAkB,QAAQ,QAAQ;AACrC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO,EAAE,MAAM,MAAM,QAAQ,MAAM;AACrC;AAEA,eAAsB,UAAU,MAAc,MAAiC;AAC7E,QAAM,OAAOK,YAAW,IAAI,GAC1B,SAAS,MAAM,SAAS,MAAM,IAAI;AACpC,QAAM,EAAE,uBAAAC,uBAAsB,IAAI,MAAM;AACxC,QAAM,OAAO,MAAMA,uBAAsB,MAAM,MAAM,YAAY,IAAI,CAAC;AACtE,SAAO;AAAA,IACL,EAAE,MAAM,MAAM,QAAQ,OAAO,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,IAAI,KAAK;AAAA,IACzE;AAAA,MACE,MAAM;AAAA,MACN,QAAQ,MAAM,SAAS,MAAM,eAAe;AAAA,MAC5C,OAAO,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,IAAI;AAAA,IAChD;AAAA,EACF;AACF;AAEA,eAAsB,eAAe,MAAc;AACjD,QAAM,SAAS,MAAM,SAAS,MAAM,YAAY;AAChD,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACX,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,aAAa,UAAU,IAAI,wBAAwB,sBAAsB,KAAK;AAAA,IACvF;AAAA,EACF;AACF;AAEA,eAAsB,kBAAkB,MAAc,MAAY,YAAqB;AACrF,QAAMJ,QAAO,cAAe,MAAM,SAAS,MAAM,QAAQ,IAAI,CAAC;AAC9D,QAAM,SAAS,SAAS,UAAUF,OAAME,SAAQ,EAAE,IAAI,OAAO,MAAM,KAAK,MAAMA,SAAQ,IAAI,CAAC;AAC3F,QAAM,UAAW,SAAS,UAAU,OAAO,cAAc,OAAO;AAEhE,QAAM,QAAQ,uBAAuB;AAAA,IACnC,KAAK,MAAO,MAAM,SAAS,MAAMG,YAAW,IAAI,CAAC,KAAM,IAAI;AAAA,EAC7D;AACA,QAAM,WAAW,WAAW,MAAM,YAAY,IAAI,CAAC;AACnD,QAAM,aAAa,8BAA8B,IAAI;AACrD,QAAM,MAAM,SAAS,UAAU,SAAY,OAAO,OAAO,MAAM,QAAQ,KAAK;AAC5E,SAAO;AAAA,IACL;AAAA,IACA,aAAa,KAAK,YAAY;AAAA,IAC9B,OAAO,OAAO;AAAA,MACZ,OAAO,KAAK,SAAS,KAAK,EAAE,IAAI,CAAC,UAAU;AAAA,QACzC;AAAA,SACC,MAAM,QAAQ,KAAK,KAAK,CAAC,GAAG;AAAA,UAC3B,CAAC,UACC,MAAM,MACH,OAAO,CAAC,YAAY,WAAW,SAAS,QAAQ,WAAW,EAAE,CAAC,EAC9D,IAAI,CAAC,aAAa,EAAE,GAAG,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC;AAAA,QAC9D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,UACE,MAAM,oBAAoB,QACzB,OAAO,UAAkD,UAAU,SACnE,OAAO,UAAkD,gBAAgB;AAAA,EAC9E;AACF;AAGA,eAAsB,mBAAmB,MAAc,MAAY;AACjE,QAAM,SAAS,MAAM,kBAAkB,MAAM,IAAI;AACjD,QAAM,eAAe,MAAM,iBAAiB,MAAM,IAAI;AACtD,QAAM,UAAU,aAAa,CAAC,GAAG,UAAU;AAC3C,QAAM,EAAE,WAAAE,WAAU,IAAI,MAAM;AAC5B,QAAM,QAAQA,WAAU,SAAS,wBAAwB,oBAAoB;AAC7E,QAAM,wBACJ,CAAC,CAAC,SACF,CAAC,eAAe,iBAAiB,iBAAiB,EAAE;AAAA,IAAM,CAAC,SACzD,MAAM,KAAK,SAAS,IAAI;AAAA,EAC1B,KACA,aAAa,MAAM,CAAC,EAAE,MAAM,CAAC,SAAS;AACpC,UAAM,WAAW,KAAK,KAAK,WAAW,UAAU,IAAI,kBAAkB;AACtE,YAAQ,KAAK,UAAU,IAAI,MAAM,OAAO,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,MAAM,QAAQ;AAAA,EACnF,CAAC;AACH,QAAM,gBAAgB,WAAW,MAAM,YAAY,IAAI,CAAC,EAAE;AAC1D,QAAM,kBAAkB,OAAO;AAAA,IAC7B,OAAO,QAAQ,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,MAAM,MAAM;AAAA,MACpD;AAAA,MACA,OAAO,IAAI,CAAC,WAAW;AAAA,QACrB,GAAG;AAAA,QACH,OAAO,MAAM,MAAM,IAAI,CAAC,aAAa;AAAA,UACnC,GAAG;AAAA,UACH,SAAS,cAAc,aAAa,CAAC,EAAE,MAAM,CAAC,EAAE;AAAA,QAClD,EAAE;AAAA,MACJ,EAAE;AAAA,IACJ,CAAC;AAAA,EACH;AACA,QAAM,gBACJ,kBAAkB,EAAE,SAAS,OAAO,KAAK,SAAS,MAAM,OAAO,KAAK,KAAK,GAAG,WAAW,IAAI,CAAC,MAC3F,OAAO,KAAK,SAAS,UAAa,OAAO,IAAI,SAAS;AACzD,QAAM,kBAAkB,kBAAkB,iBAAiB,aAAa;AACxE,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,qBAAqB,aAAa,MAAM,CAAC,SAAS,KAAK,WAAW,KAAK,KAAK;AAAA,IAC5E;AAAA,IACA;AAAA,IACA,cAAc,kBAAkB,OAAO,OAAO,aAAa;AAAA,IAC3D,YAAY,yBAAyB,iBAAiB;AAAA,EACxD;AACF;AA1PA,IAWM,QACO,SACP,YACJ,UACI,eACJ;AAhBF,IAAAC,eAAA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AAEA,IAAAC;AACA;AAEA,IAAM,SAASR,IAAE,OAAOA,IAAE,QAAQ,CAAC;AAC5B,IAAM,UAAU,CAAC,SAAgB,SAAS,UAAU,uBAAuB;AAClF,IAAM,aAAa;AAAnB,IACE,WAAW;AACb,IAAM,gBAAgB;AAAtB,IACE,cAAc;AAAA;AAAA;;;AChBhB;AAAA;AAAA;AAAA;AAAA,oBAAAS;AAAA,EAAA;AAAA;AAAA;AAAA,sBAAAC;AAAA;AAAA,SAAS,KAAAC,WAAS;AAqBlB,eAAe,mBAAmB,MAAc;AAC9C,SAAOD,cAAa;AAAA,IACjB,MAAM,cAAc,MAAM,eAAe,KAAM,EAAE,SAAS,GAAG,OAAO,CAAC,EAAE;AAAA,EAC1E;AACF;AAKA,eAAsB,kBAAkB,KAAa,MAAYE,UAAkB;AACjF,QAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,SAAO;AAAA,IAAS,GAAG;AAAA,IAAM;AAAA,IAA6B,MACpD,cAAc,GAAG,MAAM,MAAMA,QAAO;AAAA,EACtC;AACF;AAEA,eAAsB,sBAAsB,MAAc,MAAYA,UAAkB;AACtF,QAAM,OAAOH,YAAW,IAAI;AAC5B,QAAM,SAAS,MAAM,SAAS,MAAM,IAAI;AACxC,QAAM,WAAW,uBAAuB,MAAM,KAAK,MAAM,UAAU,IAAI,CAAC;AACxE,QAAM,SAAS,MAAM,mBAAmB,IAAI;AAC5C,QAAM,UAAU,WAAW,MAAMG,QAAO;AACxC,QAAM,aAAa,QAAQ,MAAM,aAAa,CAAC,EAAE,MAAM,CAAC,EAAE;AAC1D,QAAM,WAAW,OAAO,MAAM,IAAI,GAAG;AACrC,QAAM,gBAAgB,MAAM,SAAS,MAAM,cAAc;AACzD,QAAM,UACJ,kBAAkB,OACd,CAAC,IACA,gBAAgB,MAAM,KAAK,MAAM,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAEtF,QAAM,QAAQ,oBAAI,IAAI,CAAC,UAAU,GAAG,SAAS,YAAY,GAAG,yBAAyB,IAAI,CAAC,CAAC;AAC3F,QAAM,QAAQ,SAAS,SAAS,CAAC;AACjC,aAAW,SAAS,aAAa;AAC/B,UAAM,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,GAC9B,IAAI,CAAC,WAAW;AAAA,MACf,GAAG;AAAA,MACH,OAAO,MAAM,MAAM;AAAA,QACjB,CAAC,YACC,EACE,QAAQ,SAAS,aACjB,OAAO,QAAQ,YAAY,YAC3B,MAAM,IAAI,QAAQ,OAAO;AAAA,MAE/B;AAAA,IACF,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,MAAM,MAAM;AACvC,UAAM,KAAK,EAAE,KAAK,GAAG,QAAQ,MAAM,KAAK,CAAC;AAAA,EAC3C;AACA,SAAO,MAAM,IAAI,IAAI,EAAE,SAAS,WAAW;AAC3C,SAAO,EAAE,MAAM,QAAQ,QAAQ,EAAE,GAAG,UAAU,MAAM,GAAG,QAAQ,WAAW;AAC5E;AAEA,eAAe,cAAc,MAAc,MAAYA,UAAkB;AACvE,QAAM,EAAE,MAAM,QAAQ,QAAQ,QAAQ,WAAW,IAAI,MAAM;AAAA,IACzD;AAAA,IACA;AAAA,IACAA;AAAA,EACF;AACA,QAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AACjC,QAAM,EAAE,WAAAC,WAAU,IAAI,MAAM;AAC5B,QAAM,EAAE,eAAAC,gBAAe,wBAAAC,wBAAuB,IAAI,MAAM;AACxD,QAAM,OAAO,EAAE,MAAM,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,KAAK;AACjF,QAAM,YAAY,MAAMH,gBAAe,IAAI;AAC3C,QAAMC,WAAU,MAAM,MAAMC,eAAc,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC;AAC/E,aAAWE,SAAQ,UAAW,OAAMH,WAAU,MAAMG,KAAI;AACxD,QAAMH,WAAU,MAAM,IAAI;AAG1B,QAAM,eAAe,MAAM,iBAAiB,MAAM;AAClD,QAAMA,WAAU,MAAM,MAAME,wBAAuB,MAAM,MAAM,UAAU,CAAC;AAC1E,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MACE,SAAS,UACL,6IACA;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEA,eAAsB,oBAAoB,KAAa;AACrD,QAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,QAAM,SAAS,MAAM,mBAAmB,GAAG,IAAI;AAC/C,QAAM,SAAkC,CAAC;AACzC,aAAW,QAAQ,CAAC,UAAU,OAAO,GAAY;AAC/C,UAAM,WAAW,OAAO,MAAM,IAAI;AAClC,QAAI,CAAC,SAAU;AACf,UAAM,UAAU,uBAAuB;AAAA,MACpC,MAAM,cAAc,GAAG,MAAMP,YAAW,IAAI,CAAC,KAAM,CAAC;AAAA,IACvD;AACA,UAAM,mBAAmB,YAAY;AAAA,MAAO,CAAC,UAC3C,QAAQ,QAAQ,KAAK,GAAG;AAAA,QAAK,CAAC,UAC5B,MAAM,MAAM;AAAA,UACV,CAAC,YAAY,QAAQ,SAAS,aAAa,QAAQ,YAAY,SAAS;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAI,IAAI;AAAA,MACb,YAAYA,YAAW,IAAI;AAAA,MAC3B;AAAA,MACA,QACE,QAAQ,oBAAoB,OACxB,aACA,iBAAiB,WAAW,YAAY,SACtC,eACA;AAAA,MACR,SACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AACT;AAzIA,IAQM,aAKO,wBAGAC,eAIA,iBAMAD;AA1Bb;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA,IAAAS;AACA;AAEA,IAAM,cAAcP,IACjB,OAAO;AAAA,MACN,OAAOA,IAAE,MAAMA,IAAE,OAAO,EAAE,MAAMA,IAAE,OAAO,GAAG,SAASA,IAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,CAAC;AAAA,IAC7F,CAAC,EACA,YAAY;AACR,IAAM,yBAAyBA,IACnC,OAAO,EAAE,OAAOA,IAAE,OAAOA,IAAE,MAAM,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,EAC3D,YAAY;AACR,IAAMD,gBAAeC,IAAE,OAAO;AAAA,MACnC,SAASA,IAAE,QAAQ,CAAC;AAAA,MACpB,OAAOA,IAAE,OAAOA,IAAE,OAAO,EAAE,SAASA,IAAE,OAAO,EAAE,CAAC,CAAC;AAAA,IACnD,CAAC;AACM,IAAM,kBAAkB;AAMxB,IAAMF,cAAa,CAAC,SACzB,SAAS,WAAW,0BAA0B;AAAA;AAAA;;;AC3BhD;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,qBAAAU,0BAAyB;AAClC,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,SAAAC,QAAO,aAAAC,kBAAiB;AACjC,OAAOC,SAAQ;AACf,SAAS,KAAAC,WAAS;AA6BlB,eAAe,oBAAoB,MAAc,UAA2B;AAC1E,QAAM,QAAgB,CAAC,GACrB,cAAwD,CAAC;AAC3D,QAAM,SAAS,oBAAI,IAA2B;AAC9C,QAAM,OAAO,OAAO,SAAiB;AACnC,QAAI,CAAC,OAAO,IAAI,IAAI,EAAG,QAAO,IAAI,MAAM,MAAM,SAAS,MAAM,IAAI,CAAC;AAClE,WAAO,OAAO,IAAI,IAAI;AAAA,EACxB;AACA,QAAM,UAAU,OAAO,MAAc,WAAgC;AACnE,QAAI;AACF,YAAM,OAAO;AAAA,IACf,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAChE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM,KAAK,cAAc;AACjD,QAAM,YACJ,oBAAoB,OAChB,EAAE,SAAS,GAAG,OAAO,CAAC,EAAE,IACxB,gBAAgB,MAAM,KAAK,MAAM,eAAe,CAAC;AACvD,QAAM,cAAc,MAAM,KAAK,UAAU;AACzC,QAAM,QAAQ,gBAAgB,OAAO,OAAO,YAAY,MAAM,KAAK,MAAM,WAAW,CAAC;AACrF,QAAM,UACH,MAAM,UAAU,IAAI,GAAG,WACvB,MAAML,KAAG;AAAA,IACRC,OAAK,QAAQ,OAAO,MAAMK,KAAI,MAAM,aAAa,kBAAkB,GAAG,KAAK,CAAC;AAAA,EAC9E;AACF,QAAM,iBAAiB,UAAU,CAAC,QAAQ,MAAM,KAAK,mBAAmB,IAAI;AAC5E,QAAM,WACJ,mBAAmB,OACf,EAAE,SAAS,GAAY,OAAO,CAAC,EAAY,IAC3C,oBAAoB,MAAM,KAAK,MAAM,cAAc,CAAC;AAC1D,QAAM,mBAAmB,MAAM,KAAK,eAAe;AACnD,QAAM,aACJ,qBAAqB,OAAO,OAAOC,cAAa,MAAM,KAAK,MAAM,gBAAgB,CAAC;AACpF,QAAMC,YAAW,CAAC,SAChB,IAAI;AAAA,IACF;AAAA,MACE,YAAY,MAAM,IAAI,GAAG;AAAA,MACzB,GAAI,UAAU,MAAMC,YAAW,IAAI,CAAC,GAAG,gBAAgB,CAAC;AAAA,MACxD,GAAG,yBAAyB,IAAI;AAAA,MAChC,WAAW,MAAM,YAAY,IAAI,CAAC,EAAE,MAAM,aAAa,CAAC,EAAE,MAAM,CAAC,EAAE;AAAA,MACnE,WAAW,IAAI,EAAE,MAAM,aAAa,CAAC,EAAE,MAAM,CAAC,EAAE;AAAA,IAClD,EAAE,OAAO,CAACC,aAA+B,CAAC,CAACA,QAAO;AAAA,EACpD;AACF,QAAM,eAAe,CAACA,UAAiB,SACrCF,UAAS,IAAI,EAAE,IAAIE,QAAO,KAAK,4BAA4B,KAAKA,QAAO;AACzE,QAAM,MAAM,CAAC,MAAc,QAAgB,OAAeC,WAAmB;AAC3E,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN;AAAA,MACA,OACE,UAAU,MAAM,IAAI,GAAG,YACtBA,UAAS,UAAU,MAAM,IAAI,EAAE,gBAAgB,KAAK,MAAM,KACvD,OACA;AAAA,IACR,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB,MAAM;AAAA,IACxB,CAAC,SACC,CAAC,SAAS,SAAS,IAAI,MACtB,OAAO,MAAM,IAAI,KAChB,YAAY,MAAM,IAAI,KACtB,UAAU,MAAM,QAAQ,IAAI,CAAC,KAC7B,UAAU,MAAMF,YAAW,IAAI,CAAC;AAAA,EACtC;AAEA,aAAW,QAAQ,MAAM,OAAO,CAACG,UAAS,CAAC,SAAS,SAASA,KAAI,CAAC,GAAG;AACnE,UAAM,QAAQ,QAAQ,IAAI,GAAG,YAAY;AACvC,YAAMC,QAAO,MAAM,KAAK,QAAQ,IAAI,CAAC;AACrC,YAAM,SAAS,SAAS,UAAUX,OAAMW,SAAQ,EAAE,IAAIC,QAAO,MAAM,KAAK,MAAMD,SAAQ,IAAI,CAAC;AAC3F,YAAM,UAAUC,QAAO;AAAA,SACpB,SAAS,UAAU,OAAO,cAAc,OAAO,eAAe,CAAC;AAAA,MAClE;AACA,wBAAkB,QAAQ,UAAU;AAAA,IACtC,CAAC;AACD,UAAM,QAAQL,YAAW,IAAI,GAAG,YAAY;AAC1C,YAAM,SAAS,uBAAuB;AAAA,QACpC,KAAK,MAAO,MAAM,KAAKA,YAAW,IAAI,CAAC,KAAM,IAAI;AAAA,MACnD;AACA,wBAAkB,OAAO,OAAO,OAAO,SAAS,CAAC,CAAC,EAAE;AAAA,QAAK,CAAC,WACxD,OAAO;AAAA,UAAK,CAAC,UACX,MAAM,MAAM,KAAK,CAAC,YAAY,QAAQ,WAAW,aAAa,QAAQ,SAAS,IAAI,CAAC;AAAA,QACtF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,QAAQ,UAAU;AAC3B,UAAM,UAAU,QAAQ,IAAI;AAC5B,UAAM,QAAQ,SAAS,YAAY;AACjC,YAAM,SAAS,MAAM,KAAK,OAAO;AACjC,UAAI,WAAW,KAAM;AACrB,YAAM,SAAS,SAAS,UAAUP,OAAM,MAAM,IAAIY,QAAO,MAAM,KAAK,MAAM,MAAM,CAAC;AACjF,YAAM,MAAM,SAAS,UAAU,gBAAgB;AAC/C,YAAM,UAAUA,QAAO,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC;AAC9C,UAAI,QAAQ,UAAU,QAAW;AAC/B,YAAI,SAAS,WAAW,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,OAAO,SAAS,MAAM,CAAC;AACxE,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AACF;AAAA,MACF;AACA,YAAM,YAAY,UAAU,MAAM,OAAO,GAAG;AAC5C,YAAM,WAAW,YACb,CAAC,SAAS,IACV;AAAA,QACE,KAAK,WAAW,IAAI,CAAC;AAAA,QACrB,GAAI,SAAS,WAAW,CAAC,KAAK,EAAE,MAAM,SAAS,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAAA,MAC5E;AACJ,UAAI,CAAC,SAAS,SAAS,KAAK,QAAQ,KAAK,CAAC;AACxC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,aAAO,QAAQ;AACf,YAAM,UAAU,EAAE,GAAG,QAAQ,CAAC,GAAG,GAAG,QAAQ;AAC5C,UAAI,CAAC,OAAO,KAAK,OAAO,EAAE,OAAQ,QAAO,QAAQ,GAAG;AACpD,UAAI,SAAS,UAAU;AACrB,YAAI,SAAS,QAAQ,KAAK,OAAO,GAAG,CAAC,OAAO,KAAK,OAAO,EAAE,MAAM;AAChE;AAAA,MACF;AACA,YAAM,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,GAC3B,QAAQ,UAAU,QAAQ,OAAO,GAAG;AACtC,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6DAA6D;AACzF,YAAM,gBAAgB,UAAU,MAAM,OAAO,GAAG,OAAO,KAAK;AAC5D,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACAX,WAAU,EAAE,aAAa,EAAE,OAAO,WAAW,IAAI,EAAE,EAAE,CAAC,EAAE,QAAQ;AAAA,MAClE,EAAE,QAAQ;AACV,UACE,gBACI,KAAK,MAAM,IAAI,MAAM,gBACrB,MAAM,KAAK,QAAQ,SAAS,IAAI,MAAM,gBAC1C;AACA,cAAM,IAAI,MAAM,8DAA8D;AAAA,MAChF;AACA,YAAM,QAAQ,OAAO,MAAM,GAAG,MAAM,IAAI,IAAI,OAAO,MAAM,MAAM,EAAE,EAAE,QAAQ,UAAU,EAAE;AACvF,YAAM,SAASD,OAAM,KAAK;AAE1B,UAAI,CAAC,OAAO,KAAK,OAAO,EAAE,UAAU,OAAO,GAAG,MAAM,OAAW,SAAQ,GAAG,IAAI,CAAC;AAC/E,UAAI,CAACH,mBAAkB,QAAQ,OAAO;AACpC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,UAAI,SAAS,QAAQ,OAAO,CAAC,MAAM,KAAK,CAAC;AAAA,IAC3C,CAAC;AACD,UAAM,WAAWU,YAAW,IAAI;AAChC,UAAM,QAAQ,UAAU,YAAY;AAClC,YAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,UAAI,WAAW,KAAM;AACrB,YAAM,SAAS,uBAAuB,MAAM,KAAK,MAAM,MAAM,CAAC;AAC9D,UAAI,UAAU;AACd,iBAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,SAAS,CAAC,CAAC,GAAG;AAChE,cAAM,QAAQ,UAAU,MAAM,QAAQ,GAAG,QAAQ,KAAK;AACtD,cAAM,WAAW,OAAO,QAAQ,CAAC,UAAU,MAAM,KAAK;AACtD,YACE,SACA,CAAC,SAAS;AAAA,UACR,CAAC,YACC,QAAQ,SAAS,aAAa,QAAQ,WAAWD,UAAS,IAAI,EAAE,IAAI,QAAQ,OAAO;AAAA,QACvF,KACA,SAAS,KAAK,CAAC,YAAY,CAAC,MAAM,SAAS,KAAK,OAAO,CAAC,CAAC,GACzD;AACA,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,SACE,sEACA,QACA;AAAA,UACJ,CAAC;AAAA,QACH;AACA,cAAM,OAAO,OAAO,QAAQ,CAAC,UAAU;AACrC,gBAAMO,YAAW,MAAM,MAAM,OAAO,CAAC,YAAY;AAC/C,gBACE,QAAQ,SAAS,aACjB,QAAQ,WACRP,UAAS,IAAI,EAAE,IAAI,QAAQ,OAAO,GAClC;AACA,wBAAU;AACV,qBAAO;AAAA,YACT;AACA,gBAAI,QAAQ,WAAW,aAAa,QAAQ,SAAS,IAAI;AACvD,0BAAY,KAAK;AAAA,gBACf,MAAM;AAAA,gBACN,SACE,iEAAiE,QAAQ;AAAA,cAC7E,CAAC;AACH,mBAAO;AAAA,UACT,CAAC;AACD,iBAAOO,UAAS,WAAW,MAAM,MAAM,SACnC,CAAC,KAAK,IACNA,UAAS,SACP,CAAC,EAAE,GAAG,OAAO,OAAOA,UAAS,CAAC,IAC9B,CAAC;AAAA,QACT,CAAC;AACD,YAAI,KAAK,UAAU,CAAC,OAAO,OAAQ,QAAO,MAAO,KAAK,IAAI;AAAA,YACrD,QAAO,OAAO,MAAO,KAAK;AAAA,MACjC;AACA,UAAI,CAAC,QAAS;AACd,UAAI,CAAC,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC,EAAE,OAAQ,QAAO,OAAO;AAC3D,UAAI,UAAU,QAAQ,KAAK,MAAM,GAAG,CAAC,OAAO,KAAK,MAAM,EAAE,MAAM;AAAA,IACjE,CAAC;AAAA,EACH;AAGA,QAAM,uBAAuB,MAAM;AACnC,MAAI,CAAC,iBAAiB,CAAC,YAAY;AACjC,eAAW,QAAQ;AACjB,YAAM,QAAQ,MAAM,YAAY;AAC9B,cAAM,SAAS,MAAM,KAAK,IAAI;AAC9B,YAAI,WAAW,KAAM;AACrB,YAAI,QAAQ;AACZ,mBAAW,CAAC,OAAO,GAAG,KAAK,OAAO,MAAM,GAAG,CAAC,GAAG;AAC7C,gBAAM,QAAQ,UAAU,OAAO,OAAO,GAAG;AACzC,cAAI,CAAC,MAAO;AACZ,gBAAM,UACJ,iEACC,KAAK,WAAW,UAAU,IAAI,iBAAiB;AAClD,gBAAM,YAAY,CAAC,mBAAmB,aAAa,IAAI,OAAO,KAAK,OAAO,EAAE,QAAQ,CAAC;AACrF,gBAAM,WAAW,UAAU,MAAM,IAAI,GAAG,OAAO,KAAK;AACpD,cACE,WACI,KAAK,MAAM,IAAI,MAAM,WACrB,CAAC,UAAU,SAAS,MAAM,KAAK,QAAQ,SAAS,IAAI,CAAC,GACzD;AACA,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,kBAAQ,MAAM,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM,MAAM,EAAE,EAAE,QAAQ,UAAU,EAAE;AAAA,QACjF;AACA,YAAI,UAAU,OAAQ,KAAI,MAAM,QAAQ,OAAO,CAAC,MAAM,KAAK,CAAC;AAAA,MAC9D,CAAC;AAEL,MAAI,YAAY,OAAQ,OAAM,OAAO,oBAAoB;AAEzD,MAAI,CAAC,YAAY,QAAQ;AACvB,UAAM,UAAkB,CAAC;AACzB,UAAM,eAAe,MAAMX;AAAA,MACzB,SAAS,IAAI,CAAC,SAAS,uCAAuC,OAAO,OAAO;AAAA,MAC5E,EAAE,KAAK,MAAM,KAAK,MAAM,WAAW,OAAO,qBAAqB,MAAM;AAAA,IACvE;AACA,QAAI,aAAa,SAAS;AACxB,YAAM,IAAI,MAAM,uEAAuE;AACzF,eAAW,QAAQ,aAAa,KAAK;AACnC,YAAM,QAAQ,MAAM,YAAY;AAC9B,cAAM,OAAO,KAAK,SAAS,kBAAkB,IAAI,UAAU;AAC3D,cAAM,iBAAiB,MAAM,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,GAAG,IAAI;AACvE,gBAAQ,KAAK,EAAE,MAAM,MAAM,QAAQ,MAAM,KAAK,IAAI,GAAG,OAAO,KAAK,CAAC;AAAA,MACpE,CAAC;AACH,QAAI,CAAC;AACH,YAAM,QAAQ,6BAA6B,YAAY;AACrD,cAAM,SAAS,MAAM,KAAK,2BAA2B;AACrD,YAAI,WAAW,KAAM;AACrB,QAAAC,IAAE,OAAO,EAAE,SAASA,IAAE,QAAQ,CAAC,GAAG,eAAeA,IAAE,OAAO,EAAE,CAAC,EAC1D,OAAO,EACP,MAAM,KAAK,MAAM,MAAM,CAAC;AAC3B,gBAAQ,KAAK,EAAE,MAAM,6BAA6B,QAAQ,OAAO,KAAK,CAAC;AAAA,MACzE,CAAC;AAEH,QAAI,CAAC,YAAY,QAAQ;AACvB,iBAAW,QAAQ,UAAU;AAC3B,YAAI,MAAO,QAAO,MAAM,MAAM,IAAI;AAClC,YAAI,WAAY,QAAO,WAAW,MAAM,IAAI;AAC5C,eAAO,UAAU,MAAM,QAAQ,IAAI,CAAC;AACpC,eAAO,UAAU,MAAMI,YAAW,IAAI,CAAC;AAAA,MACzC;AACA,UAAI,CAAC,cAAe,YAAW,QAAQ,eAAgB,QAAO,UAAU,MAAM,IAAI;AAClF,UAAI,gBAAgB;AAClB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO,UAAU,OAAO,KAAK,MAAO,KAAK,EAAE,SAAS,KAAK,KAAK,IAAI;AAAA,QACpE,CAAC;AAAA,eACM;AACP,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,QAC1F,CAAC;AACH,UAAI,qBAAqB;AACvB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO,OAAO,KAAK,WAAY,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI;AAAA,QACpE,CAAC;AACH,UAAI,oBAAoB;AACtB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO,OAAO,KAAK,UAAU,KAAK,EAAE,SAAS,KAAK,SAAS,IAAI;AAAA,QACjE,CAAC;AACH,YAAM,KAAK,GAAG,OAAO;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,KAAK;AAAA,IACxD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,kBAAkB,MAAc,UAA2B;AACxE,QAAM,SAAS,oBAAI,IAA2B;AAC9C,QAAM,OAAO,OAAO,SAAiB;AACnC,UAAM,QAAQ,MAAM,SAAS,MAAM,IAAI;AACvC,WAAO,IAAI,MAAM,KAAK;AACtB,WAAO;AAAA,EACT;AACA,QAAM,QAAgB,CAAC;AACvB,QAAM,cAAc,MAAM,KAAK,UAAU;AACzC,QAAM,QAAQ,gBAAgB,OAAO,OAAO,YAAY,MAAM,KAAK,MAAM,WAAW,CAAC;AACrF,QAAM,mBAAmB,MAAM,KAAK,eAAe;AACnD,QAAM,aACJ,qBAAqB,OAAO,OAAOF,cAAa,MAAM,KAAK,MAAM,gBAAgB,CAAC;AACpF,aAAW,QAAQ,UAAU;AAC3B,QAAI,MAAO,QAAO,MAAM,MAAM,IAAI;AAClC,QAAI,WAAY,QAAO,WAAW,MAAM,IAAI;AAAA,EAC9C;AACA,MAAI,MAAO,OAAM,KAAK,EAAE,MAAM,YAAY,QAAQ,aAAa,OAAO,KAAK,KAAK,EAAE,CAAC;AACnF,MAAI;AACF,UAAM,KAAK,EAAE,MAAM,iBAAiB,QAAQ,kBAAkB,OAAO,KAAK,UAAU,EAAE,CAAC;AAEzF,QAAM,UACH,MAAM,UAAU,IAAI,GAAG,WACvB,MAAMP,KAAG;AAAA,IACRC,OAAK,QAAQ,OAAO,MAAMK,KAAI,MAAM,aAAa,kBAAkB,GAAG,KAAK,CAAC;AAAA,EAC9E;AACF,MAAI,UAAU,CAAC,OAAO;AACpB,UAAM,SAAS,MAAM,KAAK,mBAAmB;AAC7C,UAAM,WACJ,WAAW,OACP,EAAE,SAAS,GAAG,OAAO,CAAC,EAAY,IAClC,oBAAoB,MAAM,KAAK,MAAM,MAAM,CAAC;AAClD,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN;AAAA,MACA,OAAO,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,IAC1F,CAAC;AAAA,EACH;AACA,QAAM,WAAW,MAAMF;AAAA,IACrB,SAAS,IAAI,CAAC,SAAS,uCAAuC,OAAO,OAAO;AAAA,IAC5E,EAAE,KAAK,MAAM,KAAK,MAAM,WAAW,OAAO,qBAAqB,MAAM;AAAA,EACvE;AACA,MAAI,SAAS,SAAS;AACpB,UAAM,IAAI,MAAM,uEAAuE;AACzF,aAAW,QAAQ,UAAU;AAC3B,UAAM,OAAO,KAAK,SAAS,kBAAkB,IAAI,UAAU;AAC3D,UAAM,iBAAiB,MAAM,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,GAAG,IAAI;AACvE,UAAM,KAAK,EAAE,MAAM,MAAM,QAAQ,MAAM,KAAK,IAAI,GAAG,OAAO,KAAK,CAAC;AAAA,EAClE;AACA,SAAO;AAAA,IACL,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,KAAK;AAAA,IACxD;AAAA,IACA,aAAa,CAAC;AAAA,IACd,eAAe;AAAA,EACjB;AACF;AAEA,eAAsB,gBACpB,KACA,UAAgE,CAAC,GACjE;AACA,QAAM,EAAE,KAAK,IAAI,MAAM,UAAU,GAAG;AACpC,QAAM,WAAW,QAAQ,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,KAAK;AAC1D,QAAM,MAAM,OAAO,UAAmB;AACpC,UAAM,OAAO,QAAQ,UACjB,MAAM,oBAAoB,MAAM,QAAQ,IACxC,MAAM,kBAAkB,MAAM,QAAQ;AAC1C,QAAI,OAAO;AAET,iBAAW,CAAC,MAAM,MAAM,KAAK,KAAK;AAChC,YAAK,MAAM,SAAS,MAAM,IAAI,MAAO;AACnC,gBAAM,IAAI,MAAM,oCAAoC,OAAO,mBAAmB;AAClF,iBAAW,QAAQ,KAAK,MAAO,OAAM,UAAU,MAAM,IAAI;AAAA,IAC3D;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO,QAAQ,UAAU,YAAY;AAAA,MACrC,QAAQ,KAAK,YAAY,SAAS,eAAe;AAAA,MACjD;AAAA,MACA,OAAO;AAAA,MACP,QAAQ,CAAC,CAAC,QAAQ;AAAA,MAClB,SAAS,KAAK,MAAM,IAAI,CAAC,UAAU;AAAA,QACjC,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK,UAAU,OAAO,WAAW;AAAA,MAC3C,EAAE;AAAA,MACF,aAAa,KAAK;AAAA,MAClB,4BAA4B,KAAK,iBAAiB,CAAC,CAAC,KAAK,YAAY;AAAA,MACrE,MAAM,KAAK,YAAY,SACnB,+EACA,QAAQ,UACN,uFACA;AAAA,IACR;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,IAAI,KAAK;AAC/B,MAAI,QAAQ,UAAU,CAAC,QAAQ,QAAQ,OAAQ,QAAO;AACtD,OAEI,MAAME;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,QACR,OAAO,CAAC,WAAW,OAAO,KAAK,WAAW,iBAAiB,CAAC,EAC5D,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,EAChC,GACA,KAAK;AAEP,UAAM,IAAI,MAAM,sDAAsD;AACxE,SAAO,SAAS,MAAM,6BAA6B,MAAM,IAAI,IAAI,CAAC;AACpE;AAEO,SAAS,kBAAkB,QAAqD;AACrF,SAAO;AAAA,IACL,SAAS,OAAO,KAAK,YAAY,OAAO,SAAS,aAAa,EAAE,KAAK,OAAO,MAAM;AAAA,IAClF,GAAG,OAAO,QAAQ;AAAA,MAChB,CAAC,WAAW,KAAK,OAAO,SAAS,WAAW,EAAE,GAAG,OAAO,MAAM,KAAK,OAAO,IAAI;AAAA,IAChF;AAAA,IACA,GAAG,OAAO,YAAY,IAAI,CAAC,SAAS,cAAc,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE;AAAA,IAC9E,GAAI,CAAC,OAAO,QAAQ,SAAS,CAAC,aAAa,IAAI,CAAC;AAAA,IAChD;AAAA,IACA,GAAI,OAAO,UAAU,aAAa,OAAO,6BACrC;AAAA,MACE;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,OAAO,SAAS,CAAC,sCAAsC,IAAI,CAAC,OAAO,IAAI;AAAA,EAC7E,EAAE,KAAK,IAAI;AACb;AA5dA,IA8BM,OACAQ,SACA;AAhCN;AAAA;AAAA;AAMA;AACA;AACA;AAMA;AACA;AACA;AACA,IAAAE;AACA,IAAAC;AACA;AACA;AAOA;AAGA,IAAM,QAAQ,CAAC,SAAS,QAAQ;AAChC,IAAMH,UAAST,IAAE,OAAOA,IAAE,QAAQ,CAAC;AACnC,IAAM,OAAO,CAAC,UAAmB,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI;AAAA;AAAA;;;AChClE;AAAA;AAAA;AAAA;AAAA;AASA,eAAsB,YAAY,KAAa;AAC7C,QAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,QAAM,aAAa,MAAM,eAAe,GAAG,IAAI;AAC/C,QAAM,QAAQ,WAAW;AACzB,MAAI,CAAC,SAAS,CAAC,OAAO,KAAK,MAAM,KAAK,EAAE,QAAQ;AAC9C,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC3B,CAAC,SAAS,QAAQ,EAAY,IAAI,OAAO,UAAU;AAAA,QAClD;AAAA,QACA,SAAS,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,IAAI;AAAA,MAC7D,EAAE;AAAA,IACJ;AACA,UAAM,UAAU,QAAQ,OAAO,CAAC,SAAS,KAAK,YAAY,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI;AACvF,UAAM,gBAGF,CAAC;AACL,UAAM,QAAQ;AAAA,MACX,CAAC,SAAS,QAAQ,EAAY,IAAI,OAAO,SAAS;AACjD,YAAI;AACF,gBAAM,YAAY,MAAM,mBAAmB,GAAG,MAAM,IAAI;AACxD,wBAAc,IAAI,IAAI;AAAA,YACpB,YAAY,UAAU;AAAA,YACtB,UAAU,UAAU,YAAY,UAAU;AAAA,UAC5C;AAAA,QACF,SAAS,OAAO;AACd,wBAAc,IAAI,IAAI;AAAA,YACpB,YAAY;AAAA,YACZ,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UACnE;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,QAAQ,SAAS,eAAe;AAAA,MACxC,OAAO,CAAC;AAAA,MACR;AAAA,MACA,MAAM,QAAQ,SACV,oDACA,QAAQ,CAAC,IACT,wFACA;AAAA,IACN;AAAA,EACF;AACA,QAAMa,SAeF,CAAC;AACL,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,aAAa,MAAM,iBAAiB,GAAG,IAAI;AACjD,aAAW,QAAQ,CAAC,SAAS,QAAQ,GAAY;AAC/C,UAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,QAAI,CAAC,MAAO;AACZ,UAAM,SAAS,MAAM,mBAAmB,GAAG,MAAM,IAAI;AACrD,UAAM,sBAAsB,OAAO;AACnC,UAAM,MACJ,OAAO,iBAAiB,CAAC,OAAO,eAAe,KAAK,OAAO,GAAG,MAAM,MAAM;AAC5E,UAAM,eAAe,OAAO;AAC5B,UAAM,QAAQ,OAAO,mBAAmB,CAAC,OAAO;AAChD,UAAM,QAAQ,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,IAAI;AAChE,UAAM,aACJ,WAAW,SAAS,GAAG,QACtB,OAAO,WAAW,gBACjB,MAAM,SAAS,GAAG,QAClB,MAAM,aAAa,MAAM;AAC7B,UAAM,cAAc,MAAM;AAAA,MACxB,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,MAAM;AAAA,MACN,UAAU,WAAW;AAAA,IACvB;AAEA,UAAM,WAAW,OAAO,OAAO,aAAa,YAAY,CAAC,CAAC,EAAE;AAAA,MAAK,CAAC,GAAG,MACnE,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,IACzB;AACA,UAAM,WAAW,SAAS;AAAA,MAAK,CAAC,YAC9B,OAAO,MAAM,CAAC,UAAU,QAAQ,OAAO,SAAS,KAAK,CAAC;AAAA,IACxD;AACA,UAAM,iBAAiB,UAAU,UAAU,SAAS,CAAC,GAAG,UAAU,CAAC;AACnE,UAAM,UAAoB,CAAC;AAC3B,QAAI,CAAC,UAAU,UAAW,SAAQ,KAAK,UAAU,OAAQ;AACzD,QAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,yBAAyB,CAAC;AACtD,cAAQ;AAAA,QACN;AAAA,MACF;AACF,QAAI,CAAC,aAAa;AAChB,cAAQ;AAAA,QACN;AAAA,MACF;AACF,QAAI,CAAC;AACH,cAAQ;AAAA,QACN;AAAA,MACF;AACF,QAAI,WAAW,WAAW;AACxB,cAAQ;AAAA,QACN;AAAA,MACF;AACF,UAAM,UACJ,UAAU,aACV,OACA,SACA,OAAO,yBACP,cACA,WAAW,WAAW;AACxB,IAAAA,OAAM,IAAI,IAAI;AAAA,MACZ,QAAQ,UACJ,YAAY,aAAa,eACvB,WACA,YACF;AAAA,MACJ,SAAS,UAAU,YAAY,aAAa,UAAU,UAAU,MAAM;AAAA,MACtE,KAAK,MAAM,eAAe;AAAA,MAC1B,cAAc,sBACV,YACA,OAAO,wBACL,eACA;AAAA,MACN,mBAAmB,QACf,eACE,eACA,eACF;AAAA,MACJ;AAAA,MACA,cAAc,aAAa,gBAAgB;AAAA,MAC3C,mBAAmB,WAAW;AAAA,MAC9B,oBACE,WAAW,WAAW,YACjB,WAAW,sBAAsB,gBAClC;AAAA,MACN;AAAA,MACA,SACE,OAAO,eAAe,CAAC,gBAAgB,CAAC,uBACpC;AAAA,QACE,yFACE,OACA;AAAA,MACJ,IACA,CAAC;AAAA,IACT;AAAA,EACF;AACA,QAAM,WAAW,OAAO,OAAOA,MAAK,EAAE,IAAI,CAAC,SAAS,KAAK,MAAM;AAC/D,QAAM,YAAY,MAAM,kBAAkB,GAAG,IAAI;AACjD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QACE,SAAS,UAAU,SAAS,MAAM,CAAC,WAAW,WAAW,QAAQ,IAC7D,WACA,SAAS,SAAS,WAAW,IAC3B,cACA;AAAA,IACR,MAAM,GAAG;AAAA,IACT,OAAAA;AAAA,IACA,gBAAgB,WAAW;AAAA,IAC3B,iBAAiB,UAAU,QAAQ;AAAA,IACnC,aAAa,UAAU;AAAA,IACvB,OACE;AAAA,EACJ;AACF;AAEO,SAAS,oBAAoB,QAAyD;AAC3F,QAAM,QAAQ,CAAC,kBAAkB,OAAO,SAAS,GAAG;AACpD,MAAI,OAAO,kBAAkB,OAAO,mBAAmB,OAAO,MAAM;AAClE,UAAM;AAAA,MACJ,+BAA+B,OAAO,iBAAiB;AAAA,IACzD;AAAA,EACF;AACA,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AACxD,UAAM;AAAA,MACJ,GAAG,IAAI,KAAK,MAAM,MAAM;AAAA,MACxB,cAAc,MAAM,OAAO,UAAU,MAAM,GAAG,mBAAmB,MAAM,YAAY;AAAA,MACnF,YAAY,MAAM,iBAAiB,eAAe,MAAM,eAAe,KAAK,IAAI,KAAK,MAAM;AAAA,MAC3F,4BAA4B,MAAM,YAAY,mBAAmB,MAAM,kBAAkB,KAAK,MAAM,iBAAiB;AAAA,MACrH,GAAG,MAAM,QAAQ,IAAI,CAAC,YAAY,aAAa,OAAO;AAAA,IACxD;AACA,UAAM,KAAK,GAAG,MAAM,QAAQ,IAAI,CAAC,YAAY,iBAAiB,OAAO,CAAC;AAAA,EACxE;AACA,MAAI,qBAAqB,OAAQ,OAAM,KAAK,qBAAqB,OAAO,eAAe,GAAG;AAC1F,MAAI,OAAO,KAAM,OAAM,KAAK,OAAO,IAAI;AACvC,SAAO,MAAM,KAAK,IAAI;AACxB;AA1MA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AAAA;AAAA;;;ACPA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,cAAAC,mBAAkB;AAqB3B,eAAsB,WAAW,MAAc,UAAgC;AAC7E,MAAI,SAAU,QAAO;AACrB,MAAI,QAAQ,IAAI,qBAAqB,WAAW,QAAQ,IAAI,qBAAqB;AAC/E,WAAO,QAAQ,IAAI;AACrB,QAAM,QAAgB,CAAC;AACvB,MACG,MAAM,SAAS,MAAM,oBAAoB,MAAO,QAChD,MAAM,SAAS,MAAM,mBAAmB,MAAO;AAEhD,UAAM,KAAK,OAAO;AACpB,MACG,MAAM,SAAS,MAAM,uBAAuB,MAAO,QACnD,MAAM,SAAS,MAAM,WAAW,MAAO;AAExC,UAAM,KAAK,QAAQ;AACrB,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AACtC,QAAM,IAAI,MAAM,oEAAoE;AACtF;AAEA,eAAsB,aACpB,KACA,UAAgD,CAAC,GACjD;AACA,UAAQ,UAAU,KAAK,gCAAgC;AACvD,QAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,QAAM,OAAO,MAAM,WAAW,GAAG,MAAM,QAAQ,IAAI;AACnD,OAEI,MAAMC;AAAA,IACJ,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF,GACA,KAAK;AAEP,UAAM,IAAI,MAAM,8EAA8E;AAChG,SAAO,SAAS,GAAG,MAAM,6BAA6B,YAAY;AAChE,UAAM,WAAW,MAAM,UAAU,GAAG,IAAI;AACxC,UAAM,kBAAkB,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,IAAI;AAC1E,UAAM,YAAY,MAAM,iBAAiB;AACzC,QAAI,CAAC,UAAU,UAAW,OAAM,IAAI,MAAM,UAAU,OAAQ;AAC5D,UAAM,aAAa,MAAM,mBAAmB,GAAG,MAAM,IAAI;AACzD,QAAI,CAAC,WAAW;AACd,YAAM,IAAI;AAAA,QACR,sGACE,OACA;AAAA,MACJ;AACF,UAAM,eAAe,CAAC,YAAY,GAAG,YAAY,YAAY,OAAO,OAAO;AAC3E,UAAM,WACJ,MAAMA,KAAI,GAAG,MAAM,gBAAgB,cAAc,MAAM,GAAG,YAAY,EAAE,MAAM,MAAM,EAAE,GAErF,KAAK,EACL,MAAM,IAAI;AACb,QAAI,CAAC,aAAa,MAAM,CAAC,SAAS,QAAQ,SAAS,IAAI,CAAC;AACtD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,UAAM,eAAe,WAAW;AAChC,UAAM,eAAe;AAAA,MACnB,GAAG,aAAa,IAAI,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAO,EAAE;AAAA,MACxE,EAAE,MAAM,QAAQ,IAAI,GAAG,QAAQ,MAAM,SAAS,GAAG,MAAM,QAAQ,IAAI,CAAC,EAAE;AAAA,MACtE,EAAE,MAAMC,YAAW,IAAI,GAAG,QAAQ,MAAM,SAAS,GAAG,MAAMA,YAAW,IAAI,CAAC,EAAE;AAAA,IAC9E;AACA,UAAM,QAAQ,MAAM,UAAU,GAAG,MAAM,IAAI;AAC3C,UAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,UAAM,cAAc,MAAM,SAAS,GAAG,MAAM,UAAU;AACtD,UAAM,iBAAiB,KAAK,WAAW,GAAG;AAC1C,UAAM,cAAc,KAAK;AAAA,MACvB,SAAS;AAAA,MACT,KAAK;AAAA,MACL,OAAO,WAAW;AAAA,MAClB,cAAc,aAAa,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,IACpD,CAAC;AACD,UAAM,WAAW,UAAU,MAAM,IAAI;AACrC,UAAM,UACJ,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,KAAK,KAAK,KAAK,UAAU,gBAAgB;AAChF,UAAM,WAAW,CAAC,WAAW,WAAW,SAAS,WAAWF,YAAW;AACvE,UAAM,QAAqB,YAAY,EAAE,SAAS,GAAG,OAAO,CAAC,EAAE;AAC/D,UAAM,MAAM,IAAI,IAAI;AAAA,MAClB,mBAAmB,UAAU;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC9C;AAEA,UAAM,cAAc,GAAG,YAAY,YAAY,OAAO;AAEtD,UAAM,iBAAiB,iBAAiB,oBACpC;AAAA,MACE,mBAAmB,gBAAgB;AAAA,MACnC,sBAAsB,gBAAgB,wBAAwB,CAAC;AAAA,IACjE,IACA,CAAC;AACL,YAAQ,UAAU,KAAK,cAAc,SAAS,UAAU,UAAU,aAAa,cAAc;AAC7F,UAAM,eAAe,GAAG,MAAM,aAAa;AAAA,MACzC,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,MACR,GAAG;AAAA,MACH,MAAM,GAAG;AAAA,MACT;AAAA,IACF,CAAC;AACD,UAAM,eAAyB,CAAC;AAChC,eAAW,QAAQ,MAAO,KAAI,MAAM,UAAU,GAAG,MAAM,IAAI,EAAG,cAAa,KAAK,KAAK,IAAI;AACzF,QACE,MAAM,UAAU,GAAG,MAAM;AAAA,MACvB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI;AAAA,IAC1C,CAAC;AAED,mBAAa,KAAK,UAAU;AAC9B,YAAQ,UAAU,KAAK,8BAA8B;AACrD,eAAW,SAAS;AAClB,UAAK,MAAM,SAAS,GAAG,MAAM,MAAM,IAAI,MAAO,MAAM;AAClD,cAAM,IAAI,MAAM,MAAM,OAAO,8CAA8C;AAC/E,UAAM,eAAe,GAAG,MAAM,aAAa;AAAA,MACzC,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,MACR,GAAG;AAAA,MACH,MAAM,GAAG;AAAA,MACT;AAAA,MACA,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACvC,CAAC;AACD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,GAAG;AAAA,MACT,SAAS,EAAE,MAAM,UAAU,SAAS,SAAS,SAAS,UAAU,QAAQ;AAAA,MACxE;AAAA,MACA;AAAA,MACA,YAAY,MAAM,YAAY,GAAG,IAAI;AAAA,MACrC,MACE,WAAW,YAAY,WAAW,cAC9B,qGACA,SAAS,UACP,8IACA;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEO,SAAS,eAAe,QAA0D;AACvF,SAAO;AAAA,IACL,wBAAwB,OAAO,IAAI;AAAA,IACnC;AAAA,IACA;AAAA,IACA,KAAK,OAAO,aAAa,MAAM;AAAA,IAC/B,iBAAiB,OAAO,WAAW,SAAS;AAAA,IAC5C,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAsB,kBACpB,KACA,UAAkE,CAAC,GACnE;AACA,QAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,QAAM,OAAO,MAAM,WAAW,GAAG,MAAM,QAAQ,IAAI;AACnD,QAAM,MAAM,OAAO,UAAmB;AACpC,UAAM,eAAe,MAAM,iBAAiB,GAAG,MAAM,IAAI;AACzD,UAAM,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI;AACvC,UAAM,QAAQ,MAAM,UAAU,GAAG,MAAM,IAAI;AAC3C,UAAM,QAAQ,CAAC,GAAI,MAAM,eAAe,GAAG,IAAI,GAAI,GAAG,cAAc,KAAK,MAAM,CAAC,CAAC;AAEjF,UAAM,iBAAiB,WAAW,MAAM,YAAY,IAAI,CAAC,EAAE,MAAM,aAAa,CAAC,EAAE,MAAM,CAAC,EACrF;AACH,UAAM,YAAY,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,cAAc,KAAK,MAAM,CAAC,CAAC,GAAG;AAAA,MAC/E,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG;AAAA,IACnB,CAAC;AACD,QAAI,OAAO;AACT,cAAQ,UAAU,KAAK,sCAAsC;AAC7D,YAAM,UAAU,GAAG,MAAM,SAAS;AAClC,iBAAW,QAAQ,MAAO,OAAM,UAAU,GAAG,MAAM,IAAI;AACvD,YAAM;AAAA,QACJ,GAAG;AAAA,QACH,MAAM,uBAAuB,GAAG,MAAM,MAAM,CAAC,EAAE,MAAM,cAAc;AAAA,MACrE;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ,QAAQ,SAAS,YAAY;AAAA,MACrC;AAAA,MACA,MAAM,GAAG;AAAA,MACT,QAAQ,CAAC,CAAC,QAAQ;AAAA,MAClB,SAAS,MACN,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,KAAK,EAC3C,IAAI,CAAC,UAAU;AAAA,QACd,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK,WAAW,OAAO,WAAW;AAAA,MAC5C,EAAE;AAAA,MACJ,MACE,yEACA,OACA;AAAA,IACJ;AAAA,EACF;AACA,MAAI,QAAQ,OAAQ,QAAO,IAAI,KAAK;AACpC,OAAK,MAAMC,KAAI,GAAG,MAAM,YAAY,MAAM,gBAAgB,2BAA2B,GAAG,KAAK;AAC3F,UAAM,IAAI,MAAM,kEAAkE;AACpF,SAAO,SAAS,GAAG,MAAM,6BAA6B,MAAM,IAAI,IAAI,CAAC;AACvE;AAEO,SAAS,wBAAwB,QAAuD;AAC7F,SAAO;AAAA,IACL,uBAAuB,OAAO,SAAS,aAAa,EAAE,QAAQ,OAAO,IAAI;AAAA,IACzE,GAAG,OAAO,QAAQ;AAAA,MAChB,CAAC,WAAW,KAAK,OAAO,SAAS,WAAW,EAAE,GAAG,OAAO,MAAM,KAAK,OAAO,IAAI;AAAA,IAChF;AAAA,IACA,GAAI,CAAC,OAAO,QAAQ,SAAS,CAAC,qDAAqD,IAAI,CAAC;AAAA,IACxF,OAAO,SAAS,yCAAyC,OAAO;AAAA,EAClE,EAAE,KAAK,IAAI;AACb;AArPA;AAAA;AAAA;AACA;AACA;AACA;AACA,IAAAE;AACA,IAAAC;AAQA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACjBA,OAAOC,UAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,cAAAC,aAAY,cAAAC,mBAAkB;AACvC,SAAS,KAAAC,WAAS;AA2BlB,eAAsB,cACpB,KACA,UACA,MACA,UAAuB,CAAC,GACH;AACrB,QAAM,MAAM,QAAQ,OAAO,QAAQ,KACjC,WAAW,QAAQ,YAAY,QAAQ;AACzC,QAAM,UAAU,CAAC,GAAG,QAAQ;AAG5B,QAAM,cACJ,aAAa,UACT,OAAO,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,IAAI,YAAY,MAAM,MAAM,IAAI,CAAC,IACrE,IAAI;AACV,QAAM,gBACJ,aAAa,UACT,gBAAgB,eAAe,MAAM,KAAK,GAAG,KAC5C,eAAe,IACb,MAAM,GAAG,EACT;AAAA,IACC,CAAC,UACCL,OAAK,MAAM,WAAW,KAAK,KAAKA,OAAK,MAAM,QAAQ,KAAK,MAAMA,OAAK,MAAM,QAAQ,GAAG;AAAA,EACxF;AACR,QAAM,YACJ;AACF,QAAM,WAAW,gBAAgB,KAAK,yCAAyC;AAC/E,QAAM,SAAS,CAAC,YAAgC;AAAA,IAC9C,QAAQ;AAAA,IACR;AAAA,IACA,SAAS,GAAG,MAAM;AAAA,EAAK,gBAAgB,KAAK,OAAO,GAAG;AAAA,CAAkB,GAAG,SAAS;AAAA,EACtF;AACA,MAAI,IAAI,yBAAyB;AAC/B,WAAO,OAAO,4DAA4D;AAC5E,MAAI,WAAW,KAAK,GAAG,KAAK,IAAI,SAAS,aAAa,UAAU,MAAM,GAAG;AACvE,WAAO,OAAO,8DAA8D;AAC9E,MAAI;AACF,QAAI,aAAa,SAAS;AACxB,YAAM,UAAU,MAAM,YAAY,MAAM;AACxC,UAAI,CAAC,gBAAgB,QAAQ,OAAO,GAAG,GAAG;AACxC,YAAI,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,UAAU,GAAG,GAAG;AACjE,kBAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,KAAK,SAAS,QAAQ,UAAU,KAAK,CAAC;AAC7E,gBAAM,KAAK,OAAO;AAAA,QACpB;AACA,cAAM,YAAY,OAAO,KAAK,OAAO;AAAA,MACvC;AACA,aAAO,EAAE,QAAQ,cAAc,SAAS,QAAQ;AAAA,IAClD;AACA,UAAM,QAAQA,OAAK,SAAS,IAAI,SAASD,IAAG,SAAS,EAAE,SAAS,EAAE;AAClE,UAAM,WAAW,QAAQ,YAAYA,IAAG,QAAQ;AAChD,QAAIO;AACJ,QAAI,CAAC,CAAC,QAAQ,OAAO,IAAI,EAAE,SAAS,KAAK;AACvC,aAAO,OAAO,2CAA2C,SAAS,kBAAkB,GAAG;AACzF,QAAI,IAAI,cAAe,CAAAA,YAAW,CAACN,OAAK,QAAQ,IAAI,aAAa,CAAC;AAAA,aACzD,UAAU,MAAO,CAAAM,YAAW,CAACN,OAAK,KAAK,IAAI,WAAW,UAAU,QAAQ,CAAC;AAAA,aACzE,UAAU,KAAM,CAAAM,YAAW,CAACN,OAAK,KAAK,UAAU,UAAU,CAAC;AAAA,SAC/D;AACH,YAAM,aAAa,CAAC,iBAAiB,eAAe,UAAU,EAAE;AAAA,QAAI,CAAC,SACnEA,OAAK,KAAK,UAAU,IAAI;AAAA,MAC1B;AACA,UAAI,QAAQ,WAAW,CAAC;AACxB,iBAAW,QAAQ;AACjB,YACE,MAAMF,KAAG,MAAM,IAAI,EAAE;AAAA,UACnB,MAAM;AAAA,UACN,CAAC,UAAmB;AAClB,gBAAI,aAAa,OAAO,QAAQ,EAAG,QAAO;AAC1C,kBAAM;AAAA,UACR;AAAA,QACF,GACA;AACA,kBAAQ;AACR;AAAA,QACF;AACF,MAAAQ,YAAW,CAACN,OAAK,KAAK,UAAU,SAAS,GAAG,KAAK;AAAA,IACnD;AACA,UAAM,SAAS,oBAAoBG,YAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;AAC9F,eAAW,WAAWG,WAAU;AAG9B,YAAM,OAAO,MAAMR,KAAG,MAAM,OAAO,EAAE,MAAM,CAAC,UAAmB;AAC7D,YAAI,aAAa,OAAO,QAAQ,EAAG,QAAO;AAC1C,cAAM;AAAA,MACR,CAAC;AACD,YAAM,OAAO,MAAM,eAAe,IAAI,MAAMA,KAAG,SAAS,OAAO,IAAIE,OAAK,QAAQ,OAAO;AACvF,YAAM,WAAW,MAAMF,KAAG,SAAS,IAAI,EAAE,MAAM,CAAC,UAAmB;AACjE,YAAI,aAAa,OAAO,QAAQ,KAAK,CAAC,KAAM,QAAO;AACnD,cAAM;AAAA,MACR,CAAC;AACD,UAAI,YAAY,CAAC,OAAO,KAAK,SAAS,SAAS,MAAM,CAAC,EAAE,OAAO,QAAQ;AACrE,eAAO,OAAO,+BAA+B,OAAO,GAAG;AACzD,YAAMS,QAAO,UAAU,SAAS,MAAM,KAAK;AAC3C,YAAM,QAAQ,QAAQ;AAAA,QACpB,CAAC,MACC,EAAE,SAAS,aAAa,EAAE,SAAS;AAAA,MACvC;AACA,UAAI,SAASA,MAAK,SAAS,MAAM,KAAK,EAAG;AACzC,UAAIA,MAAK,SAAS,MAAM,KAAM,SAASA,MAAK,SAAS,kBAAkB;AACrE,eAAO,OAAO,2CAA2C,OAAO,GAAG;AACrE,YAAM,UAAUA,MAAK,SAAS,MAAM,IAAI,SAAS;AACjD,YAAM,QACJ,OAAO,UAEL,OACA,SACA,iCACA,MAAM,GAAG,IACT,8BACA,MAAM,GAAG,IACT,gDACA,WAAW,MAAM,OAAO;AAC5B,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAK,EAAE,MAAM,WAAW,MAAM,OAAO,SAAS,aAAa,KAAK,CAAC;AACzE,cAAM,KAAK,OAAO;AAAA,MACpB;AACA,YAAMT,KAAG,MAAME,OAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAGtD,YAAM,SAAS,MAAMF,KAAG,KAAK,MAAM,aAAa,OAAO,QAAQ,MAAM,GAAK;AAC1E,UAAI;AACF,YAAI,EAAE,MAAM,OAAO,SAAS,GAAG,OAAO,YAAY,OAAO,MAAM,CAAC,CAAC;AAC/D,gBAAM,IAAI,MAAM,8CAA8C,OAAO,EAAE;AACzE,cAAM,OAAO,UAAU,KAAK;AAC5B,cAAM,OAAO,KAAK;AAAA,MACpB,UAAE;AACA,cAAM,OAAO,MAAM;AAAA,MACrB;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,cAAc,SAAS,QAAQ;AAAA,EAClD,SAAS,OAAO;AACd,WAAO;AAAA,MACL,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACrF;AAAA,EACF;AACF;AAEA,eAAsB,WAAW,SAA0C;AACzE,QAAM,WAAqB,CAAC;AAC5B,aAAW,UAAU,SAAS;AAC5B,QAAI;AACF,UAAI,OAAO,SAAS,WAAW;AAC7B,cAAM,UAAU,MAAM,YAAY,MAAM;AACxC,YACE,EAAE,QAAQ,SAAS,IAAI,MAAM,GAAG,EAAE,SAAS,OAAO,KAAK,KACvD,gBAAgB,QAAQ,OAAO,OAAO,KAAK;AAE3C,gBAAM,IAAI,MAAM,uBAAuB;AACzC,cAAM,YAAY,UAAU,OAAO,OAAO,SAAS,OAAO,OAAO;AACjE;AAAA,MACF;AACA,YAAM,OAAO,MAAMA,KAAG,MAAM,OAAO,IAAI,EAAE,MAAM,CAAC,UAAmB;AACjE,YAAI,aAAa,OAAO,QAAQ,EAAG,QAAO;AAC1C,cAAM;AAAA,MACR,CAAC;AACD,UAAI,CAAC,KAAM;AACX,UAAI,CAAC,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,sBAAsB;AAC1D,YAAM,QAAQ,MAAMA,KAAG,SAAS,OAAO,IAAI,GACzCS,QAAO,MAAM,SAAS,MAAM;AAC9B,UAAI,CAAC,OAAO,KAAKA,KAAI,EAAE,OAAO,KAAK,EAAG,OAAM,IAAI,MAAM,0BAA0B;AAChF,YAAM,QAAQA,MAAK,QAAQ,OAAO,KAAK;AACvC,UAAI,QAAQ,KAAKA,MAAK,QAAQ,OAAO,OAAO,QAAQ,OAAO,MAAM,MAAM,KAAK;AAC1E,cAAM,IAAI,MAAM,kCAAkC;AACpD,YAAM,SAASA,MAAK,MAAM,GAAG,KAAK,GAChC,SAASA,MAAK,MAAM,QAAQ,OAAO,MAAM,MAAM;AACjD,YAAM,YACJ,UAAU,UAAU,CAAC,OAAO,SAAS,IAAI,IACrC,OAAO,MAAM,WAAW,MAAM,IAC5B,SACA,OACF;AACN,YAAM,OAAO,OAAO,KAAK,SAAS,YAAY,MAAM;AACpD,YAAM,YAAY,OAAO,OAAO,YAAYH,YAAW;AACvD,UAAI;AACF,YAAI,KAAK,QAAQ,EAAG,OAAM,IAAI,MAAM,iCAAiC;AACrE,cAAM,SAAS,MAAMN,KAAG,KAAK,WAAW,MAAM,KAAK,OAAO,GAAK;AAC/D,YAAI;AACF,gBAAM,OAAO,UAAU,IAAI;AAC3B,gBAAM,OAAO,MAAM,KAAK,OAAO,GAAK;AACpC,cAAI,QAAQ,aAAa,QAAS,OAAM,OAAO,MAAM,KAAK,KAAK,KAAK,GAAG;AACvE,gBAAM,OAAO,KAAK;AAAA,QACpB,UAAE;AACA,gBAAM,OAAO,MAAM;AAAA,QACrB;AACA,cAAM,UAAU,MAAMA,KAAG,MAAM,OAAO,IAAI;AAC1C,YACE,CAAC,QAAQ,OAAO,KAChB,QAAQ,QAAQ,KAAK,OACrB,EAAE,MAAMA,KAAG,SAAS,OAAO,IAAI,GAAG,OAAO,KAAK;AAE9C,gBAAM,IAAI,MAAM,kCAAkC;AACpD,cAAMA,KAAG,OAAO,WAAW,OAAO,IAAI;AAAA,MACxC,UAAE;AACA,cAAMA,KAAG,GAAG,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,MACxC;AAAA,IAGF,SAAS,OAAO;AACd,eAAS;AAAA,QACP,yBAAyB,OAAO,SAAS,YAAY,OAAO,OAAO,OAAO,KAAK,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC5I;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAuBA,eAAsB,YACpB,QACA,QAAQ,IACR,UACA,cAAc,OACQ;AACtB,QAAM,UAAU,OAAO,KAAK,KAAK,UAAU,EAAE,QAAQ,OAAO,UAAU,YAAY,CAAC,CAAC,EAAE;AAAA,IACpF;AAAA,EACF;AACA,QAAM,SAAS;AAAA;AAAA,oEAEmD,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBzE,QAAM,EAAE,OAAO,IAAI,MAAMU;AAAA,IACvB;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,QAAQ;AAAA,IAClD;AAAA,IACA,EAAE,aAAa,MAAM,SAAS,MAAO,WAAW,OAAO,KAAK;AAAA,EAC9D;AACA,SAAOH,IACJ,OAAO,EAAE,OAAOA,IAAE,OAAO,EAAE,SAAS,GAAG,MAAMA,IAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACpE,MAAM,KAAK,MAAM,OAAO,QAAQ,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;AAC3D;AApTA,IASMG,UACO,kBAoBP,OAkNA,uBAKO;AArPb;AAAA;AAAA;AAAA;AASA,IAAMA,WAAUN,WAAUD,SAAQ;AAC3B,IAAM,mBAAmBI,IAAE,mBAAmB,QAAQ;AAAA,MAC3DA,IAAE,OAAO;AAAA,QACP,MAAMA,IAAE,QAAQ,SAAS;AAAA,QACzB,MAAMA,IAAE,OAAO;AAAA,QACf,OAAOA,IAAE,OAAO;AAAA,QAChB,SAASA,IAAE,QAAQ;AAAA,MACrB,CAAC;AAAA,MACDA,IAAE,OAAO,EAAE,MAAMA,IAAE,QAAQ,SAAS,GAAG,OAAOA,IAAE,OAAO,GAAG,SAASA,IAAE,QAAQ,EAAE,CAAC;AAAA,IAClF,CAAC;AAYD,IAAM,QAAQ,CAAC,MAAc,MAAM,EAAE,QAAQ,MAAM,OAAO,IAAI;AAkN9D,IAAM,wBAAwB,CAAC,UAC7BL,OAAK,MACF,UAAU,MAAM,KAAK,EAAE,QAAQ,YAAY,IAAI,CAAC,EAChD,QAAQ,WAAW,EAAE,EACrB,YAAY;AACV,IAAM,kBAAkB,CAC7B,OACA,OACA,MAAyB,QAAQ,QAC9B;AACH,YAAM,YAAY,IAAI,IAAI,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,KAAKS,MAAK,MAAM,CAAC,IAAI,YAAY,GAAGA,MAAK,CAAC,CAAC;AAC/F,YAAM,SAAS,CAAC,SACd,KAAK,QAAQ,cAAc,CAAC,OAAO,QAAgB,UAAU,IAAI,IAAI,YAAY,CAAC,KAAK,KAAK;AAC9F,cAAQ,SAAS,IACd,MAAM,GAAG,EACT,KAAK,CAAC,SAAS,sBAAsB,OAAO,IAAI,CAAC,MAAM,sBAAsB,KAAK,CAAC;AAAA,IACxF;AAAA;AAAA;;;AChQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,OAAOC,SAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,qBAAqB;AAC9B,OAAOC,UAAQ;AACf,SAAS,KAAAC,WAAS;AAkClB,eAAsB,iBAAiB,MAAsC;AAC3E,QAAM,MAAM,MAAM,cAAc,MAAM,cAAc;AACpD,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,SAASJ,cAAa,MAAM,GAAG;AACrC,MAAI,OAAO,SAAU,MAAMG,KAAG,SAAS,IAAI;AACzC,UAAM,IAAI,MAAM,0CAA0C;AAC5D,SAAO;AACT;AAEO,SAAS,qBAAqB;AAEnC,QAAM,SAASD,OAAK,QAAQA,OAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,OAAO;AACjF,QAAM,OAAOA,OAAK,QAAQA,OAAK,QAAQ,MAAM,CAAC;AAC9C,MACEA,OAAK,QAAQ,MAAM,MAAMA,OAAK,KAAK,MAAM,UAAU,KACnD,CAAC,iBAAiB,KAAKA,OAAK,SAAS,MAAM,CAAC,GAC5C;AACA,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,OAAO;AACxB;AAEA,eAAsB,sBAAsB;AAC1C,QAAM,WAAW,mBAAmB;AACpC,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,QAAM,SAAS,MAAM,iBAAiB,IAAI;AAC1C,SAAO,EAAE,MAAM,QAAQ,OAAO;AAChC;AAEO,SAAS,wBACd,QACA,MAAyB,QAAQ,KACxB;AACT,SACE,OAAO,SAAS,YAAY,QAC5B,CAAC,OAAO,QAAQ,iBAChB,CAAC,OAAO,QAAQ,UAChB,CAAC,IAAI,MACL,IAAI,yBAAyB,OAC7B,CAAC,IAAI,sBACL,CAAC,IAAI;AAET;AAGO,SAAS,mBAAmB,WAAmB,WAA4B;AAChF,MAAI,CAAC,kBAAkB,KAAK,SAAS,EAAG,QAAO;AAC/C,QAAM,IAAI,UAAU,MAAM,GAAG,EAAE,IAAI,MAAM,GACvC,IAAI,UAAU,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AACnD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,EACtC;AACA,SAAO,UAAU,SAAS,GAAG;AAC/B;AAlGA,IAQa,gBACP,UACO,oBAMAF,eAgBA;AAhCb;AAAA;AAAA;AAKA;AACA;AAEO,IAAM,iBAAiBI,IAAE,OAAO,EAAE,MAAM,qCAAqC;AACpF,IAAM,WAAWA,IAAE,OAAO,EAAE,MAAM,gBAAgB;AAC3C,IAAM,qBAAqBA,IAAE,OAAO;AAAA,MACzC,SAASA,IAAE,QAAQ;AAAA,MACnB,UAAUA,IAAE,OAAO;AAAA,MACnB,eAAe,eAAe,SAAS;AAAA,MACvC,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,CAAC;AACM,IAAMJ,gBAAeI,IAAE,OAAO;AAAA,MACnC,QAAQA,IAAE,QAAQ,CAAC;AAAA,MACnB,MAAMA,IAAE,OAAO;AAAA,MACf,KAAKA,IAAE,OAAO;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,WAAWA,IAAE,OAAOA,IAAE,OAAO,CAAC;AAAA,MAC9B,mBAAmBA,IAAE,OAAOA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACjD,aAAaA,IAAE,MAAM,gBAAgB,EAAE,SAAS;AAAA,MAChD,SAAS,mBAAmB,SAAS;AAAA,MACrC,UAAUA,IAAE,OAAO,EAAE,IAAI,UAAU,SAAS,eAAe,CAAC,EAAE,SAAS;AAAA,MACvE,SAASA,IACN,OAAO,EAAE,IAAI,UAAU,SAAS,gBAAgB,gBAAgBA,IAAE,OAAO,EAAE,CAAC,EAC5E,SAAS;AAAA,IACd,CAAC;AAEM,IAAM,cAAc,MACzB,QAAQ,IAAI,eACX,QAAQ,aAAa,UAClBF,OAAK,KAAK,QAAQ,IAAI,gBAAgBD,IAAG,QAAQ,GAAG,OAAO,IAC3DC,OAAK,KAAKD,IAAG,QAAQ,GAAG,oBAAoB;AAAA;AAAA;;;ACpClD,OAAOI,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,KAAAC,WAAS;AAuBlB,eAAsB,WAAW,MAAc;AAC7C,QAAM,QAAQ,MAAMH,KAAG,SAAS,MAAM,UAAU,MAAM,aAAa,CAAC;AACpE,QAAM,WAAW,aAAa,MAAM,KAAK,MAAM,MAAM,SAAS,MAAM,CAAC,CAAC;AACtE,QAAM,UAAU,SAAS,OAAO,WAAW,QAAQ;AACnD,aAAW,QAAQ,OAAO,KAAK,SAAS,KAAK,GAAG;AAC9C,QACE,KAAK,SAAS,IAAI,KAClB,KAAK,MAAM,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,OAAO,MAAM,IAAI,KACzDC,OAAK,WAAW,IAAI,GACpB;AACA,YAAM,IAAI,MAAM,kCAAkC,IAAI;AAAA,IACxD;AAAA,EACF;AACA,aAAW,YAAY;AAAA,IACrB,UAAU,aAAa;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AACD,QAAI,CAAC,SAAS,MAAM,QAAQ,EAAG,OAAM,IAAI,MAAM,8BAA8B,QAAQ;AAAA,EACvF;AACA,SAAO,EAAE,UAAU,cAAc,OAAO,KAAK,EAAE;AACjD;AAGA,eAAsB,aAAa,MAAc,cAAuB;AACtE,QAAM,SAAS,MAAM,WAAW,IAAI;AACpC,MAAI,gBAAgB,OAAO,iBAAiB;AAC1C,UAAM,IAAI,MAAM,gCAAgC;AAClD,MAAI,OAAO,SAAS,WAAW,GAAG,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAChE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,QAAQ,OAAO,KAAK,OAAO,SAAS,KAAK;AAE/C,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,QAAQ;AAAA,MACZ,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,OAAO,SAAS;AACxC,YAAI,OAAO,MAAMD,KAAG,SAAS,MAAM,UAAU,MAAM,IAAI,CAAC,CAAC,MAAM,OAAO,SAAS,MAAM,IAAI;AACvF,gBAAM,IAAI,MAAM,qCAAqC,IAAI;AAAA,MAC7D,CAAC;AAAA,IACH;AACF,SAAO;AACT;AArEA,IAMa,SAQPI,SACO,cASA;AAxBb;AAAA;AAAA;AAIA;AAEO,IAAM,UAAU;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,IAAMA,UAASD,IAAE,OAAO,EAAE,MAAM,gBAAgB;AACzC,IAAM,eAAeA,IACzB,OAAO;AAAA,MACN,QAAQA,IAAE,QAAQ,CAAC;AAAA,MACnB,SAASA,IAAE,OAAO,EAAE,MAAM,qCAAqC;AAAA,MAC/D,QAAQA,IAAE,KAAK,OAAO;AAAA,MACtB,aAAaA,IAAE,OAAO;AAAA,MACtB,OAAOA,IAAE,OAAOC,OAAM;AAAA,IACxB,CAAC,EACA,OAAO;AACH,IAAM,SAAS,CAAC,UAA2BF,YAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AAAA;AAAA;;;ACxBjG,OAAO,SAAS;AAiBT,SAAS,oBAAoB,OAAuB;AACzD,QAAM,QAAQ,iBAAiB,QAAQ,MAAM,QAAQ;AACrD,QAAM,OACJ,SAAS,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,MAAM,IAAI,IAAI;AAC/E,QAAM,SAAS,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC7E,QAAM,mBAAmB,QAAQ,mDAAmD,KAAK,IAAI;AAC7F,QAAM,OAAO,mBACT,qIACA;AACJ,SAAO,IAAI,MAAM,uDAAuD,MAAM,KAAK,IAAI,IAAI;AAAA,IACzF,OAAO;AAAA,EACT,CAAC;AACH;AA7BA,IAAAG,cAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,OAAOC,UAAQ;AACf,SAAS,kBAAkB;AAC3B,OAAOC,SAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,KAAAC,WAAS;AAwClB,eAAsB,oBAAoB,MAAc;AAGtD,QAAM,WAAW,MAAM,UAAU,MAAM,UAAU;AACjD,QAAM,aAAoE,CAAC;AAC3E,QAAM,UAAU,MAAM,iBAAiB,IAAI;AAC3C,QAAM,cAAc,oBAAI,IAAI,CAAC,QAAQ,SAAS,QAAQ,UAAU,IAAI,QAAQ,SAAS,EAAE,CAAC;AACxF,aAAW,QAAQ,MAAMJ,KAAG,QAAQ,QAAQ,GAAG;AAC7C,UAAM,UAAU,wCAAwC,KAAK,IAAI;AACjE,UAAM,KAAK,UAAU,CAAC,KAAK;AAC3B,QAAI,CAAC,iBAAiB,KAAK,EAAE,KAAK,YAAY,IAAI,EAAE,EAAG;AACvD,QAAI;AACF,YAAMK,aAAY,MAAM,UAAU,MAAM,YAAY,IAAI,EAAE;AAC1D,YAAML,KAAG,OAAO,MAAM,UAAUK,YAAW,2BAA2B,CAAC;AACvE,YAAM,SAAS,MAAM,aAAaA,UAAS;AAC3C,UACE,OAAO,aAAa,MAAM,GAAG,EAAE,MAAM,MACrC,OAAO,SAAS,MAAM,2BAA2B;AAEjD,mBAAW,KAAK,EAAE,IAAI,WAAAA,YAAW,SAAS,CAAC,CAAC,QAAQ,CAAC;AAAA,IACzD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,CAAC,WAAW,OAAQ;AACxB,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAS,MAAM,iBAAiB,YAAY;AAChD,UAAM,SAAS,MAAM,iBAAiB,IAAI;AAC1C,UAAM,OAAO,oBAAI,IAAI,CAAC,OAAO,SAAS,OAAO,UAAU,IAAI,OAAO,SAAS,EAAE,CAAC;AAC9E,UAAMA,aAAY,MAAM,UAAU,MAAM,UAAU;AAClD,UAAM,SAAS,MAAML,KAAG,QAAQK,UAAS,EAAE,MAAM,CAAC,UAAmB;AACnE,UAAI,aAAa,OAAO,QAAQ,EAAG,QAAO,CAAC;AAC3C,YAAM;AAAA,IACR,CAAC;AACD,eAAW,QAAQ,QAAQ;AACzB,UAAI,CAAC,qBAAqB,KAAK,IAAI,EAAG;AACtC,UAAI;AACF,cAAM,MAAM,MAAM,cAAc,MAAM,YAAY,IAAI,EAAE;AACxD,YAAI,QAAQ,KAAM;AAClB,cAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,YAAI,MAAM,SAASJ,IAAG,SAAS,EAAG;AAClC,YAAI;AACF,kBAAQ,KAAK,MAAM,KAAK,CAAC;AACzB,eAAK,IAAI,MAAM,MAAM;AAAA,QACvB,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,QAAS;AACvD,gBAAMD,KAAG,GAAG,MAAM,UAAU,MAAM,YAAY,IAAI,EAAE,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,QACxE;AAAA,MACF,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AACA,eAAW,aAAa,YAAY;AAClC,UAAI,KAAK,IAAI,UAAU,EAAE,EAAG;AAC5B,UAAI;AACF,cAAM,UAAU,UAAU,UACtB,UAAU,YACV,MAAM,UAAU,MAAM,qBAAqB,UAAU,EAAE,IAAIG,YAAW,CAAC,EAAE;AAC7E,YAAI,CAAC,UAAU,QAAS,OAAMH,KAAG,OAAO,UAAU,WAAW,OAAO;AACpE,gBAAQ,KAAK,OAAO;AAAA,MACtB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAC;AACD,aAAWK,cAAa,QAAS,OAAML,KAAG,GAAGK,YAAW,EAAE,WAAW,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC7F;AAhHA,IAaM;AAbN,IAAAC,gBAAA;AAAA;AAAA;AAAA;AAOA;AACA;AACA;AACA;AACA,IAAAC;AAEA,IAAM,cAAcH,IAAE,OAAO;AAAA,MAC3B,KAAKA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MAC/B,MAAMA,IAAE,OAAO;AAAA,MACf,QAAQA,IAAE,OAAO,EAAE,MAAM,gBAAgB;AAAA,IAC3C,CAAC;AAAA;AAAA;;;AChBD,OAAOI,UAAQ;AACf,OAAOC,SAAQ;AACf,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,KAAAC,WAAS;AAMlB,eAAsB,cAAc,MAAgC;AAClE,QAAMC,aAAY,MAAM,UAAU,MAAM,UAAU;AAClD,QAAM,QAAQ,MAAMJ,KAAG,QAAQI,UAAS,EAAE,MAAM,CAAC,UAAmB;AAClE,QAAI,aAAa,OAAO,QAAQ,EAAG,QAAO,CAAC;AAC3C,UAAM;AAAA,EACR,CAAC;AACD,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,qBAAqB,KAAK,IAAI,EAAG,QAAO;AAC7C,UAAM,WAAW,cAAc;AAC/B,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,MAAM,QAAQ;AAC9C,UAAI,QAAQ,KAAM;AAClB,YAAM,QAAQC,aAAY,MAAM,GAAG;AACnC,UAAI,MAAM,SAASJ,IAAG,SAAS,EAAG,QAAO;AACzC,UAAI;AACF,gBAAQ,KAAK,MAAM,KAAK,CAAC;AACzB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAK,MAAgC,SAAS,QAAS,QAAO;AAAA,MAChE;AACA,YAAMD,KAAG,GAAG,MAAM,UAAU,MAAM,QAAQ,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,IAC9D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,YAAY,MAA4C;AAC5E,QAAM,OAAO,YAAYE,YAAW,CAAC;AACrC,QAAM,eAAe,MAAM,MAAM,EAAE,KAAK,QAAQ,KAAK,MAAMD,IAAG,SAAS,EAAE,CAAC;AAC1E,SAAO,YAAY;AACjB,UAAMD,KAAG,GAAG,MAAM,UAAU,MAAM,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1E;AACF;AA5CA,IAOMK;AAPN;AAAA;AAAA;AAAA;AAKA;AAEA,IAAMA,eAAcF,IAAE,OAAO,EAAE,KAAKA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,MAAMA,IAAE,OAAO,EAAE,CAAC;AAAA;AAAA;;;ACPnF,IAAAG,mBAAA;AAAA,SAAAA,kBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,OAAOC,UAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,YAAAC,WAAU,aAAa;AAChC,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,cAAAC,oBAAkB;AA4B3B,eAAe,QAAQ,MAAcC,UAAiB,OAAO,KAAO;AAClE,QAAM,OAAO,OAAO,UAAUD,aAAW;AACzC,MAAI;AACF,UAAML,KAAG,UAAU,MAAMM,UAAS,EAAE,MAAM,MAAM,KAAK,CAAC;AACtD,UAAMN,KAAG,OAAO,MAAM,IAAI;AAAA,EAC5B,UAAE;AACA,UAAMA,KAAG,GAAG,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,EACnC;AACF;AAUA,eAAsB,kBACpB,QACAO,WACA,UAA0B,CAAC,GAC3B;AACA,EAAAA,WAAU,KAAK,0CAA0C;AACzD,QAAM,SAAS,MAAM,aAAa,MAAM;AACxC,QAAM,eAAeL,OAAK,QAAQ,YAAY,CAAC;AAC/C,MAAI,CAAC,QAAQ,UAAW,OAAMF,KAAG,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AACxE,QAAM,OAAO,MAAMA,KAAG,SAAS,YAAY;AAC3C,MAAI,QAAQ,WAAW;AACrB;AAAA,MACE,MAAM,iBAAiB,IAAI;AAAA,MAC3B,OAAO,SAAS;AAAA,MAChB,QAAQ;AAAA,IACV;AACA,UAAM,cAAc,MAAM,UAAU,MAAM,cAAc,OAAO,aAAa,MAAM,GAAG,EAAE,CAAC;AAGxF,UAAM,WAAW,MAAM,QAAQ,aAAa,MAAM;AAClD,UAAM,EAAE,OAAO,IAAI,MAAMI,WAAUD,SAAQ;AAAA,MACzCD,OAAK,KAAK,aAAa,QAAQ,aAAa,UAAU,aAAa,MAAM;AAAA,MACzE,CAACA,OAAK,KAAK,aAAa,mBAAmB,GAAG,WAAW;AAAA,MACzD,EAAE,SAAS,KAAO,aAAa,MAAM,KAAK,EAAE,GAAG,QAAQ,KAAK,sBAAsB,IAAI,EAAE;AAAA,IAC1F;AACA,QAAI,OAAO,KAAK,MAAM,OAAO,SAAS;AACpC,YAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AACA,SAAO;AAAA,IAAS;AAAA,IAAM;AAAA,IAAiB,MACrCM,eAAc,MAAM,QAAQ,QAAQD,WAAU,OAAO;AAAA,EACvD;AACF;AAEA,SAAS,mBAAmB,QAA8B,SAAiB,UAAmB;AAC5F,MACE,CAAC,UACD,CAAC,wBAAwB,QAAQ,EAAE,GAAG,QAAQ,KAAK,eAAe,GAAG,CAAC,KACtE,OAAO,SAAS,aAAa,YAC7B,CAAC,mBAAmB,SAAS,OAAO,OAAO,GAC3C;AACA,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC3F;AACF;AAEA,eAAeC,eACb,MACA,QACA,QACAD,WACA,SACA,gBAAgB,OAChB;AACA,QAAM,MAAM,MAAM,cAAc,MAAM,cAAc;AACpD,QAAM,WAAW,QAAQ,OAAO,OAAOE,cAAa,MAAM,GAAG;AAC7D,MAAI,QAAQ;AACV,uBAAmB,UAAU,OAAO,SAAS,SAAS,QAAQ,cAAc;AAC9E,MAAI,CAAC;AACH,eAAW,QAAQ,MAAMT,KAAG,QAAQ,IAAI,GAAG;AACzC,UAAI,SAAS,gBAAiB;AAE9B,YAAMU,aAAYR,OAAK,KAAK,MAAM,IAAI;AACtC,YAAM,OAAO,MAAMF,KAAG,MAAMU,UAAS;AACrC,UACE,CAAC,CAAC,YAAY,KAAK,EAAE,SAAS,IAAI,KAClC,CAAC,KAAK,YAAY,MACjB,MAAMV,KAAG,QAAQU,UAAS,GAAG,QAC9B;AACA,cAAM,IAAI,MAAM,yEAAyE;AAAA,MAC3F;AAAA,IACF;AACF,QAAM,cAAcR,OAAK;AAAA,IACvB,QAAQ,IAAI,iBACV,UAAU,QACT,QAAQ,aAAa,UAClBA,OAAK,KAAK,MAAM,KAAK,IACrBA,OAAK,KAAKD,IAAG,QAAQ,GAAG,YAAY;AAAA,EAC5C;AACA,QAAMD,KAAG,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAC/C,QAAM,MAAM,MAAMA,KAAG,SAAS,WAAW;AACzC,MAAI,aAAa,SAAS,SAAS,QAAQ,SAAS,QAAQ;AAC1D,UAAM,IAAI,MAAM,4DAA4D;AAC9E,QAAM,KAAK,OAAO,aAAa,MAAM,GAAG,EAAE;AAC1C,QAAM,cAAc,MAAM,UAAU,MAAM,cAAc,EAAE;AAC1D,MAAI,QAAQ,WAAW;AACrB,UAAMW,WAAyB;AAAA,MAC7B,GAAG;AAAA,MACH,SAAS,EAAE,IAAI,SAAS,OAAO,SAAS,SAAS,gBAAgB,QAAQ,eAAgB;AAAA,IAC3F;AACA,UAAM,eAAe,MAAM,gBAAgBA,QAAO;AAClD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,OAAO,SAAS;AAAA,MACzB,iBAAiB,SAAU;AAAA,MAC3B,MAAM,EAAE,SAAS,yCAAyC;AAAA,IAC5D;AAAA,EACF;AACA,QAAM,YACJ,QAAQ,aAAa,UACjB;AAAA,IACE,aAAa;AAAA,IACb,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,MAK1B,QAAQT,OAAK,KAAK,aAAa,UAAU,CAAC,CAAC,IAAI,QAAQA,OAAK,KAAK,aAAa,mBAAmB,CAAC,CAAC;AAAA;AAAA;AAAA,iCAGxE,QAAQA,OAAK,KAAK,MAAM,wBAAwB,CAAC,CAAC;AAAA,+BACpD,QAAQ,IAAI,CAAC;AAAA,mBACzB,QAAQ,sCAAsC,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9D,IACA;AAAA,IACE,OAAO;AAAA,OAAmB,QAAQA,OAAK,KAAK,aAAa,MAAM,CAAC,CAAC,IAAI,QAAQA,OAAK,KAAK,aAAa,mBAAmB,CAAC,CAAC;AAAA;AAAA,EAC3H;AACN,aAAW,CAAC,MAAMI,QAAO,KAAK,OAAO,QAAQ,SAAS,GAAG;AACvD,UAAM,OAAO,MAAM,UAAU,KAAK,IAAI;AACtC,UAAM,MAAM,MAAMN,KAAG,SAAS,MAAM,MAAM,EAAE,MAAM,CAAC,UAAmB;AACpE,UAAI,aAAa,OAAO,QAAQ,EAAG,QAAO;AAC1C,YAAM;AAAA,IACR,CAAC;AACD,QACE,QAAQ,QACR,QAAQ,UAAU,UAAU,IAAI,KAChC,QAAQ,UAAU,oBAAoB,IAAI,KAC1C,QAAQM;AAER,YAAM,IAAI,MAAM,0DAA0D,IAAI;AAAA,EAClF;AAIA,QAAM,UAAU,OAAO,QAAQ,EAAE,GAAG,UAAU,mBAAmB,GAAG,UAAU,UAAU,CAAC,EAAE;AAAA,IACzF,CAAC,CAAC,IAAI,MAAM,EAAE,QAAQ;AAAA,EACxB;AACA,QAAM,eAAe,OAAO,MAAc,aAAqB;AAC7D,QAAI,CAAC,cAAc,SAAS,IAAI,EAAG,OAAM,IAAI,MAAM,8BAA8B;AACjF,UAAM,SAAS,MAAMN,KAAG,SAAS,MAAM,UAAU,KAAK,IAAI,GAAG,MAAM,EAAE,MAAM,CAAC,UAAmB;AAC7F,UAAI,aAAa,OAAO,QAAQ,EAAG,QAAO;AAC1C,YAAM;AAAA,IACR,CAAC;AACD,QAAI,WAAW,QAAQ,WAAW;AAChC,YAAM,IAAI,MAAM,4CAA4C,IAAI;AAAA,EACpE;AACA,aAAW,CAAC,MAAM,QAAQ,KAAK,QAAS,OAAM,aAAa,MAAM,QAAQ;AACzE,EAAAO,WAAU,KAAK,oBAAoB,OAAO,SAAS,OAAO,EAAE;AAC5D,QAAM,UACJ,QAAQ,kBAAkB,UAAU,UAChC,EAAE,GAAG,SAAS,QAAQ,IACtB;AAAA,IACE,GAAI,UAAU,WAAW;AAAA,MACvB,SAAS,CAAC,YAAY,CAAC,QAAQ,IAAI,MAAM,QAAQ,IAAI,yBAAyB;AAAA,IAChF;AAAA,IACA,UAAUF,aAAW;AAAA,IACrB,eAAe,QAAQ,IAAI,eAAe,QAAQ,MAAM,EAAE,KAAK;AAAA,IAC/D,QAAQ,QAAQ,IAAI,sBAAsB,UAAU,SAAS;AAAA,EAC/D;AACN,MAAI,QAAQ,UAAU;AACpB,YAAQ,gBAAgB,OAAO,SAAS;AACxC,YAAQ,WAAWA,aAAW;AAAA,EAChC;AACA,QAAM,UAAyB;AAAA,IAC7B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,SAAS,OAAO,SAAS;AAAA,IACzB;AAAA,IACA,aAAa,UAAU,eAAe,CAAC;AAAA,IACvC;AAAA,IACA,UACE,YAAY,SAAS,YAAY,KAC7B,EAAE,IAAI,SAAS,SAAS,SAAS,SAAS,QAAQ,IAClD,UAAU;AAAA,EAClB;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAW,EAAE,GAAG,UAAU,mBAAmB,UAAU,IAAI;AAAA,EAC7D;AACA,MAAI;AACF,QAAI,CAAC,cAAe,OAAM,WAAW,MAAM,QAAQ,aAAa,MAAM;AACtE,eAAW,CAAC,MAAMC,QAAO,KAAK,OAAO,QAAQ,SAAS;AACpD,YAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,IAAI,GAAGA,UAAS,GAAK;AAChE,eAAW,CAAC,MAAM,QAAQ,KAAK,SAAS;AACtC,YAAM,aAAa,MAAM,QAAQ;AACjC,YAAMN,KAAG,GAAG,MAAM,UAAU,KAAK,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,IACzD;AACA,UAAM,eAAe,MAAM,gBAAgB,OAAO;AAAA,EACpD,SAAS,OAAO;AAEd,QAAI,UAAU;AACZ,iBAAW,CAAC,MAAMM,QAAO,KAAK,OAAO,QAAQ,SAAS,SAAS;AAC7D,cAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,IAAI,GAAGA,UAAS,GAAK;AAChE,YAAM,eAAe,MAAM,gBAAgB,QAAQ;AAAA,IACrD;AACA,UAAM;AAAA,EACR;AACA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,iBAAiB,UAAU;AAAA,MAC3B,MAAM,EAAE,SAAS,yBAAyB;AAAA,IAC5C;AACF,EAAAC,WAAU,KAAK,wCAAwC;AACvD,QAAM,aAAa,MAAM,cAAc,KAAK,QAAQ,eAAe,CAAC,GAAG,OAAO,YAAY;AACxF,YAAQ,cAAc;AACtB,UAAM,eAAe,MAAM,gBAAgB,OAAO;AAAA,EACpD,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,OAAO,SAAS;AAAA,IACzB,iBAAiB,UAAU;AAAA,IAC3B,MAAM;AAAA,EACR;AACF;AAEA,eAAe,WACb,MACA,QACA,aACA,QACA;AACA,QAAMK,UAAS,MAAMZ,KAAG,MAAM,WAAW,EAAE;AAAA,IACzC,MAAM;AAAA,IACN,CAAC,UAAmB;AAClB,UAAI,aAAa,OAAO,QAAQ,EAAG,QAAO;AAC1C,YAAM;AAAA,IACR;AAAA,EACF;AACA,MAAIY,SAAQ;AACV,UAAM,aAAa,aAAa,OAAO,YAAY;AACnD;AAAA,EACF;AACA,QAAM,QAAQ,MAAM,UAAU,MAAM,uBAAuBP,aAAW,GAAG,IAAI;AAC7E,QAAML,KAAG,MAAM,KAAK;AACpB,MAAI;AACF,eAAW,QAAQ,CAAC,eAAe,GAAG,OAAO,KAAK,OAAO,SAAS,KAAK,CAAC,GAAG;AACzE,YAAM,OAAO,MAAM,UAAU,QAAQ,IAAI,GACvC,KAAK,MAAM,UAAU,OAAO,MAAM,IAAI;AACxC,YAAMA,KAAG,SAAS,MAAM,EAAE;AAC1B,YAAMA,KAAG,MAAM,KAAK,MAAMA,KAAG,KAAK,IAAI,GAAG,OAAO,GAAK;AAAA,IACvD;AACA,UAAM,aAAa,OAAO,OAAO,YAAY;AAC7C,QAAI;AACF,YAAMA,KAAG,OAAO,OAAO,WAAW;AAAA,IACpC,SAAS,OAAO;AAEd,UAAI;AACF,cAAM,aAAa,aAAa,OAAO,YAAY;AAAA,MACrD,QAAQ;AACN,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,UAAE;AACA,UAAMA,KAAG,GAAG,OAAO,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACrD;AACF;AAGA,eAAsB,qBAAqB,MAAc;AACvD,QAAM,SAAS,MAAM,iBAAiB,IAAI,GACxC,YAAY,OAAO;AACrB,MAAI,UAAgE;AACpE,MAAI,aAAa,wBAAwB,MAAM,KAAK,CAAE,MAAM,cAAc,IAAI,GAAI;AAChF,QAAI;AACF,iBAAW,MAAM,aAAa,MAAM,UAAU,MAAM,cAAc,UAAU,EAAE,CAAC;AAC/E,UACE,SAAS,aAAa,MAAM,GAAG,EAAE,MAAM,UAAU,MACjD,SAAS,SAAS,YAAY,UAAU;AAExC,cAAM,IAAI,MAAM,wBAAwB;AAAA,IAC5C,SAAS,OAAO;AACd,0BAAoB;AAAA,IACtB;AAAA,EACF;AACA,SAAO,SAAS,MAAM,iBAAiB,YAAY;AACjD,QAAI,SAAS,MAAM,iBAAiB,IAAI;AACxC,UAAM,UAAU,OAAO;AACvB,QACE,WACA,WAAW,OAAO,QAAQ,OACzB,YAAY,sBACb,wBAAwB,MAAM,KAC9B,QAAQ,mBAAmB,OAAO,SAAS,YAC3C,mBAAmB,QAAQ,SAAS,OAAO,OAAO,KAClD,CAAE,MAAM,cAAc,IAAI,GAC1B;AACA,UAAI;AACF,YAAI,kBAAmB,OAAM;AAC7B,cAAM,SAAS,MAAM,UAAU,MAAM,cAAc,QAAQ,EAAE;AAC7D,cAAMQ,eAAc,MAAM,QAAQ,UAAW,QAAW,EAAE,gBAAgB,KAAK,GAAG,IAAI;AACtF,iBAAS,MAAM,iBAAiB,IAAI;AAAA,MACtC,SAAS,OAAO;AAEd,iBAAS,MAAM,iBAAiB,IAAI;AACpC,eAAO,OAAO;AACd,cAAM,eAAe,MAAM,gBAAgB,MAAM;AACjD,cAAM,eAAe,MAAM,sBAAsB;AAAA,UAC/C,aAAa,KAAK,IAAI;AAAA,UACtB,OAAO,OAAO,KAAK;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,UAAU,MAAM,YAAY,IAAI;AACtC,WAAO,EAAE,QAAQ,MAAM,UAAU,MAAM,cAAc,OAAO,OAAO,GAAG,QAAQ;AAAA,EAChF,CAAC;AACH;AAEA,eAAsB,qBAAqB;AACzC,QAAM,EAAE,KAAK,IAAI,MAAM,oBAAoB;AAC3C,SAAO,SAAS,MAAM,iBAAiB,YAAY;AACjD,UAAM,SAAS,MAAM,iBAAiB,IAAI;AAC1C,QAAI,CAAC,OAAO,SAAU,OAAM,IAAI,MAAM,wCAAwC;AAC9E,QAAI,MAAM,cAAc,IAAI;AAC1B,YAAM,IAAI,MAAM,uDAAuD;AACzE,UAAM,SAAS,MAAM,UAAU,MAAM,cAAc,OAAO,SAAS,EAAE;AACrE,UAAM,SAAS,MAAM,aAAa,MAAM;AACxC,QACE,OAAO,aAAa,MAAM,GAAG,EAAE,MAAM,OAAO,SAAS,MACrD,OAAO,SAAS,YAAY,OAAO,SAAS;AAE5C,YAAM,IAAI,MAAM,gCAAgC;AAClD,WAAOA,eAAc,MAAM,QAAQ,QAAQ,QAAW,EAAE,gBAAgB,MAAM,UAAU,KAAK,CAAC;AAAA,EAChG,CAAC;AACH;AAEA,eAAsB,kBAAkB,SAAkBD,WAAqB;AAC7E,MAAI,WAAW,CAAC,wCAAwC,KAAK,OAAO;AAClE,UAAM,IAAI,MAAM,4CAA4C;AAC9D,EAAAA,WAAU,KAAK,+BAA+B;AAC9C,QAAM,EAAE,MAAM,QAAQ,OAAO,IAAI,MAAM,oBAAoB;AAC3D,QAAM,aAAa,MAAM;AACzB,QAAM,SAAS,QAAQ,IAAI,sBAAsB,OAAO,SAAS,UAAU;AAC3E,MAAI,UAAU,CAAC;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,MAAI,WAAW,SAAS,QAAQ,MAAM,EAAE;AACxC,MAAI,CAAC,UAAU;AACb,IAAAA,WAAU,KAAK,6BAA6B;AAC5C,UAAM,WAAW,MAAM,MAAM,0DAA0D;AAAA,MACrF,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,YAAY,QAAQ,GAAK;AAAA,IACnC,CAAC,EAAE,MAAM,CAAC,UAAmB;AAC3B,YAAM,oBAAoB,KAAK;AAAA,IACjC,CAAC;AACD,QAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uCAAuC,SAAS,MAAM,IAAI;AAC5F,eAAW,IAAI,IAAI,SAAS,GAAG,EAAE,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,MAAM,EAAE;AAC5E,QAAI,CAAC,YAAY,CAAC,sCAAsC,KAAK,QAAQ;AACnE,YAAM,IAAI,MAAM,gCAAgC;AAAA,EACpD;AACA,QAAM,mBAAmB,MAAM,SAAS,MAAM,iBAAiB,YAAY;AACzE,UAAM,UAAU,MAAM,iBAAiB,IAAI;AAC3C,QAAI,QAAQ,YAAY,SAAU,QAAO;AACzC,UAAM,aAAa,MAAM,UAAU,MAAM,cAAc,QAAQ,OAAO,CAAC;AACvE,YAAQ,UAAU;AAAA,MAChB,GAAI,QAAQ,WAAW,EAAE,SAAS,MAAM;AAAA,MACxC,UAAUF,aAAW;AAAA,MACrB,eAAe,UAAU,WAAW;AAAA,MACpC,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO,QAAQ;AACf,UAAM,eAAe,MAAM,gBAAgB,OAAO;AAClD,WAAO;AAAA,EACT,CAAC;AACD,MAAI,kBAAkB;AACpB,IAAAE,WAAU,KAAK;AACf,YAAQ,IAAI,SAAS,QAAQ,wBAAwB;AACrD,WAAO;AAAA,EACT;AACA,QAAM,UAAU,QAAQ,aAAa;AACrC,QAAM,SAASL,OAAK,KAAK,QAAQ,UAAU,gBAAgB,YAAY;AAEvE,EAAAK,WAAU,KAAK;AACf,QAAM,OAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC1D,UAAM,QAAQ;AAAA,MACZ,UAAU,mBAAmB;AAAA,MAC7B,UACI;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IACA,CAAC,QAAQ,QAAS;AAAA,MACtB;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,YAAY;AAAA,UACZ,eAAe,OAAO;AAAA,UACtB,oBAAoB,QAAQ,IAAI,sBAAsB,OAAO,SAAS,UAAU;AAAA,UAChF,eAAe,WAAW;AAAA,UAC1B,8BAA8B;AAAA,UAC9B,uBAAuB;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AACA,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM,GAAG,QAAQ,CAACM,UAAS,QAAQA,SAAQ,CAAC,CAAC;AAAA,EAC/C,CAAC;AACD,MAAI,SAAS;AACX,YAAQ;AAAA,MACN;AAAA,IACF;AACF,SAAO;AACT;AAEA,eAAsB,sBAAsB;AAC1C,QAAM,EAAE,MAAM,OAAO,IAAI,MAAM,oBAAoB;AACnD,QAAM,QAAQ,QAAQ,IAAI;AAC1B,MAAI,QAAQ,aAAa,YAAY,CAAC,SAAS,CAAC,mBAAmB,KAAK,KAAK,IAAI;AAC/E,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,MAAM,iBAAiB,YAAY;AAChD,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,OAAO,SAAS,GAAG;AAC/D,UAAI,CAAC,cAAc,SAAS,IAAI,EAAG,OAAM,IAAI,MAAM,8BAA8B;AACjF,YAAM,OAAO,MAAM,UAAU,OAAO,KAAK,IAAI;AAC7C,YAAM,SAAS,MAAMb,KAAG,SAAS,MAAM,MAAM,EAAE,MAAM,CAAC,UAAmB;AACvE,YAAI,aAAa,OAAO,QAAQ,EAAG,QAAO;AAC1C,cAAM;AAAA,MACR,CAAC;AACD,UAAI,WAAW,QAAQ,WAAW;AAChC,cAAM,IAAI,MAAM,oCAAoC,IAAI;AAAA,IAC5D;AACA,eAAW,WAAW,MAAM,WAAW,OAAO,eAAe,CAAC,CAAC,EAAG,SAAQ,MAAM,OAAO;AACvF,QAAI,QAAQ,aAAa;AACvB,YAAM,QAAQ,MAAM,UAAU,MAAM,0BAA0B,IAAI,GAAG,KAAM;AAC7E,eAAW,QAAQ,OAAO,KAAK,OAAO,SAAS;AAC7C,YAAMA,KAAG,GAAG,MAAM,UAAU,OAAO,KAAK,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,EAClE,CAAC;AAID,MAAI,QAAQ,aAAa,QAAS,OAAMA,KAAG,GAAG,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACpF,SAAO;AACT;AA1fA,IAyBM,SACA,SAIO,wBAEP;AAhCN,IAAAc,gBAAA;AAAA;AAAA;AAAA;AAOA;AACA;AACA;AACA;AAEA;AASA;AACA,IAAAC;AAEA;AACA,IAAM,UAAU,CAAC,MAAc,MAAM,EAAE,QAAQ,MAAM,OAAO,IAAI;AAChE,IAAM,UAAU,CAAC,MAAc,MAAM,EAAE,QAAQ,MAAM,IAAI,IAAI;AAItD,IAAM,yBACX;AACF,IAAM,gBAAgB,CAAC,SAAS,aAAa,aAAa,oBAAoB;AAAA;AAAA;;;AChC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,SAAAC,cAAa;AACtB,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,KAAAC,WAAS;AAwClB,eAAe,gBAAgB,KAA8B;AAC3D,QAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,YAAY,QAAQ,IAAK,GAAG,UAAU,SAAS,CAAC;AAC5F,MAAI,CAAC,SAAS,MAAM,CAAC,SAAS;AAC5B,UAAM,IAAI,MAAM,wCAAwC,SAAS,MAAM,IAAI;AAC7E,MAAI,OAAO,SAAS,QAAQ,IAAI,gBAAgB,CAAC,IAAI,OAAO;AAC1D,UAAM,IAAI,MAAM,+BAA+B;AACjD,QAAM,SAAS,SAAS,KAAK,UAAU,GACrC,SAAuB,CAAC;AAC1B,MAAI,OAAO;AACX,MAAI;AACF,eAAS;AACP,YAAM,QAAiB,MAAM,OAAO,KAAK;AACzC,UAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS;AAC5C,cAAM,IAAI,MAAM,iCAAiC;AACnD,YAAM,EAAE,OAAO,KAAK,IAAI;AACxB,UAAI,KAAM;AACV,UAAI,EAAE,iBAAiB,YAAa,OAAM,IAAI,MAAM,iCAAiC;AACrF,cAAQ,MAAM;AACd,UAAI,OAAO,OAAO,KAAM,OAAM,IAAI,MAAM,+BAA+B;AACvE,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF,UAAE;AACA,UAAM,OAAO,OAAO;AAAA,EACtB;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAGA,eAAsB,qBAAqB,MAAc,MAAM,KAAK,IAAI,GAAG;AAGzE,QAAM,WAAW,kBAAkB;AAAA,IACjC,KAAK;AAAA,OAED,MAAM;AAAA,QACJ;AAAA,MACF,GACA,SAAS,MAAM;AAAA,IACnB;AAAA,EACF;AACA,QAAM,aAAa,MAAM,iBAAiB,IAAI,GAAG;AACjD,MAAI;AACJ,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,QAAQ,SAAS,QAAQ,MAAM,EAAE;AACjD,QACE,QAAQ,aAAa,MAAM,WAC3B,QAAQ,SACR,QAAQ,cACR,CAAC,QAAQ,gBACT,EAAE,MAAM,KAAK,MAAM,QAAQ,YAAY,KAAK,mBAC5C,CAAC,mBAAmB,SAAS,SAAS;AAEtC;AACF,QAAI,CAAC,YAAY,mBAAmB,SAAS,QAAQ,EAAG,YAAW;AAAA,EACrE;AACA,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,QAAQ,MAAM,gBAAgB,GAAG,WAAW,cAAc,QAAQ,cAAc;AACtF,QAAM,WAAW,qBAAqB,MAAM,KAAK,MAAM,MAAM,SAAS,MAAM,CAAC,CAAC;AAC9E,MAAI,SAAS,YAAY;AACvB,UAAM,IAAI,MAAM,sDAAsD;AACxE,QAAM,YAAqB,KAAK;AAAA,KAE5B,MAAM,gBAAgB,GAAG,WAAW,cAAc,SAAS,OAAO,uBAAuB,GACzF,SAAS,MAAM;AAAA,EACnB;AAGA,MACE,CAAC,SAAS,SAAS,KACnB,CAAC,SAAS,UAAU,gBAAgB,KACpC,UAAU,iBAAiB;AAE3B,UAAM,IAAI,MAAM,wDAAwD;AAC1E,QAAM,EAAE,gBAAgB,aAAa,IAAI,MAAM,OAAO,kBAAkB;AACxE,QAAM,SAAS,aAAa,eAAe,SAAS,CAAC;AACrD,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,UAAU;AAC1C,QAAM,OAAO,QAAQ,OAAO;AAAA,IAC1B,wBAAwB,mFAAmF,SAAS,OAAO;AAAA,IAC3H,mBAAmB;AAAA,IACnB,cAAc,MAAM,UAAU,MAAM,gBAAgB;AAAA,IACpD,SAAS;AAAA,IACT,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB,CAAC;AACD,SAAO;AACT;AAEA,eAAe,aAAa,MAAc,SAAiBC,SAAgB,UAAkB;AAC3F,QAAM,SAAS,MAAM,iBAAiB,IAAI;AAC1C,QAAM,SAAS,MAAM,UAAU,MAAM,cAAc,OAAO,OAAO;AACjE,QAAM,aAAa,MAAM;AACzB,QAAM,UAAU,QAAQ,aAAa,SACnC,SAASJ,OAAK,KAAK,QAAQ,UAAU,gBAAgB,YAAY;AACnE,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,UAAM,QAAQC;AAAA,MACZ,UAAU,mBAAmB;AAAA,MAC7B,UACI,CAAC,cAAc,mBAAmB,oBAAoB,UAAU,SAAS,MAAM,IAC/E,CAAC,MAAM;AAAA,MACX;AAAA,QACE,KAAK;AAAA,QACL,aAAa;AAAA,QACb,OAAO,CAAC,UAAU,UAAU,MAAM;AAAA,QAClC,SAAS,KAAK,KAAK;AAAA,QACnB,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,YAAY;AAAA,UACZ,eAAe,OAAO;AAAA,UACtB,eAAe;AAAA,UACf,oBAAoB;AAAA,UACpB,uBAAuBG;AAAA,UACvB,8BAA8B;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AACA,QAAI,aAAa;AACjB,UAAM,OAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,oBAAc,aAAa,OAAO,MAAM,IAAK;AAAA,IAC/C,CAAC;AACD,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM;AAAA,MAAG;AAAA,MAAS,CAAC,SACjB,SAAS,IACL,QAAQ,IACR,OAAO,IAAI,MAAM,2BAA2B,IAAI,MAAM,WAAW,KAAK,CAAC,EAAE,CAAC;AAAA,IAChF;AAAA,EACF,CAAC;AACH;AAGA,eAAsB,mBACpB,MACA,eAAe,EAAE,cAAc,sBAAsB,SAAS,aAAa,GAC3E,MAAM,KAAK,IAAI,GACf;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,YAAY;AACV,YAAM,SAAS,MAAM,iBAAiB,IAAI;AAC1C,UAAI,CAAC,wBAAwB,MAAM,EAAG;AACtC,YAAM,MAAMC,cAAa,UAAU,MAAM,cAAc,MAAM,oBAAoB,CAAC;AAClF,UACE,IAAI,WACJ,MAAM,IAAI,KAAK,cAAc,qBAC7B,IAAI,KAAK,eAAe;AAExB;AACF,YAAM,SAAuC,EAAE,aAAa,IAAI;AAChE,YAAM,eAAe,MAAM,sBAAsB,MAAM;AACvD,UAAI;AACF,cAAM,oBAAoB,IAAI,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC9C,cAAM,UAAU,MAAM,aAAa,aAAa,IAAI;AACpD,YAAI,CAAC,QAAS;AACd,eAAO,mBAAmB,QAAQ;AAClC,cAAM,MAAM,MAAM,KAAK,MAAM,QAAQ,WAAW;AAChD,YACE,OAAO,kBACP,mBAAmB,QAAQ,SAAS,OAAO,OAAO,MACjD,CAAC,OAAO,WAAW,mBAAmB,QAAQ,SAAS,OAAO,QAAQ,OAAO,IAC9E;AACA,gBAAM,QAAQ,SAAS,QAAQ,QAAQ,IAAI,QAAQ,IAAI,IAAI,QAAQ,aAAa,UAAU,QAAQ,QAAQ;AAC1G,gBAAMD,UAAS,QAAQ,OAAO,KAAK;AACnC,cAAI,CAACA,QAAQ,OAAM,IAAI,MAAM,kDAAkD;AAE/E,gBAAM,QAAQ,MAAM,iBAAiB,IAAI;AACzC,cACE,wBAAwB,KAAK,KAC7B,MAAM,SAAS,aAAa,OAAO,QAAS,YAC5C,mBAAmB,QAAQ,SAAS,MAAM,OAAO,GACjD;AACA,kBAAM,aAAa,QAAQ,MAAM,QAAQ,SAASA,SAAQ,OAAO,QAAS,QAAQ;AAAA,UACpF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE;AAEA,UACE,MAAML,KAAG,OAAOC,OAAK,KAAK,MAAM,cAAc,CAAC,EAAE;AAAA,QAC/C,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAEA,cAAM,eAAe,MAAM,sBAAsB,MAAM;AAAA,IAC3D;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,0BAAyC;AAC7D,MAAI;AACF,UAAM,EAAE,MAAM,OAAO,IAAI,MAAM,oBAAoB;AACnD,QAAI,CAAC,wBAAwB,MAAM,EAAG;AACtC,UAAM,SAASK,cAAa,UAAU,MAAM,cAAc,MAAM,oBAAoB,CAAC;AACrF,UAAM,MAAM,KAAK,IAAI;AACrB,QACE,OAAO,WACP,OAAO,KAAK,eAAe,OAC3B,MAAM,OAAO,KAAK,cAAc;AAEhC;AACF,UAAM,SAAS,MAAM,UAAU,MAAM,cAAc,OAAO,OAAO;AACjE,UAAM,QAAQJ;AAAA,MACZD,OAAK,KAAK,QAAQ,QAAQ,aAAa,UAAU,aAAa,MAAM;AAAA,MACpE,CAACA,OAAK,KAAK,QAAQ,mBAAmB,GAAG,iBAAiB;AAAA,MAC1D,EAAE,KAAK,MAAM,KAAK,QAAQ,KAAK,OAAO,UAAU,UAAU,MAAM,aAAa,KAAK;AAAA,IACpF;AACA,UAAM,GAAG,SAAS,MAAM;AAAA,IAAC,CAAC;AAC1B,UAAM,MAAM;AAAA,EACd,QAAQ;AAAA,EAER;AACF;AAEA,eAAsB,eAAe,MAAc,QAAgD;AACjG,SAAO,SAAS,MAAM,iBAAiB,YAAY;AACjD,UAAM,SAAS,MAAM,iBAAiB,IAAI;AAC1C,UAAM,UAAiD;AAAA,MACrD,GAAI,OAAO,WAAW,EAAE,SAAS,MAAM;AAAA,MACvC,UAAUE,aAAW;AAAA,IACvB;AACA,QAAI,WAAW,SAAU,SAAQ,UAAU;AAC3C,QAAI,WAAW,UAAW,SAAQ,UAAU;AAC5C,QAAI,WAAW,MAAO,SAAQ,gBAAgB,OAAO;AACrD,QAAI,WAAW,QAAS,QAAO,QAAQ;AACvC,WAAO,UAAU;AACjB,WAAO,OAAO;AACd,UAAM,eAAe,MAAM,gBAAgB,MAAM;AACjD,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,aAAa,MAAc;AAC/C,QAAM,SAAS,MAAM,iBAAiB,IAAI;AAC1C,QAAM,YAAYG,cAAa;AAAA,IAC5B,MAAM,cAAc,MAAM,oBAAoB,KAAM,EAAE,aAAa,EAAE;AAAA,EACxE;AACA,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO,SAAS,WAAW;AAAA,IACpC,WAAW,wBAAwB,MAAM;AAAA,IACzC,eAAe,OAAO,SAAS,iBAAiB;AAAA,IAChD,QAAQ,OAAO,SAAS,UAAU;AAAA,IAClC,gBAAgB,OAAO,SAAS,WAAW;AAAA,IAC3C,WAAW,UAAU,cAAc,YAAY;AAAA,EACjD;AACF;AAGA,eAAsB,oBAAoB,OAAgD;AACxF,QAAM,UAAU,mBAAmB;AACnC,MAAI,CAAC,SAAS;AACZ,UAAM,MAAM;AACZ;AAAA,EACF;AAGA,QAAM,UAAU,MAAM,qBAAqB,QAAQ,IAAI;AACvD,MAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,UAAM,QAAQJ;AAAA,MACZD,OAAK,KAAK,QAAQ,QAAQ,QAAQ,aAAa,UAAU,aAAa,MAAM;AAAA,MAC5E,CAACA,OAAK,KAAK,QAAQ,QAAQ,uBAAuB,GAAG,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,MAC7E,EAAE,OAAO,WAAW,aAAa,KAAK;AAAA,IACxC;AACA,UAAM,YAAY,MAAM;AACpB,YAAM,KAAK,QAAQ;AAAA,IACrB,GACA,YAAY,MAAM;AAChB,YAAM,KAAK,SAAS;AAAA,IACtB;AACF,YAAQ,GAAG,UAAU,SAAS;AAC9B,YAAQ,GAAG,WAAW,SAAS;AAC/B,QAAI;AACF,cAAQ,WAAW,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAChE,cAAM,GAAG,SAAS,MAAM;AACxB,cAAM,GAAG,QAAQ,CAAC,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAAA,MAC/C,CAAC;AAAA,IACH,UAAE;AACA,cAAQ,IAAI,UAAU,SAAS;AAC/B,cAAQ,IAAI,WAAW,SAAS;AAChC,YAAM,QAAQ,QAAQ;AAAA,IACxB;AACA;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ,MAAM;AACJ,WAAK,wBAAwB;AAAA,IAC/B;AAAA,IACA,KAAK,KAAK;AAAA,EACZ;AACA,QAAM,MAAM;AACZ,QAAM,OAAO,MAAM;AACjB,kBAAc,KAAK;AACnB,SAAK,SAAS,QAAQ;AAAA,EACxB;AACA,MAAI;AACF,UAAM,MAAM,IAAI;AAChB,SAAK,wBAAwB;AAAA,EAC/B,SAAS,OAAO;AACd,SAAK;AACL,UAAM;AAAA,EACR;AACF;AA5VA,IAoBa,mBACA,gBACP,aACA,mBAQO,sBAQPK;AAvCN;AAAA;AAAA;AAAA;AAMA;AACA;AACA;AAQA;AACA,IAAAC;AACA,IAAAC;AAEO,IAAM,oBAAoB,KAAK,KAAK,KAAK;AACzC,IAAM,iBAAiB,KAAK,KAAK,KAAK;AAC7C,IAAM,cAAc;AACpB,IAAM,oBAAoBJ,IAAE;AAAA,MAC1BA,IAAE,OAAO;AAAA,QACP,UAAUA,IAAE,OAAO;AAAA,QACnB,OAAOA,IAAE,QAAQ;AAAA,QACjB,YAAYA,IAAE,QAAQ;AAAA,QACtB,cAAcA,IAAE,OAAO,EAAE,SAAS;AAAA,MACpC,CAAC;AAAA,IACH;AACO,IAAM,uBAAuBA,IACjC,OAAO;AAAA,MACN,QAAQA,IAAE,QAAQ,CAAC;AAAA,MACnB,SAASA,IAAE,OAAO,EAAE,MAAM,iBAAiB;AAAA,MAC3C,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,MACjC,QAAQA,IAAE,OAAOA,IAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAAA,IACrD,CAAC,EACA,OAAO;AACV,IAAME,gBAAeF,IAAE,OAAO;AAAA,MAC5B,aAAaA,IAAE,OAAO;AAAA,MACtB,kBAAkBA,IAAE,OAAO,EAAE,SAAS;AAAA,MACtC,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,CAAC;AAAA;AAAA;;;AC3CD,SAAS,iBAAAK,sBAAqB;;;ACA9B;AACA;AAOA;AAEA;AACA;AACA;AACA;AAJA,SAAS,iBAAiB;;;ACHnB,SAAS,eACd,UAII,CAAC,GACK;AACV,QAAM,QACJ,QAAQ,UACP,CAACC,UAAS;AACT,YAAQ,OAAO,MAAMA,KAAI;AAAA,EAC3B;AACF,QAAM,cACJ,QAAQ,gBACP,CAAC,CAAC,QAAQ,OAAO,SAAS,QAAQ,IAAI,SAAS,UAAU,CAAC,QAAQ,IAAI;AACzE,QAAM,UAAU,QAAQ,YAAY,MAAM,QAAQ,OAAO,WAAW;AACpE,QAAM,SAAS,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAChE,MAAI,UAAU,IACZ,UAAU,GACV,QAAQ;AACV,MAAI;AACJ,QAAM,UAAU,MAAM;AACpB,UAAM,UAAU,KAAK,OAAO,KAAK,IAAI,IAAI,WAAW,GAAI;AACxD,WAAO,UAAU,KAAK,OAAO,OAAO;AAAA,EACtC;AACA,QAAM,SAAS,CAAC,WAAmB;AAEjC,UAAMA,QAAO,GAAG,MAAM,IAAI,OAAO,GAAG,QAAQ,CAAC;AAC7C,UAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC;AACvC,UAAM,eAAiBA,MAAK,SAAS,QAAQA,MAAK,MAAM,GAAG,QAAQ,CAAC,IAAI,WAAMA,MAAK;AAAA,EACrF;AACA,QAAM,OAAO,CAAC,UAAU,SAAS;AAC/B,QAAI,MAAO,eAAc,KAAK;AAC9B,YAAQ;AACR,QAAI,WAAW,aAAa;AAC1B,aAAO,UAAU,WAAM,QAAG;AAC1B,YAAM,IAAI;AAAA,IACZ;AACA,cAAU;AAAA,EACZ;AACA,SAAO;AAAA,IACL,KAAK,MAAM;AACT,WAAK;AACL,gBAAU,KAAK,QAAQ,yBAAyB,GAAG;AACnD,gBAAU,KAAK,IAAI;AACnB,cAAQ;AACR,UAAI,CAAC,aAAa;AAChB,cAAM,UAAU,OAAO;AAAA,CAAK;AAC5B;AAAA,MACF;AACA,aAAO,OAAO,KAAK,CAAC;AACpB,cAAQ,YAAY,MAAM;AACxB,eAAO,OAAO,EAAE,QAAQ,OAAO,MAAM,CAAC;AAAA,MACxC,GAAG,GAAG;AACN,YAAM,MAAM;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACF;;;ADjDA;AAEA,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAevB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAapB,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2Bd,IAAM,WAAW,CAAC,SAChB,UAAU;AAAA,EACR,MAAM;AAAA,EACN,kBAAkB;AAAA,EAClB,SAAS;AAAA,IACP,KAAK,EAAE,MAAM,SAAS;AAAA,IACtB,MAAM,EAAE,MAAM,SAAS;AAAA,IACvB,SAAS,EAAE,MAAM,SAAS;AAAA,IAC1B,cAAc,EAAE,MAAM,SAAS;AAAA,IAC/B,MAAM,EAAE,MAAM,UAAU;AAAA,IACxB,MAAM,EAAE,MAAM,WAAW,OAAO,IAAI;AAAA,IACpC,WAAW,EAAE,MAAM,UAAU;AAAA,IAC7B,SAAS,EAAE,MAAM,UAAU;AAAA,IAC3B,SAAS,EAAE,MAAM,UAAU;AAAA,IAC3B,QAAQ,EAAE,MAAM,UAAU;AAAA,IAC1B,SAAS,EAAE,MAAM,UAAU;AAAA,IAC3B,SAAS,EAAE,MAAM,SAAS;AAAA,IAC1B,SAAS,EAAE,MAAM,SAAS;AAAA,IAC1B,QAAQ,EAAE,MAAM,SAAS;AAAA,EAC3B;AACF,CAAC;AACI,SAAS,cAAc,MAAyB;AACrD,MAAI;AACF,UAAM,SAAS,SAAS,IAAI;AAC5B,WAAO,OAAO,YAAY,CAAC,MAAM,UAAU,CAAC,OAAO,OAAO;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,YAAY;AAAA,EAChB,KAAK,CAAC,MAAc,QAAQ,OAAO,MAAM,IAAI,IAAI;AAAA,EACjD,KAAK,CAAC,MAAc,QAAQ,OAAO,MAAM,IAAI,IAAI;AACnD;AACA,eAAsB,iBACpB,MACA,QAAQ,IACR,KAAK,WACL,UAAgD,CAAC,GAChC;AACjB,MAAI,SAAS;AACb,MAAIC;AACJ,MAAI;AACF,UAAM,EAAE,QAAQ,YAAY,IAAI,SAAS,IAAI;AAC7C,QAAI,OAAO,QAAQ,CAAC,YAAY,QAAQ;AACtC,SAAG;AAAA,QACD,YAAY,CAAC,MAAM,aACf,iBACA,YAAY,CAAC,MAAM,UACjB,cACA;AAAA,MACR;AACA,aAAO;AAAA,IACT;AACA,QAAI,YAAY,WAAW,EAAG,OAAM,IAAI,MAAM,uBAAuB;AACrE,KAAC,MAAM,IAAI;AACX,QAAI,OAAO,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,SAAS,MAAM;AACtD,YAAM,IAAI,MAAM,uCAAuC;AACzD,QAAI,OAAO,YAAY,UAAa,WAAW;AAC7C,YAAM,IAAI,MAAM,qCAAqC;AACvD,UAAM,kBAAkB;AAAA,MACtB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT,EAAE,KAAK,CAAC,MAAM,MAAM,MAAS;AAC7B,QAAI,mBAAmB,WAAW;AAChC,YAAM,IAAI,MAAM,uCAAuC;AACzD,UAAM,WAAW,CAAI,QACnB,OAAO,UAAU,YAAY,KAAK,GAAG,GAAG,IAAI,IAAI;AAClD,UAAM,MAAM,OAAO,OAAO,QAAQ,IAAI;AACtC,QAAI,OAAO,SAAS,MAAM,UAAa,CAAC,CAAC,QAAQ,UAAU,EAAE,SAAS,MAAM;AAC1E,YAAM,IAAI,MAAM,0CAA0C;AAC5D,QAAI,OAAO,YAAY,MAAM,QAAW;AACtC,UAAI,WAAW,YAAY,OAAO,QAAQ,OAAO;AAC/C,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,SAAG,IAAI,KAAK,UAAU,MAAM,mBAAmB,KAAK,OAAO,YAAY,CAAC,GAAG,MAAM,CAAC,CAAC;AACnF,aAAO;AAAA,IACT;AACA,QAAI,WAAW,YAAY;AACzB,UAAI,OAAO,YAAY;AACrB,cAAM,IAAI,MAAM,2CAA2C;AAC7D,YAAM,EAAE,iBAAAC,kBAAiB,mBAAAC,mBAAkB,IAAI,MAAM;AACrD,YAAM,SAAS,MAAMD,iBAAgB,KAAK;AAAA,QACxC,MAAM,OAAO,SAAS,SAAY,SAAY,WAAW,MAAM,OAAO,IAAI;AAAA,QAC1E,QAAQ,OAAO,SAAS;AAAA,QACxB,SAAS,OAAO;AAAA,MAClB,CAAC;AACD,SAAG,IAAI,OAAO,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAIC,mBAAkB,MAAM,CAAC;AAChF,aAAO,OAAO,WAAW,aAAa,IAAI;AAAA,IAC5C;AACA,QAAI,WAAW,QAAQ;AACrB,YAAM,OAAO,WAAW,MAAM,OAAO,IAAI;AACzC,UAAI,QAAQ,eAAe,QAAQ,gBAAgB;AACjD,cAAM,IAAI,MAAM,kDAAkD;AACpE,YAAM,SAAS,MAAM;AAAA,QAAS,MAC5B,kBAAkB,MAAM,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,YAAY,CAAC;AAAA,MACnE;AACA,UAAI,OAAQ,IAAG,IAAI,KAAK,UAAU,MAAM,CAAC;AACzC,aAAO;AAAA,IACT;AACA,QAAI,WAAW,WAAW,WAAW,QAAQ;AAC3C,UAAI,OAAO;AACT,cAAM,IAAI,MAAM,yDAAyD;AAC3E,YAAM,EAAE,cAAAC,eAAc,gBAAAC,iBAAgB,mBAAAC,oBAAmB,yBAAAC,yBAAwB,IAC/E,MAAM;AACR,YAAM,OAAO,OAAO,OAAO,WAAW,MAAM,OAAO,IAAI,IAAI;AAC3D,UAAI,CAAC,OAAO;AACV,QAAAN,YAAW;AAAA,UACT,OAAO,YACH,CAAC,IACD;AAAA,YACE,OAAO,CAACO,UAAS,GAAG,IAAIA,MAAK,QAAQ,OAAO,EAAE,CAAC;AAAA,YAC/C,aAAa;AAAA,UACf;AAAA,QACN;AACF,UAAI,WAAW,QAAQ;AACrB,cAAM,SAAS,MAAMF,mBAAkB,KAAK,EAAE,MAAM,QAAQ,OAAO,SAAS,GAAG,UAAAL,UAAS,CAAC;AACzF,QAAAA,WAAU,KAAK;AACf,WAAG,IAAI,OAAO,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAIM,yBAAwB,MAAM,CAAC;AAAA,MACxF,OAAO;AACL,cAAM,SAAS,MAAMH,cAAa,KAAK,EAAE,MAAM,UAAAH,UAAS,CAAC;AACzD,QAAAA,WAAU,KAAK;AACf,WAAG,IAAI,OAAO,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAII,gBAAe,MAAM,CAAC;AAAA,MAC/E;AACA,aAAO;AAAA,IACT;AACA,QAAI,WAAW,aAAa,WAAW,UAAU;AAC/C,YAAM,OAAO,WAAW,MAAM,OAAO,IAAI;AACzC,SAAG;AAAA,QACD,KAAK;AAAA,UACH,WAAW,YACP,MAAM,kBAAkB,KAAK,MAAM,OAAO,OAAO,IACjD,WAAW,MAAM,OAAO,OAAO;AAAA,UACnC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,QAAI,OAAO,QAAQ,OAAO;AACxB,YAAM,IAAI,MAAM,yDAAyD;AAC3E,QAAI,WAAW,SAAS;AACtB,YAAM,cAAc,OAAO,WAAW,UAAa,OAAO,YAAY;AACtE,YAAM,SAAS,OAAO,YAAY,UAAa,OAAO,WAAW;AACjE,UACG,OAAO,WAAW,UAAa,OAAO,YAAY,UAClD,gBAAgB,UAAU,OAAO,YAAY;AAE9C,cAAM,IAAI,MAAM,0EAA0E;AAC5F,UAAI,WAAW,CAAC,OAAO,WAAW,CAAC,OAAO,WAAW,CAAC,OAAO;AAC3D,cAAM,IAAI,MAAM,qDAAqD;AACvE,UAAI,aAAa;AACf,cAAMI,UAAS,MAAM,oBAAoB,KAAK,CAAC,CAAC,OAAO,MAAM;AAC7D,WAAG;AAAA,UACD,OAAO,OACH,KAAK,UAAUA,SAAQ,MAAM,CAAC,IAC9B,eAAeA,QAAO,UAAU,YAAY,UAAU;AAAA,QAC5D;AACA,eAAO;AAAA,MACT;AACA,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,iBAAiB,MAAM,OAAO,MAAM;AAAA,QACtC;AACF,YAAM,SAAS,MAAM,iBAAiB,KAAK,OAAO,OAAO;AACzD,SAAG,IAAI,OAAO,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,oBAAoB,MAAM,CAAC;AAClF,aAAO;AAAA,IACT;AACA,QAAI,WAAW,UAAU;AACvB,YAAM,EAAE,aAAAC,cAAa,qBAAAC,qBAAoB,IAAI,MAAM;AACnD,YAAM,QAAQ,MAAMD,aAAY,GAAG;AACnC,YAAM,SAAS;AAAA,QACb,GAAI,MAAM,iBAAiB,GAAG;AAAA,QAC9B,YAAY,MAAM,oBAAoB,GAAG;AAAA,QACzC;AAAA,MACF;AACA,SAAG;AAAA,QACD,OAAO,QAAQ,CAAC,QAAQ,OAAO,QAC3B,KAAK,UAAU,QAAQ,MAAM,CAAC,IAC9B;AAAA,UACEC,qBAAoB,KAAK;AAAA,UACzB,gCAAgC,OAAO,SAAS;AAAA,UAChD,OAAO;AAAA,QACT,EACG,OAAO,OAAO,EACd,KAAK,MAAM;AAAA,MACpB;AACA,aAAO;AAAA,IACT;AACA,QAAI,WAAW,QAAS,OAAM,IAAI,MAAM,iCAAiC,MAAM;AAC/E,UAAM,EAAE,OAAO,IAAI,MAAM,SAAS,MAAM,SAAS,KAAK,EAAE,OAAO,WAAW,CAAC,CAAC;AAC5E,OAAG,IAAI,OAAO,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC;AACxE,WAAO,OAAO,WAAW,aAAa,IAAI,OAAO,WAAW,kBAAkB,IAAI;AAAA,EACpF,SAAS,OAAO;AACd,IAAAV,WAAU,KAAK,KAAK;AACpB,UAAM,UACJ,WAAW,UACP,6BACA,kBAAkB,KAAK,EAAE,UACzB,4DACA,WAAW,aACT,gCACA,kBAAkB,KAAK,EAAE,UACzB,mGACA,eAAe,KAAK;AAC5B,QAAI,WAAW,UAAU,cAAc,IAAI,GAAG;AAC5C,SAAG,IAAI,KAAK,UAAU,EAAE,eAAe,QAAQ,CAAC,CAAC;AACjD,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,QAAQ;AACxB,SAAG;AAAA,QACD,KAAK,UAAU;AAAA,UACb,SAAS;AAAA,UACT,GAAI,CAAC,QAAQ,SAAS,UAAU,EAAE,SAAS,MAAM,IAC7C;AAAA,YACE;AAAA,YACA,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,IACA,EAAE,QAAQ,cAAc;AAAA,UAC5B,SAAS,kBAAkB,KAAK;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,QACG,IAAG,IAAI,OAAO;AACnB,WAAO;AAAA,EACT;AACF;;;AD5SA,IAAM,YAAY,QAAQ,KAAK,MAAM,CAAC;AACtC,IAAM,gBAAgB,UAAU,CAAC,MAAM;AACvC,IAAM,YAAY,gBAAgB,UAAU,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI;AAC9D,IAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAC3B,IAAM,QAAQ,SAAS,QAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BlC,IAAM,gBACH,YAAY,UAAU,cAAc,IAAI,KACxC,YAAY,UAAU,CAAC,KAAK,SAAS,gBAAgB,MAAM,iBAAiB,KAAK,SAAS;AAC7F,IAAI;AACJ,IAAI;AACF,MAAI,eAAe;AACjB,QACE,CAAC,aACD,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,SAAS,KACvC,EAAE,CAAC,OAAO,MAAM,EAAE,SAAS,OAAO,KAAK;AAEvC,YAAM,IAAI,MAAM,2BAA2B;AAG7C,QAAI,CAAC,eAAe;AAClB,YAAM,EAAE,eAAAW,eAAc,IAAI,MAAM;AAChC,YAAMA,eAAc,WAAiC,EAAE,eAAe,YAAY,MAAM,CAAC;AAAA,IAC3F;AAAA,EACF;AACA,MAAI,YAAY;AACd,YAAQ,IAAI,KAAK,UAAU,EAAE,UAAU,GAAG,SAAS,SAAY,CAAC,CAAC;AAAA,WAC1D,CAAC,WAAW,CAAC,UAAU,MAAM,MAAM,EAAE,SAAS,OAAO,EAAG,SAAQ,IAAI,KAAK;AAAA,WACzE,CAAC,aAAa,IAAI,EAAE,SAAS,OAAO,EAAG,SAAQ,IAAI,QAAW;AAAA,WAC9D,YAAY,mBAAmB;AACtC,QAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AACtE,UAAM,EAAE,qBAAAC,qBAAoB,IAAI,MAAM;AACtC,UAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,UAAMA,qBAAoB,MAAMD,qBAAoB,GAAG,IAAI;AAAA,EAC7D,WAAW,YAAY,oBAAoB;AACzC,QAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,sCAAsC;AACvE,UAAM,EAAE,mBAAAE,mBAAkB,IAAI,MAAM;AACpC,UAAM,aAAaC,eAAc,IAAI,IAAI,SAAS,YAAY,GAAG,CAAC;AAClE,eAAW,eAAe;AAC1B,UAAM,iBAAiB,QAAQ,IAAI;AACnC,QAAI,kBAAkB,CAAC,iBAAiB,KAAK,QAAQ,IAAI,yBAAyB,EAAE;AAClF,YAAM,IAAI,MAAM,yDAAyD;AAC3E,UAAM,YAAY,MAAMD,mBAAkB,YAAY,UAAU;AAAA,MAC9D,WAAW,CAAC,CAAC;AAAA,MACb;AAAA,IACF,CAAC;AACD,aAAS,KAAK;AACd,UAAM,UACJ,UAAU,mBAAmB,UAAU,oBAAoB,UAAU,UACjE,iBAAiB,UAAU,eAAe,WAAM,UAAU,OAAO,KACjE,mBAAmB,UAAU,OAAO;AAC1C,QAAI;AACF,cAAQ;AAAA,QACN,gBAAgB,UAAU,OAAO;AAAA,MACnC;AAAA,SACG;AACH,YAAM,EAAE,cAAAE,cAAa,IAAI,MAAM;AAC/B,YAAM,SAAS,MAAMA,cAAa,UAAU,IAAI;AAChD,YAAM,SAAS,OAAO,gBAClB,aAAa,OAAO,aAAa,KACjC,OAAO,SACL,2BACA,OAAO,UACL,YACA;AACR,cAAQ;AAAA,QACN,GAAG,OAAO,OAAO,UAAU,IAAI;AAAA,EAAM,UAAU,KAAK,OAAO;AAAA,qBAAwB,MAAM;AAAA,MAC3F;AAAA,IACF;AAAA,EACF,WAAW,YAAY,WAAW;AAChC,QAAI,KAAK,SAAS,QAAQ;AACxB,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,SACG;AACH,YAAM,SAAS,KAAK,OAAO,CAAC,QAAQ,QAAQ,QAAQ,EAAE,CAAC,KAAK;AAC5D,UACE,KAAK,OAAO,CAAC,QAAQ,QAAQ,QAAQ,EAAE,SAAS,KAChD,CAAC,CAAC,UAAU,UAAU,WAAW,OAAO,OAAO,EAAE,SAAS,MAAM;AAEhE,cAAM,IAAI,MAAM,iEAAiE;AACnF,YAAM,EAAE,qBAAAJ,qBAAoB,IAAI,MAAM;AACtC,YAAM,EAAE,gBAAAK,iBAAgB,cAAAD,eAAc,yBAAAE,yBAAwB,IAC5D,MAAM;AACR,YAAM,EAAE,KAAK,IAAI,MAAMN,qBAAoB;AAC3C,UAAI,WAAW;AACb,cAAMK,gBAAe,MAAM,MAAgD;AAC7E,YAAM,SAAS,MAAMD,cAAa,IAAI;AACtC,UAAI,KAAK,SAAS,QAAQ,EAAG,SAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,WAC1D;AACH,gBAAQ;AAAA,UACN,SAAS,OAAO,OAAO;AAAA,qBAAwB,OAAO,YAAY,YAAY,UAAU,iBAAiB,OAAO,UAAU,YAAY,UAAU;AAAA,QAClJ;AACA,YAAI,OAAO;AACT,kBAAQ;AAAA,YACN,aAAa,OAAO,aAAa;AAAA,UACnC;AACF,YAAI,OAAO;AACT,kBAAQ,IAAI,qEAAqE;AACnF,YAAI,CAAC,OAAO,aAAa,OAAO,WAAW,CAAC,OAAO,iBAAiB,CAAC,OAAO;AAC1E,kBAAQ;AAAA,YACN;AAAA,UACF;AACF,YAAI,OAAO;AACT,kBAAQ;AAAA,YACN,cAAc,OAAO,cAAc;AAAA,UACrC;AACF,YAAI,OAAO,WAAW;AACpB,kBAAQ,IAAI,eAAe,IAAI,KAAK,OAAO,UAAU,WAAW,EAAE,YAAY,CAAC,EAAE;AACjF,cAAI,OAAO,UAAU;AACnB,oBAAQ,IAAI,6BAA6B,OAAO,UAAU,gBAAgB,EAAE;AAC9E,cAAI,OAAO,UAAU,MAAO,SAAQ,IAAI,wBAAwB,OAAO,UAAU,KAAK,EAAE;AAAA,QAC1F;AAAA,MACF;AACA,UAAI,WAAW,YAAY,WAAW,QAAS,MAAKE,yBAAwB;AAAA,IAC9E;AAAA,EACF,WAAW,YAAY,YAAY;AACjC,QAAI,KAAK,SAAS,QAAQ;AACxB,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,SACG;AACH,UAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,8BAA8B;AAC/D,YAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,YAAM,WAAW,MAAMA,oBAAmB;AAC1C,cAAQ;AAAA,QACN,kBAAkB,SAAS,OAAO;AAAA,MACpC;AAAA,IACF;AAAA,EACF,WAAW,YAAY,aAAa,YAAY,aAAa;AAC3D,QAAI,KAAK,SAAS,QAAQ;AACxB,cAAQ;AAAA,QACN,YAAY,YACR,mIACA;AAAA,MACN;AAAA,SACG;AACH,YAAM,EAAE,mBAAAC,oBAAmB,qBAAAC,qBAAoB,IAC7C,MAAM;AACR,UAAI,KAAK,UAAU,YAAY,YAAY,IAAI,GAAI,OAAM,IAAI,MAAM,uBAAuB;AAC1F,UAAI,YAAY,WAAW;AACzB,mBAAW,eAAe;AAC1B,gBAAQ,WAAW,MAAMD,mBAAkB,KAAK,CAAC,GAAG,QAAQ;AAAA,MAC9D;AACE,gBAAQ;AAAA,WACL,QAAQ,aAAa,UAClB,wDACA,uCACD,MAAMC,qBAAoB,IAC3B;AAAA,QACJ;AAAA,IACJ;AAAA,EACF,WACE,CAAC,QAAQ,SAAS,YAAY,UAAU,SAAS,SAAS,WAAW,UAAU,MAAM,EAAE;AAAA,IACrF;AAAA,EACF,KACA,eACA;AACA,UAAM,YAAY,YAAY,SAAS,OAAO,CAAC,SAAS,GAAG,IAAI;AAC/D,QAAI,QAAQ;AACZ,QAAI,cAAc,SAAS,KAAK,CAAC,QAAQ,MAAM;AAC7C,uBAAiB,SAAS,QAAQ,OAAO;AACvC,cAAM,QAAiB;AACvB,YAAI,OAAO,UAAU,SAAU,UAAS;AAAA,iBAC/B,iBAAiB,WAAY,UAAS,OAAO,KAAK,KAAK,EAAE,SAAS;AAAA,YACtE,OAAM,IAAI,MAAM,0BAA0B;AAC/C,YAAI,OAAO,WAAW,KAAK,IAAI,OAAO,KAAM;AAAA,MAC9C;AACF,YAAQ,WAAW,MAAM,iBAAiB,WAAW,OAAO,QAAW;AAAA,MACrE,aAAa,gBAAiB,YAAmC;AAAA,IACnE,CAAC;AAAA,EACH,WAAW,CAAC,SAAS,UAAU,SAAS,QAAQ,KAAK,EAAE,SAAS,OAAO,GAAG;AACxE,UAAM,SAAS,IAAI,IAAI,WAAW,OAAO,OAAO,YAAY,GAAG;AAC/D,YAAQ,OAAO,CAAC,QAAQ,UAAUN,eAAc,MAAM,GAAG,GAAG,IAAI;AAChE,UAAM,OAAO,OAAO;AAAA,EACtB,MAAO,OAAM,IAAI,MAAM,sBAAsB,UAAU,qBAAqB;AAC9E,SAAS,OAAO;AACd,YAAU,KAAK,KAAK;AACpB,QAAM,UAAU,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAClF,MAAI,eAAe;AACjB,YAAQ,IAAI,KAAK,UAAU,EAAE,eAAe,UAAU,qCAAqC,CAAC,CAAC;AAC7F,YAAQ,WAAW;AAAA,EACrB,OAAO;AACL,YAAQ,MAAM,OAAO;AACrB,YAAQ,WAAW;AAAA,EACrB;AACF;","names":["scopes","args","command","path","configPath","raw","ALL_CHECKS","content","fs","path","fg","AsyncLocalStorage","path","args","fs","constants","fg","scopes","literal","z","fs","directory","z","repoPath","path","z","createHash","fs","path","createHash","z","content","fs","path","fg","readdir","directory","lstat","count","fg","file","path","quote","text","directory","hash","content","commands","fs","path","fg","priority","content","fs","path","directory","fs","path","path","fg","fs","path","text","count","path","content","path","directory","path","content","text","json","args","text","scopes","content","text","path","hits","init_drift","init_drift","createHash","z","z","digest","evidenceSchema","z","z","directory","fs","z","git","evidenceSchema","record","events","event","commitSchema","eventSchema","init_drift","args","fs","path","hash","fs","path","randomUUID","z","content","head","count","fs","path","createHash","z","git","args","scopes","record","text","exists","commands","z","fs","z","configPath","configSchema","directory","empty","stateSchema","findingSchema","key","findingId","text","os","fs","randomUUID","z","directory","randomUUID","z","statePath","empty","git","verifications","record","previousPath","pendingKnowledge","hosts","text","fs","path","git","z","fs","path","os","createHash","init_drift","z","fs","path","git","directory","z","execFile","promisify","fs","args","git","fs","z","directory","z","prepareLaunch","observeActivation","warning","knowledge","command","fs","path","randomUUID","text","file","init_files","z","text","command","init_files","z","init_files","parse","z","text","config","servers","configPath","planAutomationInstall","blockSpan","init_config","init_files","configPath","recordSchema","z","command","ancillaryEdits","applyEdit","ownershipEdit","completedHookOwnership","edit","init_files","isDeepStrictEqual","fs","path","parse","stringify","fg","z","git","recordSchema","commands","configPath","command","empty","host","text","object","handlers","init_files","init_config","hosts","init_config","randomUUID","git","configPath","init_files","init_config","fs","os","path","execFile","promisify","createHash","randomUUID","z","profiles","text","execute","value","recordSchema","os","path","fs","z","fs","path","createHash","z","digest","init_trust","fs","os","path","randomUUID","z","directory","init_runtime","init_trust","fs","os","randomUUID","z","directory","leaseSchema","install_exports","fs","os","path","execFile","promisify","randomUUID","content","progress","installLocked","recordSchema","directory","receipt","exists","code","init_install","init_trust","fs","path","spawn","randomUUID","z","digest","statusSchema","init_runtime","init_install","fileURLToPath","text","progress","teardownProject","summarizeTeardown","setupProject","summarizeSetup","initializeProject","summarizeInitialization","text","result","setupStatus","summarizeActivation","prepareLaunch","currentInstallation","runAutomaticUpdate","installStandalone","fileURLToPath","updateStatus","updateSettings","scheduleAutomaticUpdate","rollbackStandalone","upgradeStandalone","uninstallStandalone"]}
1
+ {"version":3,"sources":["../src/utils/paths.ts","../src/utils/validation.ts","../src/utils/profile.ts","../src/utils/git-read.ts","../src/audit/types.ts","../src/utils/files.ts","../src/utils/storage.ts","../src/audit/inspection.ts","../src/decisions/anchors.ts","../src/utils/store-lock.ts","../src/snapshot/lock.ts","../src/snapshot/snapshot.ts","../src/context/lexical.ts","../src/context/trust.ts","../src/decisions/provenance.ts","../src/decisions/decisions.ts","../src/audit/inputs.ts","../src/audit/policy.ts","../src/audit/commands.ts","../src/audit/tree.ts","../src/audit/claims.ts","../src/audit/git.ts","../src/audit/docs.ts","../src/audit/scope.ts","../src/drift/drift.ts","../src/audit/checks/deleted-reference.ts","../src/audit/checks/new-module.ts","../src/audit/checks/stale-count.ts","../src/audit/checks/dead-command.ts","../src/audit/dependency-claims.ts","../src/audit/release-metadata.ts","../src/audit/checks/deps-changed.ts","../src/decisions/excerpts.ts","../src/decisions/drift.ts","../src/audit/checks/decision-anchor.ts","../src/audit/checks/index.ts","../src/audit/findings.ts","../src/automation/pending-tools.ts","../src/automation/stop-review.ts","../src/automation/notifications.ts","../src/automation/store.ts","../src/audit/advisory-review.ts","../src/audit/audit.ts","../src/audit/repair.ts","../src/automation/evidence.ts","../src/automation/config.ts","../src/automation/usefulness.ts","../src/automation/execution.ts","../src/decisions/attribution.ts","../src/decisions/pending.ts","../src/automation/runtime.ts","../src/automation/hook-root.ts","../src/hook/hook.ts","../src/setup/model.ts","../src/setup/launcher.ts","../src/setup/observations.ts","../src/automation/adapters.ts","../src/setup/files.ts","../src/setup/ownership.ts","../src/mcp/init.ts","../src/decisions/merge.ts","../src/setup/config.ts","../src/automation/install.ts","../src/setup/teardown.ts","../src/setup/status.ts","../src/setup/setup.ts","../src/distribution/path.ts","../src/distribution/state.ts","../src/distribution/bundle.ts","../src/distribution/trust.ts","../src/distribution/runtime.ts","../src/distribution/sessions.ts","../src/distribution/install.ts","../src/distribution/updates.ts","../bin/mason.ts","../src/automation/cli.ts","../src/utils/progress.ts"],"sourcesContent":["import path from \"node:path\";\n\n/** One canonical representation for stored paths and decision anchors. */\nexport function normalizeRepoPath(value: string): string | null {\n const slash = value.replace(/\\\\/g, \"/\");\n if (!slash || slash.includes(\"\\0\") || path.posix.isAbsolute(slash) || /^[A-Za-z]:/.test(slash))\n return null;\n if (slash.split(\"/\").includes(\"..\")) return null;\n const normalized = path.posix.normalize(slash).replace(/\\/$/, \"\");\n return normalized === \".\" ? null : normalized;\n}\n\nexport function sanitizeRepoPaths(files: string[]): string[] {\n return [...new Set(files.map(normalizeRepoPath).filter((p): p is string => p !== null))];\n}\n\nexport function isWithinRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);\n}\n\nexport function anchorMatches(anchor: string, file: string): boolean {\n const a = normalizeRepoPath(anchor);\n const f = normalizeRepoPath(file);\n return a !== null && f !== null && (a === f || f.startsWith(`${a}/`));\n}\n\nexport function matchingPaths(anchors: string[], files: Iterable<string>): string[] {\n return [...new Set(files)].filter((file) =>\n anchors.some((anchor) => anchorMatches(anchor, file)),\n );\n}\n\n/** Match an inventory to every scope in one pass through its path components. */\nexport function indexMatchingPaths(\n scopes: readonly (readonly string[])[],\n files: Iterable<string>,\n): string[][] {\n interface Node {\n children: Map<string, Node>;\n scopes: Set<number>;\n }\n const node = (): Node => ({ children: new Map(), scopes: new Set() });\n const root = node();\n const matches: string[][] = scopes.map(() => []);\n scopes.forEach((anchors, index) => {\n for (const anchor of anchors) {\n const normalized = normalizeRepoPath(anchor);\n if (!normalized) continue;\n let current = root;\n for (const part of normalized.split(\"/\")) {\n if (!current.children.has(part)) current.children.set(part, node());\n current = current.children.get(part)!;\n }\n current.scopes.add(index);\n }\n });\n for (const file of new Set(files)) {\n const normalized = normalizeRepoPath(file);\n if (!normalized) continue;\n const selected = new Set<number>();\n let current: Node | undefined = root;\n for (const part of normalized.split(\"/\")) {\n current = current.children.get(part);\n if (!current) break;\n for (const index of current.scopes) selected.add(index);\n }\n for (const index of selected) matches[index].push(file);\n }\n return matches;\n}\n","/** Narrow external objects without allowing arrays or null to masquerade as records. */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item: unknown) => typeof item === \"string\");\n}\n\nexport function hasErrorCode(error: unknown, code: string): boolean {\n return isRecord(error) && error.code === code;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\ntype Timing = { calls: number; totalMs: number };\nconst profiles = new AsyncLocalStorage<Record<string, Timing>>();\n\n/** Opt-in, invocation-local timings. Labels are fixed in source; no repository data. */\nexport async function profilePhase<T>(label: string, run: () => Promise<T>): Promise<T> {\n const phases = profiles.getStore();\n if (!phases) return run();\n const start = performance.now();\n try {\n return await run();\n } finally {\n const timing = (phases[label] ??= { calls: 0, totalMs: 0 });\n timing.calls++;\n timing.totalMs += performance.now() - start;\n }\n}\n\nexport async function withProfile<T>(\n run: () => Promise<T>,\n emit: (json: string) => void,\n): Promise<T> {\n const phases: Record<string, Timing> = {};\n const start = performance.now();\n return profiles.run(phases, async () => {\n try {\n return await run();\n } finally {\n emit(\n JSON.stringify({\n kind: \"mason-profile\",\n version: 1,\n totalMs: performance.now() - start,\n phases,\n }),\n );\n }\n });\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { profilePhase } from \"./profile.js\";\n\nconst execute = promisify(execFile);\nconst commands = new Set([\n \"rev-parse\",\n \"symbolic-ref\",\n \"for-each-ref\",\n \"ls-files\",\n \"check-ignore\",\n \"status\",\n \"log\",\n \"diff\",\n \"ls-tree\",\n \"show\",\n \"merge-base\",\n]);\nexport interface GitReadOptions {\n cwd: string;\n maxBuffer?: number;\n timeout?: number;\n input?: string;\n}\n\n/** Fixed command labels only: profiling never includes arguments or repository paths. */\nexport function execGit(args: string[], options: GitReadOptions) {\n const command = args.find((arg) => !arg.startsWith(\"-\")) ?? \"other\";\n return profilePhase(\"git.\" + (commands.has(command) ? command : \"other\"), async () => {\n const { input, ...processOptions } = options;\n const operation = execute(\"git\", args, processOptions);\n if (input !== undefined) {\n operation.child.stdin!.on(\"error\", () => {\n /* The child exit reports a failed query. */\n });\n operation.child.stdin!.end(input);\n }\n return operation;\n });\n}\n","import type { decisionProvenance } from \"../decisions/provenance.js\";\n\nexport type IssueType = \"deleted-reference\" | \"new-module\" | \"stale-count\" | \"dead-command\";\n\nexport type AdvisoryType = \"deps-changed\" | \"decision-anchor-drift\" | IssueType;\n\nexport type CheckName = IssueType | AdvisoryType;\n\nexport const ALL_CHECKS: CheckName[] = [\n \"deleted-reference\",\n \"new-module\",\n \"stale-count\",\n \"dead-command\",\n \"deps-changed\",\n \"decision-anchor-drift\",\n];\n\n/**\n * \"certain\" — the claim is provably false (a tracked path is gone, a computed\n * count differs, a script is absent from a resolved manifest). \"likely\" is\n * retained for older reports. Inferred scope and speculative omissions are\n * advisory; even a certain mismatch needs semantic review before repair.\n */\nexport type Confidence = \"certain\" | \"likely\";\n\nexport interface CommitRef {\n hash: string;\n date: string;\n subject: string;\n}\n\nexport interface DocAnchor {\n /** Repo-relative doc path, e.g. \"CLAUDE.md\" or \".claude/CLAUDE.md\". */\n doc: string;\n /** 1-based line of the claim; null for doc-level issues (new-module). */\n line: number | null;\n /** The claim exactly as written, e.g. \"src/utils/logger.ts\". */\n excerpt: string | null;\n}\n\nexport interface ClaimScope {\n basis: \"repository\" | \"document\" | \"document-link\" | \"explicit\";\n directory: string;\n /** Exact repository-relative paths/manifests considered by the check. */\n candidates: string[];\n}\n\nexport type Evidence =\n | {\n kind: \"missing-path\";\n claimed: string;\n renamedTo: string | null;\n deletedInCommit: CommitRef | null;\n everTracked: boolean;\n parentDirExists: boolean;\n resolvedPath?: string;\n scope?: ClaimScope;\n }\n | {\n kind: \"unmentioned-dir\";\n dir: string;\n sourceFileCount: number;\n firstCommit: CommitRef | null;\n checkedDocs: string[];\n }\n | {\n kind: \"count-mismatch\";\n claimed: number;\n actual: number;\n unit: string;\n /** Where the actual count came from, e.g. \"package.json workspaces\". */\n countedFrom: string;\n members: string[];\n }\n | {\n kind: \"missing-script\";\n scriptName: string;\n invocation: string;\n manifestsChecked: string[];\n availableScripts: string[];\n scope?: ClaimScope;\n }\n | {\n kind: \"doc-behind-manifests\";\n docLastCommit: CommitRef;\n manifestCommits: Array<CommitRef & { files: string[] }>;\n totalCommits: number;\n matches?: import(\"./dependency-claims.js\").DependencyMatch[];\n matchingIncomplete?: boolean;\n }\n | {\n kind: \"decision-anchor\";\n provenance?: ReturnType<typeof decisionProvenance>;\n decisionId: string;\n title: string;\n changedFiles: string[];\n refreshedHash: string;\n };\n\nexport interface AuditIssue {\n type: IssueType;\n message: string;\n anchor: DocAnchor;\n confidence: Confidence;\n evidence: Evidence;\n}\n\n/**\n * Advisories require judgment and never drive the ordinary audit exit code.\n * Historical advisories require a separate review. Explicitly recheckable\n * candidates can cease to be detected without asserting semantic approval.\n */\nexport interface AuditAdvisory {\n type: AdvisoryType;\n message: string;\n anchor: DocAnchor;\n evidence: Evidence;\n resolution?: \"recheck\" | \"informational\";\n}\n\nexport interface AuditDocInfo {\n path: string;\n scope?: string;\n kind?: \"instructions\" | \"readme\" | \"guide\";\n lastCommit: CommitRef | null;\n /** Uncommitted edits present — deps-changed is suppressed for dirty docs. */\n dirty: boolean;\n lineCount: number;\n}\n\nexport interface AuditReport {\n /** Additive-only schema — this output is a CI contract. */\n version: 1;\n root: string;\n gitAvailable: boolean;\n /** Commit and exact check scope used by this run. */\n headHash?: string;\n checksRun?: CheckName[];\n docs: AuditDocInfo[];\n /** Whether .mason/decisions/ existed and was checked. */\n decisionsChecked: boolean;\n /** Drive exit code 1. */\n issues: AuditIssue[];\n /** Never drive the exit code. */\n advisories: AuditAdvisory[];\n /** Original committed evidence retained while local doc edits suppress reporting. */\n suppressedAdvisories?: AuditAdvisory[];\n skippedChecks: Array<{ check: string; reason: string; doc?: string }>;\n clean: boolean;\n excludedChecks?: Array<{ check: CheckName; doc: string }>;\n /** Additive assessment status; original advisory evidence remains intact. */\n advisoryReviews?: import(\"./advisory-review.js\").AdvisoryReviewSummary[];\n}\n\nexport interface PathClaim {\n path: string;\n line: number;\n excerpt: string;\n /** Markdown links resolve against the physical document directory. */\n relativeTo?: \"document\";\n}\n\nexport interface CountClaim {\n count: number;\n unit: string;\n line: number;\n excerpt: string;\n}\n\nexport interface CommandClaim {\n scriptName: string;\n invocation: string;\n line: number;\n excerpt: string;\n /** A literal cd/directory flag, relative to the document's assumed cwd. */\n directory?: string;\n scopeUnknown?: string;\n}\n\nexport interface DocClaims {\n paths: PathClaim[];\n counts: CountClaim[];\n commands: CommandClaim[];\n}\n","import { isRecord, isStringArray } from \"./validation.js\";\nimport { execGit } from \"./git-read.js\";\nimport fs from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport { isWithinRoot, normalizeRepoPath } from \"./paths.js\";\n\nexport const SOURCE_EXTENSIONS = [\n \"ts\",\n \"tsx\",\n \"js\",\n \"jsx\",\n \"mts\",\n \"cts\",\n \"mjs\",\n \"cjs\",\n \"vue\",\n \"svelte\",\n \"kt\",\n \"kts\",\n \"java\",\n \"py\",\n \"go\",\n \"rs\",\n \"swift\",\n \"rb\",\n \"cs\",\n \"cpp\",\n \"c\",\n \"h\",\n \"hpp\",\n \"dart\",\n \"php\",\n];\nexport const SOURCE_GLOB = `**/*.{${SOURCE_EXTENSIONS.join(\",\")}}`;\nexport const SOURCE_IGNORE = [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.gradle/**\",\n \"**/target/**\",\n \"**/.git/**\",\n \"**/.mason/**\",\n \"**/vendor/**\",\n \"**/__pycache__/**\",\n \"**/venv/**\",\n \"**/.venv/**\",\n \"**/*.min.*\",\n \"**/*.map\",\n \"**/*.lock\",\n \"**/generated/**\",\n \"**/*.generated.*\",\n \"**/R.java\",\n \"**/BuildConfig.java\",\n \"**/package-lock.json\",\n \"**/yarn.lock\",\n \"**/pnpm-lock.yaml\",\n];\nexport const MAX_SOURCE_BYTES = 1024 * 1024;\nexport interface ProjectConfig {\n patterns?: string[];\n alwaysInclude?: string[];\n ignore?: string[];\n audit?: {\n include?: string[];\n exclude?: Partial<Record<import(\"../audit/types.js\").CheckName, string[]>>;\n };\n}\nexport interface SourceFile {\n path: string;\n content: string;\n totalLines: number;\n}\n\nexport function isSensitiveFile(file: string): boolean {\n return file\n .split(/[\\\\/]/)\n .some((part) =>\n /^(?:\\.env(?:\\..*)?|id_rsa.*|id_ed25519.*)$|\\.(?:pem|key|p12|pfx|jks|keystore)$|credentials\\.|secret|^local\\.properties$/i.test(\n part,\n ),\n );\n}\n\n/** Bound reads even if a file grows after stat. Only read regular files. */\nexport async function readBoundedFile(file: string, maxBytes: number): Promise<string | null> {\n // Do not block on a FIFO or follow a symlink substituted after resolution.\n const handle = await fs.open(\n file,\n constants.O_RDONLY | constants.O_NONBLOCK | constants.O_NOFOLLOW,\n );\n try {\n const stat = await handle.stat();\n if (!stat.isFile() || stat.size > maxBytes) return null;\n const buffer = Buffer.alloc(Math.min(maxBytes + 1, stat.size + 1));\n let bytes = 0;\n while (bytes < buffer.length) {\n const result = await handle.read(buffer, bytes, buffer.length - bytes, null);\n if (result.bytesRead === 0) break;\n bytes += result.bytesRead;\n }\n return bytes === buffer.length ? null : buffer.subarray(0, bytes).toString(\"utf8\");\n } finally {\n await handle.close();\n }\n}\n\nexport async function loadProjectConfig(root: string): Promise<ProjectConfig> {\n try {\n const canonicalRoot = await fs.realpath(root);\n const configPath = await fs.realpath(path.join(root, \".mason/config.json\"));\n if (!isWithinRoot(canonicalRoot, configPath))\n throw new Error(\"Project configuration resolves outside the repository\");\n const raw = await readBoundedFile(configPath, 64 * 1024);\n if (raw === null)\n throw new Error(\"Project configuration is not a regular file or exceeds 64 KiB\");\n const value: unknown = JSON.parse(raw);\n if (!isRecord(value)) throw new Error(\"Expected a configuration object\");\n const config: ProjectConfig = {};\n for (const key of [\"patterns\", \"alwaysInclude\", \"ignore\"] as const) {\n if (value[key] === undefined) continue;\n if (!isStringArray(value[key])) {\n throw new Error(`Configuration ${key} must be an array of strings`);\n }\n config[key] = value[key];\n }\n if (value.audit !== undefined) {\n const audit = value.audit;\n if (!isRecord(audit)) throw new Error(\"Configuration audit must be an object\");\n const patterns = (raw: unknown): string[] => {\n if (\n !isStringArray(raw) ||\n raw.length > 100 ||\n !raw.every(\n (s) =>\n typeof s === \"string\" &&\n normalizeRepoPath(s) === s &&\n !s.startsWith(\"!\") &&\n !/[\\x00-\\x1f]/.test(s),\n )\n ) {\n throw new Error(\n \"Audit patterns must be at most 100 repository-relative globs without traversal or negation\",\n );\n }\n return raw;\n };\n config.audit = {};\n if (audit.include !== undefined) config.audit.include = patterns(audit.include);\n if (audit.exclude !== undefined) {\n if (!isRecord(audit.exclude))\n throw new Error(\"audit.exclude must map check names to patterns\");\n const { ALL_CHECKS } = await import(\"../audit/types.js\");\n config.audit.exclude = {};\n for (const [check, globs] of Object.entries(audit.exclude)) {\n if (!ALL_CHECKS.includes(check as (typeof ALL_CHECKS)[number]))\n throw new Error(\"Unknown audit check: \" + check);\n config.audit.exclude[check as (typeof ALL_CHECKS)[number]] = patterns(globs);\n }\n }\n }\n return config;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw new Error(\n `Cannot apply project file policy: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n}\n\n/** Scoped to one operation, so a later tool call sees newly edited files/ignores. */\nexport async function createFileAccess(rootDir: string) {\n const root = path.resolve(rootDir);\n const canonicalRoot = await fs.realpath(root).catch(() => root);\n const config = await loadProjectConfig(root);\n const ignore = [...SOURCE_IGNORE, ...(config.ignore ?? [])];\n let gitFiles: Set<string> | null = null;\n try {\n const { stdout } = await execGit(\n [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\"],\n { cwd: root, maxBuffer: 50 * 1024 * 1024 },\n );\n gitFiles = new Set(stdout.split(\"\\0\").filter(Boolean));\n } catch {\n // File-system projects are supported. Fail closed if this IS a Git repo.\n let inGit = false;\n try {\n await execGit([\"rev-parse\", \"--git-dir\"], { cwd: root });\n inGit = true;\n } catch {\n /* no Git */\n }\n if (inGit) throw new Error(\"Cannot enumerate Git files safely\");\n }\n\n async function resolve(file: string): Promise<string | null> {\n const relative = normalizeRepoPath(file);\n if (!relative || isSensitiveFile(relative) || (gitFiles && !gitFiles.has(relative)))\n return null;\n const candidate = path.join(root, relative);\n try {\n const real = await fs.realpath(candidate);\n if (!isWithinRoot(canonicalRoot, real) || isSensitiveFile(path.relative(canonicalRoot, real)))\n return null;\n const stat = await fs.stat(real);\n if (!stat.isFile() || stat.size > MAX_SOURCE_BYTES) return null;\n // A symlink must not bypass the target's ignore policy either.\n if (gitFiles && !gitFiles.has(path.relative(canonicalRoot, real).split(path.sep).join(\"/\")))\n return null;\n return real;\n } catch {\n return null;\n }\n }\n\n async function list(\n patterns: string | string[] = SOURCE_GLOB,\n options: { deep?: number; dot?: boolean } = {},\n ): Promise<string[]> {\n const found = await fg(patterns, { cwd: root, ignore, followSymbolicLinks: false, ...options });\n const safe = await Promise.all(found.map(async (f) => ((await resolve(f)) ? f : null)));\n return safe.filter((f): f is string => f !== null).sort();\n }\n\n async function read(file: string): Promise<SourceFile | null> {\n const relative = normalizeRepoPath(file);\n if (!relative) return null;\n const real = await resolve(relative);\n if (!real) return null;\n // Apply the same glob exclusions to explicit reads and symlink targets.\n for (const rel of new Set([\n relative,\n path.relative(canonicalRoot, real).split(path.sep).join(\"/\"),\n ])) {\n if (!(await fg(fg.escapePath(rel), { cwd: root, ignore, dot: true })).length) return null;\n }\n try {\n const content = await readBoundedFile(real, MAX_SOURCE_BYTES);\n return content === null\n ? null\n : { path: relative, content, totalLines: content.split(\"\\n\").length };\n } catch {\n return null;\n }\n }\n return { root, config, list, read, inventory: () => (gitFiles ? [...gitFiles].sort() : null) };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { normalizeRepoPath } from \"./paths.js\";\nimport { readBoundedFile } from \"./files.js\";\n\nexport interface StoreDiagnostic {\n path: string;\n message: string;\n}\n\n/** Metadata paths may not contain symlinks, including their parent directories. */\nexport async function storePath(\n root: string,\n relative: string,\n createParents = false,\n): Promise<string> {\n const normalized = normalizeRepoPath(relative);\n if (!normalized) throw new Error(`Invalid store path: ${relative}`);\n let current = await fs.realpath(root);\n const parts = normalized.split(\"/\");\n for (let i = 0; i < parts.length; i++) {\n current = path.join(current, parts[i]);\n let stat;\n try {\n stat = await fs.lstat(current);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n if (createParents && i < parts.length - 1) {\n try {\n await fs.mkdir(current);\n } catch (mkdirError) {\n if ((mkdirError as NodeJS.ErrnoException).code !== \"EEXIST\") throw mkdirError;\n }\n stat = await fs.lstat(current);\n }\n }\n if (stat?.isSymbolicLink()) throw new Error(`Symlink in store path: ${relative}`);\n }\n return current;\n}\n\nexport const STORE_MAX_BYTES = 10 * 1024 * 1024;\n\n/** A larger `maxBytes` lets a caller read an oversized store it can shrink. */\nexport async function readStoreJson(\n root: string,\n relative: string,\n maxBytes = STORE_MAX_BYTES,\n): Promise<unknown | null> {\n try {\n const file = await storePath(root, relative);\n const raw = await readBoundedFile(file, maxBytes);\n if (raw === null)\n throw new Error(`file is not regular or exceeds ${maxBytes / 1024 / 1024} MiB`);\n const parsed: unknown = JSON.parse(raw);\n if (parsed === null) throw new Error(\"expected a JSON object, received null\");\n return parsed;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw new Error(\n `Invalid Mason store ${relative}: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n}\n\nexport async function writeStoreJson(\n root: string,\n relative: string,\n value: unknown,\n options: { compact?: boolean } = {},\n): Promise<void> {\n const payload = JSON.stringify(value, null, options.compact ? undefined : 2) + \"\\n\";\n if (Buffer.byteLength(payload) > STORE_MAX_BYTES) {\n throw new Error(`Mason store ${relative} exceeds 10 MiB`);\n }\n const file = await storePath(root, relative, true);\n const temporary = path.join(path.dirname(file), `.${path.basename(file)}.${randomUUID()}.tmp`);\n try {\n const handle = await fs.open(temporary, \"wx\", 0o600);\n try {\n await handle.writeFile(payload, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n await fs.rename(temporary, file);\n } finally {\n await fs.rm(temporary, { force: true });\n }\n}\n","import fg from \"fast-glob\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport path from \"node:path\";\nimport { execGit, type GitReadOptions } from \"../utils/git-read.js\";\nimport { loadProjectConfig, SOURCE_EXTENSIONS } from \"../utils/files.js\";\n\ninterface Inspection {\n root: string;\n reads: Map<string, Promise<unknown>>;\n}\nconst inspections = new AsyncLocalStorage<Inspection>();\n\n/** Always start fresh. In particular, final validation must not reuse initial reads. */\nexport function withRepositoryInspection<T>(root: string, run: () => Promise<T>): Promise<T> {\n return inspections.run({ root: path.resolve(root), reads: new Map() }, run);\n}\n\n/** Read observations are shared only inside an explicit inspection, never across hooks. */\nexport function inspectionRead<T>(root: string, key: string, read: () => Promise<T>): Promise<T> {\n const inspection = inspections.getStore();\n if (!inspection || inspection.root !== path.resolve(root)) return read();\n if (!inspection.reads.has(key)) {\n const pending = read();\n inspection.reads.set(key, pending);\n // A failed query must be retried, not turned into a reusable unavailable result.\n void pending.catch(() => {\n if (inspection.reads.get(key) === pending) inspection.reads.delete(key);\n });\n }\n return inspection.reads.get(key)! as Promise<T>;\n}\n\n/** Tool writes invalidate their cached observations within the active inspection. */\nexport function invalidateInspectionReads(root: string, prefix: string): void {\n const inspection = inspections.getStore();\n if (!inspection || inspection.root !== path.resolve(root)) return;\n for (const key of inspection.reads.keys())\n if (key.startsWith(prefix)) inspection.reads.delete(key);\n}\n\n/** Exact arguments and limits preserve each history query's semantics. */\nexport function inspectionGit(args: string[], options: GitReadOptions) {\n return inspectionRead(options.cwd, \"git:\" + JSON.stringify([args, options]), () =>\n execGit(args, options),\n );\n}\n\nconst sourceSpecs = SOURCE_EXTENSIONS.map((extension) => `:(glob)**/*.${extension}`);\nconst docSpecs = [\n \":(icase,glob)**/readme.md\",\n \":(icase,glob)**/agents.md\",\n \":(icase,glob)**/claude.md\",\n];\nconst sourceSuffixes = new Set(SOURCE_EXTENSIONS.map((extension) => \".\" + extension));\n\n/** Git still prunes ignored trees; unrelated generated files are never inventoried. */\nexport async function auditGitPaths(\n root: string,\n kind: \"documents\" | \"sources\",\n): Promise<string[]> {\n const custom = (await loadProjectConfig(root)).audit?.include ?? [];\n const shared = inspections.getStore()?.root === path.resolve(root) && !custom.length;\n const expanded = fg.generateTasks(custom).flatMap((task) => task.positive);\n if (expanded.length > 1000)\n throw new Error(\"Audit include patterns expand to more than 1,000 globs\");\n const documentSpecs = [...docSpecs, ...expanded.map((pattern) => `:(glob)${pattern}`)];\n const specs = shared\n ? [...documentSpecs, ...sourceSpecs]\n : kind === \"documents\"\n ? documentSpecs\n : sourceSpecs;\n const limit = kind === \"documents\" ? 16 * 1024 * 1024 : 32 * 1024 * 1024;\n const { stdout } = await inspectionGit(\n [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\", \"--\", ...specs],\n { cwd: root, maxBuffer: shared ? 48 * 1024 * 1024 : limit, timeout: 10000 },\n );\n const paths = [...new Set(stdout.split(\"\\0\").filter(Boolean))].filter((file) =>\n kind === \"documents\"\n ? custom.length > 0 || /^(readme|agents|claude)\\.md$/i.test(path.posix.basename(file))\n : // Git's *.ts also matches a file named .ts, unlike path.extname().\n sourceSuffixes.has(file.slice(file.lastIndexOf(\".\"))),\n );\n if (Buffer.byteLength(paths.join(\"\\0\")) > limit)\n throw new Error(\"Git \" + kind + \" inventory exceeds its bounded read limit.\");\n return paths.sort();\n}\n","import { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { z } from \"zod\";\nimport fg from \"fast-glob\";\nimport { inspectionGit, inspectionRead } from \"../audit/inspection.js\";\nimport { createFileAccess, MAX_SOURCE_BYTES } from \"../utils/files.js\";\nimport {\n anchorMatches,\n indexMatchingPaths,\n matchingPaths,\n normalizeRepoPath,\n} from \"../utils/paths.js\";\nimport { storePath } from \"../utils/storage.js\";\n\nconst repoPath = z.string().refine((p) => normalizeRepoPath(p) === p);\nexport const anchorCaptureSchema = z\n .object({\n anchors: z.array(repoPath),\n files: z.record(repoPath, z.string().regex(/^[a-f0-9]{64}$/)),\n complete: z.boolean(),\n })\n .refine(\n (capture) =>\n JSON.stringify(capture.anchors) === JSON.stringify([...new Set(capture.anchors)].sort()) &&\n matchingPaths(capture.anchors, Object.keys(capture.files)).length ===\n Object.keys(capture.files).length,\n \"Capture paths must belong to its normalized, sorted anchor scope\",\n );\nexport type AnchorCapture = z.infer<typeof anchorCaptureSchema>;\n\n/** Content evidence, not approval. Unreadable/excluded scopes never become current.\n * Batch independent scopes and share observations only inside one repository inspection.\n * Final validation creates a fresh inspection; standalone callers always read again.\n */\nexport async function captureAnchorScopes(\n root: string,\n scopes: string[][],\n): Promise<AnchorCapture[]> {\n const union = [...new Set(scopes.flat())].sort();\n let context: ReturnType<typeof prepareContext> | undefined;\n const prepareContext = async () => {\n const access = await inspectionRead(root, \"decision-anchor-access\", () =>\n createFileAccess(root),\n );\n const inventory = access.inventory();\n if (!inventory) throw new Error(\"Git anchor inventory unavailable\");\n // Ignored files under an anchor with Git-visible content sit outside its evidence, as\n // in Git. An anchor naming only ignored paths (.env, an ignored directory) stays\n // incomplete rather than capturing nothing.\n const visible = indexMatchingPaths(\n union.map((anchor) => [anchor]),\n inventory,\n );\n const hidden = new Set(union.filter((_, index) => !visible[index].length));\n const ignored = hidden.size\n ? (\n await inspectionGit(\n [\n \"ls-files\",\n \"-z\",\n \"--others\",\n \"--ignored\",\n \"--exclude-standard\",\n \"--\",\n ...[...hidden].map((anchor) => `:(literal)${anchor}`),\n ],\n { cwd: root, maxBuffer: 8 * 1024 * 1024 },\n )\n ).stdout\n .split(\"\\0\")\n .filter(Boolean)\n : [];\n const files = [...new Set([...inventory, ...ignored])].sort();\n // Apply file policy in one glob walk rather than one walk per anchor file.\n // storePath still rejects symlinked parents at each bounded byte read.\n const patterns = await Promise.all(\n union.map(async (anchor) => {\n const literal = fg.escapePath(anchor);\n try {\n return (await fs.lstat(await storePath(root, anchor))).isDirectory()\n ? `${literal}/**/*`\n : literal;\n } catch {\n return literal;\n }\n }),\n );\n const eligible = new Set(await access.list(patterns, { dot: true }));\n const indexed = indexMatchingPaths(scopes, files);\n const filesByScope = new Map(\n scopes.map((scope, index) => [JSON.stringify([...new Set(scope)].sort()), indexed[index]]),\n );\n return { filesByScope, eligible, hidden, ignored: new Set(ignored) };\n };\n return Promise.all(\n scopes.map((scope) => {\n const anchors = [...new Set(scope)].sort();\n return inspectionRead(\n root,\n \"decision-anchor-capture:\" + JSON.stringify(anchors),\n async () => {\n const capture: AnchorCapture = { anchors, files: {}, complete: true };\n if (!anchors.length) return capture;\n try {\n const { eligible, filesByScope, hidden, ignored } = await (context ??=\n prepareContext());\n // Another scope's hidden anchor can list ignored files under this scope's anchors.\n const files = filesByScope\n .get(JSON.stringify(anchors))!\n .filter(\n (file) =>\n !ignored.has(file) ||\n anchors.some((anchor) => hidden.has(anchor) && anchorMatches(anchor, file)),\n );\n if (files.length > 2000) return { ...capture, complete: false };\n for (const file of files) {\n const evidence = await inspectionRead(\n root,\n \"decision-anchor-file:\" + file,\n async () => {\n try {\n const absolute = await storePath(root, file);\n await fs.lstat(absolute); // Missing indexed files are deletions, not unreadable evidence.\n if (!eligible.has(file)) return { complete: false };\n const handle = await fs.open(\n absolute,\n constants.O_RDONLY | constants.O_NONBLOCK | constants.O_NOFOLLOW,\n );\n try {\n const stat = await handle.stat();\n if (!stat.isFile() || stat.size > MAX_SOURCE_BYTES)\n return { complete: false };\n const bytes = Buffer.alloc(Math.min(stat.size + 1, MAX_SOURCE_BYTES + 1));\n let size = 0;\n while (size < bytes.length) {\n const read = await handle.read(bytes, size, bytes.length - size, null);\n if (!read.bytesRead) break;\n size += read.bytesRead;\n }\n if (size === bytes.length) return { complete: false }; // Grew during capture.\n return {\n complete: true,\n hash: createHash(\"sha256\").update(bytes.subarray(0, size)).digest(\"hex\"),\n };\n } finally {\n await handle.close();\n }\n } catch (error) {\n return { complete: (error as NodeJS.ErrnoException).code === \"ENOENT\" };\n }\n },\n );\n if (!evidence.complete) capture.complete = false;\n if (evidence.hash) capture.files[file] = evidence.hash;\n }\n } catch {\n capture.complete = false;\n }\n return capture;\n },\n );\n }),\n );\n}\n\nexport async function captureAnchors(root: string, anchors: string[]): Promise<AnchorCapture> {\n return (await captureAnchorScopes(root, [anchors]))[0];\n}\n\nexport function changedCaptureFiles(before: AnchorCapture, after: AnchorCapture): string[] {\n return [...new Set([...Object.keys(before.files), ...Object.keys(after.files)])]\n .filter((file) => before.files[file] !== after.files[file])\n .sort();\n}\n","import { z } from \"zod\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { storePath } from \"./storage.js\";\n\nconst lockOwnerSchema = z.object({ host: z.string(), pid: z.number().int().positive() });\n\nasync function lockDiagnostic(file: string): Promise<string> {\n let reason: string;\n try {\n const owner = lockOwnerSchema.safeParse(JSON.parse(await fs.readFile(file, \"utf8\")));\n if (!owner.success) {\n reason = \"Lock owner data is incomplete or malformed.\";\n } else if (owner.data.host !== os.hostname()) {\n reason = \"The lock belongs to another host; its process cannot be checked locally.\";\n } else {\n try {\n process.kill(owner.data.pid, 0);\n reason = `Local owner PID ${owner.data.pid} is still running.`;\n } catch (error) {\n reason =\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n ? `Local owner PID ${owner.data.pid} has exited, but lock recovery has not completed.`\n : `Local owner PID ${owner.data.pid} could not be checked.`;\n }\n }\n } catch (error) {\n reason =\n error instanceof SyntaxError\n ? \"Lock owner data is incomplete or malformed.\"\n : \"Lock owner data could not be read; the lock may have changed.\";\n }\n if (\n await fs.lstat(file + \".reclaim\").then(\n () => true,\n () => false,\n )\n ) {\n reason += \" A recovery guard also needs inspection: \" + file + \".reclaim.\";\n }\n return (\n reason +\n \" Retry if a writer is active. For manual recovery, stop all Mason writers for this checkout, confirm they have exited (including other hosts), then remove only confirmed abandoned lock and lock.reclaim files. See docs/reference.md#snapshot-repairs-and-verification.\"\n );\n}\n\n/** Cross-process lock: a killed writer's lock is reclaimed only after its local PID is gone. */\nexport async function withStoreLock<T>(\n root: string,\n directory: string,\n run: () => Promise<T>,\n waitMs = 5000,\n label = \"Mason store\",\n): Promise<T> {\n const file = await storePath(root, directory + \"/lock\", true);\n const deadline = Date.now() + waitMs;\n let handle;\n while (!handle) {\n try {\n handle = await fs.open(file, \"wx\", 0o600);\n } catch (error) {\n // Windows can deny opening a lock while another process finishes deleting it.\n // Retry acquisition only, retaining the original error if access stays denied.\n if (process.platform === \"win32\" && (error as NodeJS.ErrnoException).code === \"EPERM\") {\n if (Date.now() >= deadline) throw error;\n await new Promise((resolve) => setTimeout(resolve, 40));\n continue;\n }\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n // Do not steal malformed, remote, or live locks on a time-based guess.\n try {\n const owner = lockOwnerSchema.parse(JSON.parse(await fs.readFile(file, \"utf8\")));\n if (owner.host === os.hostname() && Number.isInteger(owner.pid) && owner.pid > 0) {\n try {\n process.kill(owner.pid, 0);\n } catch (probe) {\n if ((probe as NodeJS.ErrnoException).code === \"ESRCH\") {\n // A separate guard arbitrates reclamation; recheck the owner before unlinking.\n const reclaim = file + \".reclaim\";\n let guard;\n try {\n guard = await fs.open(reclaim, \"wx\", 0o600);\n const current = lockOwnerSchema.parse(JSON.parse(await fs.readFile(file, \"utf8\")));\n if (current.pid === owner.pid && current.host === owner.host) await fs.unlink(file);\n } finally {\n if (guard) {\n await guard.close();\n await fs.rm(reclaim, { force: true });\n }\n }\n }\n }\n }\n } catch {\n /* Another writer may be creating/releasing/reclaiming it. */\n }\n if (Date.now() >= deadline)\n throw new Error(\n label +\n \" is busy or its lock needs inspection: \" +\n file +\n \". \" +\n (await lockDiagnostic(file)),\n { cause: error },\n );\n await new Promise((resolve) => setTimeout(resolve, 40));\n }\n if (handle) {\n try {\n await handle.writeFile(JSON.stringify({ pid: process.pid, host: os.hostname() }));\n } catch (error) {\n await handle.close().catch(() => {});\n await fs.rm(file, { force: true }).catch(() => {});\n throw error;\n }\n }\n }\n try {\n return await run();\n } finally {\n await handle.close();\n await fs.unlink(file);\n }\n}\n","import { withStoreLock } from \"../utils/store-lock.js\";\n\n/** Each checkout has its own snapshot, shared by all MCP processes. */\nexport function withSnapshotWrite<T>(\n root: string,\n run: () => Promise<T>,\n waitMs = 5000,\n): Promise<T> {\n return withStoreLock(root, \".mason/local/snapshot-write\", run, waitMs, \"Snapshot store\");\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport { createFileAccess } from \"../utils/files.js\";\nimport { readStoreJson, writeStoreJson, type StoreDiagnostic } from \"../utils/storage.js\";\nimport { z } from \"zod\";\nimport { withSnapshotWrite } from \"./lock.js\";\nimport { normalizeRepoPath } from \"../utils/paths.js\";\n\nexport interface FeatureEntry {\n description: string;\n files: string[];\n tests?: string[];\n /**\n * Commit this entry was last verified against. Entries updated by an\n * incremental save carry HEAD here; untouched entries keep the hash the\n * map had before the save, so drift stays visible per entry. Absent means\n * \"as of the snapshot's top-level gitHash\".\n */\n refreshedHash?: string;\n /**\n * Whether this is a user-facing capability or internal infrastructure\n * (DI wiring, config loading, logging, provider/transport plumbing).\n * Capabilities describe user-facing functionality;\n * infrastructure stays in the AI concept map only. Defaults to \"capability\"\n * when absent (older snapshots) — see normalizeFeatureType.\n */\n type?: \"capability\" | \"infrastructure\";\n /**\n * When an assistant last confirmed this entry's files actually implement\n * the claimed feature (verify_snapshot flow). Absent on older snapshots\n * and never-verified entries. Drift checks freshness against git; this\n * checks the map was CORRECT in the first place.\n */\n verifiedAt?: string;\n verifiedHash?: string;\n /** Digest of the entry and bounded source evidence reviewed for this verdict. */\n verificationToken?: string;\n /** Set when verification judged the entry wrong — re-map it. */\n verificationFailed?: boolean;\n verificationNote?: string;\n}\n\nexport type FeatureType = \"capability\" | \"infrastructure\";\n\n/**\n * Coerce an arbitrary type value to a known classification. Anything that\n * isn't explicitly \"infrastructure\" defaults to \"capability\" — so older\n * snapshots and unclassified entries are treated as user-facing (published),\n * never silently hidden.\n */\nexport function normalizeFeatureType(value: unknown): FeatureType {\n return value === \"infrastructure\" ? \"infrastructure\" : \"capability\";\n}\n\nexport interface FlowEntry {\n description: string;\n chain: string[];\n /** See FeatureEntry.refreshedHash. */\n refreshedHash?: string;\n /** See FeatureEntry.verifiedAt / verificationFailed. */\n verifiedAt?: string;\n verifiedHash?: string;\n /** Digest of the entry and bounded source evidence reviewed for this verdict. */\n verificationToken?: string;\n verificationFailed?: boolean;\n verificationNote?: string;\n}\n\nexport interface Snapshot {\n version: 2;\n createdAt: string;\n updatedAt: string;\n gitHash: string;\n features: Record<string, FeatureEntry>;\n flows: Record<string, FlowEntry>;\n}\n\nconst repoPath = z\n .string()\n .refine((value) => normalizeRepoPath(value) !== null, \"Expected a relative repository path\");\nconst verificationFields = {\n refreshedHash: z.string().optional(),\n verifiedAt: z.string().optional(),\n verifiedHash: z.string().optional(),\n verificationToken: z.string().optional(),\n verificationFailed: z.boolean().optional(),\n verificationNote: z.string().optional(),\n};\nexport const featureSchema = z\n .object({\n description: z.string(),\n files: z.array(repoPath),\n tests: z.array(repoPath).optional(),\n type: z.enum([\"capability\", \"infrastructure\"]).optional(),\n ...verificationFields,\n })\n .passthrough();\nexport const flowSchema = z\n .object({ description: z.string(), chain: z.array(repoPath), ...verificationFields })\n .passthrough();\nconst snapshotSchema = z\n .object({\n version: z.literal(2),\n createdAt: z.string(),\n updatedAt: z.string(),\n gitHash: z.string(),\n features: z.record(featureSchema),\n flows: z.record(flowSchema),\n })\n .passthrough();\n\nexport async function loadSnapshot(rootDir: string): Promise<Snapshot | null> {\n const parsed = await readStoreJson(rootDir, \".mason/snapshot.json\");\n if (parsed === null || (parsed as { version?: number }).version === 1) return null;\n const result = snapshotSchema.safeParse(parsed);\n if (!result.success) throw new Error(`Invalid Mason snapshot: ${result.error.message}`);\n return result.data;\n}\n\n/** Context and onboarding can use decisions even when the optional map is broken. */\nexport async function inspectSnapshot(rootDir: string): Promise<{\n status: \"available\" | \"missing\" | \"invalid\";\n snapshot: Snapshot | null;\n diagnostics: StoreDiagnostic[];\n}> {\n try {\n const raw = await readStoreJson(rootDir, \".mason/snapshot.json\");\n const snapshot = raw === null ? null : snapshotSchema.parse(raw);\n return { status: snapshot ? \"available\" : \"missing\", snapshot, diagnostics: [] };\n } catch (error) {\n return {\n status: \"invalid\",\n snapshot: null,\n diagnostics: [\n {\n path: \".mason/snapshot.json\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\n/** Read and commit under one cross-process lock; a null snapshot means no write. */\nexport async function updateSnapshot<T>(\n rootDir: string,\n update: (current: Snapshot | null) => Promise<{\n snapshot: Snapshot | null;\n result: T;\n }>,\n): Promise<T> {\n return withSnapshotWrite(rootDir, async () => {\n const change = await update(await loadSnapshot(rootDir));\n if (change.snapshot) {\n await writeStoreJson(rootDir, \".mason/snapshot.json\", snapshotSchema.parse(change.snapshot));\n }\n return change.result;\n });\n}\n\nexport async function getCurrentGitHash(rootDir: string): Promise<string> {\n try {\n const { stdout } = await execGit([\"rev-parse\", \"HEAD\"], {\n cwd: rootDir,\n });\n return stdout.trim();\n } catch {\n return \"unknown\";\n }\n}\n\nexport async function listSourceFiles(resolvedRoot: string): Promise<string[]> {\n return (await createFileAccess(resolvedRoot)).list();\n}\n","import path from \"node:path\";\n\n// Question/filler words that carry no signal about which entry a task\n// touches. Domain words (\"auth\", \"drift\") are never in this list.\nconst STOPWORDS = new Set([\n \"the\",\n \"a\",\n \"an\",\n \"and\",\n \"or\",\n \"of\",\n \"to\",\n \"in\",\n \"on\",\n \"for\",\n \"with\",\n \"how\",\n \"does\",\n \"do\",\n \"is\",\n \"are\",\n \"was\",\n \"what\",\n \"where\",\n \"which\",\n \"why\",\n \"when\",\n \"who\",\n \"i\",\n \"we\",\n \"my\",\n \"our\",\n \"you\",\n \"your\",\n \"it\",\n \"its\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n \"can\",\n \"could\",\n \"should\",\n \"would\",\n \"will\",\n \"want\",\n \"need\",\n \"please\",\n \"about\",\n \"into\",\n \"from\",\n \"when\",\n \"there\",\n \"any\",\n \"all\",\n \"some\",\n \"not\",\n \"but\",\n \"also\",\n \"just\",\n \"like\",\n \"get\",\n \"make\",\n \"use\",\n \"new\",\n \"work\",\n \"works\",\n \"working\",\n \"implement\",\n \"implemented\",\n \"change\",\n \"changed\",\n \"file\",\n \"files\",\n \"code\",\n]);\n\n/** Split camelCase/PascalCase/kebab/snake/path into lowercase word tokens. */\nexport function tokenize(text: string): string[] {\n return text\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 2 && !STOPWORDS.has(t));\n}\n\n/** Crude singular/plural folding so \"flows\" matches \"flow\" etc. */\nexport function stem(token: string): string {\n return token.length > 3 && token.endsWith(\"s\") ? token.slice(0, -1) : token;\n}\n\nexport function tokenSet(text: string): Set<string> {\n return new Set(tokenize(text).map(stem));\n}\n\nexport interface Scorable {\n name: string;\n description: string;\n files: string[];\n}\n\n/**\n * Lexical relevance of one entry to the task. Name hits are the strongest\n * signal, then description, then file-path words. Each distinct task token\n * counts once at its best weight, so a token appearing everywhere doesn't\n * triple-count.\n */\nexport function scoreEntry(taskTokens: Set<string>, entry: Scorable): number {\n const nameTokens = tokenSet(entry.name);\n const descTokens = tokenSet(entry.description);\n const fileTokens = tokenSet(entry.files.map((f) => path.basename(f)).join(\" \"));\n\n let score = 0;\n for (const token of taskTokens) {\n if (nameTokens.has(token)) score += 3;\n else if (descTokens.has(token)) score += 1;\n else if (fileTokens.has(token)) score += 1;\n }\n return score;\n}\n\n/** Jaccard similarity of two token sets: |∩| / |∪|, 0 when both empty. */\nexport function jaccard(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 0;\n let intersection = 0;\n for (const token of a) if (b.has(token)) intersection++;\n return intersection / (a.size + b.size - intersection);\n}\n","export type Freshness = \"current\" | \"changed\" | \"unknown\";\nexport interface TrustState {\n freshness: Freshness;\n verification: \"unverified\" | \"passed\" | \"failed\" | \"stale\" | \"unknown\";\n /** Historical map verdict, retained even when its evidence no longer applies. */\n recordedVerdict?: \"passed\" | \"failed\";\n verifiedAt?: string;\n verifiedHash?: string;\n reasons: string[];\n}\n\nexport function assessTrust(\n entry: {\n verifiedAt?: string;\n verifiedHash?: string;\n verificationFailed?: boolean;\n verificationNote?: string;\n },\n freshness: Freshness,\n): TrustState {\n const verification = entry.verificationFailed\n ? \"failed\"\n : entry.verifiedAt\n ? \"passed\"\n : \"unverified\";\n const reasons: string[] = [];\n if (freshness === \"unknown\")\n reasons.push(\n \"Anchors, history, or working-tree evidence are unavailable; verify before relying on this entry.\",\n );\n if (freshness === \"changed\")\n reasons.push(\n \"Anchored files changed; verify against current code before relying on this entry.\",\n );\n if (verification === \"failed\")\n reasons.push(\n `Verification failed: ${entry.verificationNote ?? \"re-map this entry before relying on it\"}`,\n );\n if (verification === \"unverified\") reasons.push(\"No correctness verification has been recorded.\");\n return {\n freshness,\n verification,\n verifiedAt: entry.verifiedAt,\n verifiedHash: entry.verifiedHash,\n reasons,\n };\n}\n\nexport function trustHint(states: TrustState[]): string {\n const parts: string[] = [];\n if (states.some((s) => s.verification === \"failed\" || s.recordedVerdict === \"failed\"))\n parts.push(\n \"Verification failed for returned entries; do not rely on those descriptions until corrected.\",\n );\n if (states.some((s) => s.verification === \"stale\"))\n parts.push(\n \"Recorded verification evidence changed; use verify_snapshot and review the current evidence before reusing those verdicts.\",\n );\n if (states.some((s) => s.verification === \"unknown\"))\n parts.push(\n \"Recorded verification evidence cannot be confirmed; inspect the files and obtain a fresh review before relying on those verdicts.\",\n );\n if (states.some((s) => s.freshness === \"unknown\"))\n parts.push(\n \"Freshness is unknown for some returned entries; inspect their files before relying on them.\",\n );\n if (states.some((s) => s.freshness === \"changed\"))\n parts.push(\n \"Some returned entries have changed files, including possible local edits; verify against the current code.\",\n );\n if (!parts.length)\n parts.push(\n \"No changes detected in the returned anchors. This does not prove the descriptions are correct.\",\n );\n if (states.some((s) => s.verification === \"unverified\"))\n parts.push(\n \"Some entries have never been verified; read their evidence or use verify_snapshot for map descriptions.\",\n );\n return parts.join(\" \");\n}\n","import { z } from \"zod\";\nimport { createHash } from \"node:crypto\";\nimport { anchorCaptureSchema } from \"./anchors.js\";\nimport { normalizeRepoPath } from \"../utils/paths.js\";\nimport { assessTrust, type Freshness } from \"../context/trust.js\";\n\nconst text = (max: number) => z.string().trim().min(1).max(max);\nexport const decisionSourceSchema = z\n .object({\n kind: z.enum([\"pull_request\", \"issue\", \"incident\", \"discussion\", \"document\", \"other\"]),\n reference: text(1000),\n note: text(500).optional(),\n })\n .strict();\nexport type DecisionSource = z.infer<typeof decisionSourceSchema>;\nexport const attributionSchema = z.object({\n owner: text(200).nullable().optional(),\n sources: z.array(decisionSourceSchema).max(20).optional(),\n actor: text(200).optional(),\n});\nconst contentSchema = z.object({\n title: z.string().min(1),\n body: z.string().min(1),\n category: z.enum([\"decision\", \"gotcha\", \"deprecation\", \"convention\"]),\n files: z.array(z.string().refine((f) => normalizeRepoPath(f) !== null)),\n owner: text(200).optional(),\n sources: z.array(decisionSourceSchema).max(20),\n});\nconst approvalSchema = z.enum([\"unreviewed\", \"proposed\", \"accepted\"]);\nconst statusSchema = z.enum([\"active\", \"superseded\", \"retired\"]);\nexport const reviewEvidenceSchema = z.object({\n baseHash: z.string(),\n headHash: z.string(),\n historyAvailable: z.boolean(),\n changedFiles: z.array(z.string()),\n localChanges: z.array(z.string()),\n});\nconst eventSchema = z.object({\n kind: z.enum([\n \"imported\",\n \"created\",\n \"revised\",\n \"accepted\",\n \"reaffirmed\",\n \"retired\",\n \"superseded\",\n ]),\n at: z.string().datetime(),\n actor: text(200).optional(),\n note: text(1500).optional(),\n revision: z.number().int().positive(),\n content: contentSchema,\n approval: approvalSchema,\n status: statusSchema,\n refreshedHash: z.string(),\n evidence: reviewEvidenceSchema.optional(),\n capture: anchorCaptureSchema.optional(),\n});\nexport type DecisionEvent = z.infer<typeof eventSchema>;\nexport type DecisionApproval = z.infer<typeof approvalSchema>;\nexport type DecisionContent = z.infer<typeof contentSchema>;\n\nconst legacySchema = z\n .object({\n version: z.literal(1),\n id: z.string().regex(/^[a-zA-Z0-9_-]+$/),\n title: z.string().min(1),\n body: z.string().min(1),\n category: contentSchema.shape.category,\n files: contentSchema.shape.files,\n createdAt: z.string(),\n updatedAt: z.string(),\n refreshedHash: z.string(),\n status: z.enum([\"active\", \"superseded\"]),\n supersededBy: z.string().optional(),\n })\n .passthrough();\nconst currentSchema = legacySchema\n .extend({\n version: z.literal(2),\n status: statusSchema,\n approval: approvalSchema,\n revision: z.number().int().positive(),\n owner: text(200).optional(),\n sources: z.array(decisionSourceSchema).max(20),\n history: z.array(eventSchema).min(1),\n capture: anchorCaptureSchema.optional(),\n inspections: z\n .array(\n z.object({\n at: z.string().datetime(),\n inspector: text(200),\n note: text(1500),\n outcome: z.literal(\"no_contradiction_found\"),\n scope: z.literal(\"operative\").optional(),\n decisionDigest: z.string().regex(/^[a-f0-9]{64}$/),\n headHash: z.string(),\n capture: anchorCaptureSchema,\n }),\n )\n .max(200)\n .optional(),\n })\n .superRefine((record, ctx) => {\n const invalid = (message: string) => ctx.addIssue({ code: \"custom\", message });\n const same = (a: unknown, b: unknown) => JSON.stringify(a) === JSON.stringify(b);\n let previous: DecisionEvent | undefined;\n for (const event of record.history) {\n if (!previous) {\n if (![\"created\", \"imported\"].includes(event.kind) || event.revision !== 1)\n invalid(\"History must begin with creation or legacy import at revision 1\");\n if (event.approval !== (event.kind === \"created\" ? \"proposed\" : \"unreviewed\"))\n invalid(\"Initial records cannot claim acceptance\");\n } else {\n if ([\"created\", \"imported\"].includes(event.kind)) invalid(\"History cannot restart\");\n if (previous.status !== \"active\") invalid(\"Archived decisions cannot be changed\");\n if (event.revision !== previous.revision + (event.kind === \"revised\" ? 1 : 0))\n invalid(\"Invalid revision sequence\");\n if (event.kind !== \"revised\" && !same(event.content, previous.content))\n invalid(\"A review cannot silently revise decision content\");\n if (event.kind === \"reaffirmed\" && previous.approval !== \"accepted\")\n invalid(\"Only accepted decisions can be reaffirmed\");\n if (event.kind === \"accepted\" && previous.approval === \"accepted\")\n invalid(\"Use reaffirmation for an accepted decision\");\n const approval =\n event.kind === \"revised\"\n ? \"proposed\"\n : [\"accepted\", \"reaffirmed\"].includes(event.kind)\n ? \"accepted\"\n : previous.approval;\n if (event.approval !== approval) invalid(\"Approval disagrees with review history\");\n if (\n ![\"accepted\", \"reaffirmed\"].includes(event.kind) &&\n event.refreshedHash !== previous.refreshedHash\n )\n invalid(\"Only a review can refresh the evidence baseline\");\n }\n if (\n event.kind !== \"imported\" &&\n event.status !==\n (event.kind === \"retired\"\n ? \"retired\"\n : event.kind === \"superseded\"\n ? \"superseded\"\n : \"active\")\n )\n invalid(\"Lifecycle disagrees with history\");\n if (\n [\"accepted\", \"reaffirmed\", \"retired\"].includes(event.kind) &&\n (!event.actor || !event.note || !event.evidence)\n )\n invalid(\"Reviews require a named reviewer, reason, and code evidence\");\n if ([\"accepted\", \"reaffirmed\"].includes(event.kind)) {\n if (!event.content.owner || !event.content.sources.length)\n invalid(\"Accepted decisions require an owner and source\");\n if (\n !event.evidence ||\n !/^[a-f0-9]{40,64}$/.test(event.evidence.headHash) ||\n event.refreshedHash !== event.evidence.headHash ||\n event.evidence.localChanges.length\n )\n invalid(\"Acceptance requires a committed evidence baseline\");\n }\n if (event.capture && !same([...event.content.files].sort(), event.capture.anchors))\n invalid(\"Capture scope disagrees with decision anchors\");\n previous = event;\n }\n if (previous && !same(previous.capture, record.capture))\n invalid(\"Capture does not match the final history event\");\n if (\n !previous ||\n !same(previous.content, decisionContent(record)) ||\n previous.approval !== record.approval ||\n previous.status !== record.status ||\n previous.revision !== record.revision ||\n previous.refreshedHash !== record.refreshedHash\n )\n invalid(\"Decision does not match the final history event\");\n });\n\nexport const decisionSchema = z.union([legacySchema, currentSchema]);\nexport type DecisionRecord = z.infer<typeof decisionSchema>;\nexport type ReviewedDecisionRecord = z.infer<typeof currentSchema>;\n\nexport function decisionContent(\n record: Pick<DecisionRecord, \"title\" | \"body\" | \"category\" | \"files\"> & {\n owner?: unknown;\n sources?: unknown;\n },\n): DecisionContent {\n return {\n title: record.title,\n body: record.body,\n category: record.category,\n files: record.files,\n ...(typeof record.owner === \"string\" ? { owner: record.owner } : {}),\n sources: Array.isArray(record.sources) ? (record.sources as DecisionSource[]) : [],\n };\n}\n\n/** Reading legacy records never upgrades their approval or rewrites their files. */\nexport function decisionApproval(record: DecisionRecord): DecisionApproval {\n return record.version === 1 ? \"unreviewed\" : record.approval;\n}\n\n/** The last accepted revision remains operative while a replacement is drafted.\n * This is a read-only projection; writes and review tokens use the complete record.\n * Archived records never regain authority from their history.\n */\nexport function effectiveDecision(record: DecisionRecord): DecisionRecord {\n if (record.version !== 2 || record.status !== \"active\" || record.approval !== \"proposed\")\n return record;\n let index = record.history.length - 1;\n while (index >= 0 && ![\"accepted\", \"reaffirmed\"].includes(record.history[index].kind)) index--;\n if (index < 0) return record;\n const event = record.history[index];\n return {\n ...record,\n ...event.content,\n owner: event.content.owner,\n approval: \"accepted\",\n revision: event.revision,\n refreshedHash: event.refreshedHash,\n capture: event.capture,\n updatedAt: event.at,\n history: record.history.slice(0, index + 1),\n };\n}\n\n/** Anchors relevant to either the operative knowledge or its pending proposal. */\nexport function decisionAnchors(record: DecisionRecord): string[] {\n return [...new Set([...effectiveDecision(record).files, ...record.files])];\n}\n\nexport function importLegacy(record: DecisionRecord, now: string): ReviewedDecisionRecord {\n if (record.version === 2) return record;\n // Ignore unrecognized legacy fields: they are not evidence of authorship or approval.\n const content = decisionContent({\n title: record.title,\n body: record.body,\n category: record.category,\n files: record.files,\n });\n return {\n id: record.id,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt,\n status: record.status,\n refreshedHash: record.refreshedHash,\n supersededBy: record.supersededBy,\n ...content,\n version: 2,\n approval: \"unreviewed\",\n revision: 1,\n history: [\n {\n kind: \"imported\",\n at: now,\n revision: 1,\n content,\n approval: \"unreviewed\",\n status: record.status,\n refreshedHash: record.refreshedHash,\n note: \"Imported a legacy record. Prior authorship and review history are unknown.\",\n },\n ],\n };\n}\n\nexport function decisionProvenance(record: DecisionRecord, freshness: Freshness = \"unknown\") {\n const approval = decisionApproval(record);\n const review =\n record.version === 2\n ? [...record.history]\n .reverse()\n .find(\n (e) => [\"accepted\", \"reaffirmed\"].includes(e.kind) && e.revision === record.revision,\n )\n : undefined;\n return {\n approval,\n revision: record.version === 2 ? record.revision : 0,\n owner: record.version === 2 ? (record.owner ?? null) : null,\n sources: record.version === 2 ? record.sources : [],\n guidance:\n record.status !== \"active\"\n ? \"historical\"\n : approval === \"accepted\"\n ? \"constraint\"\n : approval === \"proposed\"\n ? \"proposal\"\n : \"unreviewed\",\n reviewRequired:\n record.status === \"active\" && (approval !== \"accepted\" || freshness !== \"current\"),\n lastReview: review\n ? {\n reviewer: review.actor!,\n at: review.at,\n note: review.note!,\n gitHash: review.refreshedHash,\n }\n : null,\n };\n}\n\nexport function decisionTrust(record: DecisionRecord, freshness: Freshness) {\n const review = decisionProvenance(record, freshness).lastReview;\n return assessTrust(\n review ? { verifiedAt: review.at, verifiedHash: review.gitHash } : {},\n freshness,\n );\n}\n\n/** Inspection identity covers both the proposal and the operative accepted revision. */\nexport type InspectionScope = \"all\" | \"operative\";\n\nexport function decisionInspectionDigest(\n record: DecisionRecord,\n scope: InspectionScope = \"all\",\n): string {\n const effective = effectiveDecision(record);\n if (scope === \"operative\")\n return createHash(\"sha256\")\n .update(\n JSON.stringify([\n \"operative\",\n record.status,\n decisionApproval(effective),\n effective.version === 2 ? effective.revision : 0,\n decisionContent(effective),\n effective.refreshedHash,\n ]),\n )\n .digest(\"hex\");\n return createHash(\"sha256\")\n .update(\n JSON.stringify([\n record.status,\n decisionApproval(record),\n record.version === 2 ? record.revision : 0,\n decisionContent(record),\n decisionContent(effective),\n effective.refreshedHash,\n ]),\n )\n .digest(\"hex\");\n}\n\nexport function latestDecisionInspection(record: DecisionRecord, scope: InspectionScope = \"all\") {\n return record.version === 2\n ? record.inspections\n ?.filter(\n (i) =>\n (scope === \"operative\" || i.scope !== \"operative\") &&\n i.decisionDigest === decisionInspectionDigest(record, i.scope ?? \"all\"),\n )\n .at(-1)\n : undefined;\n}\n\nfunction revisionKnowledge(record: DecisionRecord, freshness: Freshness) {\n return {\n ...decisionContent(record),\n ...decisionProvenance(record, freshness),\n trust: decisionTrust(record, freshness),\n };\n}\n\n/** Readers show accepted content first and label the unaccepted draft separately. */\nexport function decisionKnowledge(\n record: DecisionRecord,\n freshness: Freshness = \"unknown\",\n proposalFreshness: Freshness = \"unknown\",\n) {\n const effective = effectiveDecision(record);\n const inspection = latestDecisionInspection(\n record,\n decisionApproval(effective) === \"accepted\" ? \"operative\" : \"all\",\n );\n return {\n ...revisionKnowledge(effective, freshness),\n ...(inspection\n ? {\n inspection: {\n freshness,\n at: inspection.at,\n inspector: inspection.inspector,\n note: inspection.note,\n outcome: inspection.outcome,\n scope: inspection.scope ?? \"all\",\n headHash: inspection.headHash,\n },\n }\n : {}),\n ...(effective !== record\n ? {\n pendingProposal: {\n ...revisionKnowledge(record, proposalFreshness),\n assessment: latestDecisionInspection(record)\n ? \"no_contradiction_found\"\n : \"not_assessed\",\n },\n }\n : {}),\n };\n}\n\nexport function compactDecisionKnowledge(...args: Parameters<typeof decisionKnowledge>) {\n const { body, pendingProposal, ...summary } = decisionKnowledge(...args);\n if (!pendingProposal) return summary;\n const { body: proposalBody, ...proposal } = pendingProposal;\n return { ...summary, pendingProposal: proposal };\n}\n\nexport const DECISION_GUIDANCE =\n \"Accepted decisions are recorded team constraints, subject to freshness checks. A pendingProposal is an unaccepted replacement; the accepted revision remains operative until explicit acceptance or retirement. Proposals are suggestions; legacy unreviewed records need confirmation. Use review_decision to prepare evidence and record a separate source inspection without human approval, or an authorized human review; identities and sources are recorded assertions, not authenticated proof.\";\n","import { inspectionRead, invalidateInspectionReads } from \"../audit/inspection.js\";\nimport { readBoundedFile } from \"../utils/files.js\";\nimport { captureAnchors } from \"./anchors.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { writeStoreJson, storePath, type StoreDiagnostic } from \"../utils/storage.js\";\nimport { sanitizeRepoPaths } from \"../utils/paths.js\";\nimport { getCurrentGitHash } from \"../snapshot/snapshot.js\";\nimport { jaccard, tokenSet } from \"../context/lexical.js\";\nimport {\n attributionSchema,\n decisionSchema,\n decisionContent,\n decisionApproval,\n effectiveDecision,\n importLegacy,\n type DecisionSource,\n type DecisionRecord,\n type ReviewedDecisionRecord,\n} from \"./provenance.js\";\nexport type { DecisionRecord } from \"./provenance.js\";\n\nexport type DecisionCategory = \"decision\" | \"gotcha\" | \"deprecation\" | \"convention\";\nexport type DecisionStatus = \"active\" | \"superseded\" | \"retired\";\n\nexport const TITLE_MAX_CHARS = 80;\nexport const BODY_RECOMMENDED_CHARS = 1500;\nexport const BODY_MAX_CHARS = 2500;\nexport const MAX_ACTIVE_DECISIONS = 150;\n\n// Share validation with MCP so rejected tool calls include the actual length.\nconst boundedText = (field: string, max: number, hint: string) =>\n z\n .string({\n errorMap: (issue, ctx) => ({\n message:\n issue.code === \"too_big\" && typeof ctx.data === \"string\"\n ? `${field} has ${ctx.data.length} characters; maximum is ${max} (${ctx.data.length - max} over). ${hint}`\n : ctx.defaultError,\n }),\n })\n .trim()\n .min(1, `${field} must be non-empty`)\n .max(max);\n\nexport const decisionTitleSchema = boundedText(\n \"title\",\n TITLE_MAX_CHARS,\n \"Tighten it to a specific headline.\",\n);\nexport const decisionBodySchema = boundedText(\n \"body\",\n BODY_MAX_CHARS,\n `Aim for ${BODY_RECOMMENDED_CHARS} characters or fewer. Preserve the rule, reason, and exceptions; put supporting references in sources.`,\n);\n\nconst DUPLICATE_JACCARD = 0.5;\nconst DUPLICATE_JACCARD_WITH_SHARED_FILE = 0.35;\n\n/** Raw bytes also feed automation fingerprints, including malformed records. */\nexport async function readDecisionInputs(\n rootDir: string,\n): Promise<{ inputs: Array<[string, string | null]>; diagnostics: StoreDiagnostic[] }> {\n return structuredClone(\n await inspectionRead(rootDir, \"decision-store:inputs\", async () => {\n const inputs: Array<[string, string | null]> = [];\n const diagnostics: StoreDiagnostic[] = [];\n let entries: string[];\n try {\n entries = await fs.readdir(await storePath(rootDir, \".mason/decisions\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\")\n diagnostics.push({ path: \".mason/decisions\", message: String(error) });\n return { inputs, diagnostics };\n }\n for (const entry of entries.sort()) {\n if (!entry.endsWith(\".json\")) continue;\n const relative = `.mason/decisions/${entry}`;\n try {\n const raw = await readBoundedFile(await storePath(rootDir, relative), 10 * 1024 * 1024);\n if (raw === null) throw new Error(\"file is not regular or exceeds 10 MiB\");\n inputs.push([relative, raw]);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") inputs.push([relative, null]);\n else\n diagnostics.push({\n path: relative,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { inputs, diagnostics };\n }),\n );\n}\n\nexport async function loadDecisionStore(\n rootDir: string,\n): Promise<{ records: DecisionRecord[]; diagnostics: StoreDiagnostic[] }> {\n // Callers may edit their returned records while preparing a write. Never expose\n // mutable cached records, and never share this cache with final validation.\n return structuredClone(\n await inspectionRead(rootDir, \"decision-store:parsed\", async () => {\n const raw = await readDecisionInputs(rootDir);\n const records: DecisionRecord[] = [];\n const diagnostics = [...raw.diagnostics];\n for (const [relative, content] of raw.inputs) {\n try {\n const record = decisionSchema.parse(content === null ? null : JSON.parse(content));\n if (relative !== `.mason/decisions/${record.id}.json`)\n throw new Error(\"Record id does not match its filename\");\n records.push(record);\n } catch (error) {\n diagnostics.push({\n path: relative,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { records, diagnostics };\n }),\n );\n}\n\nexport async function loadDecisions(rootDir: string): Promise<DecisionRecord[]> {\n return (await loadDecisionStore(rootDir)).records;\n}\n\nexport async function saveDecisionRecord(rootDir: string, record: DecisionRecord): Promise<void> {\n const validated = decisionSchema.parse(record);\n await writeStoreJson(rootDir, `.mason/decisions/${validated.id}.json`, validated);\n invalidateInspectionReads(rootDir, \"decision-store:\");\n}\n\n/**\n * Deterministic, human-readable id: base slug ≤60 chars, ending at a word\n * boundary when possible. A single longer word is cut to fit.\n * A slug collision with a DIFFERENT record appends a 6-hex content suffix.\n */\nexport function decisionIdFor(title: string, body: string, existingIds: Set<string>): string {\n const fullSlug = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n let slug = fullSlug.slice(0, 60);\n if (fullSlug.length > 60 && fullSlug[60] !== \"-\") {\n const boundary = slug.lastIndexOf(\"-\");\n if (boundary > 0) slug = slug.slice(0, boundary);\n }\n slug = slug.replace(/-+$/, \"\") || \"decision\";\n if (!existingIds.has(slug)) return slug;\n const suffix = createHash(\"sha1\")\n .update(title + body)\n .digest(\"hex\")\n .slice(0, 6);\n return `${slug}-${suffix}`;\n}\n\nexport function findNearDuplicate(\n candidate: { title: string; body: string; files: string[] },\n existing: DecisionRecord[],\n): { record: DecisionRecord; similarity: number } | null {\n const candidateTokens = tokenSet(`${candidate.title} ${candidate.body}`);\n const candidateFiles = new Set(candidate.files);\n let best: { record: DecisionRecord; similarity: number } | null = null;\n\n for (const record of existing) {\n if (record.status !== \"active\") continue;\n const similarity = jaccard(candidateTokens, tokenSet(`${record.title} ${record.body}`));\n const sharesFile = record.files.some((f) => candidateFiles.has(f));\n const threshold = sharesFile ? DUPLICATE_JACCARD_WITH_SHARED_FILE : DUPLICATE_JACCARD;\n if (similarity >= threshold && (!best || similarity > best.similarity)) {\n best = { record, similarity };\n }\n }\n return best;\n}\n\nexport interface UpsertDecisionInput {\n title: string;\n body: string;\n category: DecisionCategory;\n files?: string[];\n owner?: string | null;\n sources?: DecisionSource[];\n /** Only supply a known identity; never infer authorship from Git configuration. */\n actor?: string;\n /** Existing id to revise. Unchanged content is a no-op; use review_decision to reaffirm. */\n id?: string;\n /** Id of a decision this one replaces; the old record is kept, marked superseded. */\n supersedes?: string;\n /** Save even when a near-duplicate was detected. */\n force?: boolean;\n}\n\nexport type UpsertDecisionResult =\n | {\n status: \"created\" | \"updated\" | \"unchanged\" | \"superseded_and_created\";\n id: string;\n totalActive: number;\n warnings: string[];\n approval?: \"unreviewed\" | \"proposed\" | \"accepted\";\n hint?: string;\n pruneCandidates?: string[];\n }\n | { status: \"duplicate_suspected\"; existing: DecisionRecord; hint: string }\n | { status: \"error\"; error: string };\n\n/** Serialize tool writes so prepared reviews cannot overwrite another decision edit. */\nexport async function withDecisionWrite<T>(\n root: string,\n operation: () => Promise<T>,\n): Promise<T | { status: \"error\"; error: string }> {\n const lockPath = await storePath(root, \".mason/decisions/.write-lock\", true);\n let lock;\n try {\n lock = await fs.open(lockPath, \"wx\", 0o600);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\")\n return {\n status: \"error\",\n error:\n \"Decision store is locked by another write. Retry after it finishes; an abandoned .mason/decisions/.write-lock must be removed only after confirming no writer is running.\",\n };\n throw error;\n }\n try {\n return await operation();\n } finally {\n await lock.close();\n await fs.unlink(lockPath);\n }\n}\n\nexport async function upsertDecision(\n rootDir: string,\n input: UpsertDecisionInput,\n): Promise<UpsertDecisionResult> {\n const parsedTitle = decisionTitleSchema.safeParse(input.title),\n parsedBody = decisionBodySchema.safeParse(input.body);\n if (!parsedTitle.success) return { status: \"error\", error: parsedTitle.error.issues[0].message };\n if (!parsedBody.success) return { status: \"error\", error: parsedBody.error.issues[0].message };\n const title = parsedTitle.data,\n body = parsedBody.data;\n const attribution = attributionSchema.safeParse(input);\n if (!attribution.success) return { status: \"error\", error: attribution.error.message };\n if (input.id && input.supersedes)\n return {\n status: \"error\",\n error: \"Use either id to revise or supersedes to replace a record, not both.\",\n };\n return withDecisionWrite(rootDir, async () => {\n const store = await loadDecisionStore(rootDir);\n if (store.diagnostics.length)\n return {\n status: \"error\",\n error:\n \"Repair malformed decision records before saving: \" +\n store.diagnostics.map((d) => d.path).join(\", \"),\n };\n const existing = store.records,\n byId = new Map(existing.map((r) => [r.id, r]));\n const now = new Date().toISOString(),\n head = await getCurrentGitHash(rootDir);\n const warnings: string[] = [];\n if (body.length > BODY_RECOMMENDED_CHARS)\n warnings.push(\n `body has ${body.length} characters, above the recommended ${BODY_RECOMMENDED_CHARS}; matching context and hooks include it in full. Keep the rule, reason, and exceptions concise; use sources for supporting references.`,\n );\n const files = sanitizeRepoPaths(input.files ?? []);\n if (input.files && files.length < input.files.length)\n warnings.push(\"some anchor paths were outside the repo or duplicated and were dropped\");\n for (const file of files) {\n try {\n await fs.access(path.join(rootDir, file));\n } catch {\n warnings.push(`anchor file does not exist on disk: ${file}`);\n }\n }\n const hint =\n \"Saved locally for review and commit. Proposals are not accepted constraints; an existing accepted revision remains operative while its replacement is proposed. Use review_decision to prepare evidence and record a separate inspection without human approval, or an authorized acceptance or reaffirmation.\";\n if (input.id) {\n const original = byId.get(input.id);\n if (!original) return { status: \"error\", error: `no decision with id \"${input.id}\"` };\n if (original.status !== \"active\")\n return {\n status: \"error\",\n error: \"Archived records cannot be revised; create a new proposal.\",\n };\n const record = importLegacy(original, now);\n const content = decisionContent({\n ...record,\n title,\n body,\n category: input.category,\n files: input.files !== undefined ? files : record.files,\n owner:\n attribution.data.owner === undefined\n ? record.owner\n : (attribution.data.owner ?? undefined),\n sources: attribution.data.sources ?? record.sources,\n });\n if (JSON.stringify(content) === JSON.stringify(decisionContent(record))) {\n return {\n status: \"unchanged\",\n id: record.id,\n totalActive: existing.filter((r) => r.status === \"active\").length,\n approval: decisionApproval(original),\n warnings,\n hint: \"Unchanged content; no review or freshness stamp was written. Use review_decision for explicit re-verification.\",\n };\n }\n const revision = record.revision + 1;\n const capture = await captureAnchors(rootDir, content.files);\n const updated: ReviewedDecisionRecord = {\n ...record,\n ...content,\n owner: content.owner,\n updatedAt: now,\n revision,\n approval: \"proposed\",\n capture,\n history: [\n ...record.history,\n {\n kind: \"revised\",\n at: now,\n actor: attribution.data.actor,\n revision,\n content,\n approval: \"proposed\",\n status: \"active\",\n refreshedHash: record.refreshedHash,\n capture,\n },\n ],\n };\n await saveDecisionRecord(rootDir, updated);\n return {\n status: \"updated\",\n id: record.id,\n totalActive: existing.filter((r) => r.status === \"active\").length,\n approval: \"proposed\",\n warnings,\n hint,\n };\n }\n const old = input.supersedes ? byId.get(input.supersedes) : undefined;\n if (input.supersedes && !old)\n return { status: \"error\", error: `no decision with id \"${input.supersedes}\" to supersede` };\n if (\n old &&\n (old.status !== \"active\" || decisionApproval(effectiveDecision(old)) === \"accepted\")\n ) {\n return {\n status: \"error\",\n error:\n \"A proposal cannot supersede an accepted or archived record. Create and review the replacement separately, then explicitly retire the old decision with review_decision.\",\n };\n }\n if (!input.force) {\n const duplicate = findNearDuplicate({ title, body, files }, existing);\n if (duplicate)\n return {\n status: \"duplicate_suspected\",\n existing: duplicate.record,\n hint: `A similar decision exists (\"${duplicate.record.title}\"). Call save_decision with id=\"${duplicate.record.id}\" to revise it, or force:true if distinct.`,\n };\n }\n const id = decisionIdFor(title, body, new Set(byId.keys()));\n if (byId.has(id))\n return {\n status: \"error\",\n error: `Decision id collision: ${id}. Choose a distinct title or revise the existing record.`,\n };\n const content = decisionContent({\n title,\n body,\n category: input.category,\n files,\n owner: attribution.data.owner ?? undefined,\n sources: attribution.data.sources ?? [],\n });\n const capture = await captureAnchors(rootDir, content.files);\n const record: ReviewedDecisionRecord = {\n ...content,\n capture,\n version: 2,\n id,\n createdAt: now,\n updatedAt: now,\n refreshedHash: head,\n status: \"active\",\n approval: \"proposed\",\n revision: 1,\n history: [\n {\n kind: \"created\",\n at: now,\n actor: attribution.data.actor,\n revision: 1,\n content,\n approval: \"proposed\",\n status: \"active\",\n refreshedHash: head,\n capture,\n },\n ],\n };\n // Write the replacement first: a failed second write leaves both records\n // available instead of removing the original before its replacement exists.\n await saveDecisionRecord(rootDir, record);\n if (old) {\n const imported = importLegacy(old, now);\n await saveDecisionRecord(rootDir, {\n ...imported,\n status: \"superseded\",\n supersededBy: id,\n updatedAt: now,\n history: [\n ...imported.history,\n {\n kind: \"superseded\",\n at: now,\n actor: attribution.data.actor,\n note: `Replaced by proposal ${id}`,\n revision: imported.revision,\n content: decisionContent(imported),\n approval: imported.approval,\n status: \"superseded\",\n refreshedHash: imported.refreshedHash,\n capture: imported.capture,\n },\n ],\n });\n }\n const totalActive = existing.filter((r) => r.status === \"active\").length + (old ? 0 : 1);\n const result: UpsertDecisionResult = {\n status: old ? \"superseded_and_created\" : \"created\",\n id,\n totalActive,\n approval: \"proposed\",\n warnings,\n hint,\n };\n if (totalActive > MAX_ACTIVE_DECISIONS) {\n result.pruneCandidates = existing\n .filter((r) => r.status !== \"active\")\n .map((r) => r.id)\n .slice(0, 10);\n warnings.push(\n `${totalActive} active decisions exceeds the soft cap of ${MAX_ACTIVE_DECISIONS} — consider a cleanup PR (archived records first)`,\n );\n }\n return result;\n });\n}\n","import fs from \"node:fs/promises\";\nimport * as nativeFs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport fg from \"fast-glob\";\nimport { readBoundedFile } from \"../utils/files.js\";\nimport { storePath } from \"../utils/storage.js\";\nimport { execGit } from \"../utils/git-read.js\";\nimport { auditGitPaths } from \"./inspection.js\";\n\nconst MAX_INPUTS = 100_000;\n\n/** Check the paths a particular audit actually reads, including their parents. */\nexport async function auditInputPath(root: string, file: string): Promise<string> {\n if (file === \".\") return fs.realpath(root);\n try {\n return await storePath(root, file);\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Symlink\")) {\n throw new Error(\n `Audit input contains a symbolic link: ${file}. Its evidence could not be verified.`,\n { cause: error },\n );\n }\n throw error;\n }\n}\n\nexport async function readAuditInput(root: string, file: string): Promise<string | null> {\n try {\n const value = await readBoundedFile(await auditInputPath(root, file), 10 * 1024 * 1024);\n if (value === null) throw new Error(`Unreadable or oversized audit input: ${file}`);\n return value;\n } catch (error) {\n if ([\"ENOENT\", \"ENOTDIR\"].includes((error as NodeJS.ErrnoException).code ?? \"\")) return null;\n throw error;\n }\n}\n\n/** Bound relevant results and directory traversal, without counting unrelated files. */\nexport async function auditGlob(\n root: string,\n patterns: string | string[],\n options: {\n ignore?: string[];\n onlyDirectories?: boolean;\n followSymbolicLinks?: boolean;\n label: string;\n select?: (file: string) => boolean;\n },\n): Promise<string[]> {\n if (Array.isArray(patterns) && !patterns.length) return [];\n const directories = new Set<string>();\n // fast-glob may stat a link, but must never enumerate a linked directory.\n // Validate each traversal and each selected result instead of scanning the\n // entire repository just to reject unrelated symlinks.\n const readdir = ((\n directory: string,\n opts: unknown,\n callback: (error: unknown, entries?: unknown) => void,\n ) => {\n const relative = path.relative(root, directory).split(path.sep).join(\"/\") || \".\";\n directories.add(relative);\n if (directories.size > MAX_INPUTS) {\n callback(\n new Error(\n `${options.label} exceeds ${MAX_INPUTS.toLocaleString(\"en-US\")} directories while inspecting ${relative}. Narrow this check's inputs.`,\n ),\n );\n return;\n }\n auditInputPath(root, relative).then(() => {\n nativeFs.readdir(\n directory,\n opts as { withFileTypes: true },\n callback as (error: NodeJS.ErrnoException | null, entries: nativeFs.Dirent[]) => void,\n );\n }, callback);\n }) as typeof nativeFs.readdir;\n // Literal workspace patterns use lstat instead of readdir. Validate them\n // before fast-glob can silently discard a dangling link as a missing file.\n const lstat = ((file: string, callback: (error: unknown, stat?: nativeFs.Stats) => void) => {\n const relative = path.relative(root, file).split(path.sep).join(\"/\") || \".\";\n auditInputPath(root, relative).then(() => nativeFs.lstat(file, callback), callback);\n }) as typeof nativeFs.lstat;\n const stream = fg.stream(patterns, {\n cwd: root,\n ignore: options.ignore,\n onlyFiles: false,\n onlyDirectories: options.onlyDirectories,\n objectMode: true,\n followSymbolicLinks: options.followSymbolicLinks ?? true,\n fs: { readdir, lstat },\n concurrency: 16,\n }) as Readable;\n const matches: string[] = [];\n try {\n for await (const value of stream) {\n const entry = value as fg.Entry;\n const file = entry.path;\n if (options.select && !options.select(file)) continue;\n await auditInputPath(root, file);\n if (!options.onlyDirectories && !entry.dirent.isFile()) continue;\n matches.push(file);\n if (matches.length > MAX_INPUTS) {\n const largest = [\n ...matches.reduce((counts, item) => {\n const dir = item.split(\"/\")[0];\n counts.set(dir, (counts.get(dir) ?? 0) + 1);\n return counts;\n }, new Map<string, number>()),\n ]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3);\n throw new Error(\n `${options.label} exceeds ${MAX_INPUTS.toLocaleString(\"en-US\")} relevant paths. Largest directories: ${largest.map(([dir, count]) => `${dir} (${count})`).join(\", \")}. Narrow this check's inputs.`,\n );\n }\n }\n } finally {\n stream.destroy();\n }\n return matches.sort();\n}\n\n/** Git prunes ignored trees before discovery; tracked source remains visible. */\nexport async function gitSourcePaths(root: string): Promise<string[]> {\n return auditGitPaths(root, \"sources\");\n}\n\n/** Small directory batches, never a repository-wide inventory of ignored files. */\nexport async function gitIgnoredPaths(root: string, files: string[]): Promise<Set<string>> {\n if (!files.length) return new Set();\n const ignored = new Set<string>();\n for (let offset = 0; offset < files.length; offset += 1000) {\n try {\n const { stdout } = await execGit([\"check-ignore\", \"-z\", \"--stdin\"], {\n cwd: root,\n maxBuffer: 4 * 1024 * 1024,\n timeout: 10_000,\n input: files.slice(offset, offset + 1000).join(\"\\0\") + \"\\0\",\n });\n for (const file of stdout.split(\"\\0\").filter(Boolean)) ignored.add(file);\n } catch (error) {\n if ((error as { code?: number }).code !== 1) throw error;\n }\n }\n return ignored;\n}\n","import fg from \"fast-glob\";\nimport { auditGlob } from \"./inputs.js\";\n\n/** Filter literal existing paths with the same bounded, symlink-safe policy as discovery. */\nexport async function includedCheckPaths(\n root: string,\n paths: string[],\n exclude: string[],\n): Promise<Set<string>> {\n if (!exclude.length) return new Set(paths);\n const included = new Set<string>();\n for (let offset = 0; offset < paths.length; offset += 256) {\n for (const file of await auditGlob(\n root,\n paths.slice(offset, offset + 256).map((file) => fg.escapePath(file)),\n {\n ignore: exclude,\n followSymbolicLinks: false,\n label: \"Audit check exclusions\",\n },\n ))\n included.add(file);\n }\n return included;\n}\n","import path from \"node:path\";\nimport type { CommandClaim } from \"./types.js\";\n\nconst TOKEN = `(?:\"[^\"\\\\n]*\"|'[^'\\\\n]*'|[^\\\\s\\x60;&|]+)`;\nconst COMMAND = new RegExp(\n `\\\\b(npm|pnpm|yarn)((?:[ \\\\t]+${TOKEN})*?)[ \\\\t]+run[ \\\\t]+([A-Za-z0-9:_.-]+)`,\n \"g\",\n);\nconst literal = (value: string) => {\n const unquoted = value.replace(/^([\"'])(.*)\\1$/, \"$2\");\n return /[$`*?[\\]{}~\\\\\\x00-\\x1f]/.test(unquoted) || path.posix.isAbsolute(unquoted)\n ? null\n : unquoted;\n};\n\nfunction splitCommands(line: string): string[] {\n const parts: string[] = [];\n let quote = \"\",\n start = 0;\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n if (char === \"\\\\\") {\n i++;\n continue;\n }\n if (quote) {\n if (char === quote) quote = \"\";\n continue;\n }\n if (char === \"'\" || char === '\"') {\n quote = char;\n continue;\n }\n if (char === \";\" || line.slice(i, i + 2) === \"&&\") {\n parts.push(line.slice(start, i));\n if (char === \"&\") i++;\n start = i + 1;\n }\n }\n parts.push(line.slice(start));\n return parts;\n}\n\n/** Deliberately small shell subset: literal cd and npm-family run invocations. */\nexport function commandClaims(\n line: string,\n lineNo: number,\n cwd?: string | null,\n shell = false,\n): { claims: CommandClaim[]; cwd: string | null | undefined } {\n const claims: CommandClaim[] = [];\n const segments = splitCommands(line);\n for (const segment of segments) {\n const text = segment.trim().replace(/^\\$\\s+/, \"\");\n if (text.startsWith(\"#\") || /^(?:echo|printf)\\b/.test(text)) continue;\n const cd = text.match(/^cd\\s+(.+)$/);\n if (cd) {\n const directory = literal(cd[1]);\n cwd =\n directory === null || cwd === null || (/\\s/.test(directory) && !/^[\"']/.test(cd[1]))\n ? null\n : path.posix.join(cwd ?? \".\", directory);\n continue;\n }\n for (const match of text.matchAll(COMMAND)) {\n const flags = match[2].trim();\n const selector = flags.match(/^(?:--prefix|--dir|-C)(?:\\s+|=)(.+)$/);\n let directory = cwd;\n let scopeUnknown: string | undefined;\n if ((shell && match.index !== 0) || match[3].startsWith(\"-\"))\n scopeUnknown = \"Unsupported shell wrapper or options before the script.\";\n if (selector) {\n const selected = literal(selector[1]);\n directory =\n selected === null || cwd === null ? null : path.posix.join(cwd ?? \".\", selected);\n } else if (flags) scopeUnknown = \"Unsupported package-manager options before run: \" + flags;\n const tail = text.slice(match.index! + match[0].length).split(/\\s--(?:\\s|$)/)[0];\n if (\n /(?:^|\\s)(?:--workspace(?:s)?|-w|--filter|-F|--prefix|--dir|-C|--if-present)(?:\\s|=|$)/.test(\n tail,\n )\n ) {\n scopeUnknown = \"Package selection or conditional options after the script need review.\";\n }\n if (\n /[|()]/.test(text) ||\n /\\b(?:pushd|popd|if|for|while)\\b/.test(text) ||\n directory === null\n ) {\n scopeUnknown =\n \"The command's working directory or shell control flow could not be resolved.\";\n }\n claims.push({\n scriptName: match[3],\n invocation: match[0],\n excerpt: match[0],\n line: lineNo,\n ...(directory !== undefined && directory !== null ? { directory } : {}),\n ...(scopeUnknown ? { scopeUnknown } : {}),\n });\n }\n // An unresolved directory change must not leave later commands apparently scoped.\n if (/\\b(?:cd|pushd|popd)\\b/.test(text)) cwd = null;\n }\n return { claims, cwd };\n}\n","import type { PathClaim } from \"./types.js\";\n\n/**\n * A fenced block is treated as a directory tree only when it clearly is one —\n * below this many branch-glyph lines it's more likely an ASCII sketch.\n */\nconst MIN_GLYPH_LINES = 3;\n\nconst GLYPHS = [\"├──\", \"└──\"] as const;\n\nfunction glyphIndex(line: string): number {\n for (const glyph of GLYPHS) {\n const idx = line.indexOf(glyph);\n if (idx !== -1) return idx;\n }\n return -1;\n}\n\n/** Tree furniture: blank, or only vertical bars and whitespace. */\nfunction isSpacerLine(line: string): boolean {\n return /^[\\s│|]*$/.test(line);\n}\n\n/**\n * Strip an inline comment/annotation from a tree entry. Entries commonly\n * carry `# comment` or column-aligned notes after two or more spaces.\n */\nfunction entryName(afterGlyph: string): string | null {\n let name = afterGlyph.replace(/^\\s+/, \"\");\n const hash = name.search(/\\s+#/);\n if (hash !== -1) name = name.slice(0, hash);\n const columns = name.search(/\\s{2,}/);\n if (columns !== -1) name = name.slice(0, columns);\n name = name.trim();\n // A name with remaining internal whitespace is not a path — treat the\n // line as malformed rather than guessing.\n if (!name || /\\s/.test(name)) return null;\n return name;\n}\n\n/**\n * Reconstruct full paths from an ASCII directory tree inside a fenced block.\n *\n * The failure mode must always be a missed claim, never an invented path: a\n * line that doesn't parse cleanly aborts reconstruction below it, and every\n * emitted path still passes the deleted-reference provability gate later.\n *\n * `blockLines` are the fence's content lines; `blockStartLine` is the 1-based\n * doc line number of the first content line.\n */\nexport function extractTreeClaims(blockLines: string[], blockStartLine: number): PathClaim[] {\n const glyphLines = blockLines.filter((l) => glyphIndex(l) !== -1).length;\n if (glyphLines < MIN_GLYPH_LINES) return [];\n\n const claims: PathClaim[] = [];\n // Directories on the path from the root to the current entry, keyed by the\n // column their branch glyph appeared at.\n const stack: Array<{ col: number; name: string }> = [];\n let rootPrefix = \"\";\n let started = false;\n\n for (let i = 0; i < blockLines.length; i++) {\n const line = blockLines[i];\n const col = glyphIndex(line);\n\n if (col === -1) {\n if (isSpacerLine(line)) continue;\n if (!started) {\n // A bare `src/` line above the first glyph names the tree's root.\n const candidate = line.trim();\n if (candidate.endsWith(\"/\") && !/\\s/.test(candidate)) {\n rootPrefix = candidate.replace(/\\/+$/, \"\");\n claims.push({\n path: rootPrefix,\n line: blockStartLine + i,\n excerpt: candidate,\n });\n }\n continue;\n }\n // Unparseable line after the tree began: stop here, keep what we have.\n return claims;\n }\n\n started = true;\n const name = entryName(line.slice(col + GLYPHS[0].length));\n if (name === null) return claims;\n\n while (stack.length > 0 && stack[stack.length - 1].col >= col) {\n stack.pop();\n }\n\n const isDir = name.endsWith(\"/\");\n const cleanName = name.replace(/\\/+$/, \"\");\n const segments = [...(rootPrefix ? [rootPrefix] : []), ...stack.map((s) => s.name), cleanName];\n claims.push({\n path: segments.join(\"/\"),\n line: blockStartLine + i,\n excerpt: name,\n });\n\n if (isDir) stack.push({ col, name: cleanName });\n }\n\n return claims;\n}\n","import MarkdownIt from \"markdown-it\";\nimport { commandClaims } from \"./commands.js\";\nimport type { CommandClaim, CountClaim, DocClaims, PathClaim } from \"./types.js\";\nimport { extractTreeClaims } from \"./tree.js\";\n\n/**\n * Single-segment names that count as path claims without containing a \"/\".\n * Anything else without a slash is prose (\"name your file `config.ts`\"), not\n * a claim about this repo.\n */\nconst ROOT_FILE_NAMES = new Set([\n \"package.json\",\n \"package-lock.json\",\n \"pnpm-workspace.yaml\",\n \"tsconfig.json\",\n \"tsup.config.ts\",\n \"vitest.config.ts\",\n \"Makefile\",\n \"Dockerfile\",\n \"docker-compose.yml\",\n \"Cargo.toml\",\n \"go.mod\",\n \"go.sum\",\n \"pyproject.toml\",\n \"requirements.txt\",\n \"Gemfile\",\n \"composer.json\",\n \"settings.gradle.kts\",\n \"settings.gradle\",\n \"build.gradle.kts\",\n \"build.gradle\",\n \"manifest.json\",\n \"server.json\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\",\n \"CLAUDE.md\",\n \"AGENTS.md\",\n \".gitignore\",\n \".env.example\",\n]);\n\nconst SHELL_FENCE_INFOS = new Set([\"\", \"bash\", \"sh\", \"shell\", \"console\", \"zsh\"]);\n\nconst markdown = new MarkdownIt(\"commonmark\", { html: false });\nconst COUNT_RE = /(\\d+)\\s+(modules?|packages?|workspaces?|crates?)\\b/gi;\n/** \"3 package managers\" is not a package count. */\nconst COUNT_DENYLIST_RE = /^\\s*(manager|registr|lock|json)/i;\n\nconst IGNORE_LINE = \"<!-- mason:ignore -->\";\nconst IGNORE_START = \"<!-- mason:ignore-start -->\";\nconst IGNORE_END = \"<!-- mason:ignore-end -->\";\n\n/**\n * Normalize a candidate token into a repo-relative path claim, or return\n * null when the token is not a claim about this repo (URL, glob,\n * placeholder, relative import example, bare word).\n */\nexport function normalizePathToken(token: string): string | null {\n let t = token.trim();\n if (!t) return null;\n if (/\\s/.test(t)) return null;\n if (t.includes(\"://\") || t.includes(\"\\\\\")) return null;\n if (/[*?[\\]{}<>$`]/.test(t)) return null;\n if (t.startsWith(\"/\") || t.startsWith(\"~\") || t.startsWith(\"./\") || t.startsWith(\"../\")) {\n return null;\n }\n // `src/mcp/tools.ts:189` claims the file, not the line.\n t = t.replace(/:\\d+(?:-\\d+)?$/, \"\");\n if (t.includes(\":\")) return null;\n const normalized = t.replace(/\\/+$/, \"\");\n if (!normalized) return null;\n // `server/src/test/kotlin/...` — a dots-only segment is an \"and so on\"\n // placeholder, not a claim.\n if (normalized.split(\"/\").some((seg) => /^\\.+$/.test(seg))) return null;\n if (normalized.includes(\"/\")) return normalized;\n return ROOT_FILE_NAMES.has(normalized) ? normalized : null;\n}\n\n/** A fence line that is exactly one path-shaped token is a file-list claim. */\nfunction exactTokenPath(line: string): string | null {\n const trimmed = line.trim();\n if (!trimmed || /\\s/.test(trimmed) || !trimmed.includes(\"/\")) return null;\n return normalizePathToken(trimmed);\n}\n\nfunction computeIgnoredLines(lines: string[]): boolean[] {\n const ignored = new Array<boolean>(lines.length).fill(false);\n let inRegion = false;\n let ignoreNext = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.includes(IGNORE_START)) {\n inRegion = true;\n ignored[i] = true;\n continue;\n }\n if (line.includes(IGNORE_END)) {\n inRegion = false;\n ignored[i] = true;\n continue;\n }\n if (inRegion) {\n ignored[i] = true;\n continue;\n }\n if (ignoreNext) {\n if (line.trim().length === 0) continue; // skip blanks to the next real line\n ignored[i] = true;\n ignoreNext = false;\n continue;\n }\n if (line.includes(IGNORE_LINE)) {\n ignored[i] = true;\n const rest = line.replace(IGNORE_LINE, \"\").trim();\n if (rest.length === 0) ignoreNext = true;\n }\n }\n return ignored;\n}\n\n/**\n * Extract every checkable claim from a context-file's markdown. Deterministic\n * and purely lexical — precision comes from the checks' provability gates,\n * not from clever parsing here.\n */\nexport function extractClaims(content: string): DocClaims {\n const lines = content.split(\"\\n\");\n const ignored = computeIgnoredLines(lines);\n\n const paths = new Map<string, PathClaim>();\n const counts: CountClaim[] = [];\n const commands = new Map<string, CommandClaim>();\n\n const addPath = (claim: PathClaim): void => {\n const key = [claim.relativeTo ?? \"scope\", claim.path].join(\":\");\n if (!paths.has(key)) paths.set(key, claim);\n };\n const addCommand = (claim: CommandClaim): void => {\n const key = JSON.stringify([claim.scriptName, claim.directory, claim.scopeUnknown]);\n if (!commands.has(key)) commands.set(key, claim);\n };\n\n // A real Markdown parser distinguishes reference links, images and escaped\n // destinations from code examples. Ignore markers preserve source line offsets.\n const parsed = markdown.parse(lines.map((line, i) => (ignored[i] ? \"\" : line)).join(\"\\n\"), {});\n for (const token of parsed) {\n if (token.type !== \"inline\" || !token.map) continue;\n let line = token.map[0] + 1;\n for (const child of token.children ?? []) {\n const target =\n child.type === \"link_open\"\n ? child.attrGet(\"href\")\n : child.type === \"image\"\n ? child.attrGet(\"src\")\n : null;\n if (target && !/^(?:[a-z][a-z0-9+.-]*:|[/#~])/i.test(target)) {\n let pathname: string | null = null;\n try {\n pathname = decodeURIComponent(target.split(/[?#]/)[0]);\n } catch {\n /* Unsupported URL encoding. */\n }\n if (pathname && !/[$*?{}<>\\\\\\x00-\\x1f]/.test(pathname)) {\n addPath({ path: pathname, line, excerpt: target, relativeTo: \"document\" });\n }\n }\n if (child.type === \"softbreak\" || child.type === \"hardbreak\") line++;\n else line += child.content.split(\"\\n\").length - 1;\n }\n }\n\n let shellCwd: string | null | undefined;\n let inFence = false;\n let fenceInfo = \"\";\n let fenceMarker = \"\";\n let blockLines: string[] = [];\n let blockStartLine = 0;\n\n const processBlock = (): void => {\n for (const claim of extractTreeClaims(blockLines, blockStartLine)) {\n addPath(claim);\n }\n for (let i = 0; i < blockLines.length; i++) {\n const exact = exactTokenPath(blockLines[i]);\n if (exact) {\n addPath({\n path: exact,\n line: blockStartLine + i,\n excerpt: blockLines[i].trim(),\n });\n }\n }\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNo = i + 1;\n const fenceMatch = line.match(/^\\s*(```+|~~~+)(.*)$/);\n\n if (fenceMatch) {\n if (!inFence) {\n inFence = true;\n fenceMarker = fenceMatch[1][0];\n fenceInfo = fenceMatch[2].trim().toLowerCase();\n blockLines = [];\n shellCwd = undefined;\n blockStartLine = lineNo + 1;\n } else if (fenceMatch[1][0] === fenceMarker) {\n inFence = false;\n processBlock();\n }\n continue;\n }\n\n if (inFence) {\n // Ignored lines become spacers so the rest of a tree still parses.\n blockLines.push(ignored[i] ? \"\" : line);\n if (!ignored[i] && SHELL_FENCE_INFOS.has(fenceInfo)) {\n const scanned = commandClaims(line, lineNo, shellCwd, true);\n shellCwd = scanned.cwd;\n for (const claim of scanned.claims) addCommand(claim);\n }\n continue;\n }\n\n if (ignored[i]) continue;\n\n for (const m of line.matchAll(/`([^`]+)`/g)) {\n const normalized = normalizePathToken(m[1]);\n if (normalized) {\n addPath({ path: normalized, line: lineNo, excerpt: m[1] });\n }\n }\n for (const m of line.matchAll(/\"([A-Za-z][\\w.@-]*(?:\\/[\\w.@-]+)+\\/?)\"/g)) {\n const normalized = normalizePathToken(m[1]);\n if (normalized) {\n addPath({ path: normalized, line: lineNo, excerpt: m[1] });\n }\n }\n for (const m of line.matchAll(COUNT_RE)) {\n const rest = line.slice((m.index ?? 0) + m[0].length);\n if (COUNT_DENYLIST_RE.test(rest)) continue;\n counts.push({\n count: Number.parseInt(m[1], 10),\n unit: m[2].toLowerCase(),\n line: lineNo,\n excerpt: m[0],\n });\n }\n for (const match of line.matchAll(/`([^`]+)`/g)) {\n for (const claim of commandClaims(match[1], lineNo, undefined, true).claims)\n addCommand(claim);\n }\n for (const claim of commandClaims(line.replace(/`[^`]+`/g, \"\"), lineNo).claims)\n addCommand(claim);\n }\n\n // An unclosed fence still gets its block processed — trees at the end of a\n // truncated doc are claims too.\n if (inFence) processBlock();\n\n return {\n paths: [...paths.values()],\n counts,\n commands: [...commands.values()],\n };\n}\n","import { inspectionGit } from \"./inspection.js\";\nimport type { CommitRef } from \"./types.js\";\n\nconst COMMIT_FORMAT = \"%H%x09%cI%x09%s\";\n\nfunction parseCommitLine(line: string): CommitRef | null {\n const parts = line.split(\"\\t\");\n if (parts.length < 3 || !parts[0]) return null;\n return { hash: parts[0], date: parts[1], subject: parts.slice(2).join(\"\\t\") };\n}\n\n/** Most recent commit touching a path, or null if the path was never tracked. */\nexport async function lastCommitOf(\n resolvedRoot: string,\n relPath: string,\n): Promise<CommitRef | null> {\n try {\n const { stdout } = await inspectionGit(\n [\"log\", \"-1\", `--format=${COMMIT_FORMAT}`, \"--\", `:(literal)${relPath}`],\n { cwd: resolvedRoot },\n );\n const line = stdout.trim().split(\"\\n\")[0];\n return line ? parseCommitLine(line) : null;\n } catch {\n return null;\n }\n}\n\n/** The commit that deleted a path, or null if none did. */\nexport async function deletingCommitOf(\n resolvedRoot: string,\n relPath: string,\n): Promise<CommitRef | null> {\n try {\n const { stdout } = await inspectionGit(\n [\"log\", \"-1\", \"--diff-filter=D\", `--format=${COMMIT_FORMAT}`, \"--\", `:(literal)${relPath}`],\n { cwd: resolvedRoot },\n );\n const line = stdout.trim().split(\"\\n\")[0];\n return line ? parseCommitLine(line) : null;\n } catch {\n return null;\n }\n}\n\n/** Oldest commit touching a path (used to date a directory's appearance). */\nexport async function firstCommitOf(\n resolvedRoot: string,\n relPath: string,\n): Promise<CommitRef | null> {\n try {\n const { stdout } = await inspectionGit(\n [\"log\", \"--reverse\", `--format=${COMMIT_FORMAT}`, \"--\", `:(literal)${relPath}`],\n { cwd: resolvedRoot, maxBuffer: 10 * 1024 * 1024 },\n );\n const line = stdout.trim().split(\"\\n\")[0];\n return line ? parseCommitLine(line) : null;\n } catch {\n return null;\n }\n}\n\nexport interface RangeCommits {\n commits: Array<CommitRef & { files: string[] }>;\n total: number;\n}\n\n/**\n * Commits in fromHash..HEAD touching any of the pathspecs, newest first, with\n * the touched files per commit. Rev-range, not --since: immune to rebase date\n * skew and CI checkout mtimes. Returns null when the range is uncomputable\n * (unreachable base commit, shallow clone, no git).\n */\nexport async function commitsTouchingSince(\n resolvedRoot: string,\n fromHash: string,\n pathspecs: string[],\n): Promise<RangeCommits | null> {\n if (!fromHash || fromHash === \"unknown\") return null;\n try {\n const { stdout } = await inspectionGit(\n [\n \"log\",\n `${fromHash}..HEAD`,\n `--format=%x01${COMMIT_FORMAT}`,\n \"--name-only\",\n \"--\",\n ...pathspecs,\n ],\n { cwd: resolvedRoot, maxBuffer: 10 * 1024 * 1024 },\n );\n\n const commits: Array<CommitRef & { files: string[] }> = [];\n // \\x01 marks each commit header so name-only file lists can't be\n // mistaken for headers.\n for (const block of stdout.split(\"\\x01\")) {\n if (!block.trim()) continue;\n const lines = block.split(\"\\n\").filter((l) => l.trim().length > 0);\n const ref = parseCommitLine(lines[0]);\n if (!ref) continue;\n commits.push({ ...ref, files: lines.slice(1).map((l) => l.trim()) });\n }\n return { commits, total: commits.length };\n } catch {\n return null;\n }\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport { profilePhase } from \"../utils/profile.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { extractClaims } from \"./claims.js\";\nimport { lastCommitOf } from \"./git.js\";\nimport fg from \"fast-glob\";\nimport { auditGlob, auditInputPath, readAuditInput } from \"./inputs.js\";\nimport { loadProjectConfig } from \"../utils/files.js\";\nimport { auditGitPaths } from \"./inspection.js\";\nimport type { CommitRef, DocClaims } from \"./types.js\";\n\n/**\n * Instruction entry points written by setup. Audit discovery is broader and\n * preserves actual filename casing; setup/teardown must not edit every README.\n */\nexport const DOC_CANDIDATES = [\"AGENTS.md\", \"CLAUDE.md\", \".claude/CLAUDE.md\"] as const;\n\nexport interface AuditDoc {\n /** Repo-relative posix path. */\n path: string;\n content: string;\n /** Directory whose instructions this document describes, not a proven shell cwd. */\n scope: string;\n kind: \"instructions\" | \"readme\" | \"guide\";\n lineCount: number;\n /** Null when the doc is untracked. */\n lastCommit: CommitRef | null;\n /** Uncommitted edits present. */\n dirty: boolean;\n claims: DocClaims;\n}\n\nasync function dirtyDocs(resolvedRoot: string, files: string[]): Promise<Set<string>> {\n if (!files.length) return new Set();\n try {\n const dirty = new Set<string>();\n for (let offset = 0; offset < files.length; offset += 256) {\n const { stdout } = await execGit(\n [\n \"status\",\n \"--porcelain=v1\",\n \"-z\",\n \"--untracked-files=all\",\n \"--\",\n ...files.slice(offset, offset + 256).map((file) => `:(literal)${file}`),\n ],\n { cwd: resolvedRoot, maxBuffer: 16 * 1024 * 1024, timeout: 10000 },\n );\n const entries = stdout.split(\"\\0\");\n for (let i = 0; i < entries.length; i++) {\n if (!entries[i]) continue;\n const status = entries[i].slice(0, 2);\n dirty.add(entries[i].slice(3));\n // Porcelain -z emits destination first, then the original rename/copy path.\n if (/[RC]/.test(status) && entries[i + 1]) dirty.add(entries[++i]);\n }\n }\n return dirty;\n } catch {\n return new Set(files);\n }\n}\n\n/** Readme/instruction discovery shares the exact inventory used by automation. */\nexport async function discoverDocPaths(root: string): Promise<string[]> {\n let candidates: string[];\n try {\n candidates = await auditGitPaths(root, \"documents\");\n } catch (error) {\n // Outside Git we still discover documents so the audit can report Git unavailable.\n try {\n await execGit([\"rev-parse\", \"--git-dir\"], { cwd: root });\n } catch {\n return localDocPaths(root);\n }\n throw error;\n }\n candidates.push(...(await localDocPaths(root)));\n const config = await loadProjectConfig(root);\n const excluded = [\n \"**/node_modules/**\",\n \"**/vendor/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/target/**\",\n \"**/.git/**\",\n \"**/.venv/**\",\n \"**/venv/**\",\n \".mason/**\",\n ...(config.ignore ?? []),\n ];\n // Static patterns preserve literal metacharacters and reject selected symlinks.\n const paths: string[] = [];\n const unique = [...new Set(candidates)].sort();\n for (let offset = 0; offset < unique.length; offset += 256) {\n paths.push(\n ...(await auditGlob(\n root,\n unique.slice(offset, offset + 256).map((p) => fg.escapePath(p)),\n {\n ignore: excluded,\n followSymbolicLinks: false,\n label: \"Documentation discovery\",\n },\n )),\n );\n if (paths.length > 10000)\n throw new Error(\n \"Documentation discovery exceeds 10,000 relevant files; narrow .mason/config.json ignore patterns.\",\n );\n }\n const priority = (file: string) => {\n const index = (DOC_CANDIDATES as readonly string[]).findIndex(\n (p) => p.toLowerCase() === file.toLowerCase(),\n );\n return index < 0 ? DOC_CANDIDATES.length : index;\n };\n return paths.sort((a, b) => priority(a) - priority(b) || a.localeCompare(b));\n}\n\n/** Explicit local entry points may be ignored; preserve their real spelling. */\nasync function localDocPaths(root: string): Promise<string[]> {\n const paths: string[] = [];\n for (const dir of [\".\", \".claude\"]) {\n let entries;\n try {\n entries = await fs.readdir(await auditInputPath(root, dir), { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw error;\n }\n for (const entry of entries)\n if (/^(?:agents|claude|readme)\\.md$/i.test(entry.name)) {\n paths.push(path.posix.join(dir, entry.name));\n }\n }\n return paths;\n}\n\nexport function documentScope(file: string): string {\n // Explicitly included guides describe the repository; entry points retain directory scope.\n if (!/^(readme|agents|claude)\\.md$/i.test(path.posix.basename(file))) return \".\";\n const parent = path.posix.dirname(file);\n return path.posix.basename(parent).toLowerCase() === \".claude\"\n ? path.posix.dirname(parent)\n : parent;\n}\n\nexport async function discoverDocs(resolvedRoot: string): Promise<AuditDoc[]> {\n return profilePhase(\"audit.documents\", () => readDocs(resolvedRoot));\n}\n\nasync function readDocs(resolvedRoot: string): Promise<AuditDoc[]> {\n const docs: AuditDoc[] = [];\n const files = await discoverDocPaths(resolvedRoot);\n const dirty = await dirtyDocs(resolvedRoot, files);\n // Bound concurrent Git processes even when discovery reaches thousands of docs.\n for (let offset = 0; offset < files.length; offset += 4) {\n docs.push(\n ...(await Promise.all(\n files.slice(offset, offset + 4).map(async (candidate): Promise<AuditDoc> => {\n const [content, lastCommit] = await Promise.all([\n readAuditInput(resolvedRoot, candidate),\n profilePhase(\"audit.document-history\", () => lastCommitOf(resolvedRoot, candidate)),\n ]);\n if (content === null)\n throw new Error(\"Document disappeared during discovery: \" + candidate);\n return {\n path: candidate,\n content,\n scope: documentScope(candidate),\n kind: /^readme\\.md$/i.test(path.posix.basename(candidate))\n ? \"readme\"\n : /^(agents|claude)\\.md$/i.test(path.posix.basename(candidate))\n ? \"instructions\"\n : \"guide\",\n lineCount: content.split(\"\\n\").length,\n lastCommit,\n dirty: dirty.has(candidate),\n claims: extractClaims(content),\n };\n }),\n )),\n );\n }\n return docs;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { auditInputPath } from \"./inputs.js\";\nimport { documentScope } from \"./docs.js\";\nimport type { ClaimScope, PathClaim } from \"./types.js\";\n\n/** Lexical containment, before inspecting any path from documentation. */\nexport function scopedPath(directory: string, value: string): string | null {\n if (path.posix.isAbsolute(value) || value.includes(\"\\\\\") || /[\\x00-\\x1f]/.test(value))\n return null;\n const resolved = path.posix.normalize(path.posix.join(directory, value));\n return resolved === \"..\" || resolved.startsWith(\"../\") ? null : resolved;\n}\n\nexport function pathClaimScope(doc: string, claim: PathClaim): ClaimScope | null {\n const directory = claim.relativeTo === \"document\" ? path.posix.dirname(doc) : documentScope(doc);\n const local = scopedPath(directory, claim.path);\n if (!local) return null;\n const candidates =\n claim.relativeTo === \"document\" || directory === \".\"\n ? [local]\n : [...new Set([local, scopedPath(\".\", claim.path)].filter((p): p is string => p !== null))];\n return {\n basis:\n claim.relativeTo === \"document\"\n ? \"document-link\"\n : directory === \".\"\n ? \"repository\"\n : \"document\",\n directory,\n candidates,\n };\n}\n\n/** Missing is distinct from unreadable/unsafe; cache and checks use the same observation. */\nexport async function pathExists(root: string, file: string): Promise<boolean> {\n try {\n await fs.access(await auditInputPath(root, file));\n return true;\n } catch (error) {\n // A child of a regular file cannot exist either. Keep symlink and access\n // failures distinct: neither establishes that a reference is missing.\n if ([\"ENOENT\", \"ENOTDIR\"].includes((error as NodeJS.ErrnoException).code ?? \"\")) return false;\n throw error;\n }\n}\n\nexport function gitMetadataPath(file: string): boolean {\n return file.split(\"/\").includes(\".git\");\n}\n\nexport function optionalMasonPath(file: string): boolean {\n return file.split(\"/\").includes(\".mason\");\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { loadSnapshot, getCurrentGitHash, listSourceFiles } from \"../snapshot/snapshot.js\";\nimport type { Snapshot } from \"../snapshot/snapshot.js\";\nimport type { Freshness } from \"../context/trust.js\";\nimport { matchingPaths } from \"../utils/paths.js\";\n\n// Incremental refresh stops paying off once a large share of the map is\n// touched — but small absolute counts are always cheap to refresh in place,\n// so both thresholds must be exceeded before recommending a full rebuild.\nconst FULL_REBUILD_FRACTION = 0.4;\nconst FULL_REBUILD_MIN_CHANGED_MAPPED_FILES = 10;\n\nexport type ChangeStatus = \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n\nexport interface FileChange {\n status: ChangeStatus;\n /** Current path (the new path for renames). */\n path: string;\n /** Pre-rename path, only present for renames. */\n previousPath?: string;\n}\n\nexport type DriftRecommendation = \"up-to-date\" | \"incremental\" | \"full-rebuild\";\n\nexport interface WorkingTreeReport {\n available: boolean;\n changedFiles: string[];\n untrackedFiles: string[];\n}\n\nexport interface DriftReport {\n /** Live entry state; committed drift alone continues to drive CLI exit codes. */\n featureFreshness?: Record<string, Freshness>;\n flowFreshness?: Record<string, Freshness>;\n workingTree?: WorkingTreeReport;\n verification?: { neverVerified: number; failed: string[] };\n stale: boolean;\n snapshotHash: string;\n headHash: string;\n /** Commits between the snapshot and HEAD; null when history is unavailable. */\n commitsBehind: number | null;\n /**\n * False when the snapshot commit is unreachable (shallow clone, rewritten\n * history) — staleFeatures/unmappedFiles/renames cannot be computed then.\n */\n historyAvailable: boolean;\n /** Current paths of every file changed since the snapshot. */\n changedFiles: string[];\n /** Stale feature name → the mapped files that changed under it. */\n staleFeatures: Record<string, string[]>;\n /** Stale flow name → the chain files that changed under it. */\n staleFlows: Record<string, string[]>;\n totalFeatures: number;\n totalFlows: number;\n /** New source files not referenced by any feature or flow. */\n unmappedFiles: string[];\n /** Files referenced by the map that no longer exist on disk. */\n ghostFiles: string[];\n renames: Array<{ from: string; to: string }>;\n recommendation: DriftRecommendation;\n}\n\nfunction parseChanges(output: string): FileChange[] {\n const fields = output.split(\"\\0\");\n const changes: FileChange[] = [];\n for (let i = 0; i < fields.length && fields[i];) {\n const code = fields[i++];\n const first = fields[i++];\n if (!first) break;\n const second = /^[RC]/.test(code) ? fields[i++] : undefined;\n const change: FileChange = second\n ? code.startsWith(\"R\")\n ? { status: \"renamed\", path: second, previousPath: first }\n : { status: \"added\", path: second }\n : { status: code === \"A\" ? \"added\" : code === \"D\" ? \"deleted\" : \"modified\", path: first };\n if (\n change.path.startsWith(\".mason/\") &&\n (!change.previousPath || change.previousPath.startsWith(\".mason/\"))\n )\n continue;\n changes.push(change);\n }\n return changes;\n}\n\nexport function touchedPaths(changes: FileChange[]): string[] {\n return [\n ...new Set(changes.flatMap((c) => (c.previousPath ? [c.previousPath, c.path] : [c.path]))),\n ].sort();\n}\n\nexport async function getChangesWithStatus(\n resolvedRoot: string,\n fromHash: string,\n toHash = \"HEAD\",\n): Promise<FileChange[] | null> {\n if (\n !fromHash ||\n fromHash === \"unknown\" ||\n fromHash.startsWith(\"-\") ||\n !toHash ||\n toHash === \"unknown\" ||\n toHash.startsWith(\"-\")\n )\n return null;\n try {\n const { stdout } = await execGit(\n [\"diff\", \"--name-status\", \"-z\", \"-M\", fromHash, toHash, \"--\"],\n { cwd: resolvedRoot, maxBuffer: 10 * 1024 * 1024 },\n );\n return parseChanges(stdout);\n } catch {\n return null;\n }\n}\n\nexport async function getWorkingTree(resolvedRoot: string): Promise<WorkingTreeReport> {\n try {\n const [diff, untracked] = await Promise.all([\n execGit([\"diff\", \"--name-status\", \"-z\", \"-M\", \"HEAD\", \"--\"], {\n cwd: resolvedRoot,\n maxBuffer: 10 * 1024 * 1024,\n }),\n execGit([\"ls-files\", \"-z\", \"--others\", \"--exclude-standard\"], {\n cwd: resolvedRoot,\n maxBuffer: 10 * 1024 * 1024,\n }),\n ]);\n const untrackedFiles = untracked.stdout\n .split(\"\\0\")\n .filter((f) => f && !f.startsWith(\".mason/\"));\n return {\n available: true,\n changedFiles: [\n ...new Set([...touchedPaths(parseChanges(diff.stdout)), ...untrackedFiles]),\n ].sort(),\n untrackedFiles,\n };\n } catch {\n return { available: false, changedFiles: [], untrackedFiles: [] };\n }\n}\n\nasync function countCommitsBehind(resolvedRoot: string, fromHash: string): Promise<number | null> {\n if (!fromHash || fromHash === \"unknown\" || fromHash.startsWith(\"-\")) return null;\n try {\n const { stdout } = await execGit([\"rev-list\", \"--count\", `${fromHash}..HEAD`], {\n cwd: resolvedRoot,\n });\n const count = Number.parseInt(stdout.trim(), 10);\n return Number.isNaN(count) ? null : count;\n } catch {\n return null;\n }\n}\n\nfunction collectMappedFiles(snapshot: Snapshot): Set<string> {\n const mappedFiles = new Set<string>();\n for (const feature of Object.values(snapshot.features)) {\n for (const f of feature.files) mappedFiles.add(f);\n for (const t of feature.tests ?? []) mappedFiles.add(t);\n }\n for (const flow of Object.values(snapshot.flows)) {\n for (const f of flow.chain) mappedFiles.add(f);\n }\n return mappedFiles;\n}\n\nasync function findGhostFiles(resolvedRoot: string, mappedFiles: Set<string>): Promise<string[]> {\n const ghosts: string[] = [];\n for (const file of mappedFiles) {\n try {\n await fs.access(path.join(resolvedRoot, file));\n } catch {\n ghosts.push(file);\n }\n }\n return ghosts.sort();\n}\n\n/**\n * Compare the concept map against HEAD and report feature-level drift.\n * Fully deterministic — git + filesystem only, no LLM involved.\n * Returns null when no snapshot exists.\n */\nexport async function computeDrift(rootDir: string): Promise<DriftReport | null> {\n const root = path.resolve(rootDir);\n const snapshot = await loadSnapshot(root);\n if (!snapshot) return null;\n const [headHash, workingTree] = await Promise.all([\n getCurrentGitHash(root),\n getWorkingTree(root),\n ]);\n const hashFor = (entry: { refreshedHash?: string }) => entry.refreshedHash ?? snapshot.gitHash;\n const entries = [...Object.values(snapshot.features), ...Object.values(snapshot.flows)];\n const hashes = new Set([snapshot.gitHash, ...entries.map(hashFor)]);\n const changesByHash = new Map<string, FileChange[] | null>();\n await Promise.all(\n [...hashes].map(async (hash) => {\n changesByHash.set(\n hash,\n hash === headHash && headHash !== \"unknown\" ? [] : await getChangesWithStatus(root, hash),\n );\n }),\n );\n const historyAvailable =\n headHash !== \"unknown\" && [...changesByHash.values()].every((changes) => changes !== null);\n const mappedFiles = collectMappedFiles(snapshot);\n const report: DriftReport = {\n stale: !historyAvailable,\n snapshotHash: snapshot.gitHash,\n headHash,\n commitsBehind: 0,\n historyAvailable,\n changedFiles: [],\n staleFeatures: {},\n staleFlows: {},\n totalFeatures: Object.keys(snapshot.features).length,\n totalFlows: Object.keys(snapshot.flows).length,\n unmappedFiles: [],\n ghostFiles: await findGhostFiles(root, mappedFiles),\n renames: [],\n recommendation: historyAvailable ? \"up-to-date\" : \"full-rebuild\",\n featureFreshness: {},\n flowFreshness: {},\n workingTree,\n verification: {\n neverVerified: entries.filter((e) => !e.verifiedAt).length,\n failed: [...Object.entries(snapshot.features), ...Object.entries(snapshot.flows)]\n .filter(([, e]) => e.verificationFailed)\n .map(([name]) => name),\n },\n };\n const counts = await Promise.all(\n [...hashes].map(async (hash) => (hash === headHash ? 0 : countCommitsBehind(root, hash))),\n );\n const knownCounts = counts.filter((n): n is number => n !== null);\n report.commitsBehind = knownCounts.length ? Math.max(...knownCounts) : null;\n\n const check = (\n name: string,\n files: string[],\n hash: string,\n staleEntries: Record<string, string[]>,\n freshness: Record<string, Freshness>,\n ) => {\n const changes = changesByHash.get(hash);\n const committedHits = changes ? matchingPaths(files, touchedPaths(changes)) : [];\n if (committedHits.length) staleEntries[name] = committedHits;\n const localHits = matchingPaths(files, workingTree.changedFiles);\n freshness[name] =\n files.length === 0 || changes === null || changes === undefined || !workingTree.available\n ? \"unknown\"\n : committedHits.length ||\n localHits.length ||\n files.some((f) => report.ghostFiles.includes(f))\n ? \"changed\"\n : \"current\";\n };\n for (const [name, feature] of Object.entries(snapshot.features)) {\n check(\n name,\n [...feature.files, ...(feature.tests ?? [])],\n hashFor(feature),\n report.staleFeatures,\n report.featureFreshness!,\n );\n }\n for (const [name, flow] of Object.entries(snapshot.flows)) {\n check(name, flow.chain, hashFor(flow), report.staleFlows, report.flowFreshness!);\n }\n\n const allChanges = [...changesByHash.values()].flatMap((changes) => changes ?? []);\n report.changedFiles = [...new Set(allChanges.map((c) => c.path))].sort();\n // Complete coverage, including omissions from a map saved at HEAD. Untracked\n // files remain in workingTree and never change the committed-drift exit code.\n const sourceFiles = new Set(await listSourceFiles(root));\n let committedFiles: Set<string> = new Set();\n try {\n const { stdout } = await execGit([\"ls-tree\", \"-r\", \"--name-only\", \"-z\", \"HEAD\"], {\n cwd: root,\n maxBuffer: 50 * 1024 * 1024,\n });\n committedFiles = new Set(stdout.split(\"\\0\").filter(Boolean));\n } catch {\n report.historyAvailable = false;\n report.stale = true;\n }\n report.unmappedFiles = [...sourceFiles]\n .filter((f) => committedFiles.has(f) && !mappedFiles.has(f))\n .sort();\n const renames = new Map<string, { from: string; to: string }>();\n for (const change of allChanges) {\n if (change.status === \"renamed\" && change.previousPath)\n renames.set(`${change.previousPath}\\0${change.path}`, {\n from: change.previousPath,\n to: change.path,\n });\n }\n report.renames = [...renames.values()];\n const changedMapped = new Set([\n ...Object.values(report.staleFeatures).flat(),\n ...Object.values(report.staleFlows).flat(),\n ]);\n // A locally deleted file is a live-edit warning, not committed map drift.\n const committedGhosts = report.ghostFiles.filter((f) => !workingTree.changedFiles.includes(f));\n report.stale ||=\n changedMapped.size > 0 || report.unmappedFiles.length > 0 || committedGhosts.length > 0;\n if (!report.historyAvailable) report.recommendation = \"full-rebuild\";\n else if (!report.stale) report.recommendation = \"up-to-date\";\n else\n report.recommendation =\n changedMapped.size >= FULL_REBUILD_MIN_CHANGED_MAPPED_FILES &&\n changedMapped.size / Math.max(1, mappedFiles.size) > FULL_REBUILD_FRACTION\n ? \"full-rebuild\"\n : \"incremental\";\n return report;\n}\n","import path from \"node:path\";\nimport { deletingCommitOf, lastCommitOf } from \"../git.js\";\nimport { gitMetadataPath, optionalMasonPath, pathClaimScope, pathExists } from \"../scope.js\";\nimport type { Evidence } from \"../types.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\n/** Prove removed references only when their scope is resolved. */\nexport async function checkDeletedReferences(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n for (const doc of ctx.docs) {\n const changes = ctx.changesSinceDoc.get(doc.path);\n const renames = new Map(\n (changes ?? [])\n .filter((c) => c.status === \"renamed\" && c.previousPath)\n .map((c) => [c.previousPath!, c.path]),\n );\n for (const claim of doc.claims.paths) {\n const scope = pathClaimScope(doc.path, claim);\n if (!scope) {\n result.skipped.push({\n check: \"deleted-reference\",\n doc: doc.path,\n reason: `Reference ${claim.excerpt} is outside the repository or has an unsupported path.`,\n });\n continue;\n }\n if (scope.candidates.some(optionalMasonPath)) continue;\n if (scope.candidates.some(gitMetadataPath)) {\n result.skipped.push({\n check: \"deleted-reference\",\n doc: doc.path,\n reason: `Reference ${claim.path} names Git metadata, whose layout varies between checkouts; it was not verified as a repository file.`,\n });\n continue;\n }\n if (\n (await Promise.all(scope.candidates.map((file) => pathExists(ctx.root, file)))).some(\n Boolean,\n )\n )\n continue;\n\n const candidates = await Promise.all(\n scope.candidates.map(async (file) => ({\n file,\n tracked: await lastCommitOf(ctx.root, file),\n parent: await pathExists(ctx.root, path.posix.dirname(file)),\n })),\n );\n const candidate =\n candidates.find((c) => c.tracked || renames.has(c.file)) ??\n candidates.find((c) => c.parent);\n // No history/parent for a bare path is usually an illustrative example.\n if (!candidate && claim.relativeTo !== \"document\") continue;\n const resolvedPath = candidate?.file ?? scope.candidates[0];\n const renamedTo = renames.get(resolvedPath) ?? null;\n const deletedInCommit =\n candidate?.tracked && !renamedTo ? await deletingCommitOf(ctx.root, resolvedPath) : null;\n const evidence: Evidence = {\n kind: \"missing-path\",\n claimed: claim.path,\n resolvedPath,\n scope,\n renamedTo,\n deletedInCommit,\n everTracked: !!candidate?.tracked || !!renamedTo,\n parentDirExists: candidate?.parent ?? false,\n };\n const anchor = { doc: doc.path, line: claim.line, excerpt: claim.excerpt };\n const message = renamedTo\n ? `\\`${resolvedPath}\\` was renamed to \\`${renamedTo}\\``\n : `\\`${resolvedPath}\\` does not exist` +\n (deletedInCommit\n ? ` – deleted in ${deletedInCommit.hash.slice(0, 7)} \"${deletedInCommit.subject}\" (${deletedInCommit.date.slice(0, 10)})`\n : \"\");\n if (scope.basis !== \"document\" && (renamedTo || candidate?.tracked)) {\n result.issues.push({\n type: \"deleted-reference\",\n message,\n anchor,\n confidence: \"certain\",\n evidence,\n });\n } else {\n result.advisories.push({\n resolution: \"recheck\",\n type: \"deleted-reference\",\n message:\n message +\n (scope.basis === \"document\"\n ? \"; the bare path's document/repository scope needs review.\"\n : \"; no tracked history establishes it as a required file. Review for a typo, generated output, or example.\"),\n anchor,\n evidence,\n });\n }\n }\n }\n return result;\n}\n","import { inspectionRead } from \"../inspection.js\";\nimport fg from \"fast-glob\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { loadProjectConfig, SOURCE_IGNORE } from \"../../utils/files.js\";\nimport { auditGlob, auditInputPath, gitIgnoredPaths, gitSourcePaths } from \"../inputs.js\";\nimport { firstCommitOf } from \"../git.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\n/** Directories that are never \"modules\" worth documenting. */\nconst DIR_DENYLIST = new Set([\n \"node_modules\",\n \"dist\",\n \"build\",\n \"out\",\n \"coverage\",\n \"target\",\n \"vendor\",\n \"__pycache__\",\n \"venv\",\n \".venv\",\n \".git\",\n \".gradle\",\n \".mason\",\n \".claude\",\n \".github\",\n \".vscode\",\n \".idea\",\n]);\n\n/** Second-level dirs need a bit more substance before they count. */\nconst SECOND_LEVEL_MIN_SOURCE_FILES = 2;\n/**\n * Descend into a top-level dir only when the docs evidently enumerate its\n * children — at least this many of its subdirs already mentioned.\n */\nconst ENUMERATION_THRESHOLD = 2;\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Word-boundary mention check across the union of all docs — `app` must not\n * match \"application\", and a dir mentioned only in AGENTS.md must not be\n * flagged against CLAUDE.md.\n */\nfunction isMentioned(combinedDocs: string, name: string): boolean {\n const re = new RegExp(`(^|[^A-Za-z0-9_-])${escapeRegExp(name)}(/|[^A-Za-z0-9_-]|$)`, \"im\");\n return re.test(combinedDocs);\n}\n\nexport async function checkNewModules(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n if (ctx.docs.length === 0) return result;\n\n const combinedDocs = moduleDocumentation(ctx.docs);\n const primaryDoc = ctx.docs[0].path;\n const checkedDocs = ctx.docs.map((d) => d.path);\n\n const flag = async (dir: string, sourceFileCount: number): Promise<void> => {\n result.advisories.push({\n resolution: \"recheck\",\n type: \"new-module\",\n message: `directory \\`${dir}/\\` contains ${sourceFileCount} source file${sourceFileCount === 1 ? \"\" : \"s\"} but is not mentioned in the discovered documentation; review whether it needs documenting`,\n anchor: { doc: primaryDoc, line: null, excerpt: dir },\n evidence: {\n kind: \"unmentioned-dir\",\n dir,\n sourceFileCount,\n firstCommit: await firstCommitOf(ctx.root, dir),\n checkedDocs,\n },\n });\n };\n\n for (const candidate of await moduleCandidates(ctx.root, combinedDocs)) {\n await flag(candidate.dir, candidate.sourceFileCount);\n }\n\n return result;\n}\n\n/** Nested documentation establishes a directory is documented without requiring\n * every package README to repeat its full repository path. */\nexport function moduleDocumentation(docs: Array<{ path: string; content: string }>): string {\n return docs\n .map(\n (doc) =>\n doc.content +\n \"\\n\" +\n (path.posix.dirname(doc.path) === \".\" ? \"\" : path.posix.dirname(doc.path) + \"/\"),\n )\n .join(\"\\n\");\n}\n\n/** Shared dependency witness: cache exactly the module candidates the audit observes. */\nexport function moduleCandidates(root: string, combinedDocs: string) {\n return inspectionRead(root, \"modules:\" + combinedDocs, () =>\n collectModuleCandidates(root, combinedDocs),\n );\n}\n\nasync function collectModuleCandidates(root: string, combinedDocs: string) {\n const [config, sourcePaths] = await Promise.all([loadProjectConfig(root), gitSourcePaths(root)]);\n const ignore = [...SOURCE_IGNORE, ...(config.ignore ?? [])];\n const sources = sourcePaths.filter(\n (file) => !file.split(\"/\").some((part) => part.startsWith(\".\")),\n );\n const listSubdirs = async (parents: string[]): Promise<Map<string, string[]>> => {\n const byParent = new Map<string, string[]>();\n // Gather one level before asking Git about ignores, with bounded directory reads.\n for (let offset = 0; offset < parents.length; offset += 16) {\n await Promise.all(\n parents.slice(offset, offset + 16).map(async (dir) => {\n const entries = await fs.readdir(await auditInputPath(root, dir), {\n withFileTypes: true,\n });\n // An unrelated directory alias is not a source module. Selected links\n // still pass through auditGlob's path and parent validation.\n const dirs = entries\n .filter(\n (entry) =>\n (entry.isDirectory() ||\n (entry.isSymbolicLink() &&\n sources.some((file) =>\n file.startsWith(path.posix.join(dir, entry.name) + \"/\"),\n ))) &&\n !entry.name.startsWith(\".\") &&\n !DIR_DENYLIST.has(entry.name),\n )\n .map((entry) => path.posix.join(dir, entry.name));\n byParent.set(dir, dirs);\n }),\n );\n }\n const ignored = await gitIgnoredPaths(root, [...byParent.values()].flat());\n const result = new Map<string, string[]>();\n for (const dir of parents) {\n // An ignore rule does not remove already tracked source from the audit.\n const visible = new Set(\n byParent\n .get(dir)!\n .filter(\n (candidate) =>\n !ignored.has(candidate) || sources.some((file) => file.startsWith(candidate + \"/\")),\n ),\n );\n result.set(\n dir,\n (\n await auditGlob(root, dir === \".\" ? \"*\" : `${fg.escapePath(dir)}/*`, {\n ignore,\n onlyDirectories: true,\n label: \"Module directory discovery\",\n select: (file) => visible.has(file),\n })\n ).map((file) => path.posix.basename(file)),\n );\n }\n return result;\n };\n const countSourceFiles = async (dir: string): Promise<number> => {\n const files = sources.filter((file) => file.startsWith(dir + \"/\"));\n let count = 0;\n // Literal path batches avoid compiling one enormous glob pattern set in a\n // genuinely large source module. Apply exclusions before counting results.\n for (let offset = 0; offset < files.length; offset += 256) {\n count += (\n await auditGlob(\n root,\n files.slice(offset, offset + 256).map((file) => fg.escapePath(file)),\n {\n ignore,\n followSymbolicLinks: false,\n label: `Source discovery in ${dir}`,\n },\n )\n ).length;\n if (count > 100000)\n throw new Error(\n `Source discovery in ${dir} exceeds 100,000 relevant files. Exclude generated source with .mason/config.json ignore patterns or narrow this audit's checks.`,\n );\n }\n return count;\n };\n const candidates: Array<{ dir: string; sourceFileCount: number }> = [];\n const topDirs = (await listSubdirs([\".\"])).get(\".\")!;\n const nested = await listSubdirs(topDirs.filter((dir) => isMentioned(combinedDocs, dir)));\n for (const topDir of topDirs) {\n const topMentioned = isMentioned(combinedDocs, topDir);\n\n if (!topMentioned) {\n const count = await countSourceFiles(topDir);\n if (count >= 1) candidates.push({ dir: topDir, sourceFileCount: count });\n continue;\n }\n\n // The docs know this dir. If they enumerate its children (several\n // subdirs already mentioned), an unmentioned sibling is drift — this is\n // how a freshly added module under src/ gets caught.\n const subdirs = nested.get(topDir)!;\n const mentioned = subdirs.filter((s) => isMentioned(combinedDocs, s));\n if (mentioned.length < ENUMERATION_THRESHOLD) continue;\n\n for (const sub of subdirs) {\n if (isMentioned(combinedDocs, sub)) continue;\n const count = await countSourceFiles(`${topDir}/${sub}`);\n if (count >= SECOND_LEVEL_MIN_SOURCE_FILES) {\n candidates.push({ dir: `${topDir}/${sub}`, sourceFileCount: count });\n }\n }\n }\n\n return candidates;\n}\n","import { isRecord, isStringArray } from \"../../utils/validation.js\";\nimport path from \"node:path\";\nimport { documentScope } from \"../docs.js\";\nimport { auditGlob, readAuditInput } from \"../inputs.js\";\nimport type { CountClaim } from \"../types.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\nconst MEMBERS_CAP = 50;\n\ninterface CountSource {\n actual: number;\n countedFrom: string;\n members: string[];\n}\n\nasync function countGradleModules(root: string): Promise<CountSource | null> {\n for (const name of [\"settings.gradle.kts\", \"settings.gradle\"]) {\n const content = await readAuditInput(root, name);\n if (content === null) continue;\n // include(\":a\", \":b\") — count quoted project strings, not include() calls.\n const members: string[] = [];\n for (const call of content.matchAll(/include\\s*\\(([^)]*)\\)/g)) {\n for (const proj of call[1].matchAll(/[\"']([^\"']+)[\"']/g)) {\n members.push(proj[1]);\n }\n }\n if (members.length === 0) return null;\n return { actual: members.length, countedFrom: name, members };\n }\n return null;\n}\n\nasync function countNpmWorkspaces(root: string): Promise<CountSource | null> {\n const pkgRaw = await readAuditInput(root, \"package.json\");\n if (pkgRaw !== null) {\n let globs: string[] = [];\n try {\n const pkg: unknown = JSON.parse(pkgRaw);\n if (!isRecord(pkg)) return null;\n const workspaces = isRecord(pkg.workspaces) ? pkg.workspaces.packages : pkg.workspaces;\n // A malformed declaration cannot establish a workspace count.\n if (workspaces !== undefined && !isStringArray(workspaces)) return null;\n globs = workspaces ?? [];\n } catch {\n // Malformed package.json — nothing provable here.\n }\n if (globs.length > 0) {\n const matched = await auditGlob(\n root,\n globs.map((g) => `${g.replace(/\\/+$/, \"\")}/package.json`),\n { ignore: [\"**/node_modules/**\"], label: \"npm workspace discovery\" },\n );\n return {\n actual: matched.length,\n countedFrom: \"package.json workspaces\",\n members: matched.map((m) => path.dirname(m)).sort(),\n };\n }\n }\n\n const pnpmRaw = await readAuditInput(root, \"pnpm-workspace.yaml\");\n if (pnpmRaw !== null) {\n const globs: string[] = [];\n let inPackages = false;\n for (const line of pnpmRaw.split(\"\\n\")) {\n if (/^packages\\s*:/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const entry = line.match(/^\\s*-\\s*[\"']?([^\"'#\\s]+)/);\n if (entry) {\n if (!entry[1].startsWith(\"!\")) globs.push(entry[1]);\n } else if (line.trim().length > 0 && !line.startsWith(\" \")) {\n inPackages = false;\n }\n }\n }\n if (globs.length > 0) {\n const matched = await auditGlob(\n root,\n globs.map((g) => `${g.replace(/\\/+$/, \"\")}/package.json`),\n { ignore: [\"**/node_modules/**\"], label: \"pnpm workspace discovery\" },\n );\n return {\n actual: matched.length,\n countedFrom: \"pnpm-workspace.yaml\",\n members: matched.map((m) => path.dirname(m)).sort(),\n };\n }\n }\n return null;\n}\n\nasync function countCargoCrates(root: string): Promise<CountSource | null> {\n const content = await readAuditInput(root, \"Cargo.toml\");\n if (content === null) return null;\n const membersBlock = content.match(/members\\s*=\\s*\\[([\\s\\S]*?)\\]/);\n if (!membersBlock) return null;\n const entries = [...membersBlock[1].matchAll(/[\"']([^\"']+)[\"']/g)].map((m) => m[1]);\n if (entries.length === 0) return null;\n\n // Workspace members may be globs (\"crates/*\") — resolve them against\n // directories that actually contain a Cargo.toml.\n const members = new Set<string>();\n for (const entry of entries) {\n if (/[*?[\\]{}]/.test(entry)) {\n const matched = await auditGlob(root, `${entry.replace(/\\/+$/, \"\")}/Cargo.toml`, {\n ignore: [\"**/target/**\"],\n label: \"Cargo workspace discovery\",\n });\n for (const m of matched) members.add(path.dirname(m));\n } else if ((await readAuditInput(root, path.posix.join(entry, \"Cargo.toml\"))) !== null) {\n members.add(entry);\n }\n }\n if (members.size === 0) return null;\n return {\n actual: members.size,\n countedFrom: \"Cargo.toml workspace members\",\n members: [...members].sort(),\n };\n}\n\n/**\n * Map a claim's unit to the ecosystem that can prove it. When the mapped\n * ecosystem has no workspace manifest in this repo, the claim is skipped —\n * \"12 packages\" in a Gradle repo proves nothing either way.\n */\nexport async function resolveCountSource(\n root: string,\n claim: CountClaim,\n): Promise<CountSource | null> {\n const unit = claim.unit.replace(/s$/, \"\");\n if (unit === \"module\") return countGradleModules(root);\n if (unit === \"workspace\") return countNpmWorkspaces(root);\n if (unit === \"crate\") return countCargoCrates(root);\n // \"packages\" is ecosystem-ambiguous — first manifest that resolves wins.\n return (\n (await countNpmWorkspaces(root)) ??\n (await countCargoCrates(root)) ??\n (await countGradleModules(root))\n );\n}\n\n/** Nested documents cannot assert the root workspace's count implicitly. */\nexport async function resolveDocCountSource(\n root: string,\n doc: string,\n claim: CountClaim,\n): Promise<CountSource | null> {\n const scope = documentScope(doc);\n const source = await resolveCountSource(path.join(root, scope), claim);\n if (!source || scope === \".\") return source;\n return {\n ...source,\n countedFrom: scope + \"/\" + source.countedFrom,\n members: source.members.map((member) => scope + \"/\" + member),\n };\n}\n\nexport async function checkStaleCounts(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n\n for (const doc of ctx.docs) {\n for (const claim of doc.claims.counts) {\n const source = await resolveDocCountSource(ctx.root, doc.path, claim);\n if (source === null) {\n result.skipped.push({\n check: \"stale-count\",\n doc: doc.path,\n reason: `${doc.path}: cannot resolve a workspace manifest for \"${claim.excerpt}\"`,\n });\n continue;\n }\n if (source.actual === claim.count) continue;\n result.issues.push({\n type: \"stale-count\",\n message: `says \"${claim.excerpt}\" but ${source.countedFrom} resolves to ${source.actual}`,\n anchor: { doc: doc.path, line: claim.line, excerpt: claim.excerpt },\n confidence: \"certain\",\n evidence: {\n kind: \"count-mismatch\",\n claimed: claim.count,\n actual: source.actual,\n unit: claim.unit,\n countedFrom: source.countedFrom,\n members: source.members.slice(0, MEMBERS_CAP),\n },\n });\n }\n }\n\n return result;\n}\n","import { isRecord } from \"../../utils/validation.js\";\nimport path from \"node:path\";\nimport { auditGlob, readAuditInput } from \"../inputs.js\";\nimport { documentScope } from \"../docs.js\";\nimport { scopedPath } from \"../scope.js\";\nimport type { ClaimScope, CommandClaim } from \"../types.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\nconst AVAILABLE_SCRIPTS_CAP = 30;\nfunction scriptsOf(raw: string): string[] | null {\n try {\n const pkg: unknown = JSON.parse(raw);\n if (!isRecord(pkg)) return null;\n if (pkg.scripts === undefined) return [];\n return isRecord(pkg.scripts) &&\n Object.values(pkg.scripts).every((value) => typeof value === \"string\")\n ? Object.keys(pkg.scripts)\n : null;\n } catch {\n return null;\n }\n}\n\ninterface Resolution {\n doc: string;\n claim: CommandClaim;\n scope: ClaimScope;\n manifest: string | null;\n scripts: string[];\n elsewhere: string[];\n problem?: string;\n}\n\n/** Shared dependency resolver: the cache records every manifest actually consulted. */\nexport async function commandInputs(\n root: string,\n docs: Array<{ path: string; claims: { commands: CommandClaim[] } }>,\n) {\n const contents = new Map<string, string | null>();\n const read = async (file: string) => {\n if (!contents.has(file)) contents.set(file, await readAuditInput(root, file));\n return contents.get(file)!;\n };\n await read(\"package.json\");\n let inventory: string[] | undefined;\n const resolutions: Resolution[] = [];\n for (const doc of docs)\n for (const claim of doc.claims.commands) {\n const base = documentScope(doc.path);\n const directory = scopedPath(base, claim.directory ?? \".\");\n const scope: ClaimScope = {\n basis: claim.directory === undefined ? \"document\" : \"explicit\",\n directory: directory ?? base,\n candidates: [],\n };\n const resolution: Resolution = {\n doc: doc.path,\n claim,\n scope,\n manifest: null,\n scripts: [],\n elsewhere: [],\n };\n resolutions.push(resolution);\n if (claim.scopeUnknown || directory === null) {\n resolution.problem = claim.scopeUnknown ?? \"The command's directory leaves the repository.\";\n continue;\n }\n let cursor = directory;\n while (true) {\n const manifest = path.posix.join(cursor, \"package.json\");\n scope.candidates.push(manifest);\n const raw = await read(manifest);\n if (raw !== null) {\n resolution.manifest = manifest;\n const scripts = scriptsOf(raw);\n if (scripts === null) resolution.problem = \"Invalid package manifest: \" + manifest;\n else resolution.scripts = scripts;\n break;\n }\n // An explicit directory is a declared execution scope, never silently use a sibling.\n if (claim.directory !== undefined || cursor === \".\") break;\n cursor = path.posix.dirname(cursor);\n }\n if (!resolution.manifest && !resolution.problem) {\n resolution.problem = `No package.json for the command's scope (${directory}).`;\n }\n if (\n resolution.problem ||\n resolution.scripts.includes(claim.scriptName) ||\n claim.directory !== undefined\n )\n continue;\n inventory ??= await commandManifests(root);\n for (const manifest of [...new Set([\"package.json\", ...inventory])].sort()) {\n if (scope.candidates.includes(manifest)) continue;\n scope.candidates.push(manifest);\n const raw = await read(manifest);\n if (raw === null) continue;\n const scripts = scriptsOf(raw);\n if (scripts === null)\n resolution.problem = \"Cannot establish script availability: invalid manifest \" + manifest;\n else if (scripts.includes(claim.scriptName)) resolution.elsewhere.push(manifest);\n }\n }\n return { manifests: [...contents].sort(([a], [b]) => a.localeCompare(b)), resolutions };\n}\n\nexport async function checkDeadCommands(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n const { resolutions } = await commandInputs(ctx.root, ctx.docs);\n for (const { doc, claim, scope, scripts, elsewhere, problem, manifest } of resolutions) {\n if (problem) {\n result.skipped.push({ check: \"dead-command\", doc, reason: problem });\n continue;\n }\n if (scripts.includes(claim.scriptName)) continue;\n const evidence = {\n kind: \"missing-script\" as const,\n scriptName: claim.scriptName,\n invocation: claim.invocation,\n manifestsChecked: scope.candidates,\n availableScripts: scripts.slice(0, AVAILABLE_SCRIPTS_CAP),\n scope,\n };\n const anchor = { doc, line: claim.line, excerpt: claim.excerpt };\n const message = `\\`${claim.invocation}\\` names script \"${claim.scriptName}\", which is absent from ${manifest}`;\n // Nested docs imply a package, but may describe commands run from another cwd.\n const certain = documentScope(doc) === \".\" && (scope.basis === \"explicit\" || !elsewhere.length);\n if (certain)\n result.issues.push({\n type: \"dead-command\",\n message,\n anchor,\n confidence: \"certain\",\n evidence,\n });\n else\n result.advisories.push({\n resolution: \"recheck\",\n type: \"dead-command\",\n message:\n message +\n (elsewhere.length\n ? `; it exists in ${elsewhere.join(\", \")}. Clarify the intended working directory.`\n : \"; the intended working directory needs review.\"),\n anchor,\n evidence,\n });\n }\n return result;\n}\n\n/** Ignored workspace manifests may still be explicit command dependencies. */\nexport function commandManifests(root: string): Promise<string[]> {\n return auditGlob(root, \"**/package.json\", {\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \".mason/reports/**\",\n \"package.json\",\n ],\n label: \"Command manifest discovery\",\n });\n}\n","import { isRecord } from \"../utils/validation.js\";\nimport path from \"node:path\";\nimport { parse as parseToml } from \"smol-toml\";\nimport { inspectionGit } from \"./inspection.js\";\n\nexport interface DependencyMatch {\n dependency: string;\n manifest: string;\n before: string | null;\n after: string | null;\n line: number;\n excerpt: string;\n}\n\n/** Preserve line numbers while excluding comments and Mason's generated instructions. */\nexport function dependencyText(content: string): string {\n return content\n .replace(/<!-- mason:start -->[\\s\\S]*?<!-- mason:end -->/g, (text) =>\n text.replace(/[^\\n]/g, \" \"),\n )\n .replace(/<!--[\\s\\S]*?-->/g, (text) => text.replace(/[^\\n]/g, \" \"));\n}\n\n/** Conservative supported declarations. Other ecosystems remain informational. */\nfunction declarations(file: string, source: string): Map<string, string> {\n const result = new Map<string, string>();\n if (!source) return result;\n if (path.posix.basename(file) === \"package.json\") {\n const json: unknown = JSON.parse(source);\n if (!isRecord(json)) throw new Error(\"Invalid package manifest\");\n for (const section of [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n \"engines\",\n ]) {\n const entries = json[section];\n if (entries === undefined) continue;\n if (!isRecord(entries) || !Object.values(entries).every((value) => typeof value === \"string\"))\n throw new Error(\"Invalid dependency declarations: \" + section);\n for (const [name, value] of Object.entries(entries)) {\n if (typeof value === \"string\")\n result.set(name, [...(result.has(name) ? [result.get(name)] : []), value].join(\"; \"));\n }\n }\n } else if (file.endsWith(\"libs.versions.toml\")) {\n const catalog = parseToml(source);\n const versions = catalog.versions;\n for (const section of [\"libraries\", \"plugins\"]) {\n const entries = catalog[section];\n if (entries === undefined) continue;\n if (!isRecord(entries)) throw new Error(\"Invalid version catalog: \" + section);\n for (const entry of Object.values(entries)) {\n if (typeof entry === \"string\") {\n const parts = entry.split(\":\");\n if (parts.length >= 3) result.set(parts.slice(0, -1).join(\":\"), parts.at(-1)!);\n } else if (isRecord(entry)) {\n const name =\n entry.module ??\n (typeof entry.group === \"string\" && typeof entry.name === \"string\"\n ? `${entry.group}:${entry.name}`\n : entry.id);\n const version =\n typeof entry.version === \"string\"\n ? entry.version\n : isRecord(entry.version) &&\n typeof entry.version.ref === \"string\" &&\n isRecord(versions)\n ? versions[entry.version.ref]\n : undefined;\n if (typeof name === \"string\")\n result.set(name, typeof version === \"string\" ? version : \"unspecified\");\n else throw new Error(\"Invalid version catalog entry\");\n } else throw new Error(\"Invalid version catalog entry\");\n }\n }\n } else if (/build\\.gradle(?:\\.kts)?$/.test(file)) {\n for (const match of source.matchAll(/[\"']([\\w.-]+:[\\w.-]+):([^\"'\\s]+)[\"']/g))\n result.set(match[1], match[2]);\n for (const match of source.matchAll(\n /\\bid\\s*\\(?\\s*[\"']([\\w.-]+)[\"']\\s*\\)?\\s*version\\s*[\"']([^\"']+)[\"']/g,\n ))\n result.set(match[1], match[2]);\n }\n return result;\n}\n\nexport async function matchDependencyChanges(\n root: string,\n from: string,\n head: string,\n files: string[],\n content: string,\n) {\n const matches: DependencyMatch[] = [];\n const lines = dependencyText(content).split(\"\\n\");\n let incomplete = files.length > 64;\n for (const file of files.slice(0, 64)) {\n if (!/(?:^|\\/)(?:package\\.json|libs\\.versions\\.toml|build\\.gradle(?:\\.kts)?)$/.test(file)) {\n incomplete = true;\n continue;\n }\n try {\n const read = async (revision: string) => {\n // ls-tree distinguishes a missing file (addition/deletion) from unavailable evidence.\n const { stdout: entry } = await inspectionGit(\n [\"ls-tree\", revision, \"--\", `:(literal)${file}`],\n { cwd: root, timeout: 10000 },\n );\n if (!entry) return \"\";\n if (!entry.startsWith(\"100644 \") && !entry.startsWith(\"100755 \"))\n throw new Error(\"Unsupported manifest mode\");\n return (\n await inspectionGit([\"show\", `${revision}:${file}`], {\n cwd: root,\n maxBuffer: 1024 * 1024,\n timeout: 10000,\n })\n ).stdout;\n };\n const [before, after] = await Promise.all([read(from), read(head)]);\n const old = declarations(file, before),\n next = declarations(file, after);\n for (const dependency of new Set([...old.keys(), ...next.keys()])) {\n if (old.get(dependency) === next.get(dependency)) continue;\n const escaped = dependency.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const mention = new RegExp(\n `(^|[^a-zA-Z0-9_@./-])${escaped}(?![a-zA-Z0-9_/-]|\\\\.[a-zA-Z0-9_])`,\n \"i\",\n );\n const line = lines.findIndex((text) => mention.test(text));\n if (line < 0) continue;\n matches.push({\n dependency,\n manifest: file,\n before: old.get(dependency) ?? null,\n after: next.get(dependency) ?? null,\n line: line + 1,\n excerpt: lines[line].trim().slice(0, 500),\n });\n if (matches.length >= 100) return { matches, incomplete: true };\n }\n } catch {\n incomplete = true;\n }\n }\n return { matches, incomplete };\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport type { RangeCommits } from \"./git.js\";\n\nasync function git(root: string, args: string[]) {\n return (await execGit(args, { cwd: root, timeout: 10000, maxBuffer: 2 * 1024 * 1024 })).stdout;\n}\n\n/** A deliberately narrow recognizer, not a Gradle evaluator. Unknown syntax stays advisory. */\nfunction withoutAndroidReleaseValues(text: string): string | null {\n if (\n /\\/\\*|\"\"\"|'''/.test(text) ||\n !/id\\s*\\(?\\s*[\"']com\\.android\\.(application|library)[\"']/.test(text)\n )\n return null;\n const scopes: string[] = [];\n const normalized: string[] = [];\n let assignments = 0;\n for (const line of text.split(\"\\n\")) {\n // Remove ordinary quoted strings and line comments solely for brace tracking.\n const code = line.replace(/\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\/\\/.*$/g, (token) =>\n token.startsWith(\"//\") ? \"\" : '\"\"',\n );\n const assignment = line.match(\n /^(\\s*)(versionName|versionCode)(\\s*(?:=\\s*|\\s+))(\"[A-Za-z0-9._+-]+\"|'[A-Za-z0-9._+-]+'|\\d+)(\\s*)$/,\n );\n if (\n assignment &&\n scopes.join(\"/\") === \"android/defaultConfig\" &&\n (assignment[2] === \"versionCode\" ? /^\\d+$/.test(assignment[4]) : /^[\"']/.test(assignment[4]))\n ) {\n normalized.push(\n assignment[1] + assignment[2] + assignment[3] + \"<release-value>\" + assignment[5],\n );\n assignments++;\n } else {\n // References can feed dependency coordinates or other executable configuration.\n if (/\\bversion(?:Name|Code)\\b/.test(line)) return null;\n normalized.push(line);\n }\n const named = code.match(/^\\s*(android|defaultConfig)\\s*\\{\\s*$/)?.[1];\n for (const brace of code.matchAll(/[{}]/g)) {\n if (brace[0] === \"{\") scopes.push(named ?? \"unknown\");\n else if (!scopes.length) return null;\n else scopes.pop();\n }\n }\n return assignments && !scopes.length ? normalized.join(\"\\n\") : null;\n}\n\n/** Only omit single-parent commits whose every touched manifest is proven release metadata. */\nexport async function releaseMetadataOnly(\n root: string,\n commit: RangeCommits[\"commits\"][number],\n): Promise<boolean> {\n if (\n !commit.files.length ||\n !commit.files.every((file) => /(^|\\/)build\\.gradle(?:\\.kts)?$/.test(file))\n )\n return false;\n try {\n const parents = (await git(root, [\"rev-list\", \"--parents\", \"-n\", \"1\", commit.hash]))\n .trim()\n .split(/\\s+/);\n if (parents.length !== 2) return false;\n for (const file of commit.files) {\n const raw = await git(root, [\n \"diff\",\n \"--raw\",\n \"-z\",\n \"--no-renames\",\n \"--no-ext-diff\",\n \"--no-textconv\",\n parents[1],\n commit.hash,\n \"--\",\n file,\n ]);\n if (!/^:(100644|100755) \\1 [a-f0-9]+ [a-f0-9]+ M\\0/.test(raw)) return false;\n const [before, after] = await Promise.all([\n git(root, [\"show\", parents[1] + \":\" + file]),\n git(root, [\"show\", commit.hash + \":\" + file]),\n ]);\n const previous = withoutAndroidReleaseValues(before);\n if (previous === null || previous !== withoutAndroidReleaseValues(after)) return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n","import { matchDependencyChanges } from \"../dependency-claims.js\";\nimport { documentScope } from \"../docs.js\";\nimport { releaseMetadataOnly } from \"../release-metadata.js\";\nimport { commitsTouchingSince } from \"../git.js\";\nimport { inspectionGit } from \"../inspection.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\nconst MANIFEST_COMMITS_CAP = 10;\n\n/** A relevance filter, not semantic validation of a dependency or its version. */\nexport function hasDependencyContent(content: string): boolean {\n const text = content\n .replace(/<!-- mason:start -->[\\s\\S]*?<!-- mason:end -->/g, \"\")\n .replace(/<!--[\\s\\S]*?-->/g, \"\");\n return (\n /\\b(?:dependenc(?:y|ies)|librar(?:y|ies)|frameworks?|tech(?:nology)? stack|prerequisites|requirements)\\b/i.test(\n text,\n ) ||\n /\\b(?:package\\.json|build\\.gradle(?:\\.kts)?|settings\\.gradle(?:\\.kts)?|libs\\.versions\\.toml|Cargo\\.toml|go\\.mod|pyproject\\.toml|requirements\\.txt|Gemfile|composer\\.json)\\b/i.test(\n text,\n ) ||\n /\\b(?:node(?:\\.js)?|npm|pnpm|yarn|bun|deno|python|ruby|rust|go|java|jdk|kotlin|gradle|swift|php|react|vue|angular|compose|ktor|room)\\s*(?:version\\s*)?[`*:=>~^v\\s-]*\\d+(?:\\.\\d+)*\\b/i.test(\n text,\n ) ||\n /\\b(?:npm|pnpm|yarn|pip3?|cargo|gem|composer)\\s+(?:install|add|require)\\b/i.test(text)\n );\n}\n\n/**\n * Tracked manifest files at any depth. Lockfiles are pure churn and are\n * deliberately not matched.\n */\nconst MANIFEST_PATHSPECS = [\n \":(glob)**/package.json\",\n \":(glob)**/build.gradle.kts\",\n \":(glob)**/build.gradle\",\n \"settings.gradle.kts\",\n \"settings.gradle\",\n \"gradle/libs.versions.toml\",\n \":(glob)**/Cargo.toml\",\n \"go.mod\",\n \"pyproject.toml\",\n \"requirements.txt\",\n \"Gemfile\",\n \"composer.json\",\n];\n\n/** Share exact dependency scope with persisted advisory assessments. */\nexport function manifestPathspecs(doc: string): string[] {\n const scope = documentScope(doc);\n if (scope === \".\") return MANIFEST_PATHSPECS;\n const escaped = scope.replace(/[\\\\*?[\\]]/g, \"\\\\$&\");\n return MANIFEST_PATHSPECS.map((spec) =>\n spec.startsWith(\":(glob)\")\n ? \":(glob)\" + escaped + \"/\" + spec.slice(\":(glob)\".length)\n : \":(literal)\" + scope + \"/\" + spec,\n );\n}\n\n/**\n * A matched declaration change is advisory, never proof of an incorrect claim.\n * Manifest recency without an affected passage is background information.\n */\nexport async function checkDepsChanged(ctx: CheckContext): Promise<CheckResult> {\n const result = emptyResult();\n result.suppressedAdvisories = [];\n const releaseOnly = new Map<string, boolean>();\n\n for (const doc of ctx.docs) {\n if (!doc.lastCommit) {\n result.skipped.push({\n check: \"deps-changed\",\n doc: doc.path,\n reason: `${doc.path} has no commit history`,\n });\n continue;\n }\n\n // Local edits must not erase the dependency evidence we are preparing to\n // retain. Inspect the committed document for dirty inputs, including setup.\n let content = doc.content;\n if (doc.dirty) {\n try {\n content = (\n await inspectionGit([\"show\", `${doc.lastCommit.hash}:${doc.path}`], {\n cwd: ctx.root,\n maxBuffer: 10 * 1024 * 1024,\n timeout: 10000,\n })\n ).stdout;\n } catch {\n result.skipped.push({\n check: \"deps-changed\",\n doc: doc.path,\n reason: `${doc.path}: committed dependency content is unavailable`,\n });\n continue;\n }\n }\n\n const range = await commitsTouchingSince(\n ctx.root,\n doc.lastCommit.hash,\n manifestPathspecs(doc.path),\n );\n if (range === null) {\n result.skipped.push({\n check: \"deps-changed\",\n doc: doc.path,\n reason: `${doc.path}: commit range unreachable (shallow clone?)`,\n });\n continue;\n }\n // Bound extra history reads. Older/ambiguous commits remain advisory.\n const relevant = [];\n for (const commit of range.commits) {\n if (!releaseOnly.has(commit.hash) && releaseOnly.size < 100) {\n releaseOnly.set(commit.hash, await releaseMetadataOnly(ctx.root, commit));\n }\n if (!releaseOnly.get(commit.hash)) relevant.push(commit);\n }\n range.commits = relevant;\n range.total = relevant.length;\n if (range.total === 0) continue;\n\n const relevance = await matchDependencyChanges(\n ctx.root,\n doc.lastCommit.hash,\n ctx.headHash,\n [...new Set(range.commits.flatMap((commit) => commit.files))],\n content,\n );\n // Documents without any dependency guidance or matched declaration stay quiet.\n if (!relevance.matches.length && !hasDependencyContent(content)) continue;\n const match = relevance.matches[0];\n if (doc.dirty && match)\n result.skipped.push({\n check: \"deps-changed\",\n doc: doc.path,\n reason: `${doc.path} has uncommitted edits – suppressed while in flight`,\n });\n (doc.dirty ? result.suppressedAdvisories : result.advisories).push({\n type: \"deps-changed\",\n ...(match ? {} : { resolution: \"informational\" as const }),\n message: match\n ? `${match.dependency} changed from ${match.before ?? \"absent\"} to ${match.after ?? \"removed\"} in ${match.manifest}; review ${doc.path}:${match.line}: ${match.excerpt}${relevance.matches.length > 1 ? ` (${relevance.matches.length - 1} more matches in evidence)` : \"\"}`\n : `Dependency manifests changed after the document baseline ${doc.lastCommit.hash.slice(0, 7)} (${doc.lastCommit.date.slice(0, 10)}); no specific affected passage was established. Informational only.${relevance.incomplete ? \" Some manifest declarations could not be matched.\" : \"\"}`,\n anchor: { doc: doc.path, line: match?.line ?? null, excerpt: match?.excerpt ?? null },\n evidence: {\n kind: \"doc-behind-manifests\",\n docLastCommit: doc.lastCommit,\n manifestCommits: range.commits.slice(0, MANIFEST_COMMITS_CAP),\n totalCommits: range.total,\n matches: relevance.matches,\n matchingIncomplete: relevance.incomplete,\n },\n });\n }\n\n return result;\n}\n","import { createHash } from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { createFileAccess } from \"../utils/files.js\";\nimport { anchorMatches } from \"../utils/paths.js\";\nimport {\n decisionApproval,\n effectiveDecision,\n latestDecisionInspection,\n type DecisionRecord,\n} from \"./provenance.js\";\n\nconst exec = promisify(execFile);\nconst MAX_DIFFED_FILES = 8;\nconst MAX_SHOWN_FILES = 3;\nconst MAX_SHOWN_HUNKS = 2;\nconst MAX_HUNK_LINES = 8;\nconst HISTORY_DEPTH = 20;\n\n/** The capture that drift compares against: the latest valid inspection, else the save capture. */\nexport function driftBaseline(record: DecisionRecord) {\n const effective = effectiveDecision(record);\n const inspection = latestDecisionInspection(\n record,\n decisionApproval(effective) === \"accepted\" ? \"operative\" : \"all\",\n );\n return {\n record: effective,\n capture: inspection?.capture ?? (effective.version === 2 ? effective.capture : undefined),\n commits: [inspection?.headHash, effective.refreshedHash].filter(\n (hash): hash is string => !!hash && /^[a-f0-9]{40,64}$/.test(hash),\n ),\n };\n}\n\ninterface Hunk {\n header: string;\n lines: string[];\n}\nexport interface DriftExcerpt {\n /** Identifiers named by the decision that appear in changed lines or enclosing declarations. */\n mentions: string[];\n /** `low` only when the decision names identifiers and every changed file was diffed\n * against its exact captured content without mentioning them. */\n relevance: \"mentioned\" | \"low\" | \"unknown\";\n unknownReason?: \"no-identifiers\" | \"incomplete\";\n files: Array<{ path: string; hunks: Hunk[]; omittedHunks: number; unavailable?: string }>;\n omittedFiles: string[];\n}\n\n/** Find a commit whose copy of the file has exactly the captured bytes, in one Git process. */\nasync function capturedCommit(root: string, file: string, hash: string, preferred: string[]) {\n if (/[\\n\\r]/.test(file)) return null;\n const { stdout } = await exec(\n \"git\",\n [\"--literal-pathspecs\", \"log\", \"-n\", String(HISTORY_DEPTH), \"--format=%H\", \"--\", file],\n { cwd: root, maxBuffer: 1024 * 1024 },\n );\n const commits = [...new Set([...preferred, ...stdout.split(\"\\n\").filter(Boolean)])];\n const batch = exec(\"git\", [\"cat-file\", \"--batch\"], {\n cwd: root,\n encoding: \"buffer\",\n maxBuffer: 64 * 1024 * 1024,\n });\n batch.child.stdin!.end(commits.map((commit) => `${commit}:${file}\\n`).join(\"\"));\n const output = (await batch).stdout;\n let position = 0;\n for (const commit of commits) {\n const end = output.indexOf(10, position);\n if (end < 0) break;\n const header = output.subarray(position, end).toString(\"utf8\").split(\" \");\n position = end + 1;\n if (header[1] !== \"blob\") continue;\n const size = Number(header[2]);\n const bytes = output.subarray(position, position + size);\n position += size + 1;\n if (createHash(\"sha256\").update(bytes).digest(\"hex\") === hash) return commit;\n }\n return null;\n}\n\n/** Code identifiers a decision names: backticked spans, calls, camelCase, snake_case and\n * backticked kebab-case. Ordinary prose is excluded because it overlaps with nearly any change. */\nexport function namedIdentifiers(text: string): string[] {\n const names = new Set<string>();\n const add = (name: string) => {\n if (name.length >= 3) names.add(name);\n };\n for (const [, span] of text.matchAll(/`([^`]+)`/g))\n for (const [name] of span.matchAll(/[A-Za-z_$][\\w$]*(?:-[A-Za-z0-9_$]+)*/g)) add(name);\n for (const [, name] of text.matchAll(/([A-Za-z_$][\\w$]*)\\(/g)) add(name);\n // Hyphenated prose (\"opt-in\", \"draft-only\") is not code; kebab-case names count in backticks.\n for (const [name] of text.matchAll(/[A-Za-z_$][\\w$]*/g))\n if (/[a-z][A-Z]|[_$]/.test(name)) add(name);\n return [...names];\n}\n\n/** Lowercase identifiers in code, with their camelCase and snake_case parts. */\nfunction codeTokens(code: string): Set<string> {\n const tokens = new Set<string>();\n for (const [name] of code.matchAll(/[A-Za-z_$][\\w$]*/g)) {\n tokens.add(name.toLowerCase());\n for (const part of name.split(/_+|(?<=[a-z0-9])(?=[A-Z])/))\n if (part.length >= 3) tokens.add(part.toLowerCase());\n }\n return tokens;\n}\n\nfunction parseHunks(diff: string): Hunk[] {\n const hunks: Hunk[] = [];\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"@@\")) hunks.push({ header: line, lines: [] });\n else if (hunks.length && /^[+-]/.test(line)) hunks.at(-1)!.lines.push(line);\n }\n return hunks;\n}\n\n/** Bounded changed hunks for the drifted anchor files, against the exact captured content.\n * Relevance matches identifiers the decision names against changed code; it never establishes\n * consistency and never replaces source inspection. */\nexport async function driftExcerpt(\n root: string,\n record: DecisionRecord,\n changedFiles: string[],\n): Promise<DriftExcerpt> {\n const baseline = driftBaseline(record);\n const excerpt: DriftExcerpt = { mentions: [], relevance: \"unknown\", files: [], omittedFiles: [] };\n const named = namedIdentifiers(`${baseline.record.title}\\n${baseline.record.body}`);\n const found = new Set<string>();\n let complete = !!baseline.capture && changedFiles.length <= MAX_DIFFED_FILES;\n const access = await createFileAccess(root);\n for (const [index, file] of changedFiles.slice(0, MAX_DIFFED_FILES).entries()) {\n let hunks: Hunk[] | null = null;\n let unavailable: string | undefined;\n const captured = baseline.capture?.files[file];\n try {\n if (!baseline.capture?.anchors.some((anchor) => anchorMatches(anchor, file))) {\n unavailable = \"not in the captured anchor scope\";\n } else if (captured === undefined) {\n // Added since capture: every current line is new.\n const source = await access.read(file);\n if (source)\n hunks = [\n {\n header: \"(added since capture)\",\n lines: source.content\n .replace(/\\r?\\n$/, \"\")\n .split(\"\\n\")\n .map((line) => \"+\" + line),\n },\n ];\n else unavailable = \"added since capture but unreadable\";\n } else {\n const commit = await capturedCommit(root, file, captured, baseline.commits);\n if (!commit) unavailable = \"captured content is not in recent Git history\";\n else {\n const { stdout } = await exec(\n \"git\",\n [\n \"--literal-pathspecs\",\n \"diff\",\n \"--no-ext-diff\",\n \"--no-textconv\",\n \"--no-color\",\n \"--no-renames\",\n \"-U0\",\n commit,\n \"--\",\n file,\n ],\n { cwd: root, maxBuffer: 1024 * 1024 },\n );\n hunks = parseHunks(stdout);\n }\n }\n } catch {\n unavailable = \"diff could not be read within its bounds\";\n }\n // Binary and mode-only changes have no hunks to compare, so they cannot be low relevance.\n if (!hunks?.length) complete = false;\n const code = (hunks ?? [])\n .map((hunk) => [hunk.header, ...hunk.lines.map((line) => line.slice(1))].join(\"\\n\"))\n .join(\"\\n\");\n const tokens = codeTokens(code);\n for (const name of named)\n if (\n name.includes(\"-\")\n ? code.toLowerCase().includes(name.toLowerCase())\n : tokens.has(name.toLowerCase())\n )\n found.add(name);\n if (index >= MAX_SHOWN_FILES) excerpt.omittedFiles.push(file);\n else\n excerpt.files.push({\n path: file,\n hunks: (hunks ?? [])\n .slice(0, MAX_SHOWN_HUNKS)\n .map((hunk) => ({ ...hunk, lines: hunk.lines.slice(0, MAX_HUNK_LINES) })),\n omittedHunks: Math.max(0, (hunks?.length ?? 0) - MAX_SHOWN_HUNKS),\n ...(unavailable ? { unavailable } : {}),\n });\n }\n excerpt.omittedFiles.push(...changedFiles.slice(MAX_DIFFED_FILES));\n excerpt.mentions = [...found].sort();\n excerpt.relevance = found.size ? \"mentioned\" : complete && named.length ? \"low\" : \"unknown\";\n if (excerpt.relevance === \"unknown\")\n excerpt.unknownReason = named.length ? \"incomplete\" : \"no-identifiers\";\n return excerpt;\n}\n\nexport function formatDriftExcerpt(title: string, id: string, excerpt: DriftExcerpt): string {\n const safe = (value: string, max = 160) =>\n value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \").slice(0, max);\n const lines = [`Changed lines for decision ${JSON.stringify(safe(title, 250))} (${safe(id)}):`];\n lines.push(\n excerpt.relevance === \"mentioned\"\n ? ` Changed lines mention identifiers named by the decision: ${excerpt.mentions.map((name) => safe(name, 60)).join(\", \")}.`\n : excerpt.relevance === \"low\"\n ? \" Low relevance: no changed line or enclosing declaration mentions an identifier named by the decision. This is a name match, not evidence of consistency; inspect before recording.\"\n : excerpt.unknownReason === \"no-identifiers\"\n ? \" Relevance not assessed: the decision names no code identifiers (such as `refresh()` or onRefresh) to match against the changes.\"\n : \" Relevance unknown: some changed content could not be compared with its captured version.\",\n );\n for (const file of excerpt.files) {\n if (file.unavailable) {\n lines.push(` ${safe(file.path)}: ${file.unavailable}.`);\n continue;\n }\n for (const hunk of file.hunks)\n lines.push(\n ` ${safe(file.path)} ${safe(hunk.header, 120)}`,\n ...hunk.lines.map((line) => \" \" + safe(line)),\n );\n if (!file.hunks.length) lines.push(` ${safe(file.path)}: changed without text hunks.`);\n if (file.omittedHunks) lines.push(` ${safe(file.path)}: ${file.omittedHunks} more hunk(s).`);\n }\n if (excerpt.omittedFiles.length)\n lines.push(` ${excerpt.omittedFiles.length} more changed file(s) not shown.`);\n return lines.join(\"\\n\");\n}\n","import { captureAnchorScopes, changedCaptureFiles, type AnchorCapture } from \"./anchors.js\";\nimport path from \"node:path\";\nimport { getChangesWithStatus, getWorkingTree, touchedPaths } from \"../drift/drift.js\";\nimport { matchingPaths } from \"../utils/paths.js\";\nimport type { Freshness } from \"../context/trust.js\";\nimport type { StoreDiagnostic } from \"../utils/storage.js\";\nimport { getCurrentGitHash } from \"../snapshot/snapshot.js\";\nimport { loadDecisionStore } from \"./decisions.js\";\nimport { driftBaseline } from \"./excerpts.js\";\nimport type { DecisionRecord } from \"./decisions.js\";\nimport { decisionApproval, effectiveDecision, latestDecisionInspection } from \"./provenance.js\";\n\n/**\n * Deliberately separate from DriftReport: mason-drift's exit codes and\n * --json shape are a CI contract, and `stale` there means MAP staleness.\n * Decision staleness is additive on top.\n */\nexport interface DecisionDriftReport {\n historyAvailable: boolean;\n freshness?: Record<string, Freshness>;\n diagnostics?: StoreDiagnostic[];\n totalDecisions: number;\n /** Decision id → committed and local anchor files changed since the evidence baseline. */\n staleDecisions: Record<string, string[]>;\n /** Draft anchors have their own freshness; they cannot replace accepted anchors. */\n pendingProposals?: Record<string, { freshness: Freshness; changedFiles: string[] }>;\n}\n\n/**\n * Flag active decisions whose anchor files changed since the record was\n * last verified. Anchorless decisions have unknown freshness and do not\n * contribute to committed drift.\n * Deterministic — git only, no LLM.\n */\nexport async function computeDecisionDrift(\n rootDir: string,\n decisions?: DecisionRecord[],\n): Promise<DecisionDriftReport> {\n const resolvedRoot = path.resolve(rootDir);\n const store = decisions\n ? { records: decisions, diagnostics: [] }\n : await loadDecisionStore(resolvedRoot);\n const report: DecisionDriftReport = {\n historyAvailable: true,\n totalDecisions: store.records.length,\n staleDecisions: {},\n freshness: {},\n diagnostics: store.diagnostics,\n };\n const [head, workingTree] = await Promise.all([\n getCurrentGitHash(resolvedRoot),\n getWorkingTree(resolvedRoot),\n ]);\n const changesByHash = new Map<string, string[] | null>();\n const baselines = store.records\n .filter((record) => record.status === \"active\")\n .flatMap((record) => {\n const effective = effectiveDecision(record);\n return [...new Set([effective, record])].flatMap((candidate) => {\n const inspection = latestDecisionInspection(\n record,\n candidate === effective && decisionApproval(effective) === \"accepted\"\n ? \"operative\"\n : \"all\",\n );\n const capture =\n inspection?.capture ?? (candidate.version === 2 ? candidate.capture : undefined);\n return capture ? [capture] : [];\n });\n });\n const captures = await captureAnchorScopes(\n resolvedRoot,\n baselines.map((baseline) => baseline.anchors),\n );\n const currentCaptures = new Map(\n baselines.map((baseline, index) => [JSON.stringify(baseline.anchors), captures[index]]),\n );\n const inspect = async (\n record: DecisionRecord,\n inspectionCapture?: AnchorCapture,\n ): Promise<{ freshness: Freshness; changedFiles: string[] }> => {\n if (record.files.length === 0) return { freshness: \"unknown\", changedFiles: [] };\n const baseline = inspectionCapture ?? (record.version === 2 ? record.capture : undefined);\n if (baseline) {\n const current = currentCaptures.get(JSON.stringify(baseline.anchors))!;\n const hits = changedCaptureFiles(baseline, current).filter(\n (file) => matchingPaths(record.files, [file]).length,\n );\n return {\n freshness:\n !baseline.complete || !current.complete ? \"unknown\" : hits.length ? \"changed\" : \"current\",\n changedFiles: hits,\n };\n }\n let touched = changesByHash.get(record.refreshedHash);\n if (touched === undefined) {\n const changes =\n record.refreshedHash === head && head !== \"unknown\"\n ? []\n : await getChangesWithStatus(resolvedRoot, record.refreshedHash);\n touched = changes === null ? null : touchedPaths(changes);\n changesByHash.set(record.refreshedHash, touched);\n }\n if (touched === null) report.historyAvailable = false;\n const hits = touched ? matchingPaths(record.files, touched) : [];\n const localHits = matchingPaths(record.files, workingTree.changedFiles);\n return {\n freshness:\n touched === null || !workingTree.available\n ? \"unknown\"\n : hits.length || localHits.length\n ? \"changed\"\n : \"current\",\n changedFiles: [...new Set([...hits, ...localHits])].sort(),\n };\n };\n for (const record of store.records) {\n if (record.status !== \"active\") continue;\n // Shared with drift excerpts so hunks are shown against the same captured baseline.\n const baseline = driftBaseline(record);\n const state = await inspect(baseline.record, baseline.capture);\n report.freshness![record.id] = state.freshness;\n if (state.changedFiles.length) report.staleDecisions[record.id] = state.changedFiles;\n if (baseline.record !== record)\n (report.pendingProposals ??= {})[record.id] = await inspect(\n record,\n latestDecisionInspection(record)?.capture,\n );\n }\n return report;\n}\n","import { computeDecisionDrift } from \"../../decisions/drift.js\";\nimport { loadDecisionStore } from \"../../decisions/decisions.js\";\nimport { decisionProvenance, effectiveDecision } from \"../../decisions/provenance.js\";\nimport type { CheckContext, CheckResult } from \"./index.js\";\nimport { emptyResult } from \"./index.js\";\n\n/**\n * Advisory only, and only when .mason/decisions/ exists (the zero-setup\n * path stays dark on bare repos). Decision records encode human knowledge —\n * they are surfaced for re-verification, never rewritten by the fix agent.\n */\nexport async function checkDecisionAnchors(\n ctx: CheckContext,\n): Promise<CheckResult & { incompleteDecisions: string[] }> {\n // One entry per skip caused by a single decision's anchor evidence; the remaining\n // skips (store diagnostics, missing history) leave every decision unverifiable.\n const result = { ...emptyResult(), incompleteDecisions: [] as string[] };\n if (!ctx.decisionsPresent) return result;\n\n const store = await loadDecisionStore(ctx.root);\n const records = store.records;\n for (const diagnostic of store.diagnostics)\n result.skipped.push({\n check: \"decision-anchor-drift\",\n reason: `${diagnostic.path}: ${diagnostic.message}`,\n });\n const drift = await computeDecisionDrift(ctx.root, records);\n if (!drift.historyAvailable) {\n result.skipped.push({\n check: \"decision-anchor-drift\",\n reason: \"some decision base commits are unreachable (shallow clone?)\",\n });\n }\n\n const changed = records\n .filter((record) => record.status === \"active\")\n .flatMap(\n (record) =>\n [\n {\n record: effectiveDecision(record),\n changedFiles: drift.staleDecisions[record.id] ?? [],\n freshness: drift.freshness?.[record.id] ?? \"unknown\",\n },\n ...(drift.pendingProposals?.[record.id]\n ? [{ record, ...drift.pendingProposals[record.id] }]\n : []),\n ] as const,\n );\n for (const { record, changedFiles, freshness } of changed) {\n if (freshness === \"unknown\" && record.files.length) {\n result.skipped.push({\n check: \"decision-anchor-drift\",\n reason: `Anchor evidence for decision ${record.id} is incomplete or unreadable`,\n });\n result.incompleteDecisions.push(record.id);\n continue;\n }\n if (!changedFiles.length) continue;\n const id = record.id;\n const provenance = decisionProvenance(record, freshness);\n result.advisories.push({\n type: \"decision-anchor-drift\",\n message: `decision \"${record.title}\" (${provenance.approval}) has anchors changed since capture or review; consistency is unchecked`,\n anchor: {\n doc: `.mason/decisions/${id}.json`,\n line: null,\n excerpt: record.title,\n },\n evidence: {\n kind: \"decision-anchor\",\n provenance,\n decisionId: id,\n title: record.title,\n changedFiles,\n refreshedHash: record.refreshedHash,\n },\n });\n }\n\n return result;\n}\n","import type { FileChange } from \"../../drift/drift.js\";\nimport type { AuditAdvisory, AuditIssue, CheckName } from \"../types.js\";\nimport type { AuditDoc } from \"../docs.js\";\nimport { checkDeletedReferences } from \"./deleted-reference.js\";\nimport { checkNewModules } from \"./new-module.js\";\nimport { checkStaleCounts } from \"./stale-count.js\";\nimport { checkDeadCommands } from \"./dead-command.js\";\nimport { checkDepsChanged } from \"./deps-changed.js\";\nimport { checkDecisionAnchors } from \"./decision-anchor.js\";\n\nexport interface CheckContext {\n root: string;\n docs: AuditDoc[];\n headHash: string;\n /** Doc path → changes since the doc's last commit; null when uncomputable. */\n changesSinceDoc: Map<string, FileChange[] | null>;\n /** Whether .mason/decisions/ exists. */\n decisionsPresent: boolean;\n}\n\nexport interface CheckResult {\n issues: AuditIssue[];\n advisories: AuditAdvisory[];\n suppressedAdvisories?: AuditAdvisory[];\n skipped: Array<{ check: string; reason: string; doc?: string }>;\n}\n\nexport type CheckFn = (ctx: CheckContext) => Promise<CheckResult>;\n\nexport const CHECKS: Record<CheckName, CheckFn> = {\n \"deleted-reference\": checkDeletedReferences,\n \"new-module\": checkNewModules,\n \"stale-count\": checkStaleCounts,\n \"dead-command\": checkDeadCommands,\n \"deps-changed\": checkDepsChanged,\n \"decision-anchor-drift\": checkDecisionAnchors,\n};\n\nexport function emptyResult(): CheckResult {\n return { issues: [], advisories: [], skipped: [] };\n}\n","import { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport type { AuditIssue, AuditAdvisory } from \"./types.js\";\nexport type Finding = AuditIssue | AuditAdvisory;\nexport const digest = (value: unknown) =>\n createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\");\nexport const checkSchema = z.enum([\n \"deleted-reference\",\n \"new-module\",\n \"stale-count\",\n \"dead-command\",\n \"deps-changed\",\n \"decision-anchor-drift\",\n]);\nexport const commitSchema = z.object({\n hash: z.string().regex(/^[a-f0-9]{40,64}$/),\n date: z.string(),\n subject: z.string(),\n});\nconst anchorSchema = z.object({\n doc: z.string(),\n line: z.number().int().positive().nullable(),\n excerpt: z.string().nullable(),\n});\nconst count = z.number().int().nonnegative();\nconst scopeSchema = z.object({\n basis: z.enum([\"repository\", \"document\", \"document-link\", \"explicit\"]),\n directory: z.string(),\n candidates: z.array(z.string()),\n});\nconst evidenceSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"missing-path\"),\n claimed: z.string(),\n renamedTo: z.string().nullable(),\n deletedInCommit: commitSchema.nullable(),\n everTracked: z.boolean(),\n parentDirExists: z.boolean(),\n resolvedPath: z.string().optional(),\n scope: scopeSchema.optional(),\n }),\n z.object({\n kind: z.literal(\"unmentioned-dir\"),\n dir: z.string(),\n sourceFileCount: count,\n firstCommit: commitSchema.nullable(),\n checkedDocs: z.array(z.string()),\n }),\n z.object({\n kind: z.literal(\"count-mismatch\"),\n claimed: count,\n actual: count,\n unit: z.string(),\n countedFrom: z.string(),\n members: z.array(z.string()),\n }),\n z.object({\n kind: z.literal(\"missing-script\"),\n scriptName: z.string(),\n invocation: z.string(),\n manifestsChecked: z.array(z.string()),\n availableScripts: z.array(z.string()),\n scope: scopeSchema.optional(),\n }),\n z.object({\n kind: z.literal(\"doc-behind-manifests\"),\n docLastCommit: commitSchema,\n manifestCommits: z.array(commitSchema.extend({ files: z.array(z.string()) })),\n totalCommits: count,\n matches: z\n .array(\n z.object({\n dependency: z.string(),\n manifest: z.string(),\n before: z.string().nullable(),\n after: z.string().nullable(),\n line: z.number().int().positive(),\n excerpt: z.string(),\n }),\n )\n .optional(),\n matchingIncomplete: z.boolean().optional(),\n }),\n z.object({\n kind: z.literal(\"decision-anchor\"),\n decisionId: z.string(),\n title: z.string(),\n changedFiles: z.array(z.string()),\n refreshedHash: z.string(),\n provenance: z.object({}).passthrough().optional(),\n }),\n]);\nconst findingSchema = z.object({\n message: z.string(),\n anchor: anchorSchema,\n evidence: evidenceSchema,\n});\nexport const issueSchema = findingSchema.extend({\n type: z.enum([\"deleted-reference\", \"new-module\", \"stale-count\", \"dead-command\"]),\n confidence: z.enum([\"certain\", \"likely\"]),\n});\nexport const advisorySchema = findingSchema.extend({\n type: checkSchema,\n resolution: z.enum([\"recheck\", \"informational\"]).optional(),\n});\nexport const checkResultSchema = z.object({\n issues: z.array(issueSchema),\n advisories: z.array(advisorySchema),\n suppressedAdvisories: z.array(advisorySchema).optional(),\n skipped: z.array(z.object({ check: z.string(), reason: z.string(), doc: z.string().optional() })),\n});\n/** Lines and wording can change without changing the underlying claim. */\nexport function findingId(finding: Finding): string {\n const e = finding.evidence;\n let key: unknown;\n switch (e.kind) {\n case \"missing-path\":\n key =\n e.resolvedPath && e.resolvedPath !== e.claimed ? [e.claimed, e.resolvedPath] : e.claimed;\n break;\n case \"unmentioned-dir\":\n key = e.dir;\n break;\n case \"count-mismatch\":\n key = [e.unit.replace(/s$/, \"\"), e.countedFrom];\n break;\n case \"missing-script\":\n key = e.scope && e.scope.directory !== \".\" ? [e.scriptName, e.scope.directory] : e.scriptName;\n break;\n case \"doc-behind-manifests\":\n key = null;\n break;\n case \"decision-anchor\":\n key = [e.decisionId, e.provenance?.revision, e.provenance?.approval];\n break;\n }\n return digest([finding.type, finding.anchor.doc, key]);\n}\n","/** Pending entries in one session; one turn rarely has more unfinished tool calls. */\nexport const PENDING_LIMIT = 32;\n\n/** Make room for one more pending tool call by dropping the oldest insertions. A dropped call\n * that later completes records a coverage gap instead of an observed edit. */\nexport function boundPending(pending: Record<string, unknown>) {\n for (const key of Object.keys(pending).slice(0, -PENDING_LIMIT + 1)) delete pending[key];\n}\n","import { z } from \"zod\";\nimport { anchorCaptureSchema, changedCaptureFiles } from \"../decisions/anchors.js\";\nimport type { Inputs } from \"./evidence.js\";\nimport { digest } from \"../audit/findings.js\";\nimport { boundPending } from \"./pending-tools.js\";\nimport type { State } from \"./store.js\";\nimport type { AutomationEvent, AutomationReport } from \"./runtime.js\";\n\nconst evidenceSchema = z.record(z.object({ digest: z.string(), capture: anchorCaptureSchema }));\nexport const stopReviewSchema = z.object({\n pending: z.record(z.object({ head: z.string(), evidence: evidenceSchema })),\n edited: z.record(z.record(z.string().nullable())),\n delivered: z.record(z.object({ digest: z.string(), files: z.record(z.string().nullable()) })),\n});\ntype Session = State[\"sessions\"][string];\nconst empty = (): z.infer<typeof stopReviewSchema> => ({ pending: {}, edited: {}, delivered: {} });\n\n/** Only paired captures establish observed edits, independently of commits and dirty status. */\nexport function observeDecisionEdits(session: Session, inputs: Inputs, event: AutomationEvent) {\n if (event.host !== \"claude\" || !event.mutating || !event.toolId) return;\n const state = (session.stopReview ??= empty());\n if (event.event === \"before_tool\") {\n // Each entry copies all decision evidence; a call that never completes must not accumulate.\n boundPending(state.pending);\n state.pending[event.toolId] = { head: inputs.head, evidence: inputs.decisionEvidence };\n } else if (event.event === \"after_tool\") {\n const before = state.pending[event.toolId];\n delete state.pending[event.toolId];\n // A pull/merge/checkout can change content without a local edit. If HEAD moved,\n // retain earlier observations but do not attribute this interval to the agent.\n if (!before || before.head !== inputs.head) return;\n for (const [id, previous] of Object.entries(before.evidence)) {\n const current = inputs.decisionEvidence[id];\n if (\n !current ||\n !previous.capture.complete ||\n !current.capture.complete ||\n digest(previous.capture.anchors) !== digest(current.capture.anchors)\n )\n continue;\n const edited = (state.edited[id] ??= {});\n for (const file of changedCaptureFiles(previous.capture, current.capture)) {\n edited[file] = current.capture.files[file] ?? null;\n }\n }\n }\n}\n\n/** Delivery is not resolution. Only explicit resolution clears its receipt. */\nexport function clearResolvedStopReviews(sessions: State[\"sessions\"], report: AutomationReport) {\n if (\n report.status === \"unavailable\" ||\n report.checks.skipped.some((check) => check.check === \"decision-anchor-drift\")\n )\n return;\n const active = new Set(\n report.findings.flatMap((finding) => {\n const evidence = (finding.current ?? finding.original).evidence;\n return evidence.kind === \"decision-anchor\" &&\n finding.status !== \"resolved\" &&\n (finding.current || finding.status === \"unverified\")\n ? [evidence.decisionId]\n : [];\n }),\n );\n for (const session of Object.values(sessions)) {\n if (!session.stopReview) continue;\n for (const id of Object.keys(session.stopReview.delivered)) {\n if (!active.has(id)) delete session.stopReview.delivered[id];\n }\n }\n}\n\nexport function decisionStopReview(\n session: Session,\n inputs: Inputs,\n report: AutomationReport,\n reentry: boolean,\n) {\n const state = (session.stopReview ??= empty());\n const decisions = new Map<\n string,\n { title: string; digest: string; files: Record<string, string | null> }\n >();\n for (const finding of report.findings) {\n const evidence = finding.current?.evidence;\n if (\n finding.status === \"resolved\" ||\n finding.status === \"unverified\" ||\n evidence?.kind !== \"decision-anchor\"\n )\n continue;\n const current = inputs.decisionEvidence[evidence.decisionId];\n const edited = state.edited[evidence.decisionId];\n if (\n !current?.capture.complete ||\n !edited ||\n !evidence.changedFiles.some(\n (file) =>\n Object.hasOwn(edited, file) && edited[file] === (current.capture.files[file] ?? null),\n )\n )\n continue;\n const value = decisions.get(evidence.decisionId) ?? {\n title: evidence.title,\n digest: current.digest,\n files: {},\n };\n for (const file of evidence.changedFiles) {\n if (Object.hasOwn(edited, file) && edited[file] === (current.capture.files[file] ?? null))\n value.files[file] = edited[file];\n }\n decisions.set(evidence.decisionId, value);\n }\n if (!decisions.size) return { reason: null, block: false, decisions: [] as string[] };\n let fresh = false;\n for (const [id, value] of decisions) {\n const previous = state.delivered[id];\n if (\n previous?.digest !== value.digest ||\n Object.entries(value.files).some(\n ([file, digest]) => !Object.hasOwn(previous.files, file) || previous.files[file] !== digest,\n )\n )\n fresh = true;\n // Consume feedback on re-entry too: another hook may have continued the turn.\n state.delivered[id] = {\n digest: value.digest,\n files: { ...(previous?.digest === value.digest ? previous.files : {}), ...value.files },\n };\n }\n const safe = (value: string) => value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \").slice(0, 250);\n const reason = [\n \"Mason: unresolved decision drift overlaps changes observed during this session. Before ending the turn, inspect these decisions:\",\n ...[...decisions].map(\n ([id, value]) =>\n `Decision ${JSON.stringify(safe(value.title))} (${safe(id)}): review_decision(action: \"prepare\", id: ${JSON.stringify(id)}).`,\n ),\n 'Check the claims against the source and diff. When an accepted revision exists, prepare and inspect with inspectionScope: \"operative\" to assess it separately; a contradictory pending draft remains unassessed and must not be promoted. For proposal-only or legacy records use the default all scope. If no contradiction is found in the selected scope, record action: \"inspect\" with the reviewToken, actual inspector, and a note explaining the evidence. \"Expected changes\" or \"my own commits\" are not evidence.',\n \"If contradicted or uncertain, explain the mismatch to the user and request direction. Do not accept, reaffirm, or retire a decision without authorized human review. A revised proposal leaves the accepted revision operative until reviewed.\",\n `Evidence: ${report.reportPath}. Concurrent changes can contribute; captures do not prove authorship. This reminder does not resolve the finding.`,\n ].join(\"\\n\");\n return { reason, block: !reentry && fresh, decisions: [...decisions.keys()] };\n}\n","import { z } from \"zod\";\nimport type { RepairFinding } from \"../audit/repair.js\";\nimport { digest } from \"../audit/findings.js\";\n\n// Compare conditions, not report wording, line numbers, commit IDs, or timestamps.\nconst conditionSchema = z.object({\n level: z.number(),\n facts: z.array(z.string()),\n magnitude: z.number().optional(),\n});\nconst MAX_COMPLETION_FINDINGS = 4;\n\ntype Condition = z.infer<typeof conditionSchema>;\nexport const notificationStateSchema = z.object({\n version: z.literal(1),\n baselineHead: z.string(),\n baseline: z.record(conditionSchema),\n delivered: z.record(conditionSchema),\n cleared: z.array(z.string()),\n});\nexport type NotificationState = z.infer<typeof notificationStateSchema>;\n\nfunction condition(finding: RepairFinding): { id: string; condition: Condition } {\n const source = finding.current ?? finding.original;\n const e = source.evidence;\n // Decision approval/revision changes alone do not create a new drift condition.\n const id =\n e.kind === \"decision-anchor\"\n ? digest([source.type, source.anchor.doc, e.decisionId])\n : finding.id;\n const result: Condition = { level: \"confidence\" in source ? 2 : 1, facts: [] };\n switch (e.kind) {\n case \"count-mismatch\":\n result.magnitude = Math.abs(e.actual - e.claimed);\n break;\n case \"unmentioned-dir\":\n result.magnitude = e.sourceFileCount;\n break;\n case \"decision-anchor\":\n result.facts = [...e.changedFiles].sort();\n break;\n case \"doc-behind-manifests\":\n result.facts = (e.matches ?? [])\n .map((m) => JSON.stringify([m.manifest, m.dependency, m.after]))\n .sort();\n break;\n // For missing paths/scripts, the finding ID already identifies the condition.\n }\n return { id, condition: result };\n}\n\nexport function notificationConditions(findings: RepairFinding[]): Record<string, Condition> {\n const active = findings.filter((f) => f.status !== \"resolved\");\n const currentIds = new Set(active.filter((f) => f.current).map((f) => condition(f).id));\n const result: Record<string, Condition> = {};\n for (const f of active) {\n const value = condition(f);\n // Historical revisions must not override current evidence for the same decision.\n if (!f.current && currentIds.has(value.id)) continue;\n const previous = result[value.id];\n result[value.id] = previous\n ? {\n level: Math.max(previous.level, value.condition.level),\n facts: [...new Set([...previous.facts, ...value.condition.facts])].sort(),\n ...(previous.magnitude !== undefined || value.condition.magnitude !== undefined\n ? { magnitude: Math.max(previous.magnitude ?? 0, value.condition.magnitude ?? 0) }\n : {}),\n }\n : value.condition;\n }\n return result;\n}\n\nexport function createNotificationState(\n findings: RepairFinding[],\n head: string,\n): NotificationState {\n return {\n version: 1,\n baselineHead: head,\n baseline: notificationConditions(findings),\n delivered: {},\n cleared: [],\n };\n}\n\nfunction worsened(current: Condition, previous?: Condition): boolean {\n return (\n !previous ||\n current.level > previous.level ||\n (current.magnitude ?? 0) > (previous.magnitude ?? 0) ||\n current.facts.some((fact) => !previous.facts.includes(fact))\n );\n}\n\n/** Each delivery channel owns its state; explicit audits never consume notifications. */\nexport function completionFindings(\n state: NotificationState,\n findings: RepairFinding[],\n): RepairFinding[] {\n const current = notificationConditions(findings);\n const cleared = new Set(state.cleared);\n const resolvedIds = new Set(\n findings.filter((f) => f.status === \"resolved\").map((f) => condition(f).id),\n );\n for (const id of Object.keys(state.baseline))\n if (resolvedIds.has(id) && !current[id]) cleared.add(id);\n state.cleared = [...cleared];\n\n const selected: RepairFinding[] = [];\n const selectedIds = new Set<string>();\n const delivered: Record<string, Condition> = { ...state.delivered };\n for (const finding of findings) {\n const value = condition(finding);\n const previous = state.delivered[value.id];\n value.condition = current[value.id] ?? value.condition;\n // Missing or temporarily unverified evidence must not erase delivery history.\n if (finding.status === \"unverified\" || (!finding.current && finding.status !== \"resolved\")) {\n continue;\n }\n if (finding.status === \"resolved\") {\n if (!current[value.id]) delete delivered[value.id];\n continue;\n }\n const eligible = cleared.has(value.id) || worsened(value.condition, state.baseline[value.id]);\n if (!eligible) continue;\n if (!selectedIds.has(value.id) && worsened(value.condition, previous)) {\n selectedIds.add(value.id);\n const source = finding.current!;\n selected.push(\n source.evidence.kind === \"decision-anchor\"\n ? {\n ...finding,\n current: {\n ...source,\n evidence: { ...source.evidence, changedFiles: value.condition.facts },\n },\n }\n : finding,\n );\n // Only displayed findings count as delivered. Overflow remains eligible\n // for the next completion, including after a session restart.\n if (selected.length <= MAX_COMPLETION_FINDINGS) delivered[value.id] = value.condition;\n }\n }\n state.delivered = delivered;\n return selected;\n}\n\nexport function completionSummary(findings: RepairFinding[], reportPath: string): string | null {\n if (!findings.length) return null;\n const safe = (value: string) => value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \").slice(0, 250);\n return [\n `Mason: ${findings.length} new or worsened finding(s) since the retained baseline.`,\n ...findings.slice(0, MAX_COMPLETION_FINDINGS).map((f) => {\n const source = f.current ?? f.original;\n if (source.evidence.kind === \"decision-anchor\") {\n const evidence = source.evidence;\n return [\n `[advisory] Decision \"${safe(evidence.title)}\" has ${evidence.changedFiles.length} anchored file(s) changed since capture or review; consistency is unchecked.`,\n `Inspect the decision and diff with review_decision(action: \"prepare\", id: ${JSON.stringify(evidence.decisionId)}). Record action: \"inspect\" after source inspection finds no contradiction; human acceptance is not required.`,\n `Changed files: ${safe(evidence.changedFiles.join(\", \"))}`,\n ].join(\"\\n\");\n }\n return `[${f.status === \"unresolved\" ? \"issue\" : \"advisory\"}] ${safe(source.anchor.doc)}: ${safe(source.message)}`;\n }),\n ...(findings.length > MAX_COMPLETION_FINDINGS\n ? [`${findings.length - MAX_COMPLETION_FINDINGS} more in the report; pending later feedback.`]\n : []),\n `Evidence: ${reportPath}. Explicit audit: mason_automation(action: \"check\").`,\n \"Inspect findings within the authorized work. Concurrent changes may also contribute; this summary does not establish who introduced them.\",\n ].join(\"\\n\");\n}\n","import { z } from \"zod\";\nimport { withStoreLock } from \"../utils/store-lock.js\";\nimport { stopReviewSchema } from \"./stop-review.js\";\nimport { notificationStateSchema } from \"./notifications.js\";\nimport { STORE_MAX_BYTES } from \"../utils/storage.js\";\n\nexport const hostSchema = z.enum([\"claude\", \"codex\"]);\nexport type Host = z.infer<typeof hostSchema>;\nexport const events = [\n \"session_start\",\n \"turn_start\",\n \"before_tool\",\n \"after_tool\",\n \"task_end\",\n] as const;\nexport type Event = (typeof events)[number];\nexport const stateSchema = z.object({\n version: z.literal(1),\n root: z.string(),\n gitDir: z.string(),\n branch: z.string(),\n baselines: z\n .array(\n z.object({ path: z.string(), at: z.string(), event: z.string(), fingerprint: z.string() }),\n )\n .max(128),\n sessions: z.record(\n z.object({\n host: hostSchema,\n lastUsed: z.string(),\n notifiedDiagnostics: z.array(z.string()).default([]),\n /** Digest of the upstream drift notice already shown to this session. */\n upstreamNotice: z.string().optional(),\n pending: z.record(z.string()),\n stopReview: stopReviewSchema.optional(),\n coverageGaps: z.array(z.string()),\n events: z.record(z.object({ at: z.string(), count: z.number().int().positive() })),\n }),\n ),\n updatedAt: z.string(),\n fingerprint: z.string().nullable(),\n latest: z.string().nullable(),\n guidance: z.object({ fingerprint: z.string(), path: z.string() }).optional(),\n notifications: notificationStateSchema.optional(),\n agentNotifications: notificationStateSchema.optional(),\n analysis: z\n .object({ id: z.string(), fingerprint: z.string(), completedAt: z.number(), path: z.string() })\n .optional(),\n});\nexport type State = z.infer<typeof stateSchema>;\nexport function parseState(raw: unknown): State {\n try {\n return stateSchema.parse(raw);\n } catch (error) {\n throw new Error(\"Invalid automation state; original evidence was retained.\", { cause: error });\n }\n}\n\n/** Sessions kept when a new one arrives; the least recently used beyond this are evicted. */\nexport const SESSION_LIMIT = 32;\nconst IDLE_PENDING_MS = 24 * 60 * 60 * 1000;\n/** Oversized stores are read so they can be shrunk instead of failing every hook. */\nexport const STATE_READ_MAX_BYTES = 64 * 1024 * 1024;\n\n/**\n * Unfinished tool calls never outlive their turn: a denied or interrupted call (and a failed\n * one on hosts without a failure hook) never reports completion. Dropping the entry loses no\n * evidence; a later post-tool event without it records a coverage gap.\n */\nexport function clearPendingTools(session: State[\"sessions\"][string]) {\n session.pending = {};\n if (session.stopReview) session.stopReview.pending = {};\n}\n\n/** Expire leaked tool calls from idle sessions and evict least recently used sessions, never\n * the active one. Unfinished calls do not protect a session: a stale capture is worth less than\n * automation for every new session. */\nexport function pruneSessions(\n state: State,\n now: Date,\n active: string | null,\n limit = SESSION_LIMIT,\n) {\n for (const session of Object.values(state.sessions))\n if (now.getTime() - Date.parse(session.lastUsed) > IDLE_PENDING_MS) clearPendingTools(session);\n const evictable = Object.keys(state.sessions)\n .filter((key) => key !== active)\n .sort((a, b) => state.sessions[a].lastUsed.localeCompare(state.sessions[b].lastUsed));\n const excess = Object.keys(state.sessions).length - limit;\n for (const key of evictable.slice(0, Math.max(0, excess))) delete state.sessions[key];\n}\n\n/** Compact JSON within the store limit, evicting idle sessions rather than failing every hook. */\nexport function serializeState(state: State, active: string | null) {\n let payload = JSON.stringify(state) + \"\\n\";\n while (Buffer.byteLength(payload) > STORE_MAX_BYTES) {\n const before = Object.keys(state.sessions).length;\n pruneSessions(state, new Date(), active, before - 1);\n if (Object.keys(state.sessions).length === before)\n throw new Error(\n \"Mason automation state exceeds 10 MiB after evicting every other session; inspect the active session in .mason/reports/automation/<id>/state.json. Original evidence was retained.\",\n );\n payload = JSON.stringify(state) + \"\\n\";\n }\n return state;\n}\n\n/** Preserve the automation lock location and diagnostics for existing callers. */\nexport function withLock<T>(\n root: string,\n directory: string,\n run: () => Promise<T>,\n waitMs = 5000,\n): Promise<T> {\n return withStoreLock(root, directory, run, waitMs, \"Automation\");\n}\n","import { inspectionGit } from \"./inspection.js\";\nimport { execGit } from \"../utils/git-read.js\";\nimport fs from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport { advisorySchema, digest, findingId, type Finding } from \"./findings.js\";\nimport { manifestPathspecs } from \"./checks/deps-changed.js\";\nimport { readAuditInput } from \"./inputs.js\";\nimport { pathExists } from \"./scope.js\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\nimport { normalizeRepoPath } from \"../utils/paths.js\";\nimport { withLock } from \"../automation/store.js\";\nimport { loadDecisionStore } from \"../decisions/decisions.js\";\nimport { latestDecisionInspection } from \"../decisions/provenance.js\";\nimport { captureAnchors, changedCaptureFiles } from \"../decisions/anchors.js\";\nimport { computeDecisionDrift } from \"../decisions/drift.js\";\n\nconst git = async (root: string, ...args: string[]) =>\n (\n await (\n [\"log\", \"ls-tree\", \"ls-files\", \"merge-base\"].includes(args[0]) ? inspectionGit : execGit\n )(args, { cwd: root, timeout: 10_000, maxBuffer: 8 * 1024 * 1024 })\n ).stdout;\nconst hashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nconst commitSchema = z.string().regex(/^[a-f0-9]{40,64}$/);\nconst evidenceSchema = z.object({\n head: commitSchema,\n fingerprint: hashSchema,\n scope: z.array(z.string()).min(1).max(1000),\n tree: z.string().max(2 * 1024 * 1024),\n lastScopeCommit: commitSchema,\n paths: z.array(z.object({ path: z.string(), exists: z.boolean() })).max(1000),\n});\nconst dismissalReasonSchema = z.enum([\"no-dependency-claims\", \"unrelated-manifest-change\"]);\nconst eventSchema = z.object({\n at: z.string().datetime(),\n reviewer: z.string().trim().min(1).max(200).optional(),\n note: z.string().trim().min(1).max(2500),\n outcome: z.enum([\"addressed\", \"inapplicable\", \"deferred\", \"dismissed\"]),\n reasonCode: dismissalReasonSchema.optional(),\n finding: advisorySchema.refine(\n (finding) => finding.evidence.kind !== \"decision-anchor\",\n \"Decision findings use decision reviews\",\n ),\n evidence: evidenceSchema,\n});\nconst recordSchema = z.object({\n version: z.literal(1),\n id: hashSchema,\n events: z.array(eventSchema).min(1).max(200),\n digest: hashSchema,\n});\ntype ReviewRecord = z.infer<typeof recordSchema>;\nexport const reviewSummarySchema = z.object({\n id: hashSchema,\n status: z.enum([\"current\", \"reopened\", \"deferred\", \"unverified\"]),\n reason: z.string(),\n recordPath: z.string().optional(),\n reviewer: z.string().optional(),\n note: z.string().optional(),\n outcome: z\n .enum([\n \"addressed\",\n \"inapplicable\",\n \"deferred\",\n \"accepted\",\n \"reaffirmed\",\n \"retired\",\n \"dismissed\",\n \"no_contradiction_found\",\n ])\n .optional(),\n reviewedHead: z.string().optional(),\n});\nexport type AdvisoryReviewSummary = z.infer<typeof reviewSummarySchema>;\nexport const advisoryReviewRequest = z.object({\n baselinePath: z.string().min(1),\n findingId: hashSchema,\n action: z\n .enum([\"prepare\", \"addressed\", \"inapplicable\", \"deferred\", \"dismiss\"])\n .default(\"prepare\"),\n reasonCode: dismissalReasonSchema.optional(),\n reviewer: eventSchema.shape.reviewer.optional(),\n note: eventSchema.shape.note.optional(),\n reviewToken: hashSchema.optional(),\n});\nexport type AdvisoryReviewInput = z.input<typeof advisoryReviewRequest>;\nconst recordPath = (id: string) => `.mason/reviews/advisories/${hashSchema.parse(id)}.json`;\n\nasync function readRecord(root: string, id: string): Promise<ReviewRecord | null> {\n const raw = await readStoreJson(root, recordPath(id));\n if (raw === null) return null;\n const record = recordSchema.parse(raw);\n const { digest: stored, ...payload } = record;\n if (\n record.id !== id ||\n digest(payload) !== stored ||\n record.events.some(\n (event) =>\n findingId(event.finding as Finding) !== id ||\n (event.outcome === \"dismissed\"\n ? !event.reasonCode || event.finding.type !== \"deps-changed\"\n : !event.reviewer || !!event.reasonCode) ||\n event.evidence.fingerprint !== evidenceFingerprint(event.evidence, event.reasonCode),\n )\n ) {\n throw new Error(\"Advisory review record is inconsistent or modified; inspect its history.\");\n }\n return record;\n}\n\nfunction evidenceFingerprint(\n evidence: z.infer<typeof evidenceSchema>,\n reason?: z.infer<typeof dismissalReasonSchema>,\n): string {\n return digest([\n evidence.scope,\n evidence.tree,\n ...(reason === \"no-dependency-claims\" ? [] : [evidence.lastScopeCommit]),\n evidence.paths,\n ]);\n}\n\nfunction scopes(finding: Finding, reason?: z.infer<typeof dismissalReasonSchema>): string[] {\n const files = [finding.anchor.doc],\n e = finding.evidence;\n if (e.kind === \"decision-anchor\")\n throw new Error(\"Use review_decision for decision acceptance, reaffirmation or retirement.\");\n if (reason === \"no-dependency-claims\" && e.kind === \"doc-behind-manifests\")\n return [`:(literal)${finding.anchor.doc}`];\n if (e.kind === \"doc-behind-manifests\")\n return [`:(literal)${finding.anchor.doc}`, ...manifestPathspecs(finding.anchor.doc)];\n if (e.kind === \"missing-path\")\n files.push(...(e.scope?.candidates ?? [e.resolvedPath ?? e.claimed]));\n else if (e.kind === \"missing-script\")\n files.push(...e.manifestsChecked, ...(e.scope?.candidates ?? []));\n else if (e.kind === \"unmentioned-dir\") files.push(e.dir, ...e.checkedDocs);\n else throw new Error(\"This advisory has no supported review scope.\");\n return [...new Set(files)]\n .map((file) => {\n if (normalizeRepoPath(file) !== file)\n throw new Error(\"Advisory contains an invalid scoped path: \" + file);\n return `:(literal)${file}`;\n })\n .sort();\n}\n\n/** Committed, scoped Git evidence survives unrelated and review-record-only commits. */\nasync function reviewEvidence(\n root: string,\n finding: Finding,\n reason?: z.infer<typeof dismissalReasonSchema>,\n) {\n if (normalizeRepoPath(finding.anchor.doc) !== finding.anchor.doc)\n throw new Error(\"Invalid advisory document path.\");\n const scope = scopes(finding, reason);\n const head = (await git(root, \"rev-parse\", \"HEAD\")).trim();\n const tracked = (await git(root, \"ls-files\", \"--cached\", \"-z\", \"--\", ...scope))\n .split(\"\\0\")\n .filter(Boolean);\n if (tracked.length > 20_000) throw new Error(\"Advisory scope exceeds 20,000 tracked files.\");\n const [tree, status, lastScopeCommit, document] = await Promise.all([\n tracked.length\n ? git(\n root,\n \"ls-tree\",\n \"-r\",\n \"-z\",\n \"HEAD\",\n \"--\",\n ...tracked.map((file) => `:(literal)${file}`),\n )\n : \"\",\n git(root, \"status\", \"--porcelain=v1\", \"-z\", \"--untracked-files=all\", \"--\", ...scope),\n git(root, \"log\", \"-1\", \"--format=%H\", \"HEAD\", \"--\", ...scope).then((value) => value.trim()),\n readAuditInput(root, finding.anchor.doc),\n ]);\n if (!document?.trim())\n throw new Error(\"Original advisory document is missing, empty or unreadable.\");\n if (tree.length > 2 * 1024 * 1024 || tree.split(\"\\0\").length > 20_000)\n throw new Error(\n \"Advisory scope is too large for a complete review; narrow the documentation scope.\",\n );\n // Reject symlinks rather than trusting a blob that describes an external target.\n for (const entry of tree.split(\"\\0\").filter(Boolean)) {\n const tab = entry.indexOf(\"\\t\"),\n file = entry.slice(tab + 1);\n if (entry.startsWith(\"120000 \") || entry.startsWith(\"160000 \"))\n throw new Error(\"Symlink or submodule in advisory review scope: \" + file);\n await storePath(root, file);\n }\n // Path checks observe presence even for explicitly documented ignored\n // outputs. Git alone cannot detect those appearing or disappearing.\n const paths =\n finding.evidence.kind === \"missing-path\"\n ? await Promise.all(\n (\n finding.evidence.scope?.candidates ?? [\n finding.evidence.resolvedPath ?? finding.evidence.claimed,\n ]\n ).map(async (file) => ({ path: file, exists: await pathExists(root, file) })),\n )\n : [];\n let dirty = status.length > 0;\n if (finding.evidence.kind === \"missing-script\") {\n for (const file of [\n ...finding.evidence.manifestsChecked,\n ...(finding.evidence.scope?.candidates ?? []),\n ]) {\n if (!tracked.includes(file) && (await pathExists(root, file))) dirty = true;\n }\n }\n const fingerprint = evidenceFingerprint(\n { head, scope, tree, lastScopeCommit, paths, fingerprint: \"\" },\n reason,\n );\n if ((await git(root, \"rev-parse\", \"HEAD\")).trim() !== head)\n throw new Error(\"HEAD changed while collecting review evidence.\");\n return {\n ...evidenceSchema.parse({ head, scope, tree, lastScopeCommit, paths, fingerprint }),\n dirty,\n documentDigest: digest(document),\n };\n}\n\nasync function decisionAssessment(\n root: string,\n finding: Finding,\n baselineHead: string,\n): Promise<AdvisoryReviewSummary | null> {\n const evidence = finding.evidence;\n if (evidence.kind !== \"decision-anchor\") return null;\n const id = findingId(finding);\n const store = await loadDecisionStore(root);\n if (store.diagnostics.length)\n throw new Error(\n \"Decision records have unavailable or malformed evidence; review cannot be confirmed.\",\n );\n const record = store.records.find((record) => record.id === evidence.decisionId);\n if (!record || record.version !== 2) return null;\n const inspection = latestDecisionInspection(\n record,\n evidence.provenance?.approval === \"accepted\" ? \"operative\" : \"all\",\n );\n if (inspection && record.status === \"active\") {\n const capture = await captureAnchors(root, inspection.capture.anchors);\n let ancestor = true;\n try {\n await git(root, \"merge-base\", \"--is-ancestor\", baselineHead, inspection.headHash);\n } catch {\n ancestor = false;\n }\n if (ancestor)\n return {\n id,\n status:\n !capture.complete || !inspection.capture.complete\n ? \"unverified\"\n : changedCaptureFiles(inspection.capture, capture).length\n ? \"reopened\"\n : \"current\",\n outcome: \"no_contradiction_found\",\n reviewer: inspection.inspector,\n note: inspection.note,\n reviewedHead: inspection.headHash,\n recordPath: `.mason/decisions/${record.id}.json`,\n reason:\n \"A separate source inspection reports no contradiction; this does not accept or reaffirm the decision. Relevant anchor changes reopen the advisory.\",\n };\n }\n const events = record.history.filter((event) =>\n [\"accepted\", \"reaffirmed\", \"retired\"].includes(event.kind),\n );\n const event = events.at(-1);\n if (\n !event?.evidence ||\n !event.actor ||\n !event.note ||\n !event.evidence.historyAvailable ||\n event.evidence.localChanges.length\n )\n return null;\n try {\n await git(root, \"merge-base\", \"--is-ancestor\", baselineHead, event.evidence.headHash);\n } catch {\n return null;\n }\n const drift = await computeDecisionDrift(root, [record]);\n if (!drift.historyAvailable) throw new Error(\"Decision review history is unavailable.\");\n const retired = record.status === \"retired\" && event.kind === \"retired\";\n const current =\n retired ||\n (record.status === \"active\" &&\n record.approval === \"accepted\" &&\n drift.freshness?.[record.id] === \"current\" &&\n !drift.pendingProposals?.[record.id]);\n return {\n id,\n status: current ? \"current\" : \"reopened\",\n outcome: event.kind as \"accepted\" | \"reaffirmed\" | \"retired\",\n reviewer: event.actor,\n note: event.note,\n reviewedHead: event.evidence.headHash,\n recordPath: `.mason/decisions/${record.id}.json`,\n reason: current\n ? \"The existing decision review records acceptance, reaffirmation or retirement covering the original finding.\"\n : \"Decision content or anchor evidence changed after its review; review the decision again.\",\n };\n}\n\nexport async function assessAdvisory(\n root: string,\n finding: Finding,\n baselineHead: string,\n): Promise<AdvisoryReviewSummary | null> {\n if (\"confidence\" in finding) return null;\n const id = findingId(finding);\n try {\n if (finding.evidence.kind === \"decision-anchor\")\n return await decisionAssessment(root, finding, baselineHead);\n const record = await readRecord(root, id);\n if (!record) return null;\n const event = record.events.at(-1)!;\n // Use the reviewed scope, not a newly shortened finding's preview of that scope.\n const current = await reviewEvidence(root, event.finding as Finding, event.reasonCode);\n await git(root, \"merge-base\", \"--is-ancestor\", event.evidence.head, current.head);\n const base = {\n id,\n recordPath: recordPath(id),\n reviewer: event.reviewer,\n note: event.note,\n outcome: event.outcome,\n reviewedHead: event.evidence.head,\n };\n if (\n current.dirty ||\n current.fingerprint !== event.evidence.fingerprint ||\n digest(scopes(finding, event.reasonCode)) !== digest(event.evidence.scope)\n )\n return {\n ...base,\n status: \"reopened\",\n reason:\n \"Relevant document or repository evidence changed after the assessment; prepare a new review.\",\n };\n return {\n ...base,\n status: event.outcome === \"deferred\" ? \"deferred\" : \"current\",\n reason:\n event.outcome === \"deferred\"\n ? \"The review was deferred and remains outstanding.\"\n : \"An explicit assessment covers the current committed scope. This does not approve an engineering decision or certify correctness.\",\n };\n } catch (error) {\n return {\n id,\n status: \"unverified\",\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/** Fingerprint receipt content so concurrent automation cannot publish an older assessment. */\nexport async function advisoryReviewInventory(root: string) {\n let names: string[];\n try {\n names = await fs.readdir(await storePath(root, \".mason/reviews/advisories\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n }\n if (names.length > 5000) throw new Error(\"Advisory review inventory exceeds 5,000 records.\");\n return Promise.all(\n names\n .filter((name) => name.endsWith(\".json\"))\n .sort()\n .map(async (name) => [name, await readAuditInput(root, \".mason/reviews/advisories/\" + name)]),\n );\n}\n\nexport async function reviewAdvisory(rootDir: string, input: AdvisoryReviewInput) {\n const root = await fs.realpath(rootDir),\n request = advisoryReviewRequest.parse(input);\n const { loadRepairBaseline } = await import(\"./repair.js\");\n const baseline = await loadRepairBaseline(root, request.baselinePath);\n const finding = [\n ...baseline.original.advisories,\n ...(baseline.original.suppressedAdvisories ?? []),\n ].find((f) => findingId(f) === request.findingId);\n if (!finding)\n throw new Error(\n \"No advisory with this findingId in the original baseline. Provable issues must be repaired and rechecked.\",\n );\n if (finding.evidence.kind === \"decision-anchor\")\n return {\n status: \"decision-review-required\",\n decisionId: finding.evidence.decisionId,\n hint: \"Use review_decision to prepare evidence and record a source inspection without human approval, or an authorized acceptance, reaffirmation or retirement, then verify this original repair baseline. An advisory assessment cannot approve a decision.\",\n };\n if (request.action === \"dismiss\") {\n if (finding.type !== \"deps-changed\" || finding.evidence.kind !== \"doc-behind-manifests\")\n throw new Error(\"One-step dismissal is only available for dependency advisories.\");\n if (!request.reasonCode || !request.note)\n throw new Error(\n \"Dismissal requires reasonCode and note; it does not require a reviewer or prepared token.\",\n );\n } else if (request.reasonCode) throw new Error(\"reasonCode is only used with dismiss.\");\n const prepare = async () => {\n const record = await readRecord(root, request.findingId);\n const evidence = await reviewEvidence(root, finding, request.reasonCode);\n await git(root, \"merge-base\", \"--is-ancestor\", baseline.original.headHash!, evidence.head);\n const token = digest({ baseline: baseline.original, finding, evidence, record });\n return { record, evidence, token };\n };\n if (request.action === \"prepare\") {\n const state = await prepare();\n let diff: string | null = null,\n diffNote: string | undefined;\n const from =\n finding.evidence.kind === \"doc-behind-manifests\"\n ? finding.evidence.docLastCommit.hash\n : baseline.original.headHash!;\n try {\n const full = await git(\n root,\n \"diff\",\n \"--no-ext-diff\",\n \"--no-textconv\",\n \"--no-color\",\n \"--no-renames\",\n \"-U3\",\n from,\n state.evidence.head,\n \"--\",\n ...state.evidence.scope,\n );\n diff = full.slice(0, 16000);\n if (full.length > diff.length)\n diffNote = \"Diff preview truncated; inspect the full scoped diff before reviewing.\";\n } catch {\n diffNote =\n \"Diff preview unavailable; inspect the original cited evidence directly before reviewing.\";\n }\n if ((await prepare()).token !== state.token)\n throw new Error(\"Review evidence changed during preparation; retry.\");\n return {\n status: \"prepared\",\n findingId: request.findingId,\n finding,\n evidence: state.evidence,\n history: state.record?.events ?? [],\n reviewToken: state.token,\n diff,\n diffNote,\n hint: \"Inspect the original finding, scoped document and relevant code changes. Record addressed, inapplicable or deferred only when the user or cited project review authorizes that assessment. Supply the actual reviewer, reason in note and reviewToken. Relevant edits must be committed first. Deferral remains outstanding. Review identities are recorded assertions, not authenticated approvals.\",\n };\n }\n if (request.action !== \"dismiss\" && (!request.reviewer || !request.note || !request.reviewToken))\n throw new Error(\n \"Prepare first; recording an assessment requires reviewToken, reviewer and note.\",\n );\n return withLock(root, \".mason/reports/advisory-review-locks/\" + request.findingId, async () => {\n const state = await prepare();\n if (request.action !== \"dismiss\" && state.token !== request.reviewToken)\n throw new Error(\n \"Review conflict: evidence or review history changed since preparation. Prepare and inspect a new review.\",\n );\n if (state.evidence.dirty)\n throw new Error(\n \"Commit relevant document and repository edits before recording the assessment. Unrelated local work may remain.\",\n );\n if ((state.record?.events.length ?? 0) >= 200)\n throw new Error(\"Review history limit reached; existing events were retained.\");\n const { dirty, documentDigest, ...evidence } = state.evidence;\n const event = eventSchema.parse({\n at: new Date().toISOString(),\n reviewer: request.reviewer,\n note: request.note,\n outcome: request.action === \"dismiss\" ? \"dismissed\" : request.action,\n reasonCode: request.reasonCode,\n finding,\n evidence,\n });\n const payload = {\n version: 1 as const,\n id: request.findingId,\n events: [...(state.record?.events ?? []), event],\n };\n if ((await prepare()).token !== state.token)\n throw new Error(\"Review conflict: evidence changed while recording the assessment.\");\n await writeStoreJson(root, recordPath(request.findingId), {\n ...payload,\n digest: digest(payload),\n });\n return {\n status: \"recorded\",\n recordPath: recordPath(request.findingId),\n event,\n hint:\n request.action === \"dismiss\"\n ? \"Dismissal saved and effective locally. Commit the record to share it. No-dependency-claims dismissals reopen on document content changes; unrelated-manifest-change dismissals reopen on scoped document or manifest changes. This does not approve a decision.\"\n : \"Review and commit this assessment record through the normal project workflow, then verify the original repair baseline. Relevant changes reopen the assessment; deferral remains outstanding.\",\n };\n });\n}\n","import { loadProjectConfig } from \"../utils/files.js\";\nimport { includedCheckPaths } from \"./policy.js\";\nimport { profilePhase } from \"../utils/profile.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getChangesWithStatus } from \"../drift/drift.js\";\nimport type { FileChange } from \"../drift/drift.js\";\nimport { getCurrentGitHash } from \"../snapshot/snapshot.js\";\nimport { discoverDocs } from \"./docs.js\";\nimport { ALL_CHECKS } from \"./types.js\";\nimport type { AuditReport, CheckName } from \"./types.js\";\nimport { CHECKS } from \"./checks/index.js\";\nimport { assessAdvisory } from \"./advisory-review.js\";\nimport type { CheckContext, CheckResult } from \"./checks/index.js\";\n\nexport interface AuditOptions {\n /** Subset of checks to run; defaults to all. */\n checks?: CheckName[];\n /** Internal execution boundary used by the automation dependency cache. */\n runCheck?: (name: CheckName, context: CheckContext) => Promise<CheckResult>;\n}\n\n/**\n * Audit discovered instruction files and READMEs\n * against repo reality. Fully deterministic — git, filesystem, and lexical\n * extraction only; no LLM, no network. Returns null when no context file\n * exists.\n */\nexport async function computeAudit(\n rootDir: string,\n options: AuditOptions = {},\n): Promise<AuditReport | null> {\n return profilePhase(\"audit.current\", () => auditCurrent(rootDir, options));\n}\n\nasync function auditCurrent(rootDir: string, options: AuditOptions): Promise<AuditReport | null> {\n const resolvedRoot = path.resolve(rootDir);\n const [docs, headHash] = await Promise.all([\n discoverDocs(resolvedRoot),\n getCurrentGitHash(resolvedRoot),\n ]);\n if (docs.length === 0) return null;\n\n const report: AuditReport = {\n version: 1,\n root: resolvedRoot,\n gitAvailable: headHash !== \"unknown\",\n headHash,\n checksRun: [],\n docs: docs.map((d) => ({\n path: d.path,\n scope: d.scope,\n kind: d.kind,\n lastCommit: d.lastCommit,\n dirty: d.dirty,\n lineCount: d.lineCount,\n })),\n decisionsChecked: false,\n issues: [],\n advisories: [],\n suppressedAdvisories: [],\n skippedChecks: [],\n clean: true,\n };\n\n // Without git the provability gates cannot run — the caller treats this\n // as an error rather than silently degrading precision.\n if (!report.gitAvailable) return report;\n\n const changesSinceDoc = new Map<string, FileChange[] | null>();\n const changesByCommit = new Map<string, FileChange[] | null>();\n for (const doc of docs) {\n const hash = doc.lastCommit?.hash;\n if (hash && !changesByCommit.has(hash))\n changesByCommit.set(hash, await getChangesWithStatus(resolvedRoot, hash));\n changesSinceDoc.set(doc.path, hash ? changesByCommit.get(hash)! : null);\n }\n\n let decisionsPresent = false;\n try {\n await fs.access(path.join(resolvedRoot, \".mason\", \"decisions\"));\n decisionsPresent = true;\n } catch {\n // No decision store — the check stays dark (zero-setup path).\n }\n report.decisionsChecked = decisionsPresent;\n\n const ctx: CheckContext = {\n root: resolvedRoot,\n docs,\n headHash,\n changesSinceDoc,\n decisionsPresent,\n };\n\n const policy = (await loadProjectConfig(resolvedRoot)).audit;\n const selected = options.checks ?? ALL_CHECKS;\n for (const name of ALL_CHECKS) {\n if (!selected.includes(name)) continue;\n const exclusions = policy?.exclude?.[name] ?? [];\n const included = await includedCheckPaths(\n resolvedRoot,\n docs.map((doc) => doc.path),\n exclusions,\n );\n const excluded = docs\n .filter((doc) => !included.has(doc.path))\n .map((doc) => ({ check: name, doc: doc.path }));\n if (excluded.length) (report.excludedChecks ??= []).push(...excluded);\n const scoped = { ...ctx, docs: docs.filter((doc) => included.has(doc.path)) };\n const { issues, advisories, suppressedAdvisories, skipped } = await (options.runCheck\n ? options.runCheck(name, scoped)\n : CHECKS[name](scoped));\n report.checksRun!.push(name);\n report.issues.push(...issues);\n const advisoryPaths = await includedCheckPaths(\n resolvedRoot,\n [...new Set(advisories.map((f) => f.anchor.doc))],\n exclusions,\n );\n report.advisories.push(...advisories.filter((f) => advisoryPaths.has(f.anchor.doc)));\n for (const f of advisories)\n if (!advisoryPaths.has(f.anchor.doc))\n (report.excludedChecks ??= []).push({ check: name, doc: f.anchor.doc });\n report.suppressedAdvisories!.push(...(suppressedAdvisories ?? []));\n report.skippedChecks.push(...skipped);\n }\n\n report.clean = report.issues.length === 0;\n const reviews = (\n await Promise.all(\n [...report.advisories, ...report.suppressedAdvisories!].map((finding) =>\n assessAdvisory(resolvedRoot, finding, headHash),\n ),\n )\n ).filter((review) => review !== null);\n if (reviews.length) report.advisoryReviews = reviews;\n return report;\n}\n","import { profilePhase } from \"../utils/profile.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { computeAudit, type AuditOptions } from \"./audit.js\";\nimport { discoverDocPaths } from \"./docs.js\";\nimport { getCurrentGitHash } from \"../snapshot/snapshot.js\";\nimport { getChangesWithStatus } from \"../drift/drift.js\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\nimport { loadProjectConfig, readBoundedFile } from \"../utils/files.js\";\nimport { isWithinRoot, normalizeRepoPath } from \"../utils/paths.js\";\nimport { ALL_CHECKS } from \"./types.js\";\nimport type { AuditReport, CheckName } from \"./types.js\";\nimport {\n checkSchema,\n commitSchema,\n issueSchema,\n advisorySchema,\n digest,\n findingId,\n type Finding,\n} from \"./findings.js\";\nimport {\n assessAdvisory,\n advisoryReviewInventory,\n reviewSummarySchema,\n type AdvisoryReviewSummary,\n} from \"./advisory-review.js\";\nexport { checkResultSchema, findingId } from \"./findings.js\";\nconst count = z.number().int().nonnegative();\n\nexport const reportSchema = z.object({\n version: z.literal(1),\n root: z.string(),\n gitAvailable: z.literal(true),\n headHash: commitSchema.shape.hash,\n checksRun: z.array(checkSchema).nonempty(),\n docs: z\n .array(\n z.object({\n path: z.string().refine((value) => normalizeRepoPath(value) === value),\n scope: z.string().optional(),\n kind: z.enum([\"instructions\", \"readme\", \"guide\"]).optional(),\n lastCommit: commitSchema.nullable(),\n dirty: z.boolean(),\n lineCount: count,\n }),\n )\n .nonempty(),\n decisionsChecked: z.boolean(),\n clean: z.boolean(),\n excludedChecks: z.array(z.object({ check: checkSchema, doc: z.string() })).optional(),\n issues: z.array(issueSchema),\n advisories: z.array(advisorySchema),\n suppressedAdvisories: z.array(advisorySchema).optional(),\n skippedChecks: z.array(\n z.object({ check: z.string(), reason: z.string(), doc: z.string().optional() }),\n ),\n});\nconst baselineSchema = z.object({\n kind: z.literal(\"mason-audit-repair\"),\n version: z.literal(1),\n createdAt: z.string().datetime(),\n report: reportSchema,\n digest: z.string().regex(/^[a-f0-9]{64}$/),\n});\n\nexport type RepairStatus = \"resolved\" | \"unresolved\" | \"review-required\" | \"unverified\";\n\nexport interface RepairFinding {\n id: string;\n original: Finding;\n status: RepairStatus;\n reason: string;\n current?: Finding;\n review?: AdvisoryReviewSummary;\n}\nexport const repairFindingSchema = z.object({\n id: z.string(),\n original: z.union([issueSchema, advisorySchema]),\n status: z.enum([\"resolved\", \"unresolved\", \"review-required\", \"unverified\"]),\n reason: z.string(),\n current: z.union([issueSchema, advisorySchema]).optional(),\n review: reviewSummarySchema.optional(),\n});\nexport interface RepairVerification {\n version: 1;\n action: \"verify\";\n baselinePath: string;\n baselineHead: string;\n currentHead: string | null;\n status: \"verified\" | \"issues-remain\" | \"incomplete\";\n findings: RepairFinding[];\n newFindings: Finding[];\n diagnostics: string[];\n currentAudit: AuditReport | null;\n counts: Record<RepairStatus, number>;\n scope: string;\n}\n\nfunction recheckable(finding: Finding): boolean {\n return (\n !(\"confidence\" in finding) &&\n finding.resolution === \"recheck\" &&\n [\"deleted-reference\", \"dead-command\", \"new-module\"].includes(finding.type) &&\n [\"missing-path\", \"missing-script\", \"unmentioned-dir\"].includes(finding.evidence.kind)\n );\n}\nfunction allFindings(report: AuditReport): Finding[] {\n return [...report.issues, ...report.advisories, ...(report.suppressedAdvisories ?? [])];\n}\n\nasync function docState(root: string): Promise<string> {\n const docs = [];\n for (const doc of await discoverDocPaths(root)) {\n try {\n const content = await readBoundedFile(await storePath(root, doc), 10 * 1024 * 1024);\n if (content === null)\n throw new Error(\"Context file is not regular or exceeds 10 MiB: \" + doc);\n docs.push([doc, digest(content)]);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n docs.push([doc, null]);\n }\n }\n return digest([docs, (await loadProjectConfig(root)).audit]);\n}\n\n/** Refuse a verification assembled across a commit or instruction-file edit. */\nasync function stableAudit(\n root: string,\n checks: CheckName[],\n options: AuditOptions = {},\n): Promise<AuditReport | null> {\n return profilePhase(\"repair.audit\", () => readStableAudit(root, checks, options));\n}\n\nasync function readStableAudit(root: string, checks: CheckName[], options: AuditOptions) {\n const head = await getCurrentGitHash(root);\n const before = await docState(root);\n const report = await computeAudit(root, { ...options, checks });\n if (\n head !== (await getCurrentGitHash(root)) ||\n before !== (await docState(root)) ||\n (report && report.headHash !== head)\n ) {\n throw new Error(\n \"HEAD or context files changed during the audit; retry against a stable checkout.\",\n );\n }\n return report;\n}\n\nexport async function prepareRepair(\n rootDir: string,\n checks: CheckName[] = ALL_CHECKS,\n options: AuditOptions = {},\n) {\n return prepareOriginal(rootDir, checks, options);\n}\n\ninterface RepairSession {\n audit: (checks: CheckName[]) => Promise<AuditReport | null>;\n document: (file: string) => Promise<string | null>;\n history: (head: string) => ReturnType<typeof getChangesWithStatus>;\n assessment: typeof assessAdvisory;\n}\n\n/** Automation shares one inspection across its audit and original baselines.\n * Its required validator re-reads the full input inventory before this returns.\n * Standalone prepare/verify retain their own stability guards below.\n */\nexport async function withRepairSession<T>(\n root: string,\n options: AuditOptions,\n run: (session: {\n prepare: () => ReturnType<typeof prepareRepair>;\n verify: (baselinePath: string) => Promise<RepairVerification>;\n currentAudit: () => Promise<AuditReport | null>;\n }) => Promise<T>,\n validate: () => Promise<void>,\n cachedAudit?: AuditReport,\n): Promise<T> {\n const head = await getCurrentGitHash(root);\n const audits = new Map<string, Promise<AuditReport | null>>();\n const documents = new Map<string, Promise<string | null>>();\n const history = new Map<string, ReturnType<typeof getChangesWithStatus>>();\n const assessments = new Map<string, ReturnType<typeof assessAdvisory>>();\n const memo = <T>(\n cache: Map<string, Promise<T>>,\n key: string,\n read: () => Promise<T>,\n ): Promise<T> => {\n if (!cache.has(key)) cache.set(key, read());\n return cache.get(key)!;\n };\n const session: RepairSession = {\n audit: (checks) =>\n memo(audits, [...checks].sort().join(\",\"), async () => {\n if (\n cachedAudit &&\n cachedAudit.headHash === head &&\n cachedAudit.root === root &&\n digest([...checks].sort()) === digest([...(cachedAudit.checksRun ?? [])].sort())\n ) {\n // Raw audit results are cached, never their approval assessments. Original\n // baselines may refer to scopes no longer mentioned in the current docs.\n const current = structuredClone(cachedAudit);\n const reviews = (\n await Promise.all(allFindings(current).map((f) => assessAdvisory(root, f, head)))\n ).filter((r) => r !== null);\n delete current.advisoryReviews;\n if (reviews.length) current.advisoryReviews = reviews;\n return current;\n }\n return computeAudit(root, { ...options, checks });\n }),\n document: (file) =>\n memo(documents, file, async () =>\n readBoundedFile(await storePath(root, file), 10 * 1024 * 1024),\n ),\n history: (head) => memo(history, head, () => getChangesWithStatus(root, head)),\n assessment: (dir, finding, head) =>\n memo(assessments, digest([dir, finding, head]), () => assessAdvisory(dir, finding, head)),\n };\n const result = await run({\n prepare: () => prepareOriginal(root, ALL_CHECKS, options, session),\n verify: (baseline) =>\n profilePhase(\"repair.verify\", () => verifyOriginal(root, baseline, options, session)),\n currentAudit: () => session.audit(ALL_CHECKS),\n });\n await validate();\n return result;\n}\n\nasync function prepareOriginal(\n rootDir: string,\n checks: CheckName[],\n options: AuditOptions,\n session?: RepairSession,\n) {\n const root = await fs.realpath(rootDir);\n const selected = z.array(checkSchema).nonempty().parse(checks);\n const report = await (session ? session.audit(selected) : stableAudit(root, selected, options));\n if (!report) throw new Error(\"No context files found to prepare a repair.\");\n if (!report.gitAvailable)\n throw new Error(\"Readable Git history is required to prepare a repair.\");\n // Canonicalize before hashing; validation on read must yield the same bytes.\n const storedReport = reportSchema.parse(report);\n const payload = {\n kind: \"mason-audit-repair\" as const,\n version: 1 as const,\n createdAt: new Date().toISOString(),\n report: storedReport,\n };\n const baselinePath = \".mason/reports/repairs/\" + randomUUID() + \".json\";\n await writeStoreJson(root, baselinePath, { ...payload, digest: digest(payload) });\n return { version: 1 as const, action: \"prepare\" as const, baselinePath, report };\n}\n\nexport async function loadRepairBaseline(rootDir: string, baselinePath: string) {\n const root = await fs.realpath(rootDir);\n const declaredRoot = path.resolve(rootDir);\n const relative = path.isAbsolute(baselinePath)\n ? path.relative(isWithinRoot(declaredRoot, baselinePath) ? declaredRoot : root, baselinePath)\n : baselinePath;\n const stored = baselineSchema.parse(await readStoreJson(root, relative));\n const { digest: savedDigest, ...payload } = stored;\n if (digest(payload) !== savedDigest)\n throw new Error(\"Repair baseline was modified; use the original baseline.\");\n if (stored.report.root !== root)\n throw new Error(\"Repair baseline belongs to a different repository.\");\n const original = stored.report as AuditReport;\n return { root, relative, original };\n}\n\nexport async function verifyRepair(\n rootDir: string,\n baselinePath: string,\n options: AuditOptions = {},\n): Promise<RepairVerification> {\n return profilePhase(\"repair.verify\", () => verifyOriginal(rootDir, baselinePath, options));\n}\n\nasync function verifyOriginal(\n rootDir: string,\n baselinePath: string,\n options: AuditOptions,\n session?: RepairSession,\n): Promise<RepairVerification> {\n const { root, relative, original } = await loadRepairBaseline(rootDir, baselinePath);\n const diagnostics: string[] = [];\n let reviewDigest: string | undefined;\n let current: AuditReport | null = null;\n try {\n if (!session) reviewDigest = digest(await advisoryReviewInventory(root));\n current = await (session\n ? session.audit(original.checksRun!)\n : stableAudit(root, original.checksRun!, options));\n if (!current) diagnostics.push(\"No context files remain available to audit.\");\n else if (!current.gitAvailable) diagnostics.push(\"Git history is unavailable.\");\n for (const doc of original.docs) {\n if (\n !allFindings(original).some((f) => f.anchor.doc === doc.path) ||\n !current?.docs.some((d) => d.path === doc.path)\n )\n continue;\n const content = await (session\n ? session.document(doc.path)\n : readBoundedFile(await storePath(root, doc.path), 10 * 1024 * 1024));\n if (content === null || !content.trim()) {\n diagnostics.push(\n \"Original context file \" +\n doc.path +\n \" is empty or unreadable; losing its claims does not verify a repair.\",\n );\n }\n }\n if (\n (await (session\n ? session.history(original.headHash!)\n : getChangesWithStatus(root, original.headHash!))) === null\n ) {\n diagnostics.push(\n \"The original audit commit is unavailable; repair history cannot be verified.\",\n );\n }\n } catch (error) {\n diagnostics.push(error instanceof Error ? error.message : String(error));\n }\n const currentById = new Map((current ? allFindings(current) : []).map((f) => [findingId(f), f]));\n const originalFindings = allFindings(original);\n const originalIds = new Set(originalFindings.map(findingId));\n const missingDocs = original.docs.filter(\n (doc) => !current?.docs.some((d) => d.path === doc.path),\n );\n for (const doc of missingDocs)\n diagnostics.push(\n \"Original context file \" +\n doc.path +\n \" is unavailable; removing it does not verify a repair.\",\n );\n const findings = await Promise.all(\n originalFindings.map(async (finding): Promise<RepairFinding> => {\n const id = findingId(finding);\n const now = currentById.get(id);\n const base = { id, original: finding, ...(now ? { current: now } : {}) };\n if (diagnostics.length || !current) {\n return {\n ...base,\n status: \"unverified\",\n reason: \"The original audit scope could not be verified. See diagnostics.\",\n };\n }\n if (now && (\"confidence\" in finding || \"confidence\" in now)) {\n return {\n ...base,\n status: \"unresolved\",\n reason: \"The original check still reports this claim.\",\n };\n }\n if (\n current.excludedChecks?.some(\n (excluded) => excluded.check === finding.type && excluded.doc === finding.anchor.doc,\n )\n ) {\n return {\n ...base,\n status: \"resolved\",\n reason:\n \"Excluded by project audit policy; this is not a correctness assessment. Original evidence is retained.\",\n };\n }\n const skipped = current.skippedChecks.filter(\n (s) => s.check === finding.type && (!s.doc || s.doc === finding.anchor.doc),\n );\n if (!current.checksRun?.includes(finding.type) || skipped.length) {\n return {\n ...base,\n status: \"unverified\",\n reason: skipped.map((s) => s.reason).join(\"; \") || \"The original check did not run.\",\n };\n }\n const review = await (session?.assessment ?? assessAdvisory)(\n root,\n now ?? finding,\n original.headHash!,\n );\n if (review) {\n if (review.status === \"unverified\")\n return { ...base, review, status: \"unverified\", reason: review.reason };\n if (review.status === \"current\")\n return { ...base, review, status: \"resolved\", reason: review.reason };\n return { ...base, review, status: \"review-required\", reason: review.reason };\n }\n if (\n !(\"confidence\" in finding) &&\n finding.evidence.kind === \"doc-behind-manifests\" &&\n !finding.evidence.matches?.length &&\n (!now || (!(\"confidence\" in now) && now.resolution === \"informational\"))\n ) {\n return {\n ...base,\n status: \"resolved\",\n reason:\n \"Manifest recency alone establishes no affected passage. Retained as information; no assessment is required.\",\n };\n }\n if (!(\"confidence\" in finding) && (!recheckable(finding) || now)) {\n return {\n ...base,\n status: \"review-required\",\n reason:\n (now\n ? \"The current check still reports this advisory. \"\n : finding.type === \"deps-changed\"\n ? \"The current check no longer reports this condition; the historical advisory remains awaiting assessment. \"\n : \"The current check no longer reports the original finding; retained evidence still requires assessment. \") +\n \"An audit cannot establish that this advisory was reviewed. Retain its original evidence and report a separate assessment; editing or committing the doc is not approval.\",\n };\n }\n return {\n ...base,\n status: \"resolved\",\n reason:\n \"The original check ran and no longer reports this claim. Inspect the edit for semantic correctness.\",\n };\n }),\n );\n if (!session)\n try {\n if (\n reviewDigest !== digest(await advisoryReviewInventory(root)) ||\n current?.headHash !== (await getCurrentGitHash(root))\n ) {\n diagnostics.push(\n \"HEAD or advisory review records changed during verification; repeat against stable evidence.\",\n );\n for (const finding of findings) {\n finding.status = \"unverified\";\n finding.reason = diagnostics.at(-1)!;\n }\n }\n } catch (error) {\n diagnostics.push(String(error));\n for (const finding of findings) {\n finding.status = \"unverified\";\n finding.reason = \"Advisory review evidence became unavailable during verification.\";\n }\n }\n const newFindings = [...currentById].filter(([id]) => !originalIds.has(id)).map(([, f]) => f);\n const reviewedIds = new Set(\n current?.advisoryReviews\n ?.filter((review) => review.status === \"current\")\n .map((review) => review.id),\n );\n const counts: Record<RepairStatus, number> = {\n resolved: 0,\n unresolved: 0,\n \"review-required\": 0,\n unverified: 0,\n };\n for (const f of findings) counts[f.status]++;\n const incomplete =\n diagnostics.length > 0 ||\n counts.unverified > 0 ||\n counts[\"review-required\"] > 0 ||\n (current?.skippedChecks.length ?? 0) > 0 ||\n newFindings.some(\n (f) =>\n !(\"confidence\" in f) && f.resolution !== \"informational\" && !reviewedIds.has(findingId(f)),\n );\n const issuesRemain = counts.unresolved > 0 || newFindings.some((f) => \"confidence\" in f);\n return {\n version: 1,\n action: \"verify\",\n baselinePath: relative,\n baselineHead: original.headHash!,\n currentHead: current?.gitAvailable ? current.headHash! : null,\n status: incomplete ? \"incomplete\" : issuesRemain ? \"issues-remain\" : \"verified\",\n findings,\n newFindings,\n diagnostics,\n currentAudit: current,\n counts,\n scope:\n \"Original audit checks over current context files and repository evidence. Resolved means no longer detected by the check or covered by an explicit assessment of current evidence; inspect each finding's reason and review. This is not a certification of documentation or application correctness.\",\n };\n}\n\nexport function repairExitCode(report: RepairVerification): number {\n return report.status === \"verified\" ? 0 : report.status === \"issues-remain\" ? 1 : 2;\n}\n\nexport function formatRepairSummary(report: RepairVerification): string {\n return [\n \"Repair verification: \" + report.status + \". Baseline: \" + report.baselinePath,\n ...report.findings.map(\n (f) =>\n \" [\" +\n f.status +\n \"] \" +\n f.original.type +\n \" \" +\n f.original.anchor.doc +\n \": \" +\n (f.current?.message ??\n \"Historical evidence at \" + report.baselineHead.slice(0, 7) + \": \" + f.original.message) +\n \"\\n \" +\n f.reason +\n \"\\n findingId: \" +\n f.id,\n ),\n ...report.newFindings.map((f) => \" [new] \" + f.type + \" \" + f.anchor.doc + \": \" + f.message),\n ...report.diagnostics.map((d) => \" [unverified] \" + d),\n ...(report.currentAudit?.skippedChecks ?? []).map(\n (s) => \" [skipped] \" + s.check + \": \" + s.reason,\n ),\n report.scope,\n ].join(\"\\n\");\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport { captureAnchorScopes, type AnchorCapture } from \"../decisions/anchors.js\";\nimport {\n loadDecisionStore,\n readDecisionInputs,\n type DecisionRecord,\n} from \"../decisions/decisions.js\";\nimport { decisionAnchors, decisionInspectionDigest } from \"../decisions/provenance.js\";\nimport { includedCheckPaths } from \"../audit/policy.js\";\nimport { loadProjectConfig } from \"../utils/files.js\";\nimport { execGit } from \"../utils/git-read.js\";\nimport { profilePhase } from \"../utils/profile.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { discoverDocPaths } from \"../audit/docs.js\";\nimport { pathClaimScope, pathExists, optionalMasonPath, gitMetadataPath } from \"../audit/scope.js\";\nimport { extractClaims } from \"../audit/claims.js\";\nimport { checkResultSchema } from \"../audit/repair.js\";\nimport { CHECKS, type CheckResult } from \"../audit/checks/index.js\";\nimport type { AuditOptions } from \"../audit/audit.js\";\nimport type { CheckName } from \"../audit/types.js\";\nimport { readAuditInput } from \"../audit/inputs.js\";\nimport { moduleCandidates, moduleDocumentation } from \"../audit/checks/new-module.js\";\nimport { resolveDocCountSource } from \"../audit/checks/stale-count.js\";\nimport { commandInputs } from \"../audit/checks/dead-command.js\";\nimport { storePath } from \"../utils/storage.js\";\nimport { advisoryReviewInventory } from \"../audit/advisory-review.js\";\n\ndeclare const PKG_VERSION: string;\nconst engineVersion = typeof PKG_VERSION === \"string\" ? PKG_VERSION : \"development\";\nexport const hash = (value: unknown): string =>\n createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\");\nexport async function git(root: string, ...args: string[]): Promise<string> {\n return profilePhase(\n \"automation.git\",\n async () =>\n (await execGit(args, { cwd: root, maxBuffer: 16 * 1024 * 1024, timeout: 10000 })).stdout,\n );\n}\n\nexport async function workspace(dir: string) {\n const root = await fs.realpath((await git(dir, \"rev-parse\", \"--show-toplevel\")).trim());\n const [gitDir, branch] = await Promise.all([\n git(root, \"rev-parse\", \"--absolute-git-dir\").then((value) => fs.realpath(value.trim())),\n git(root, \"symbolic-ref\", \"--quiet\", \"HEAD\").then(\n (value) => value.trim(),\n () => \"detached\",\n ),\n ]);\n return {\n root,\n gitDir,\n branch,\n directory: \".mason/reports/automation/\" + hash([root, gitDir, branch]).slice(0, 24),\n };\n}\n\nconst content = readAuditInput;\n\nexport interface Inputs {\n fingerprint: string;\n head: string;\n docs: Record<string, string | null>;\n keys: Record<CheckName, string>;\n decisionEvidence: Record<string, { digest: string; capture: AnchorCapture }>;\n}\n\nasync function captureDecisionEvidence(root: string, records: DecisionRecord[]) {\n const scopes = new Map(\n records\n .filter((record) => record.status === \"active\")\n .map((record) => {\n const anchors = decisionAnchors(record).sort();\n return [JSON.stringify(anchors), anchors] as const;\n }),\n );\n // Dirty path/status alone cannot detect another edit to the same file.\n // Preserve each scope's bound: a large union must not hide smaller complete captures.\n const captures = await captureAnchorScopes(root, [...scopes.values()]);\n const capturesByScope = new Map([...scopes.keys()].map((key, index) => [key, captures[index]]));\n const decisionEvidence: Inputs[\"decisionEvidence\"] = {};\n for (const record of records.filter((record) => record.status === \"active\")) {\n const key = JSON.stringify(decisionAnchors(record).sort());\n decisionEvidence[record.id] = {\n digest: decisionInspectionDigest(record),\n capture: capturesByScope.get(key)!,\n };\n }\n return decisionEvidence;\n}\n\n/** Guidance inputs exclude documentation claims, repair baselines and advisory reviews. */\nexport async function readGuidanceInputs(root: string): Promise<Inputs> {\n const [head, raw, store, shallowPath, replacements] = await Promise.all([\n git(root, \"rev-parse\", \"HEAD\").then((text) => text.trim()),\n readDecisionInputs(root),\n loadDecisionStore(root),\n git(root, \"rev-parse\", \"--git-path\", \"shallow\"),\n git(root, \"for-each-ref\", \"--format=%(refname) %(objectname)\", \"refs/replace\"),\n ]);\n if (raw.diagnostics.length || store.diagnostics.length)\n throw new Error(\n \"Cannot read decision inputs: \" +\n [...raw.diagnostics, ...store.diagnostics].map((d) => `${d.path}: ${d.message}`).join(\"; \"),\n );\n const decisionEvidence = await captureDecisionEvidence(root, store.records);\n const shallow = await fs\n .readFile(path.resolve(root, shallowPath.trim()), \"utf8\")\n .catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n const fingerprint = hash([\n \"guidance\",\n engineVersion,\n head,\n raw.inputs,\n decisionEvidence,\n shallow,\n replacements,\n ]);\n return {\n fingerprint,\n head,\n decisionEvidence,\n docs: {},\n keys: {\n \"deleted-reference\": \"\",\n \"new-module\": \"\",\n \"stale-count\": \"\",\n \"dead-command\": \"\",\n \"deps-changed\": \"\",\n \"decision-anchor-drift\": fingerprint,\n },\n };\n}\n\nexport async function readInputs(root: string): Promise<Inputs> {\n return profilePhase(\"automation.inputs\", () => collectInputs(root));\n}\n\nasync function collectInputs(root: string): Promise<Inputs> {\n const docPaths = await discoverDocPaths(root);\n const auditPolicy = (await loadProjectConfig(root)).audit;\n const allowed = new Map<CheckName, Set<string>>();\n for (const name of [\"deleted-reference\", \"new-module\", \"stale-count\", \"dead-command\"] as const) {\n allowed.set(name, await includedCheckPaths(root, docPaths, auditPolicy?.exclude?.[name] ?? []));\n }\n const [headText, docStatus, shallowPath, replacements] = await Promise.all([\n git(root, \"rev-parse\", \"HEAD\"),\n docPaths.length\n ? git(\n root,\n \"status\",\n \"--porcelain=v1\",\n \"-z\",\n \"--untracked-files=all\",\n \"--\",\n ...docPaths.map((p) => `:(literal)${p}`),\n )\n : \"\",\n git(root, \"rev-parse\", \"--git-path\", \"shallow\"),\n git(root, \"for-each-ref\", \"--format=%(refname) %(objectname)\", \"refs/replace\"),\n ]);\n const head = headText.trim();\n let shallow: string | null = null;\n try {\n shallow = await fs.readFile(path.resolve(root, shallowPath.trim()), \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n const docs: Record<string, string | null> = {};\n const docContents: Array<[string, string | null]> = [];\n const parsedDocs = [];\n const claims: Array<[string, boolean, boolean]> = [];\n const presence = new Map<string, Promise<boolean>>();\n const exists = (file: string) => {\n if (!presence.has(file)) presence.set(file, pathExists(root, file));\n return presence.get(file)!;\n };\n for (const file of docPaths) {\n const text = await content(root, file);\n docs[file] = text === null ? null : hash(text);\n docContents.push([file, text]);\n const parsed = { path: file, content: text ?? \"\", claims: extractClaims(text ?? \"\") };\n parsedDocs.push(parsed);\n for (const claim of allowed.get(\"deleted-reference\")!.has(file) ? parsed.claims.paths : []) {\n const scope = pathClaimScope(file, claim);\n if (scope?.candidates.some(gitMetadataPath)) continue;\n for (const candidate of scope?.candidates ?? []) {\n if (optionalMasonPath(candidate)) continue;\n const [filePresent, parentPresent] = await Promise.all([\n exists(candidate),\n exists(path.posix.dirname(candidate)),\n ]);\n claims.push([candidate, filePresent, parentPresent]);\n }\n }\n }\n const combinedDocs = moduleDocumentation(\n parsedDocs.filter((doc) => allowed.get(\"new-module\")!.has(doc.path)),\n );\n const countClaims = parsedDocs\n .filter((doc) => allowed.get(\"stale-count\")!.has(doc.path))\n .flatMap((doc) => doc.claims.counts.map((claim) => ({ doc: doc.path, claim })));\n const decisionDirectory = await storePath(root, \".mason/decisions\");\n const decisionPresence = await fs.lstat(decisionDirectory).then(\n (stat) => (stat.isDirectory() ? \"directory\" : \"file\"),\n (error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return \"absent\";\n throw error;\n },\n );\n const [modules, counts, commands, decisionInputs] = await Promise.all([\n combinedDocs ? moduleCandidates(root, combinedDocs) : [],\n Promise.all(countClaims.map(({ doc, claim }) => resolveDocCountSource(root, doc, claim))),\n commandInputs(\n root,\n parsedDocs.filter((doc) => allowed.get(\"dead-command\")!.has(doc.path)),\n ),\n readDecisionInputs(root),\n ]);\n if (decisionInputs.diagnostics.length)\n throw new Error(\n \"Cannot read decision inputs: \" +\n decisionInputs.diagnostics.map((d) => `${d.path}: ${d.message}`).join(\"; \"),\n );\n const decisions = decisionInputs.inputs;\n // Decision freshness observes tracked and local anchor changes; other checks\n // do not need a repository-wide status or index scan.\n const [status, index] = decisions.length\n ? await Promise.all([\n git(\n root,\n \"status\",\n \"--porcelain=v1\",\n \"-z\",\n \"--untracked-files=all\",\n \"--\",\n \".\",\n \":(exclude).mason/reports\",\n ),\n git(root, \"ls-files\", \"--stage\", \"-z\", \"--\", \".\", \":(exclude).mason/reports\"),\n ])\n : [\"\", \"\"];\n const records = decisions.length ? (await loadDecisionStore(root)).records : [];\n const decisionEvidence = await captureDecisionEvidence(root, records);\n const anchorContent = Object.entries(decisionEvidence);\n const common = [8, engineVersion, head, shallow, replacements, docContents, auditPolicy];\n const keys: Record<CheckName, string> = {\n \"deleted-reference\": hash([common, claims, docStatus]),\n \"new-module\": hash([common, modules]),\n \"stale-count\": hash([common, counts]),\n \"dead-command\": hash([common, commands]),\n \"deps-changed\": hash([common, docStatus]),\n \"decision-anchor-drift\": hash([\n common,\n decisionPresence,\n decisions,\n status,\n index,\n anchorContent,\n ]),\n };\n return {\n fingerprint: hash([keys, await advisoryReviewInventory(root)]),\n head,\n docs,\n keys,\n decisionEvidence,\n };\n}\n\nconst cacheSchema = z.object({\n version: z.literal(1),\n entries: z.record(z.object({ key: z.string(), result: checkResultSchema })),\n digest: z.string(),\n});\nexport function checkCache(raw: unknown, inputs: Inputs) {\n let entries: Record<string, { key: string; result: CheckResult }> = {};\n let diagnostic: string | null = null;\n if (raw !== null) {\n const parsed = cacheSchema.safeParse(raw);\n if (parsed.success && parsed.data.digest === hash(parsed.data.entries))\n entries = parsed.data.entries as Record<string, { key: string; result: CheckResult }>;\n else diagnostic = \"Discarded an invalid automation cache; checks are being recomputed.\";\n }\n const ran = new Set<CheckName>(),\n reused = new Set<CheckName>();\n const options: AuditOptions = {\n runCheck: async (name, ctx) => {\n if (entries[name]?.key === inputs.keys[name]) {\n reused.add(name);\n return structuredClone(entries[name].result);\n }\n const result = await profilePhase(\"check.\" + name, () => CHECKS[name](ctx));\n ran.add(name);\n // An unavailable check must be retried even if the file inputs match.\n if (!result.skipped.length) entries[name] = { key: inputs.keys[name], result };\n else delete entries[name];\n return result;\n },\n };\n return {\n options,\n ran,\n reused,\n diagnostic,\n has: (name: CheckName) =>\n entries[name]?.key === inputs.keys[name] && !entries[name].result.skipped.length,\n serialize: () => {\n const canonical = cacheSchema.shape.entries.parse(entries);\n return { version: 1, entries: canonical, digest: hash(canonical) };\n },\n };\n}\n","import { z } from \"zod\";\nimport { readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport { workspace } from \"./evidence.js\";\nimport { withLock } from \"./store.js\";\n\nexport const stopBlockSchema = z.enum([\"off\", \"drift\"]);\nconst configSchema = z.object({ version: z.literal(1), stopBlock: stopBlockSchema });\nconst directory = \".mason/reports/automation\";\nconst configPath = directory + \"/config.json\";\n\nexport async function readAutomationConfig(root: string) {\n const raw = await readStoreJson(root, configPath);\n return raw === null\n ? { version: 1 as const, stopBlock: \"drift\" as const }\n : configSchema.parse(raw);\n}\n\nexport async function configureStopBlock(dir: string, value: unknown) {\n const stopBlock = stopBlockSchema.parse(value);\n const ws = await workspace(dir);\n return withLock(ws.root, directory, async () => {\n const config = { ...(await readAutomationConfig(ws.root)), stopBlock };\n await writeStoreJson(ws.root, configPath, config);\n return config;\n });\n}\n","import { isRecord } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport { workspace, hash } from \"./evidence.js\";\nimport { readStoreJson, writeStoreJson, storePath } from \"../utils/storage.js\";\nimport { withStoreLock } from \"../utils/store-lock.js\";\nimport type { AutomationEvent, AutomationReport } from \"./runtime.js\";\nimport type { RepairFinding } from \"../audit/repair.js\";\n\nconst directory = \".mason/local/usefulness\";\nconst configPath = directory + \"/config.json\";\nconst configSchema = z.object({ version: z.literal(1), enabled: z.boolean() });\nexport const usefulnessRating = z.enum([\"helpful\", \"already-knew\", \"irrelevant\", \"deferred\"]);\nconst findingSchema = z.object({\n type: z.string(),\n channels: z.array(z.enum([\"agent\", \"completion\"])),\n status: z.enum([\"resolved\", \"unresolved\", \"review-required\", \"unverified\", \"unknown\"]),\n deliveredAt: z.string(),\n observedAt: z.string(),\n rating: usefulnessRating.optional(),\n});\nconst sessionSchema = z.object({\n host: z.string(),\n updatedAt: z.string(),\n endedAt: z.string().optional(),\n checks: z.number(),\n checkMs: z.number(),\n findings: z.record(findingSchema),\n decisions: z.array(z.string()),\n retrievalObserved: z.boolean(),\n receiptIds: z.array(z.string()),\n reportPath: z.string(),\n truncated: z.boolean(),\n});\nconst stateSchema = z.object({ version: z.literal(1), sessions: z.record(sessionSchema) });\ntype Session = z.infer<typeof sessionSchema>;\nconst empty = () => ({ version: 1 as const, sessions: {} as Record<string, Session> });\nconst statePath = (ws: Awaited<ReturnType<typeof workspace>>) =>\n `${directory}/${hash([ws.root, ws.gitDir, ws.branch]).slice(0, 24)}.json`;\nasync function enabled(root: string) {\n const raw = await readStoreJson(root, configPath);\n return raw !== null && configSchema.parse(raw).enabled;\n}\nexport async function configureUsefulness(\n dir: string,\n value: boolean,\n options: { onlyIfUnset?: boolean } = {},\n) {\n const ws = await workspace(dir);\n const configured = await withStoreLock(ws.root, directory, async () => {\n if (options.onlyIfUnset) {\n const existing = await readStoreJson(ws.root, configPath);\n if (existing !== null) return configSchema.parse(existing).enabled;\n }\n // Self-contained ignore rules keep these observations local even before project setup.\n const ignore = await storePath(ws.root, directory + \"/.gitignore\", true);\n try {\n await fs.writeFile(ignore, \"*\\n\", { flag: \"wx\", mode: 0o600 });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n await writeStoreJson(ws.root, configPath, { version: 1, enabled: value });\n return value;\n });\n return {\n enabled: configured,\n storage: directory,\n note: \"Local only. Disabling retains prior observations.\",\n };\n}\n\n/** Store IDs and counts, never hook payloads, prompts, returned text or source contents. */\nexport async function observeUsefulness(\n root: string,\n event: AutomationEvent,\n report: AutomationReport,\n agent: RepairFinding[],\n completion: RepairFinding[],\n elapsedMs: number,\n observedAt = new Date().toISOString(),\n) {\n if (!event.host || !event.sessionId || !(await enabled(root))) return;\n const ws = await workspace(root);\n await withStoreLock(ws.root, directory, async () => {\n if (!(await enabled(root))) return;\n const raw = await readStoreJson(root, statePath(ws));\n const state = raw === null ? empty() : stateSchema.parse(raw);\n const now = observedAt;\n const key = hash([event.host, event.sessionId]);\n const session = (state.sessions[key] ??= {\n host: event.host!,\n updatedAt: now,\n checks: 0,\n checkMs: 0,\n findings: {},\n decisions: [],\n retrievalObserved: false,\n receiptIds: [],\n reportPath: report.reportPath,\n truncated: false,\n });\n const newer = now >= session.updatedAt;\n if (newer) {\n session.updatedAt = now;\n session.reportPath = report.reportPath;\n }\n session.checks++;\n session.checkMs += Math.max(0, elapsedMs);\n if (newer) {\n if (event.event === \"task_end\") session.endedAt = now;\n else delete session.endedAt;\n }\n // Publication and stats recording use separate locks. A first-delivery record\n // can arrive after a newer audit; use that retained audit for its status.\n let latestFindings: { id: string; status: z.infer<typeof findingSchema>[\"status\"] }[] = [];\n if (\n !newer &&\n [...agent.slice(0, 4), ...completion.slice(0, 4)].some((f) => !session.findings[f.id])\n ) {\n try {\n if (!session.reportPath.startsWith(ws.directory + \"/checks/\"))\n throw new Error(\"Unexpected report path\");\n latestFindings = z\n .object({\n findings: z.array(z.object({ id: z.string(), status: findingSchema.shape.status })),\n })\n .parse(await readStoreJson(root, session.reportPath)).findings;\n } catch {\n /* Unavailable newer evidence means unknown, never reuse an older verdict. */\n }\n }\n for (const [channel, findings] of [\n [\"agent\", agent],\n [\"completion\", completion],\n ] as const) {\n for (const finding of findings.slice(0, 4)) {\n if (!session.findings[finding.id] && Object.keys(session.findings).length >= 200) {\n session.truncated = true;\n continue;\n }\n const saved = (session.findings[finding.id] ??= {\n type: finding.original.type,\n channels: [],\n status: newer\n ? finding.status\n : (latestFindings.find((f) => f.id === finding.id)?.status ?? \"unknown\"),\n deliveredAt: now,\n observedAt: newer ? now : session.updatedAt,\n });\n if (!saved.channels.includes(channel)) saved.channels.push(channel);\n }\n }\n for (const [id, saved] of Object.entries(session.findings)) {\n if (now < saved.observedAt) continue;\n const current = report.findings.find((f) => f.id === id);\n saved.status = current?.status ?? \"unknown\";\n saved.observedAt = now;\n }\n // Only successful get_context response receipts count as retrieval. Invocation alone is insufficient.\n if (event.retrievedDecisionIds !== undefined && event.toolId) {\n const receipt = hash([event.toolId]);\n if (!session.receiptIds.includes(receipt)) {\n session.retrievalObserved = true;\n const decisions = [\n ...new Set([...session.decisions, ...event.retrievedDecisionIds.map((id) => hash([id]))]),\n ];\n if (decisions.length > 200) session.truncated = true;\n session.decisions = decisions.slice(0, 200);\n session.receiptIds = [...session.receiptIds, receipt].slice(-200);\n }\n }\n const keys = Object.keys(state.sessions).sort((a, b) =>\n state.sessions[b].updatedAt.localeCompare(state.sessions[a].updatedAt),\n );\n for (const key of keys.slice(50)) delete state.sessions[key];\n await writeStoreJson(root, statePath(ws), state);\n });\n}\nexport async function rateUsefulness(\n dir: string,\n sessionId: string,\n findingId: string,\n rating: z.infer<typeof usefulnessRating>,\n) {\n const ws = await workspace(dir);\n return withStoreLock(ws.root, directory, async () => {\n const state = stateSchema.parse(await readStoreJson(ws.root, statePath(ws)));\n const finding = state.sessions[sessionId]?.findings[findingId];\n if (!finding)\n throw new Error(\"Unknown retained session or finding; inspect mason stats --json.\");\n finding.rating = usefulnessRating.parse(rating);\n await writeStoreJson(ws.root, statePath(ws), state);\n return { session: sessionId, finding: findingId, rating };\n });\n}\nexport async function usefulnessStatus(dir: string, sessionId?: string) {\n const ws = await workspace(dir);\n const raw = await readStoreJson(ws.root, statePath(ws));\n const state = raw === null ? empty() : stateSchema.parse(raw);\n if (sessionId !== undefined && !Object.hasOwn(state.sessions, sessionId))\n throw new Error(\"Unknown retained session; inspect mason stats --json for session IDs.\");\n const sessions = Object.entries(state.sessions)\n .filter(([id]) => sessionId === undefined || id === sessionId)\n .sort(([, a], [, b]) => b.updatedAt.localeCompare(a.updatedAt))\n .map(([id, s]) => ({\n id,\n ...s,\n receiptIds: undefined,\n delivered: Object.keys(s.findings).length,\n resolved: Object.values(s.findings).filter((f) => f.status === \"resolved\").length,\n unknown: Object.values(s.findings).filter(\n (f) => f.status === \"unknown\" || f.status === \"unverified\",\n ).length,\n open: Object.values(s.findings).filter(\n (f) => f.status === \"unresolved\" || f.status === \"review-required\",\n ).length,\n ratings: Object.fromEntries(\n usefulnessRating.options.map((rating) => [\n rating,\n Object.values(s.findings).filter((f) => f.rating === rating).length,\n ]),\n ),\n deferred: Object.values(s.findings).filter((f) => f.rating === \"deferred\").length,\n retrievedDecisions: s.retrievalObserved ? s.decisions.length : null,\n application: \"unknown\",\n modelTokens: null,\n }));\n const sum = (pick: (s: (typeof sessions)[number]) => number) =>\n sessions.reduce((total, s) => total + pick(s), 0);\n const retrievalObservedSessions = sessions.filter((s) => s.retrievalObserved).length;\n return {\n version: 1,\n enabled: await enabled(ws.root),\n branch: ws.branch,\n sessionId: sessionId ?? null,\n summary: {\n sessions: sessions.length,\n delivered: sum((s) => s.delivered),\n resolved: sum((s) => s.resolved),\n open: sum((s) => s.open),\n unknown: sum((s) => s.unknown),\n ratings: Object.fromEntries(\n usefulnessRating.options.map((rating) => [rating, sum((s) => s.ratings[rating])]),\n ),\n retrievedDecisions: retrievalObservedSessions ? sum((s) => s.retrievedDecisions ?? 0) : null,\n retrievalObservedSessions,\n checks: sum((s) => s.checks),\n checkMs: sum((s) => s.checkMs),\n truncatedSessions: sessions.filter((s) => s.truncated).length,\n application: \"unknown\",\n modelTokens: null,\n },\n note: \"Counts sum distinct findings and returned records within each retained session; the same item may appear in multiple sessions. Status reflects the last observed check, not a fresh verification. Up to 50 sessions and 200 findings/records per session are retained. Resolution after a notice does not establish causation. Ratings are supplied feedback, not authenticated judgments. Lesson application, later-session reuse and model-token cost are unknown.\",\n sessions,\n };\n}\nexport function summarizeUsefulness(result: Awaited<ReturnType<typeof usefulnessStatus>>) {\n const s = result.summary;\n return [\n `Mason stats — tracking ${result.enabled ? \"enabled\" : \"disabled\"} (local only)`,\n `${s.sessions} retained session(s)${result.sessionId ? \" selected\" : \" in this branch\"}. Counts are summed per session.`,\n `Findings: ${s.delivered} delivered; ${s.resolved} observed resolved; ${s.open} open; ${s.unknown} unknown.`,\n `Feedback: ${s.ratings.helpful} helpful; ${s.ratings[\"already-knew\"]} already knew; ${s.ratings.irrelevant} irrelevant; ${s.ratings.deferred} deferred.`,\n `Decision records returned: ${s.retrievedDecisions ?? \"unknown\"} (${s.retrievalObservedSessions}/${s.sessions} sessions with retrieval receipts); application unknown.`,\n `Automation: ${(s.checkMs / 1000).toFixed(2)} seconds across ${s.checks} observations; model-token cost unknown.`,\n ...(s.truncatedSessions\n ? [`${s.truncatedSessions} session(s) have truncated observations.`]\n : []),\n ...(result.sessionId\n ? result.sessions.flatMap((session) => [\n `Session ${session.id} (${session.host}) — ${session.endedAt ? \"last observed stop \" + session.endedAt : \"no final stop observed\"}`,\n `Evidence: ${session.reportPath}`,\n ...Object.entries(session.findings).map(\n ([id, f]) =>\n ` ${id}: ${f.type}; ${f.status}; ${f.channels.join(\"/\")}${f.rating ? \"; rated \" + f.rating : \"\"}`,\n ),\n ])\n : [\n s.sessions\n ? \"Use --json for session IDs, then --session <id> for details.\"\n : \"No retained sessions observed.\",\n ]),\n \"Last observed checks only. Resolution after a notice does not prove Mason caused it.\",\n ].join(\"\\n\");\n}\n\n/** Hosts may wrap MCP text blocks; do not infer retrieval from tool inputs. */\nexport function retrievedDecisions(\n tool: string | undefined,\n response: unknown,\n): string[] | undefined {\n if (!/(?:^|__)mason__get_context$/.test(tool ?? \"\")) return undefined;\n try {\n let value: unknown = typeof response === \"string\" ? JSON.parse(response) : response;\n if (!isRecord(value)) return undefined;\n if (value.isError) return undefined;\n if (Array.isArray(value?.content)) {\n const block: unknown = value.content.find(\n (item: unknown) => isRecord(item) && item.type === \"text\" && typeof item.text === \"string\",\n );\n if (!isRecord(block) || typeof block.text !== \"string\" || !block.text) return undefined;\n const text = block.text;\n value = JSON.parse(text);\n }\n if (!isRecord(value) || !isRecord(value.decisions)) return undefined;\n return Object.keys(value.decisions)\n .filter((id) => /^[a-zA-Z0-9_-]{1,200}$/.test(id))\n .slice(0, 200);\n } catch {\n return undefined;\n }\n}\n","import os from \"node:os\";\nimport fs from \"node:fs/promises\";\nimport { withLock } from \"./store.js\";\nimport { hash, workspace } from \"./evidence.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { readStoreJson, writeStoreJson, storePath } from \"../utils/storage.js\";\n\nconst failureSchema = z.object({\n code: z.enum([\n \"inputs-changed\",\n \"storage-full\",\n \"busy\",\n \"invalid-input\",\n \"history-unavailable\",\n \"invalid-evidence\",\n \"io-error\",\n \"internal\",\n ]),\n message: z.string(),\n retryable: z.boolean(),\n receiptRecorded: z.boolean(),\n});\nexport type AutomationFailure = z.infer<typeof failureSchema>;\nconst attemptSchema = z.object({\n id: z.string().regex(/^[a-zA-Z0-9_-]+$/),\n lease: z.literal(true).optional(),\n event: z.string(),\n startedAt: z.string(),\n finishedAt: z.string().optional(),\n durationMs: z.number().nonnegative().optional(),\n pid: z.number().int().positive(),\n host: z.string(),\n status: z.enum([\"running\", \"completed\", \"failed\", \"unknown\"]),\n verificationStatus: z.string().optional(),\n reportPath: z.string().optional(),\n failure: failureSchema.optional(),\n});\nconst executionSchema = z.object({\n version: z.literal(1),\n attempts: z.array(attemptSchema).max(160),\n discardedAttempts: z.number().int().nonnegative().default(0),\n});\nfunction parseExecution(raw: unknown) {\n try {\n return executionSchema.parse(raw);\n } catch (error) {\n throw new Error(\"Invalid automation execution store; receipt history was retained.\", {\n cause: error,\n });\n }\n}\n\n/** Classify failures without interpreting the advisory hook's exit code as evidence. */\nexport function automationFailure(error: unknown): AutomationFailure {\n const recorded = failureSchema.safeParse((error as { failure?: unknown } | null)?.failure);\n if (recorded.success) return recorded.data;\n const message = (error instanceof Error ? error.message : String(error))\n .replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \")\n .slice(0, 700);\n const codes = new Set<string>();\n let cause: unknown = error;\n for (let i = 0; cause && i < 8; i++) {\n codes.add(String((cause as NodeJS.ErrnoException).code));\n cause = (cause as Error).cause;\n }\n const code: AutomationFailure[\"code\"] =\n codes.has(\"ENOSPC\") || codes.has(\"EDQUOT\")\n ? \"storage-full\"\n : /changed during|changed while|changed between/.test(message)\n ? \"inputs-changed\"\n : /Automation is busy/.test(message)\n ? \"busy\"\n : /not a git repository|unknown revision|bad revision|different history|unreachable/.test(\n message,\n )\n ? \"history-unavailable\"\n : error instanceof z.ZodError ||\n error instanceof SyntaxError ||\n /Hook input|Expected one command|Unknown automation command|--host/.test(message)\n ? \"invalid-input\"\n : /store|baseline|modified|symbolic link|Symlink|automation state|state belongs/.test(\n message,\n )\n ? \"invalid-evidence\"\n : [...codes].some((c) => /^E[A-Z]+$/.test(c))\n ? \"io-error\"\n : \"internal\";\n return {\n code,\n message,\n retryable: [\"inputs-changed\", \"storage-full\", \"busy\", \"io-error\"].includes(code),\n receiptRecorded: false,\n };\n}\n\nexport function failureMessage(error: unknown): string {\n const failure = automationFailure(error);\n return (\n `Mason automation unavailable [${failure.code}]; evidence capture/verification was not established. ${failure.message}` +\n (failure.receiptRecorded ? \"\" : \" No durable failure receipt was recorded.\")\n );\n}\n\nconst notificationsSchema = z.object({\n version: z.literal(1),\n sessions: z.record(\n z.object({\n signature: z.string(),\n code: failureSchema.shape.code,\n message: z.string(),\n count: z.number().int().positive(),\n lastAt: z.string(),\n }),\n ),\n});\n\nexport async function failureNotifications(root: string, directory: string) {\n const raw = await readStoreJson(root, directory + \"/notifications.json\");\n return raw === null ? { version: 1 as const, sessions: {} } : notificationsSchema.parse(raw);\n}\n\n/** Suppress repeats only after the failure itself has a durable execution receipt. */\nexport async function hookFailureMessage(\n dir: string,\n host: string,\n sessionId: string,\n error: unknown,\n): Promise<string | null> {\n const failure = automationFailure(error);\n if (!failure.receiptRecorded) return failureMessage(error);\n try {\n const ws = await workspace(dir);\n return await withLock(ws.root, ws.directory + \"/notifications\", async () => {\n const notices = await failureNotifications(ws.root, ws.directory);\n const key = hash([host, sessionId]),\n signature = hash([failure.code, failure.message]);\n const previous = notices.sessions[key];\n const execution = await executionStatus(ws.root, ws.directory);\n const recovered =\n previous &&\n execution.attempts.some((a) => a.status === \"completed\" && a.startedAt > previous.lastAt);\n const repeat = previous?.signature === signature && !recovered;\n notices.sessions[key] = {\n signature,\n code: failure.code,\n message: failure.message,\n count: repeat ? previous.count + 1 : 1,\n lastAt: new Date().toISOString(),\n };\n notices.sessions = Object.fromEntries(\n Object.entries(notices.sessions)\n .sort(([, a], [, b]) => b.lastAt.localeCompare(a.lastAt))\n .slice(0, 32),\n );\n await writeStoreJson(ws.root, ws.directory + \"/notifications.json\", notices);\n return repeat\n ? null\n : failureMessage(error) +\n \" Repeated failures in this session are recorded in mason status --json.\";\n });\n } catch {\n return failureMessage(error);\n }\n}\n\n/** Each invocation owns a receipt while only brief log updates are serialized. */\nconst leasePath = (directory: string, id: string) => `${directory}/executions/${id}.json`;\n\nasync function refreshRunning(\n root: string,\n directory: string,\n attempts: z.infer<typeof attemptSchema>[],\n) {\n for (const attempt of attempts) {\n if (attempt.status !== \"running\") continue;\n let alive = false;\n try {\n const owner = (await readStoreJson(\n root,\n attempt.lease ? leasePath(directory, attempt.id) : directory + \"/lock\",\n )) as { pid?: unknown; host?: unknown } | null;\n if (\n attempt.host === os.hostname() &&\n owner?.pid === attempt.pid &&\n owner.host === attempt.host\n ) {\n try {\n process.kill(attempt.pid, 0);\n alive = true;\n } catch (error) {\n alive = (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n }\n } catch {\n /* Missing ownership never establishes a running check. */\n }\n if (!alive) attempt.status = \"unknown\";\n }\n}\n\nasync function editExecution(\n root: string,\n directory: string,\n edit: (log: z.infer<typeof executionSchema>) => void,\n) {\n return withLock(root, directory + \"/execution-lock\", async () => {\n const file = directory + \"/execution.json\";\n const raw = await readStoreJson(root, file);\n const log =\n raw === null\n ? { version: 1 as const, attempts: [], discardedAttempts: 0 }\n : parseExecution(raw);\n await refreshRunning(root, directory, log.attempts);\n edit(log);\n // Keep every live invocation plus the latest 32 finished attempts.\n const finished = log.attempts.filter((a) => a.status !== \"running\");\n const discard = new Set(finished.slice(0, Math.max(0, finished.length - 32)).map((a) => a.id));\n log.discardedAttempts += discard.size;\n log.attempts = log.attempts.filter((a) => !discard.has(a.id));\n await writeStoreJson(root, file, log);\n });\n}\n\nexport async function recordExecution<T extends { report: { status: string; reportPath: string } }>(\n root: string,\n directory: string,\n event: string,\n run: () => Promise<T>,\n): Promise<T> {\n const started = performance.now();\n const attempt: z.infer<typeof attemptSchema> = {\n id: randomUUID(),\n event,\n startedAt: new Date().toISOString(),\n pid: process.pid,\n host: os.hostname(),\n status: \"running\",\n lease: true,\n };\n const owner = leasePath(directory, attempt.id);\n const finish = async (changes: Partial<z.infer<typeof attemptSchema>>) =>\n editExecution(root, directory, (log) => {\n const current = log.attempts.find((a) => a.id === attempt.id);\n if (!current)\n throw new Error(\n \"Automation execution receipt disappeared; completion could not be recorded.\",\n );\n Object.assign(current, changes, {\n finishedAt: new Date().toISOString(),\n durationMs: performance.now() - started,\n });\n });\n await writeStoreJson(root, owner, { pid: attempt.pid, host: attempt.host });\n try {\n await editExecution(root, directory, (log) => {\n if (log.attempts.filter((a) => a.status === \"running\").length >= 128)\n throw new Error(\"Too many active automation executions; existing receipts were retained.\");\n log.attempts.push(attempt);\n });\n try {\n const result = await run();\n await finish({\n status: \"completed\",\n verificationStatus: result.report.status,\n reportPath: result.report.reportPath,\n });\n return result;\n } catch (error) {\n const failure = automationFailure(error);\n try {\n await finish({ status: \"failed\", failure: { ...failure, receiptRecorded: true } });\n failure.receiptRecorded = true;\n } catch {\n /* Storage failures may also prevent their own completion receipt. */\n }\n throw Object.assign(new Error(failure.message, { cause: error }), { failure });\n }\n } finally {\n await fs.rm(await storePath(root, owner), { force: true }).catch(() => {});\n }\n}\n\nexport async function executionStatus(root: string, directory: string) {\n const raw = await readStoreJson(root, directory + \"/execution.json\");\n if (raw === null) return { status: \"not-observed\" as const, attempts: [] };\n const log = parseExecution(raw);\n await refreshRunning(root, directory, log.attempts);\n const completed = [...log.attempts].reverse().find((a) => a.status === \"completed\");\n // A success that began before another call failed cannot establish recovery.\n const outstanding = [...log.attempts]\n .reverse()\n .find(\n (a) =>\n [\"failed\", \"unknown\"].includes(a.status) &&\n (!completed || (a.finishedAt ?? a.startedAt) >= completed.startedAt),\n );\n // Hooks overlap the next tool call, so an attempt is usually in flight during healthy use.\n // It must not hide the latest completed result; dead attempts were already marked unknown.\n const inFlight = log.attempts.some((a) => a.status === \"running\");\n const status =\n outstanding?.status ??\n (completed\n ? \"completed\"\n : inFlight\n ? \"running\"\n : (log.attempts.at(-1)?.status ?? \"not-observed\"));\n return { status, inFlight, attempts: log.attempts, discardedAttempts: log.discardedAttempts };\n}\n","import { getWorkingTree } from \"../drift/drift.js\";\nimport { execGit } from \"../utils/git-read.js\";\n\n/** A branch's own upstream is usually its remote copy, so attribute against the default branch. */\nconst TARGETS = [\n \"refs/remotes/origin/HEAD\",\n \"refs/remotes/origin/main\",\n \"refs/remotes/origin/master\",\n \"refs/heads/main\",\n \"refs/heads/master\",\n];\n\nexport interface BranchAttribution {\n /** Short name of the default branch this checkout builds on, e.g. origin/main. */\n target: string;\n mergeBase: string;\n /** Files this branch changed since the merge-base, including uncommitted work. */\n branchFiles: Set<string>;\n}\n\n/**\n * Which changes belong to this branch rather than the default branch it builds on. Returns null\n * on the default branch itself, behind it, or without a resolvable target, so drift there is\n * reported as before. Deterministic and local: refs are not fetched.\n */\nexport async function branchAttribution(root: string): Promise<BranchAttribution | null> {\n const git = async (...args: string[]) =>\n (await execGit(args, { cwd: root, maxBuffer: 16 * 1024 * 1024 })).stdout.trim();\n let target: string | null = null;\n for (const ref of TARGETS) {\n try {\n await git(\"rev-parse\", \"--verify\", \"--quiet\", `${ref}^{commit}`);\n target =\n ref === \"refs/remotes/origin/HEAD\"\n ? await git(\"symbolic-ref\", \"--short\", ref)\n : ref.replace(/^refs\\/(remotes|heads)\\//, \"\");\n break;\n } catch {\n /* Try the next conventional default branch. */\n }\n }\n if (!target) return null;\n const current = await git(\"symbolic-ref\", \"--quiet\", \"--short\", \"HEAD\").catch(() => \"\");\n if (current && (target === current || target.endsWith(\"/\" + current))) return null;\n let mergeBase: string, head: string;\n try {\n [mergeBase, head] = await Promise.all([\n git(\"merge-base\", \"HEAD\", target),\n git(\"rev-parse\", \"HEAD\"),\n ]);\n } catch {\n return null;\n }\n if (!mergeBase || mergeBase === head) return null;\n const [committed, workingTree] = await Promise.all([\n git(\"diff\", \"--name-only\", \"--no-renames\", \"-z\", mergeBase, \"HEAD\"),\n getWorkingTree(root),\n ]);\n if (!workingTree.available) return null;\n return {\n target,\n mergeBase,\n branchFiles: new Set([...committed.split(\"\\0\").filter(Boolean), ...workingTree.changedFiles]),\n };\n}\n","import { execGit } from \"../utils/git-read.js\";\nimport { loadDecisionStore } from \"./decisions.js\";\nimport { decisionApproval } from \"./provenance.js\";\n\n/** Informational only: saving, committing, and accepting are separate operations. */\nexport async function pendingKnowledge(root: string, now = Date.now()): Promise<string | null> {\n try {\n const [store, status] = await Promise.all([\n loadDecisionStore(root),\n execGit(\n [\"status\", \"--porcelain=v1\", \"-z\", \"--untracked-files=all\", \"--\", \".mason/decisions\"],\n { cwd: root, timeout: 10000, maxBuffer: 1024 * 1024 },\n ),\n ]);\n const changed = new Set<string>();\n const entries = status.stdout.split(\"\\0\");\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (!entry) continue;\n const file = entry.slice(3);\n if (/^\\.mason\\/decisions\\/[^/]+\\.json$/.test(file)) changed.add(file);\n if (/[RC]/.test(entry.slice(0, 2))) i++; // porcelain -z includes the old name separately\n }\n const records = new Map(\n store.records.map((record) => [`.mason/decisions/${record.id}.json`, record]),\n );\n const age = (at?: string) => {\n const time = at ? Date.parse(at) : NaN;\n return Number.isFinite(time)\n ? `${Math.max(0, Math.floor((now - time) / 86400000))} days`\n : \"unknown age\";\n };\n const safe = (value: string) => value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \");\n const list = (items: string[]) =>\n items.slice(0, 5).map(safe).join(\"; \") +\n (items.length > 5 ? `; ${items.length - 5} more` : \"\");\n const proposals = store.records\n .filter((record) => record.status === \"active\" && decisionApproval(record) === \"proposed\")\n .map((record) => {\n // Revisions must not reset how long an outstanding proposal has waited.\n const history = record.version === 2 ? record.history : [];\n let lastReview = -1;\n history.forEach((event, index) => {\n if (event.kind === \"accepted\" || event.kind === \"reaffirmed\") lastReview = index;\n });\n const since =\n history\n .slice(lastReview + 1)\n .find((event) => event.kind === \"created\" || event.kind === \"revised\")?.at ??\n record.createdAt;\n return { record, since };\n })\n .sort((a, b) => {\n const timestamp = (value: string) =>\n Number.isFinite(Date.parse(value)) ? Date.parse(value) : Infinity;\n return timestamp(a.since) - timestamp(b.since) || a.record.id.localeCompare(b.record.id);\n });\n const lines = [];\n if (changed.size)\n lines.push(\n `${changed.size} uncommitted decision record(s): ${list(\n [...changed]\n .sort()\n .map((file) => `${file} (saved-record age: ${age(records.get(file)?.updatedAt)})`),\n )}.`,\n );\n if (proposals.length)\n lines.push(\n `${proposals.length} proposal(s) awaiting review (oldest first): ${list(\n proposals.map(\n ({ record, since }) => `.mason/decisions/${record.id}.json (${age(since)})`,\n ),\n )}.`,\n );\n if (store.diagnostics.length)\n lines.push(\n `${store.diagnostics.length} decision record(s) could not be read; pending knowledge summary is incomplete.`,\n );\n return lines.length\n ? `Mason pending knowledge:\\n${lines.join(\"\\n\")}\\nInformational only; review and commit through the normal project workflow. No approval is implied.`\n : null;\n } catch {\n return \"Mason pending knowledge: unavailable; decision records or Git status could not be read.\";\n }\n}\n","import { loadDecisionStore } from \"../decisions/decisions.js\";\nimport { driftExcerpt, formatDriftExcerpt } from \"../decisions/excerpts.js\";\nimport { branchAttribution } from \"../decisions/attribution.js\";\nimport { checkDecisionAnchors } from \"../audit/checks/decision-anchor.js\";\nimport { readAutomationConfig } from \"./config.js\";\nimport {\n observeDecisionEdits,\n decisionStopReview,\n clearResolvedStopReviews,\n} from \"./stop-review.js\";\nimport { observeUsefulness } from \"./usefulness.js\";\nimport { completionFindings, completionSummary, createNotificationState } from \"./notifications.js\";\nimport { profilePhase } from \"../utils/profile.js\";\nimport { withRepositoryInspection } from \"../audit/inspection.js\";\nimport { recordExecution, executionStatus, failureNotifications } from \"./execution.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport {\n withRepairSession,\n reportSchema,\n findingId,\n repairFindingSchema,\n type RepairFinding,\n type RepairVerification,\n} from \"../audit/repair.js\";\nimport { ALL_CHECKS, type AuditReport } from \"../audit/types.js\";\nimport { readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport {\n checkCache,\n git,\n hash,\n readInputs,\n readGuidanceInputs,\n workspace,\n type Inputs,\n} from \"./evidence.js\";\nimport { boundPending } from \"./pending-tools.js\";\nimport {\n clearPendingTools,\n parseState,\n pruneSessions,\n serializeState,\n SESSION_LIMIT,\n STATE_READ_MAX_BYTES,\n withLock,\n type Event,\n type Host,\n type State,\n} from \"./store.js\";\n\nexport interface AutomationEvent {\n event: Event;\n host?: Host;\n sessionId?: string;\n toolId?: string;\n mutating?: boolean;\n retrievedDecisionIds?: string[];\n stopHookActive?: boolean;\n}\nexport interface AutomationReport {\n version: 1;\n status: \"verified\" | \"issues-remain\" | \"incomplete\" | \"unavailable\";\n root: string;\n branch: string;\n head: string;\n baselinePaths: string[];\n reportPath: string;\n findings: RepairFinding[];\n diagnostics: string[];\n /** Decision drift that arrived only through the default branch; not this checkout's work. */\n upstreamDrift?: {\n target: string;\n mergeBase: string;\n decisions: Array<{ id: string; title: string; changedFiles: string[] }>;\n };\n checks: {\n ran: string[];\n reused: string[];\n skipped: NonNullable<AuditReport>[\"skippedChecks\"];\n shared?: boolean;\n auditReused?: boolean;\n };\n counts: RepairVerification[\"counts\"];\n capture: \"observed\" | \"unknown\";\n scope: string;\n}\n\nconst SCOPE =\n \"Documentation audit evidence only. Hook receipts show observed events, not complete interception. Resolved findings no longer fail their checks or have a recorded assessment covering current evidence. Repair and review only within the user's task authorization.\";\nconst priority = { resolved: 0, \"review-required\": 1, unresolved: 2, unverified: 3 };\nconst cleanText = (text: string) =>\n text.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \").slice(0, 250);\n\n/** Read tools cannot create repair evidence. Observe their lifecycle without rescanning the checkout. */\nexport async function observeReadOnlyTool(dir: string, event: AutomationEvent) {\n const ws = await profilePhase(\"automation.workspace\", () => workspace(dir));\n await withLock(ws.root, ws.directory, async () => {\n const statePath = ws.directory + \"/state.json\";\n const raw = await readStoreJson(ws.root, statePath, STATE_READ_MAX_BYTES);\n if (raw === null) return;\n const state = parseState(raw);\n if (state.root !== ws.root || state.gitDir !== ws.gitDir || state.branch !== ws.branch) {\n throw new Error(\n \"Automation state belongs to another branch or worktree; original evidence was retained.\",\n );\n }\n const session =\n event.host && event.sessionId ? state.sessions[hash([event.host, event.sessionId])] : null;\n if (!session) return;\n const now = new Date().toISOString();\n session.lastUsed = now;\n session.events[event.event] = { at: now, count: (session.events[event.event]?.count ?? 0) + 1 };\n // Do not advance the audit fingerprint, report, or execution verdict: no check ran.\n await writeStoreJson(\n ws.root,\n statePath,\n serializeState(state, hash([event.host, event.sessionId])),\n {\n compact: true,\n },\n );\n });\n return { root: ws.root, directory: ws.directory };\n}\n\nexport function summarize(report: AutomationReport): string {\n const open = report.findings.filter((f) => f.status !== \"resolved\");\n const onlyReview =\n report.status === \"incomplete\" &&\n !report.diagnostics.length &&\n !report.counts.unresolved &&\n !report.counts.unverified &&\n report.counts[\"review-required\"] > 0;\n return [\n onlyReview\n ? `Mason: ${report.counts[\"review-required\"]} advisor${report.counts[\"review-required\"] === 1 ? \"y\" : \"ies\"} awaiting review; no unresolved issues.`\n : `Mason: ${report.status}; ${report.counts.unresolved} unresolved, ${report.counts[\"review-required\"]} need review, ${report.counts.unverified} unverified.`,\n ...open.slice(0, 4).map((f) => {\n const detail = f.current\n ? f.current.message\n : f.status === \"review-required\"\n ? `${f.original.type}: current check no longer reports ${f.original.type === \"deps-changed\" ? \"this condition\" : \"the original finding\"}; historical evidence awaits assessment.`\n : `Original evidence: ${f.original.message}. ${f.reason}`;\n return `[${f.status}] ${cleanText(f.original.anchor.doc)}: ${cleanText(detail)}`;\n }),\n ...(open.length > 4 ? [`${open.length - 4} more findings in the report.`] : []),\n ...report.diagnostics.slice(0, 2).map(cleanText),\n `Evidence: ${report.reportPath}. Resume/check with mason_automation(action: \"check\") or mason check.`,\n \"Keep original evidence. Address findings relevant to the authorized task; report unrelated findings with a brief scope reason and suggested follow-up. Use mason audit review for authorized assessments; otherwise leave advisories open without approving them.\",\n ].join(\"\\n\");\n}\n\ntype Workspace = Awaited<ReturnType<typeof workspace>>;\n\nasync function loadState(ws: Workspace): Promise<State> {\n const raw = await readStoreJson(ws.root, ws.directory + \"/state.json\", STATE_READ_MAX_BYTES);\n const state =\n raw === null\n ? {\n version: 1 as const,\n root: ws.root,\n gitDir: ws.gitDir,\n branch: ws.branch,\n baselines: [],\n sessions: {},\n updatedAt: new Date().toISOString(),\n fingerprint: null,\n latest: null,\n }\n : parseState(raw);\n if (state.root !== ws.root || state.gitDir !== ws.gitDir || state.branch !== ws.branch) {\n throw new Error(\n \"Automation state belongs to another branch or worktree; original evidence was retained.\",\n );\n }\n return state;\n}\n\nconst analysisSchema = z.object({\n id: z.string(),\n fingerprint: z.string(),\n completedAt: z.number(),\n baselineDigest: z.string(),\n currentAudit: reportSchema.nullable().optional(),\n report: z.object({\n version: z.literal(1),\n status: z.enum([\"verified\", \"issues-remain\", \"incomplete\", \"unavailable\"]),\n root: z.string(),\n branch: z.string(),\n head: z.string(),\n baselinePaths: z.array(z.string()),\n reportPath: z.string(),\n findings: z.array(repairFindingSchema),\n diagnostics: z.array(z.string()),\n checks: z.object({\n ran: z.array(z.string()),\n reused: z.array(z.string()),\n skipped: z.array(\n z.object({ check: z.string(), reason: z.string(), doc: z.string().optional() }),\n ),\n auditReused: z.boolean().optional(),\n }),\n counts: z.object({\n resolved: z.number(),\n unresolved: z.number(),\n \"review-required\": z.number(),\n unverified: z.number(),\n }),\n capture: z.enum([\"observed\", \"unknown\"]),\n scope: z.string(),\n }),\n});\nconst sharedSchema = z.object({ analysis: analysisSchema, digest: z.string() });\ntype Analysis = z.infer<typeof analysisSchema>;\nconst baselineDigest = async (ws: Workspace, state: State) =>\n profilePhase(\"automation.baselines\", async () =>\n hash(\n await Promise.all(\n state.baselines.map(async (b) => [b.path, await readStoreJson(ws.root, b.path)]),\n ),\n ),\n );\n\nasync function matchingAnalysis(\n ws: Workspace,\n state: State,\n inputs: Inputs,\n): Promise<{ analysis: Analysis | null; diagnostic?: string }> {\n const pointer = state.analysis;\n if (!pointer || pointer.fingerprint !== inputs.fingerprint) return { analysis: null };\n if (pointer.path !== ws.directory + \"/checks/analysis-\" + inputs.fingerprint + \".json\") {\n throw new Error(\"Invalid automation analysis cache path; inspect the retained state.\");\n }\n // This is a derived cache, not original repair evidence. Missing or malformed\n // data can be rebuilt, but storage/permission failures and unsafe paths remain\n // errors. Never discard or replace an original baseline to recover a cache.\n const invalid = {\n analysis: null,\n diagnostic:\n \"Discarded an invalid current-audit cache; audit preparation and original verification were repeated.\",\n };\n let raw: unknown;\n try {\n raw = await readStoreJson(ws.root, pointer.path);\n } catch (error) {\n const cause = (error as Error).cause;\n if (\n cause instanceof SyntaxError ||\n (cause instanceof Error && cause.message === \"expected a JSON object, received null\")\n )\n return invalid;\n throw error;\n }\n if (raw === null) return { analysis: null };\n const parsed = sharedSchema.safeParse(raw);\n if (!parsed.success) return invalid;\n const stored = parsed.data;\n const a = stored.analysis;\n if (\n stored.digest !== hash(a) ||\n a.id !== pointer.id ||\n a.fingerprint !== inputs.fingerprint ||\n a.completedAt !== pointer.completedAt ||\n a.report.root !== ws.root ||\n a.report.branch !== ws.branch ||\n a.report.head !== inputs.head ||\n hash(a.report.baselinePaths) !== hash(state.baselines.map((b) => b.path))\n ) {\n return invalid;\n }\n if (a.baselineDigest !== (await baselineDigest(ws, state)))\n throw new Error(\"Repair baseline was modified; use the original baseline.\");\n return { analysis: a };\n}\n\nasync function verifyInputs(ws: Workspace, inputs: Inputs, guidance = false) {\n return profilePhase(\"automation.revalidate\", () =>\n withRepositoryInspection(ws.root, async () => {\n const [after, currentWs] = await Promise.all([\n guidance ? readGuidanceInputs(ws.root) : readInputs(ws.root),\n workspace(ws.root),\n ]);\n if (after.fingerprint !== inputs.fingerprint || currentWs.directory !== ws.directory) {\n throw new Error(\n \"Repository inputs or branch changed during automation; no current verification was recorded. Retry on a stable checkout.\",\n );\n }\n }),\n );\n}\n\n/** Expensive reads and checks never hold the shared state lock. */\nasync function computeAnalysis(\n ws: Workspace,\n state: State,\n inputs: Inputs,\n event: AutomationEvent,\n previousAudit?: AuditReport | null,\n cacheDiagnostic?: string,\n) {\n const baselines = [...state.baselines];\n const now = new Date().toISOString();\n const empty: AutomationReport = {\n version: 1,\n status: \"unavailable\",\n root: ws.root,\n branch: ws.branch,\n head: inputs.head,\n baselinePaths: [],\n reportPath: \"\",\n findings: [],\n diagnostics: [\n \"No README.md or agent instruction files were discovered. Documentation capture is unavailable; other Mason tools remain usable.\",\n ],\n checks: { ran: [], reused: [], skipped: [] },\n counts: { resolved: 0, unresolved: 0, \"review-required\": 0, unverified: 0 },\n capture: \"unknown\",\n scope: SCOPE,\n };\n if (!baselines.length && Object.values(inputs.docs).every((value) => value === null)) {\n await verifyInputs(ws, inputs);\n return { baselines, report: empty, cache: null };\n }\n if (ws.branch === \"detached\" && state.latest) {\n const previous = (await readStoreJson(ws.root, state.latest)) as AutomationReport | null;\n if (!previous?.head || !/^[a-f0-9]{40,64}$/.test(previous.head))\n throw new Error(\"The previous detached checkout evidence is unavailable.\");\n try {\n await git(ws.root, \"merge-base\", \"--is-ancestor\", previous.head, inputs.head);\n } catch {\n throw new Error(\n \"Detached checkout moved to a different history; original repair evidence was retained. Inspect that baseline explicitly.\",\n );\n }\n }\n let cached: unknown = null;\n const diagnostics: string[] = cacheDiagnostic ? [cacheDiagnostic] : [];\n try {\n cached = await readStoreJson(ws.root, ws.directory + \"/cache.json\");\n } catch {\n diagnostics.push(\"Unreadable automation cache; checks are being recomputed.\");\n }\n const cache = checkCache(cached, inputs);\n if (cache.diagnostic) diagnostics.push(cache.diagnostic);\n // Only complete, validated raw checks can bypass current-audit preparation.\n // Retained history and review outcomes are still evaluated on every invocation.\n const cachedAudit =\n previousAudit?.gitAvailable &&\n previousAudit.headHash === inputs.head &&\n previousAudit.root === ws.root &&\n !previousAudit.skippedChecks.length &&\n ALL_CHECKS.every((name) => previousAudit.checksRun?.includes(name) && cache.has(name))\n ? previousAudit\n : undefined;\n if (cachedAudit) for (const name of ALL_CHECKS) cache.reused.add(name);\n let currentAudit: AuditReport | null = null;\n const verifications = await withRepairSession(\n ws.root,\n cache.options,\n async (repairs) => {\n const saveBaseline = async () => {\n if (baselines.length >= 128)\n throw new Error(\n \"128 retained baselines need review; automatic capture stopped without discarding original evidence.\",\n );\n const prepared = await repairs.prepare();\n baselines.push({\n path: prepared.baselinePath,\n at: now,\n event: event.event,\n fingerprint: inputs.fingerprint,\n });\n };\n if (!baselines.length) await saveBaseline();\n const verifications: RepairVerification[] = [];\n for (const baseline of baselines) verifications.push(await repairs.verify(baseline.path));\n const known = new Set(verifications.flatMap((v) => v.findings.map((f) => f.id)));\n // A clean initial baseline cannot retain findings introduced by a later rename.\n // Preserve those findings now, before another tool can edit or commit the docs.\n if (verifications.some((v) => v.newFindings.some((f) => !known.has(findingId(f))))) {\n await saveBaseline();\n verifications.push(await repairs.verify(baselines.at(-1)!.path));\n }\n currentAudit = await repairs.currentAudit();\n return verifications;\n },\n () => verifyInputs(ws, inputs),\n cachedAudit,\n );\n const merged = new Map<string, RepairFinding>();\n for (const verification of verifications) {\n for (const finding of verification.findings) {\n const previous = merged.get(finding.id);\n if (!previous || priority[finding.status] > priority[previous.status])\n merged.set(finding.id, finding);\n }\n diagnostics.push(...verification.diagnostics);\n }\n\n const counts = { resolved: 0, unresolved: 0, \"review-required\": 0, unverified: 0 };\n for (const finding of merged.values()) counts[finding.status]++;\n const report: AutomationReport = {\n version: 1,\n status:\n diagnostics.length || verifications.some((v) => v.status === \"incomplete\")\n ? \"incomplete\"\n : counts.unresolved\n ? \"issues-remain\"\n : \"verified\",\n root: ws.root,\n branch: ws.branch,\n head: inputs.head,\n baselinePaths: baselines.map((b) => b.path),\n reportPath: \"\",\n findings: [...merged.values()],\n diagnostics: [...new Set(diagnostics)],\n checks: {\n ran: [...cache.ran],\n reused: [...cache.reused].filter((name) => !cache.ran.has(name)),\n skipped: verifications.at(-1)!.currentAudit?.skippedChecks ?? [],\n ...(cachedAudit ? { auditReused: true } : {}),\n },\n counts,\n capture: \"unknown\",\n scope: SCOPE,\n };\n return {\n baselines,\n report,\n currentAudit,\n cache: cache.ran.size || cached === null || cache.diagnostic ? cache.serialize() : null,\n };\n}\n\n/** Per-input coordination shares expensive work; unrelated inputs can be checked concurrently. */\nasync function analyze(ws: Workspace, inputs: Inputs, event: AutomationEvent, startedAt: number) {\n return withLock(\n ws.root,\n ws.directory + \"/analysis/\" + inputs.fingerprint,\n async () => {\n const before = await loadState(ws);\n const { analysis: previous, diagnostic } = await matchingAnalysis(ws, before, inputs);\n // Overlap may share the whole verification. Sequential calls reuse only its\n // current audit: original history and review scopes need fresh inspection.\n if (previous && previous.completedAt >= startedAt)\n return { analysis: previous, shared: true };\n const originalDigest = await baselineDigest(ws, before);\n const computed = await computeAnalysis(\n ws,\n before,\n inputs,\n event,\n previous?.currentAudit as AuditReport | undefined,\n diagnostic,\n );\n if (originalDigest !== (await baselineDigest(ws, before)))\n throw new Error(\n \"Repair baseline was modified during automation; original evidence must be inspected.\",\n );\n const id = randomUUID();\n const analysis = analysisSchema.parse({\n id,\n fingerprint: inputs.fingerprint,\n completedAt: Date.now(),\n baselineDigest: await baselineDigest(ws, { ...before, baselines: computed.baselines }),\n report: computed.report,\n currentAudit: computed.currentAudit,\n });\n const analysisPath = ws.directory + \"/checks/analysis-\" + inputs.fingerprint + \".json\";\n await withLock(ws.root, ws.directory, async () => {\n const state = await loadState(ws);\n // A concurrent check may have retained different original evidence. Never overwrite it.\n if (\n hash(state.baselines) !== hash(before.baselines) ||\n state.analysis?.id !== before.analysis?.id\n ) {\n throw new Error(\n \"Automation evidence changed during analysis; retry against the retained baselines.\",\n );\n }\n await writeStoreJson(ws.root, analysisPath, { analysis, digest: hash(analysis) });\n if (computed.cache)\n await writeStoreJson(ws.root, ws.directory + \"/cache.json\", computed.cache);\n state.baselines = computed.baselines;\n state.analysis = {\n id,\n fingerprint: inputs.fingerprint,\n completedAt: analysis.completedAt,\n path: analysisPath,\n };\n await writeStoreJson(ws.root, ws.directory + \"/state.json\", serializeState(state, null), {\n compact: true,\n });\n });\n return { analysis, shared: false };\n },\n Math.max(0, 25000 - (Date.now() - startedAt)),\n );\n}\n\nfunction upstreamDriftNotice(drift: NonNullable<AutomationReport[\"upstreamDrift\"]>) {\n const listed = drift.decisions\n .slice(0, 5)\n .map((decision) => `${JSON.stringify(cleanText(decision.title))} (${cleanText(decision.id)})`);\n const more = drift.decisions.length - listed.length;\n return [\n `Mason: ${drift.decisions.length} decision(s) have anchors changed only by ${cleanText(drift.target)} since this branch's merge-base, not by this branch: ${listed.join(\", \")}${more ? ` and ${more} more` : \"\"}.`,\n `They are not this checkout's work and do not block. Inspect them on ${cleanText(drift.target)}, where they are reported as usual; inspections recorded here would ride along with this branch.`,\n ].join(\"\\n\");\n}\n\n/** Changed hunks let an agent dismiss irrelevant drift without another tool call. They are\n * optional context: a failed excerpt omits itself and never resolves or hides a finding. */\nasync function driftExcerpts(root: string, report: AutomationReport, ids: string[]) {\n const unique = [...new Set(ids)].slice(0, 4);\n if (!unique.length) return null;\n const records = (await loadDecisionStore(root)).records;\n const sections: string[] = [];\n for (const id of unique) {\n const record = records.find((candidate) => candidate.id === id);\n const changed = new Set<string>();\n let title = record?.title ?? id;\n for (const finding of report.findings) {\n const evidence = finding.current?.evidence;\n if (finding.status === \"resolved\" || evidence?.kind !== \"decision-anchor\") continue;\n if (evidence.decisionId !== id) continue;\n title = evidence.title;\n for (const file of evidence.changedFiles) changed.add(file);\n }\n if (!record || !changed.size) continue;\n try {\n sections.push(formatDriftExcerpt(title, id, await driftExcerpt(root, record, [...changed])));\n } catch {\n // Excerpts are a convenience; the finding and its inspection request remain.\n }\n }\n return sections.join(\"\\n\") || null;\n}\n\n/** Current decision evidence uses the same publication/receipt path, without repair baselines. */\nasync function guidanceAnalysis(ws: Workspace, inputs: Inputs) {\n const checked = await checkDecisionAnchors({\n root: ws.root,\n docs: [],\n headHash: inputs.head,\n changesSinceDoc: new Map(),\n decisionsPresent: true,\n });\n // Drift whose changed anchors this branch never touched came from the default branch, e.g.\n // through a rebase. It is reported once, separately, and never becomes this checkout's work.\n const attribution = checked.advisories.length\n ? await branchAttribution(ws.root).catch(() => null)\n : null;\n // Attribute per decision: drift in any revision touched by this branch keeps all of it here.\n const own = new Set(\n checked.advisories.flatMap((advisory) =>\n advisory.evidence.kind === \"decision-anchor\" &&\n advisory.evidence.changedFiles.some((file) => attribution?.branchFiles.has(file))\n ? [advisory.evidence.decisionId]\n : [],\n ),\n );\n const upstream = new Map<string, { id: string; title: string; changedFiles: string[] }>();\n const advisories = checked.advisories.filter((advisory) => {\n const evidence = advisory.evidence;\n if (!attribution || evidence.kind !== \"decision-anchor\" || own.has(evidence.decisionId))\n return true;\n const entry = upstream.get(evidence.decisionId) ?? {\n id: evidence.decisionId,\n title: evidence.title,\n changedFiles: [],\n };\n entry.changedFiles = [...new Set([...entry.changedFiles, ...evidence.changedFiles])].sort();\n upstream.set(evidence.decisionId, entry);\n return false;\n });\n const findings: RepairFinding[] = advisories.map((current) => ({\n id: findingId(current),\n original: current,\n current,\n status: \"review-required\",\n reason: \"Current decision anchors changed; inspect their reasoning.\",\n }));\n // Reuse the last guidance receipt for explicit closure; absence alone is not proof.\n const before = await loadState(ws);\n if (before.guidance) {\n const prior = z\n .object({ findings: z.array(repairFindingSchema) })\n .parse(await readStoreJson(ws.root, before.guidance.path)) as { findings: RepairFinding[] };\n const currentIds = new Set(findings.map((finding) => finding.id));\n const records = (await loadDecisionStore(ws.root)).records;\n // An incomplete capture blocks closure for its own decision only.\n const incomplete = new Set(checked.incompleteDecisions);\n const sharedSkip = checked.skipped.length > checked.incompleteDecisions.length;\n for (const previous of prior.findings) {\n if (currentIds.has(previous.id) || previous.original.evidence.kind !== \"decision-anchor\")\n continue;\n const evidence = previous.original.evidence;\n if (upstream.has(evidence.decisionId)) continue;\n const record = records.find((record) => record.id === evidence.decisionId);\n const capture = record && inputs.decisionEvidence[record.id]?.capture;\n const resolved =\n record?.status === \"retired\" ||\n (!!record &&\n !!capture?.complete &&\n capture.anchors.length > 0 &&\n !sharedSkip &&\n !incomplete.has(record.id));\n findings.push({\n id: previous.id,\n original: previous.original,\n status: resolved ? \"resolved\" : \"unverified\",\n reason: resolved\n ? \"Current decision evidence no longer reports this drift, or the retained record is retired.\"\n : \"Decision evidence could not establish closure.\",\n });\n }\n }\n const counts = {\n resolved: 0,\n unresolved: 0,\n \"review-required\": 0,\n unverified: checked.skipped.length,\n };\n for (const finding of findings) counts[finding.status]++;\n const report: AutomationReport = {\n version: 1,\n status: counts.unverified || counts[\"review-required\"] ? \"incomplete\" : \"verified\",\n root: ws.root,\n branch: ws.branch,\n head: inputs.head,\n baselinePaths: [],\n reportPath: \"\",\n findings,\n ...(attribution && upstream.size\n ? {\n upstreamDrift: {\n target: attribution.target,\n mergeBase: attribution.mergeBase,\n decisions: [...upstream.values()],\n },\n }\n : {}),\n diagnostics: [\n ...checked.skipped.map((item) => item.reason),\n ...findings\n .filter((finding) => finding.status === \"unverified\")\n .map((finding) => `Decision ${finding.id}: ${finding.reason}`),\n ],\n checks: { ran: [\"decision-anchor-drift\"], reused: [], skipped: checked.skipped },\n counts,\n capture: \"unknown\",\n scope:\n \"Decision anchor evidence only. Documentation audits and retained repair baselines were not checked. Source inspection remains separate from human approval.\",\n };\n await verifyInputs(ws, inputs, true);\n return { analysis: { id: \"guidance\", report }, shared: false as const };\n}\n\nexport async function automate(dir: string, event: AutomationEvent) {\n return runAutomation(dir, event, false);\n}\n\nexport async function observeDecisionLifecycle(dir: string, event: AutomationEvent) {\n return runAutomation(dir, event, true);\n}\n\n/** Durable lifecycle: read concurrently, then merge each call into the latest state. */\nasync function runAutomation(dir: string, event: AutomationEvent, guidance: boolean) {\n const startedAt = Date.now();\n const ws = await profilePhase(\"automation.workspace\", () => workspace(dir));\n const config = await readAutomationConfig(ws.root);\n const output = await recordExecution(ws.root, ws.directory, event.event, () =>\n withRepositoryInspection(ws.root, async () => {\n const inputs = await (guidance ? readGuidanceInputs(ws.root) : readInputs(ws.root));\n const result = await profilePhase(\"automation.analysis\", async () =>\n guidance ? await guidanceAnalysis(ws, inputs) : await analyze(ws, inputs, event, startedAt),\n );\n if (!guidance && result.shared) {\n await verifyInputs(ws, inputs);\n if (result.analysis.baselineDigest !== (await baselineDigest(ws, await loadState(ws)))) {\n throw new Error(\n \"Repair baseline was modified during shared automation; original evidence must be inspected.\",\n );\n }\n }\n return profilePhase(\"automation.publish\", () =>\n withLock(ws.root, ws.directory, async () => {\n const state = await loadState(ws);\n if (!guidance && state.analysis?.id !== result.analysis.id)\n throw new Error(\n \"Automation evidence changed during publication; retry against the current inputs.\",\n );\n const report = structuredClone(result.analysis.report) as AutomationReport;\n if (guidance) await verifyInputs(ws, inputs, true);\n if (!state.notifications) {\n // Upgrade from the last retained observation, not a fresh session's state.\n // This keeps changes made since that observation eligible for notification.\n let baseline = { findings: report.findings, head: report.head };\n const previousPath = guidance ? state.guidance?.path : state.latest;\n if (previousPath) {\n try {\n const previous = z\n .object({ findings: z.array(repairFindingSchema), head: z.string() })\n .safeParse(await readStoreJson(ws.root, previousPath));\n if (!previous.success) throw new Error(\"Unsupported saved report\");\n baseline = previous.data as typeof baseline;\n } catch {\n report.diagnostics.push(\n \"The saved notification baseline could not be read; initialized from the current audit. Original repair evidence is retained. Run an explicit check for all outstanding findings.\",\n );\n }\n }\n state.notifications = createNotificationState(baseline.findings, baseline.head);\n }\n if (result.shared)\n report.checks = {\n ...report.checks,\n ran: [],\n reused: [...new Set([...report.checks.ran, ...report.checks.reused])],\n shared: true,\n };\n report.reportPath =\n ws.directory + \"/checks/\" + (guidance ? \"guidance-\" : \"\") + randomUUID() + \".json\";\n const now = new Date().toISOString();\n const key = event.host && event.sessionId ? hash([event.host, event.sessionId]) : null;\n const newSession = key !== null && !state.sessions[key];\n pruneSessions(\n state,\n new Date(now),\n newSession ? null : key,\n newSession ? SESSION_LIMIT - 1 : SESSION_LIMIT,\n );\n if (key && !state.sessions[key]) {\n state.sessions[key] = {\n host: event.host!,\n notifiedDiagnostics: [],\n lastUsed: now,\n pending: {},\n coverageGaps: [],\n events: {},\n };\n }\n const session = key ? state.sessions[key] : null;\n clearResolvedStopReviews(state.sessions, report);\n if (session) {\n observeDecisionEdits(session, inputs, event);\n session.lastUsed = now;\n session.events[event.event] = {\n at: now,\n count: (session.events[event.event]?.count ?? 0) + 1,\n };\n if (event.event === \"before_tool\" && event.mutating && event.toolId) {\n boundPending(session.pending);\n session.pending[event.toolId] = inputs.fingerprint;\n }\n if (event.event === \"after_tool\" && event.mutating) {\n if (!event.toolId || !session.pending[event.toolId]) {\n const gap =\n \"A tool completed without an observed matching pre-tool capture in this checkout; pre-edit coverage is unknown. The tool may have changed checkouts; captures are kept separately for each worktree.\";\n if (!session.coverageGaps.includes(gap)) session.coverageGaps.push(gap);\n }\n if (event.toolId) delete session.pending[event.toolId];\n }\n report.diagnostics.push(...session.coverageGaps);\n if (session.coverageGaps.length && report.status !== \"unavailable\")\n report.status = \"incomplete\";\n report.capture =\n report.status !== \"unavailable\" &&\n !session.coverageGaps.length &&\n (session.events.session_start || session.events.before_tool)\n ? \"observed\"\n : \"unknown\";\n }\n // Checks and original repair baselines are independent of conversational output.\n // Potentially mutating tool names do not establish that anything changed.\n const selected =\n session && event.event === \"task_end\"\n ? completionFindings(state.notifications, report.findings)\n : [];\n // Agent delivery and user completion summaries must not consume each other.\n state.agentNotifications ??= { ...structuredClone(state.notifications), delivered: {} };\n const feedback =\n session && [\"turn_start\", \"after_tool\"].includes(event.event)\n ? completionFindings(state.agentNotifications, report.findings)\n : [];\n const diagnostics = session\n ? report.diagnostics.filter((d) => !session.notifiedDiagnostics.includes(d)).slice(0, 2)\n : [];\n if (session)\n session.notifiedDiagnostics = [\n ...new Set([\n ...session.notifiedDiagnostics.filter((d) => report.diagnostics.includes(d)),\n ...diagnostics,\n ]),\n ];\n const stopReview =\n session &&\n event.host === \"claude\" &&\n event.event === \"task_end\" &&\n config.stopBlock === \"drift\"\n ? decisionStopReview(session, inputs, report, !!event.stopHookActive)\n : { reason: null, block: false, decisions: [] };\n const excerpts = session\n ? await driftExcerpts(ws.root, report, [\n ...stopReview.decisions,\n ...[...selected, ...feedback].flatMap((finding) => {\n const evidence = (finding.current ?? finding.original).evidence;\n return evidence.kind === \"decision-anchor\" ? [evidence.decisionId] : [];\n }),\n ])\n : null;\n // Shown once per session and set of decisions; it is neither a finding nor a block.\n const upstream = report.upstreamDrift ? upstreamDriftNotice(report.upstreamDrift) : null;\n const upstreamNotice =\n session && upstream && session.upstreamNotice !== hash(upstream) ? upstream : null;\n if (session) session.upstreamNotice = upstream ? hash(upstream) : undefined;\n const message = !session\n ? summarize(report)\n : [\n stopReview.reason,\n completionSummary(selected, report.reportPath),\n completionSummary(feedback, report.reportPath),\n excerpts,\n upstreamNotice,\n ...(diagnostics.length\n ? [\n `Mason: verification limited. ${diagnostics.slice(0, 2).map(cleanText).join(\" \")} Evidence: ${report.reportPath}.`,\n ]\n : []),\n ]\n .filter(Boolean)\n .join(\"\\n\") || null;\n const notify = message !== null;\n // Completion notices are advisory; no automatic retry/repair loop.\n const previousPath = guidance ? state.guidance?.path : state.latest;\n const previousFingerprint = guidance ? state.guidance?.fingerprint : state.fingerprint;\n const persistReport =\n !previousPath ||\n previousFingerprint !== inputs.fingerprint ||\n notify ||\n newSession ||\n event.event === \"task_end\";\n if (!persistReport) report.reportPath = previousPath!;\n state.updatedAt = now;\n if (guidance)\n state.guidance = { fingerprint: inputs.fingerprint, path: report.reportPath };\n else {\n state.fingerprint = inputs.fingerprint;\n state.latest = report.reportPath;\n }\n if (persistReport) await writeStoreJson(ws.root, report.reportPath, report);\n // The turn is over: calls still pending never reported completion.\n if (session && event.event === \"task_end\") clearPendingTools(session);\n await writeStoreJson(ws.root, ws.directory + \"/state.json\", serializeState(state, key), {\n compact: true,\n });\n return {\n report,\n message,\n stopBlockReason: stopReview.block ? stopReview.reason : null,\n observedAt: now,\n delivery: { agent: feedback.slice(0, 4), completion: selected.slice(0, 4) },\n };\n }),\n );\n }),\n );\n try {\n await observeUsefulness(\n ws.root,\n event,\n output.report,\n output.delivery.agent,\n output.delivery.completion,\n Date.now() - startedAt,\n output.observedAt,\n );\n } catch {\n // Optional observations must never suppress the audit result or existing feedback.\n if (event.event === \"task_end\")\n output.message = [\n output.message,\n \"Mason: local usefulness tracking unavailable; inspect mason stats --json.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n return output;\n}\n\n/** Read-only inspection: configured hooks and observed runtime events are different facts. */\nexport async function automationStatus(dir: string) {\n const { pendingKnowledge } = await import(\"../decisions/pending.js\");\n const ws = await profilePhase(\"automation.workspace\", () => workspace(dir));\n const config = await readAutomationConfig(ws.root);\n const knowledge = await pendingKnowledge(ws.root);\n const execution = await executionStatus(ws.root, ws.directory);\n const notifications = await failureNotifications(ws.root, ws.directory);\n const raw = await readStoreJson(ws.root, ws.directory + \"/state.json\", STATE_READ_MAX_BYTES);\n if (raw === null)\n return {\n version: 1,\n stopBlock: config.stopBlock,\n status: execution.status === \"not-observed\" ? \"not-observed\" : \"unavailable\",\n root: ws.root,\n branch: ws.branch,\n baselinePaths: [],\n scope: \"not-observed\",\n auditReportPath: null,\n hosts: {},\n execution,\n notifications,\n knowledge,\n };\n const state = parseState(raw);\n if (state.root !== ws.root || state.gitDir !== ws.gitDir || state.branch !== ws.branch)\n throw new Error(\"Automation state belongs to another workspace.\");\n const inputs = await (state.guidance ? readGuidanceInputs(ws.root) : readInputs(ws.root));\n const reportPath = state.guidance?.path ?? state.latest;\n const latest = reportPath\n ? ((await readStoreJson(ws.root, reportPath!)) as AutomationReport | null)\n : null;\n const hosts: Record<string, { sessions: number; observedEvents: string[] }> = {};\n for (const session of Object.values(state.sessions)) {\n const host = (hosts[session.host] ??= { sessions: 0, observedEvents: [] });\n host.sessions++;\n host.observedEvents = [...new Set([...host.observedEvents, ...Object.keys(session.events)])];\n }\n const unfinished = [\"failed\", \"unknown\"].includes(execution.status);\n // Tool calls that have not reported completion; they expire at Stop or after 24 idle hours.\n const pendingSessions = Object.values(state.sessions).filter(\n (session) => Object.keys(session.pending).length,\n );\n return {\n version: 1,\n stopBlock: config.stopBlock,\n status: unfinished\n ? \"unavailable\"\n : inputs.fingerprint === (state.guidance?.fingerprint ?? state.fingerprint)\n ? \"current\"\n : \"changed\",\n root: ws.root,\n branch: ws.branch,\n baselinePaths: state.baselines.map((b) => b.path),\n reportPath,\n scope: state.guidance ? \"decision-guidance\" : \"documentation-audit\",\n auditReportPath: state.latest,\n verificationStatus: unfinished ? \"unavailable\" : (latest?.status ?? \"unavailable\"),\n hosts,\n sessions: Object.keys(state.sessions).length,\n unfinishedToolCalls: pendingSessions.reduce(\n (total, session) => total + Object.keys(session.pending).length,\n 0,\n ),\n oldestUnfinishedSessionUsedAt:\n pendingSessions.map((session) => session.lastUsed).sort()[0] ?? null,\n execution,\n notifications,\n knowledge,\n notificationBaselineHead: state.notifications?.baselineHead ?? null,\n note: \"Status describes the reported scope only. Decision guidance does not verify documentation repairs. Observed events do not prove all tool paths are intercepted. Run mason check for retained audit evidence.\",\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { git } from \"./evidence.js\";\nimport type { Host } from \"./store.js\";\n\nasync function repositoryRoot(dir: string): Promise<string | null> {\n if (!path.isAbsolute(dir)) throw new Error(\"Hook input working directory must be absolute.\");\n try {\n return await fs.realpath((await git(dir, \"rev-parse\", \"--show-toplevel\")).trim());\n } catch (error) {\n if (\n (error as NodeJS.ErrnoException).code === \"ENOENT\" ||\n /not a git repository/.test(String((error as { stderr?: string }).stderr))\n )\n return null;\n throw error;\n }\n}\n\n/** The host payload follows directory/worktree changes; the launch directory may not. */\nexport async function resolveHookRoot(\n host: Host,\n cwd: string,\n options: {\n launchCwd?: string;\n projectDir?: string;\n } = {},\n): Promise<string> {\n const current = await repositoryRoot(cwd);\n if (current) return current;\n const projectDir =\n options.projectDir ?? (host === \"claude\" ? process.env.CLAUDE_PROJECT_DIR : undefined);\n const projectRoot = projectDir ? await repositoryRoot(projectDir) : null;\n if (projectDir && !projectRoot)\n throw new Error(\n \"Hook input is outside Git and the host project is no longer a Git repository. Restore its history before running mason check.\",\n );\n const launchRoot = await repositoryRoot(options.launchCwd ?? process.cwd());\n const roots = [\n ...new Set([launchRoot, projectRoot].filter((root): root is string => root !== null)),\n ];\n if (!roots.length)\n throw new Error(\n \"Hook input is outside a Git repository and no project root is available. Return to the project and run mason check.\",\n );\n if (roots.length > 1)\n throw new Error(\n \"Hook input is outside a Git repository and project roots disagree. Return to the intended checkout and run mason check; verification was not established.\",\n );\n // CLAUDE_PROJECT_DIR stays at the original checkout after EnterWorktree.\n // Without a current repository, it cannot distinguish those checkouts.\n const worktrees = (await git(roots[0], \"worktree\", \"list\", \"--porcelain\", \"-z\"))\n .split(\"\\0\")\n .filter((field) => field.startsWith(\"worktree \"));\n if (worktrees.length !== 1)\n throw new Error(\n \"Hook input is outside a Git repository with multiple worktrees. Return to the intended worktree and run mason check; the active checkout is unknown.\",\n );\n return roots[0];\n}\n","import { z } from \"zod\";\nimport { isStringArray } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { loadDecisionStore } from \"../decisions/decisions.js\";\nimport { decisionAnchors, decisionKnowledge, DECISION_GUIDANCE } from \"../decisions/provenance.js\";\nimport { anchorMatches } from \"../utils/paths.js\";\nimport { createHash } from \"node:crypto\";\nimport type { Freshness } from \"../context/trust.js\";\nimport type { DecisionRecord } from \"../decisions/decisions.js\";\nimport { computeDecisionDrift, type DecisionDriftReport } from \"../decisions/drift.js\";\n\n/** More than a few constraints per fire is noise, not context. */\nconst MAX_INJECTED_DECISIONS = 3;\n/** Walk-up bound when locating the Mason root from an edited file. */\nconst MAX_WALK_UP = 30;\n\nconst SUPPORTED_TOOLS = new Set([\"Read\", \"Edit\", \"Write\"]);\n\nexport interface HookStdin {\n session_id?: string;\n agent_id?: string;\n cwd?: string;\n hook_event_name?: string;\n tool_name?: string;\n tool_input?: { file_path?: string };\n}\n\nconst hookStdinSchema = z.object({\n session_id: z.string().optional(),\n agent_id: z.string().optional(),\n cwd: z.string().optional(),\n hook_event_name: z.string().optional(),\n tool_name: z.string().optional(),\n tool_input: z.object({ file_path: z.string().optional() }).optional(),\n});\n\nexport interface HookEnv {\n /** Override for tests; defaults to os.tmpdir(). */\n stateDir?: string;\n /** Standard lifecycle integration confines delivery to its active checkout. */\n rootDir?: string;\n /** Standalone hooks retain PostToolUse; the lifecycle adapter can deliver before edits. */\n hookEventName?: \"PreToolUse\" | \"PostToolUse\";\n}\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Locate the nearest ancestor holding a .mason/decisions store. Stops at the\n * first .git boundary — a repo without Mason must stay silent, not borrow a\n * parent directory's decisions.\n */\nasync function findMasonRoot(startDir: string): Promise<string | null> {\n let dir = startDir;\n for (let i = 0; i < MAX_WALK_UP; i++) {\n if (await exists(path.join(dir, \".mason\", \"decisions\"))) return dir;\n if (await exists(path.join(dir, \".git\"))) return null;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\nfunction anchorsCover(record: DecisionRecord, relPath: string): boolean {\n return decisionAnchors(record).some((anchor) => anchorMatches(anchor, relPath));\n}\n\nfunction exactAnchor(record: DecisionRecord, relPath: string): boolean {\n return decisionAnchors(record).some((a) => a.replace(/\\/+$/, \"\") === relPath);\n}\n\nfunction stateKey(input: HookStdin): string {\n const raw = `${input.session_id ?? \"nosession\"}${input.agent_id ? `-${input.agent_id}` : \"\"}`;\n return raw.replace(/[^A-Za-z0-9_-]/g, \"\").slice(0, 120) || \"nosession\";\n}\n\nasync function loadInjected(stateFile: string): Promise<Set<string>> {\n try {\n const parsed: unknown = JSON.parse(await fs.readFile(stateFile, \"utf-8\"));\n return new Set(isStringArray(parsed) ? parsed : []);\n } catch {\n return new Set();\n }\n}\n\nfunction formatContext(\n relPath: string,\n records: DecisionRecord[],\n drift: DecisionDriftReport,\n): string {\n const lines: string[] = [];\n lines.push(\n `Mason: decision knowledge relevant to ${relPath} or updated since this session saw it. This replaces earlier guidance for the same decision id. ${DECISION_GUIDANCE} Retired or superseded records are no longer active. Use Mason tools to record decision changes and source inspections; do not edit the JSON in .mason/decisions/ directly.`,\n );\n const append = (\n id: string,\n knowledge: ReturnType<typeof decisionKnowledge>,\n label: string,\n freshness: Freshness,\n ) => {\n const stale =\n freshness === \"current\"\n ? \"\"\n : freshness === \"changed\"\n ? \" [recorded against changed files – verify against current code before relying on it]\"\n : \" [freshness unknown – verify against current code before relying on it]\";\n lines.push(\n `- [${label}] [${knowledge.category}] ${knowledge.title}: ${knowledge.body} (id: ${id}; revision: ${knowledge.revision}; anchors: ${knowledge.files.join(\", \")}; owner: ${knowledge.owner ?? \"unknown\"}; sources: ${\n knowledge.sources\n .slice(0, 2)\n .map((s) => s.reference)\n .join(\", \") || \"unrecorded\"\n })${stale}`,\n );\n };\n for (const record of records) {\n const knowledge = decisionKnowledge(\n record,\n drift.freshness?.[record.id] ?? \"unknown\",\n drift.pendingProposals?.[record.id]?.freshness ?? \"unknown\",\n );\n append(\n record.id,\n knowledge,\n record.status === \"active\" ? knowledge.approval : record.status,\n knowledge.trust.freshness,\n );\n if (knowledge.pendingProposal)\n append(\n record.id,\n knowledge.pendingProposal,\n \"proposed\",\n knowledge.pendingProposal.trust.freshness,\n );\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * The push half of Mason's memory: when an agent touches a file that a\n * decision record anchors, the record is injected into the session via the\n * PostToolUse hook contract — deterministically, without relying on the\n * model deciding to ask. Returns the hook's stdout JSON, or null for\n * \"stay silent\" (no store, no match, already injected, malformed input —\n * a hook must never disrupt the session).\n */\nexport async function runHook(stdinText: string, env: HookEnv = {}): Promise<string | null> {\n let input: HookStdin;\n try {\n input = hookStdinSchema.parse(JSON.parse(stdinText));\n } catch {\n return null;\n }\n\n if (!input || typeof input !== \"object\") return null;\n if (input.tool_name && !SUPPORTED_TOOLS.has(input.tool_name)) return null;\n const filePath = input.tool_input?.file_path;\n if (!filePath || typeof filePath !== \"string\") return null;\n\n const absPath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(input.cwd ?? process.cwd(), filePath);\n const root = await findMasonRoot(path.dirname(absPath));\n if (!root) return null;\n if (env.rootDir && (await fs.realpath(root)) !== (await fs.realpath(env.rootDir))) return null;\n const relPath = path.relative(root, absPath).split(path.sep).join(\"/\");\n if (relPath.startsWith(\"..\")) return null;\n\n const { records } = await loadDecisionStore(root);\n\n const stateDir = env.stateDir ?? os.tmpdir();\n const stateFile = path.join(\n stateDir,\n `mason-hook-${createHash(\"sha256\").update(root).digest(\"hex\").slice(0, 12)}-${stateKey(input)}.json`,\n );\n const injected = await loadInjected(stateFile);\n const recordKey = (record: DecisionRecord) =>\n `${record.id}:${createHash(\"sha256\").update(JSON.stringify(record)).digest(\"hex\")}`;\n const previouslyInjected = (record: DecisionRecord) =>\n [...injected].some((key) => key === record.id || key.startsWith(`${record.id}:`));\n // Re-inject revised/accepted records and withdraw previously injected records\n // that were retired during this session. Untouched archived records stay dark.\n // Also update previously seen records after their anchors move. Otherwise an\n // acceptance or retirement could leave obsolete guidance in the session.\n const fresh = records.filter(\n (r) =>\n !injected.has(recordKey(r)) &&\n (previouslyInjected(r) || (r.status === \"active\" && anchorsCover(r, relPath))),\n );\n if (fresh.length === 0) return null;\n\n // Exact-file anchors outrank directory-prefix ones; newest knowledge wins ties.\n fresh.sort((a, b) => {\n const withdrawn = Number(b.status !== \"active\") - Number(a.status !== \"active\");\n if (withdrawn) return withdrawn;\n const exactDiff = Number(exactAnchor(b, relPath)) - Number(exactAnchor(a, relPath));\n if (exactDiff !== 0) return exactDiff;\n return b.updatedAt.localeCompare(a.updatedAt);\n });\n const selected = fresh.slice(0, MAX_INJECTED_DECISIONS);\n\n const drift = await computeDecisionDrift(root, selected);\n\n for (const record of selected) injected.add(recordKey(record));\n try {\n await fs.writeFile(stateFile, JSON.stringify([...injected]), \"utf-8\");\n } catch {\n // Dedupe state is a convenience; losing it must not block injection.\n }\n\n return JSON.stringify({\n hookSpecificOutput: {\n hookEventName: env.hookEventName ?? \"PostToolUse\",\n additionalContext: formatContext(relPath, selected, drift),\n },\n });\n}\n","import { z } from \"zod\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { git } from \"../automation/evidence.js\";\nimport { readStoreJson } from \"../utils/storage.js\";\n\nexport const setupHostSchema = z.object({\n configuredVersion: z.string(),\n revision: z.string().uuid(),\n fingerprint: z.string(),\n mcpFingerprint: z.string(),\n instructions: z.array(z.string()),\n});\nexport const setupSchema = z.object({\n version: z.literal(2),\n hosts: z.object({\n codex: setupHostSchema.optional(),\n claude: setupHostSchema.optional(),\n }),\n});\nexport const SETUP_PATH = \".mason/local/setup.json\";\nexport const INACTIVE_HOSTS_PATH = \".mason/local/inactive-hosts.json\";\nexport const inactiveHostsSchema = z.object({\n version: z.literal(1),\n hosts: z.array(z.enum([\"claude\", \"codex\"])),\n});\nexport type SetupConfig = z.infer<typeof setupSchema>;\nexport async function loadSetup(root: string): Promise<SetupConfig | null> {\n const raw = await readStoreJson(root, SETUP_PATH);\n if (raw === null) return null;\n return setupSchema.parse(raw);\n}\n\n/** Share activation with linked worktrees, never their audit evidence or ownership. */\nexport async function effectiveSetup(\n root: string,\n): Promise<{ root: string; setup: SetupConfig | null }> {\n const local = await loadSetup(root);\n // Even an empty local record is authoritative (including after teardown).\n if (local) return { root, setup: local };\n const common = await fs.realpath(\n path.resolve(root, (await git(root, \"rev-parse\", \"--git-common-dir\")).trim()),\n );\n const own = await fs.realpath((await git(root, \"rev-parse\", \"--absolute-git-dir\")).trim());\n if (common === own) return { root, setup: null };\n // Git's first worktree identifies the primary checkout. Bare repositories\n // have no primary checkout from which to inherit activation.\n const primary = (await git(root, \"worktree\", \"list\", \"--porcelain\", \"-z\"))\n .split(\"\\0\\0\")[0]\n .split(\"\\0\");\n const candidate = primary.find((field) => field.startsWith(\"worktree \"))?.slice(9);\n if (!candidate || primary.includes(\"bare\")) return { root, setup: null };\n let inheritedRoot: string;\n try {\n inheritedRoot = await fs.realpath(\n (await git(candidate, \"rev-parse\", \"--show-toplevel\")).trim(),\n );\n } catch (error) {\n // --separate-git-dir may list only the metadata directory, with no recorded\n // checkout location. Do not infer a sibling or search unrelated directories.\n if (/must be run in a work tree/.test(String((error as { stderr?: string }).stderr)))\n return { root, setup: null };\n throw error;\n }\n const inheritedCommon = await fs.realpath(\n path.resolve(inheritedRoot, (await git(inheritedRoot, \"rev-parse\", \"--git-common-dir\")).trim()),\n );\n if (inheritedCommon !== common)\n throw new Error(\"Linked worktree setup does not belong to the same Git repository.\");\n const setup = await loadSetup(inheritedRoot);\n const inactive = await readStoreJson(root, INACTIVE_HOSTS_PATH);\n if (inactive && setup)\n for (const host of inactiveHostsSchema.parse(inactive).hosts) delete setup.hosts[host];\n return { root: inheritedRoot, setup };\n}\n\nconst receiptSchema = z.object({\n version: z.literal(1),\n host: z.enum([\"codex\", \"claude\"]),\n status: z.enum([\"installing\", \"configured\"]),\n initialReportPath: z.string().optional(),\n initialBaselinePaths: z.array(z.string()).optional(),\n root: z.string(),\n revision: z.string().uuid(),\n configuredAt: z.string().optional(),\n});\nexport async function loadSetupReceipt(root: string, directory: string, host: \"codex\" | \"claude\") {\n const raw = await readStoreJson(root, directory + \"/setup-\" + host + \".json\");\n if (raw === null) return null;\n const receipt = receiptSchema.parse(raw);\n if (receipt.root !== root || receipt.host !== host)\n throw new Error(\"Setup receipt belongs to another installation.\");\n return receipt;\n}\n","import { z } from \"zod\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport fs from \"node:fs/promises\";\nimport type { Host } from \"../automation/store.js\";\nimport { git } from \"../automation/evidence.js\";\nimport { effectiveSetup } from \"./model.js\";\n\ndeclare const PKG_VERSION: string;\nexport const executingVersion = () =>\n typeof PKG_VERSION === \"string\" ? PKG_VERSION : \"development\";\n\n// Windows needs cmd to launch both npm's and the standalone installer's .cmd shim.\nexport function globalCommand(args: string[], platform = process.platform) {\n return platform === \"win32\"\n ? { command: \"cmd.exe\", args: [\"/d\", \"/s\", \"/c\", \"mason\", ...args] }\n : { command: \"mason\", args };\n}\nexport const mcpCommand = (host: Host) => globalCommand([\"--setup-host\", host, \"mcp\"]);\nexport const hookCommand = (host: Host) => `mason --setup-host ${host}`;\n\n/** Probe the same PATH command the host will use; never download during setup. */\nexport async function installedCommand() {\n const invocation = globalCommand([\"internal-integration-version\"]);\n try {\n const { stdout } = await promisify(execFile)(invocation.command, invocation.args, {\n timeout: 5000,\n maxBuffer: 8192,\n windowsHide: true,\n });\n const result = z\n .object({ protocol: z.literal(1), version: z.string() })\n .parse(JSON.parse(stdout));\n if (result.protocol !== 1 || typeof result.version !== \"string\")\n throw new Error(\"Unsupported Mason integration protocol.\");\n return { available: true, version: result.version, message: null };\n } catch {\n return {\n available: false,\n version: null,\n message:\n \"An up-to-date mason command is not available on this process's PATH. Install or upgrade Mason, then reopen your terminal or desktop assistant and rerun mason setup.\",\n };\n }\n}\n\n/** Replaces the environment previously supplied by generated project launchers. */\nexport async function prepareLaunch(\n host: Host,\n options: { dir?: string; allowInactive?: boolean } = {},\n) {\n const root = await fs.realpath(\n (await git(options.dir ?? process.cwd(), \"rev-parse\", \"--show-toplevel\")).trim(),\n );\n const entry = (await effectiveSetup(root)).setup?.hosts[host];\n process.env.MASON_SETUP_ROOT = root;\n process.env.MASON_SETUP_HOST = host;\n delete process.env.MASON_SETUP_REVISION;\n if (!entry) {\n if (options.allowInactive) return false;\n throw new Error(\n `Mason is not configured locally for ${host}. Run mason setup --host ${host} in this checkout.`,\n );\n }\n process.env.MASON_SETUP_REVISION = entry.revision;\n return true;\n}\n\nexport function inactiveSetupMessage(): string | null {\n const host = process.env.MASON_SETUP_HOST;\n if (\n !process.env.MASON_SETUP_ROOT ||\n process.env.MASON_SETUP_REVISION ||\n (host !== \"claude\" && host !== \"codex\")\n )\n return null;\n return `Mason MCP is available, but automatic hooks are inactive in ${process.env.MASON_SETUP_ROOT}. Run mason setup --host ${host} in that checkout, review the host configuration, then restart the assistant. Setup has not been performed automatically.`;\n}\n","import fs from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport { hash, workspace } from \"../automation/evidence.js\";\nimport { withLock, events, type Host } from \"../automation/store.js\";\nimport { readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport { effectiveSetup } from \"./model.js\";\nimport { executingVersion, inactiveSetupMessage } from \"./launcher.js\";\n\nconst observationSchema = z.object({\n version: z.literal(1),\n masonVersion: z.string(),\n root: z.string(),\n revision: z.string(),\n host: z.enum([\"codex\", \"claude\"]),\n contextCalls: z.number().int().nonnegative(),\n lastContextAt: z.string().optional(),\n sessions: z.record(\n z.object({\n events: z.array(z.enum(events)),\n at: z.string(),\n verificationStatus: z.string().optional(),\n reportPath: z.string().optional(),\n }),\n ),\n});\nexport type Observation = z.infer<typeof observationSchema>;\nexport function observationPath(\n directory: string,\n host: Host,\n revision: string,\n version = executingVersion(),\n) {\n return `${directory}/activation/${host}-${revision}-${hash(version).slice(0, 12)}.json`;\n}\n\nexport async function readObservation(\n root: string,\n directory: string,\n host: Host,\n revision: string,\n version = executingVersion(),\n): Promise<Observation | null> {\n const raw = await readStoreJson(root, observationPath(directory, host, revision, version));\n if (raw === null) return null;\n const record = observationSchema.parse(raw);\n if (\n record.root !== root ||\n record.host !== host ||\n record.revision !== revision ||\n record.masonVersion !== version\n )\n throw new Error(\"Activation receipt belongs to another installation.\");\n return record;\n}\n\n/** Only the configured Mason invocation supplies these values. Never persist task text or tool arguments. */\nexport async function observeActivation(\n dir: string,\n event: \"context\" | (typeof events)[number],\n options: {\n sessionId?: string;\n verificationStatus?: string;\n reportPath?: string;\n directory?: string;\n } = {},\n): Promise<string | null> {\n const host = process.env.MASON_SETUP_HOST,\n revision = process.env.MASON_SETUP_REVISION;\n if ((host !== \"codex\" && host !== \"claude\") || !process.env.MASON_SETUP_ROOT) return null;\n try {\n if (!revision) {\n if ((await effectiveSetup(process.env.MASON_SETUP_ROOT)).setup?.hosts[host]) {\n return \"Mason setup is now present. Restart the assistant to connect this MCP session to the configured integration; activation has not been established by this session.\";\n }\n return inactiveSetupMessage();\n }\n const capturedDirectory =\n options.directory?.match(/^\\.mason\\/reports\\/automation\\/[a-f0-9]{24}$/)?.[0] ??\n options.reportPath?.match(/^(\\.mason\\/reports\\/automation\\/[a-f0-9]{24})\\/checks\\//)?.[1];\n const ws = capturedDirectory\n ? { root: await fs.realpath(dir), directory: capturedDirectory }\n : await workspace(dir);\n if (ws.root !== (await fs.realpath(process.env.MASON_SETUP_ROOT))) return null;\n const { setup } = await effectiveSetup(ws.root);\n if (setup?.hosts[host]?.revision !== revision)\n return \"Mason setup changed; restart the assistant to observe the current integration.\";\n const directory = ws.directory + \"/activation\";\n await withLock(ws.root, directory, async () => {\n const now = new Date().toISOString();\n const record =\n (await readObservation(ws.root, ws.directory, host, revision)) ??\n ({\n version: 1,\n masonVersion: executingVersion(),\n root: ws.root,\n revision,\n host,\n contextCalls: 0,\n sessions: {},\n } satisfies Observation);\n if (event === \"context\") {\n record.contextCalls++;\n record.lastContextAt = now;\n } else if (options.sessionId) {\n const key = hash(options.sessionId);\n const session = record.sessions[key] ?? { events: [], at: now };\n // Repeated tool observations add no activation evidence; avoid another write.\n if (event !== \"task_end\" && session.events.includes(event)) return;\n session.events = [...new Set([...session.events, event])];\n session.at = now;\n if (event === \"task_end\") {\n session.verificationStatus = options.verificationStatus;\n session.reportPath = options.reportPath;\n }\n record.sessions[key] = session;\n const ordered = Object.entries(record.sessions).sort(([, a], [, b]) =>\n b.at.localeCompare(a.at),\n );\n record.sessions = Object.fromEntries(ordered.slice(0, 32));\n } else return;\n await writeStoreJson(ws.root, observationPath(ws.directory, host, revision), record);\n });\n return null;\n } catch (error) {\n return (\n \"Mason activation observation could not be saved; activation coverage is unknown. \" +\n (error instanceof Error ? error.message : String(error))\n .replace(/[\\u0000-\\u001f\\u007f]/g, \" \")\n .slice(0, 300)\n );\n }\n}\n","import { retrievedDecisions } from \"./usefulness.js\";\nimport { failureMessage, hookFailureMessage } from \"./execution.js\";\nimport { z } from \"zod\";\nimport { observeDecisionLifecycle, observeReadOnlyTool, type AutomationEvent } from \"./runtime.js\";\nimport { hostSchema, type Host } from \"./store.js\";\nimport { resolveHookRoot } from \"./hook-root.js\";\nimport { runHook } from \"../hook/hook.js\";\n\nconst inputSchema = z.object({\n cwd: z.string().min(1),\n session_id: z.string().min(1).max(500),\n hook_event_name: z.enum([\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"Stop\",\n ]),\n tool_name: z.string().optional(),\n tool_use_id: z.string().max(500).optional(),\n tool_response: z.unknown().optional(),\n tool_input: z.unknown().optional(),\n stop_hook_active: z.boolean().optional(),\n permission_mode: z.string().optional(),\n});\nconst lifecycle: Record<z.infer<typeof inputSchema>[\"hook_event_name\"], AutomationEvent[\"event\"]> =\n {\n SessionStart: \"session_start\",\n UserPromptSubmit: \"turn_start\",\n PreToolUse: \"before_tool\",\n PostToolUse: \"after_tool\",\n // Claude reports failed calls separately; they still end the paired tool capture.\n PostToolUseFailure: \"after_tool\",\n Stop: \"task_end\",\n };\n\n/** Reuse the existing file-scoped injector; never infer file targets from shell text. */\nasync function decisionContext(host: Host, raw: unknown, root: string): Promise<string | null> {\n const input = inputSchema.parse(raw);\n if (\n host !== \"claude\" ||\n !(\n (input.hook_event_name === \"PostToolUse\" && input.tool_name === \"Read\") ||\n (input.hook_event_name === \"PreToolUse\" && [\"Edit\", \"Write\"].includes(input.tool_name ?? \"\"))\n )\n )\n return null;\n try {\n const output = await runHook(JSON.stringify(raw), {\n rootDir: root,\n hookEventName: input.hook_event_name,\n });\n if (!output) return null;\n const parsed: unknown = JSON.parse(output);\n return z\n .object({ hookSpecificOutput: z.object({ additionalContext: z.string() }) })\n .parse(parsed).hookSpecificOutput.additionalContext;\n } catch (error) {\n // Delivery failure must not discard a guidance notice or an activation diagnostic.\n return failureMessage(error) + \" Decision knowledge was not delivered.\";\n }\n}\n\n/** Shell and unknown/MCP tools are conservatively observed: edits need not use a file editor. */\nexport function normalizeHook(\n host: Host,\n raw: unknown,\n): { cwd: string; name: string; readOnly: boolean; event: AutomationEvent } {\n hostSchema.parse(host);\n const input = inputSchema.parse(raw);\n const readOnly = (\n host === \"claude\"\n ? /^(Read|Glob|Grep|WebSearch|WebFetch)$/\n : /^(read_file|list_dir|grep_files|Read|Glob|Grep)$/\n ).test(input.tool_name ?? \"\");\n return {\n cwd: input.cwd,\n name: input.hook_event_name,\n readOnly,\n event: {\n event: lifecycle[input.hook_event_name],\n host,\n sessionId: input.session_id,\n toolId: input.tool_use_id,\n stopHookActive: input.stop_hook_active,\n mutating: !!input.tool_name && !readOnly,\n ...(input.hook_event_name === \"PostToolUse\"\n ? { retrievedDecisionIds: retrievedDecisions(input.tool_name, input.tool_response) }\n : {}),\n },\n };\n}\n\nexport async function runAutomationHook(\n host: Host,\n stdin: string,\n options: { managed?: boolean } = {},\n): Promise<Record<string, unknown> | null> {\n let name = \"\";\n let hook: ReturnType<typeof normalizeHook> | undefined;\n try {\n if (Buffer.byteLength(stdin) > 1024 * 1024) throw new Error(\"Hook input exceeds 1 MiB.\");\n let raw: unknown;\n try {\n raw = JSON.parse(stdin);\n } catch {\n throw new Error(\"Hook input is not valid JSON.\");\n }\n const input = normalizeHook(host, raw);\n hook = input;\n name = input.name;\n if (options.managed) {\n input.cwd = await resolveHookRoot(host, input.cwd);\n const { prepareLaunch } = await import(\"../setup/launcher.js\");\n if (!(await prepareLaunch(host, { dir: input.cwd, allowInactive: true }))) return null;\n }\n if ([\"before_tool\", \"after_tool\"].includes(input.event.event) && input.readOnly) {\n const observed = await observeReadOnlyTool(input.cwd, input.event);\n const { observeActivation } = await import(\"../setup/observations.js\");\n const warning = await observeActivation(observed.root, input.event.event, {\n sessionId: input.event.sessionId,\n directory: observed.directory,\n });\n const knowledge = await decisionContext(host, raw, observed.root);\n return knowledge\n ? {\n ...(warning ? { systemMessage: warning } : {}),\n hookSpecificOutput: { hookEventName: name, additionalContext: knowledge },\n }\n : warning\n ? { systemMessage: warning }\n : null;\n }\n const result = await observeDecisionLifecycle(input.cwd, input.event);\n const { observeActivation } = await import(\"../setup/observations.js\");\n const warning = await observeActivation(result.report.root, input.event.event, {\n sessionId: input.event.sessionId,\n verificationStatus: result.report.status,\n reportPath: result.report.reportPath,\n });\n if (warning) result.message = [result.message, warning].filter(Boolean).join(\"\\n\");\n const knowledge = await decisionContext(host, raw, result.report.root);\n if (knowledge) result.message = [result.message, knowledge].filter(Boolean).join(\"\\n\\n\");\n if (name === \"Stop\" && result.stopBlockReason) {\n return { decision: \"block\", reason: result.message ?? result.stopBlockReason };\n }\n if (!result.message) return null;\n if (name === \"Stop\") {\n // Re-entry remains advisory; delivery does not resolve the finding.\n return { systemMessage: result.message };\n }\n return { hookSpecificOutput: { hookEventName: name, additionalContext: result.message } };\n } catch (error) {\n const message = hook\n ? await hookFailureMessage(hook.cwd, host, hook.event.sessionId!, error)\n : failureMessage(error);\n if (!message) return null;\n // Hook failure is visible but does not turn guidance into an editing permission gate.\n return {\n systemMessage: message,\n ...([\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n ].includes(name)\n ? { hookSpecificOutput: { hookEventName: name, additionalContext: message } }\n : {}),\n };\n }\n}\n\n/** Events every compatible installation registers. */\nexport const HOOK_EVENTS = [\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"Stop\",\n] as const;\n/** Generated for the host but optional for compatibility, so older shared configuration keeps\n * working until a maintainer refreshes it with mason init. */\nconst OPTIONAL_HOOK_EVENTS: Record<Host, readonly string[]> = {\n claude: [\"PostToolUseFailure\"],\n codex: [],\n};\nexport function hookEvents(host: Host): string[] {\n return [...HOOK_EVENTS, ...OPTIONAL_HOOK_EVENTS[host]];\n}\n/** Only guard Mason's generated launch, never interpret a custom command prefix. */\nexport function managedHookCommand(host: Host, platform = process.platform, legacy = false) {\n const command = `mason --setup-host ${host}${legacy ? \" auto\" : \"\"} hook --host ${host}`;\n return platform === \"win32\"\n ? `cmd.exe /d /s /c \"where mason >nul 2>nul & if errorlevel 1 (exit /b 0) else (${command})\"`\n : `if command -v mason >/dev/null 2>&1; then ${command}; fi`;\n}\nexport function knownManagedHookCommands(host: Host) {\n return [\n \"npx --no-install --package mason-context mason auto hook --host \" + host,\n \"npx --no-install --package mason-context mason hook --host \" + host,\n managedHookCommand(host, \"linux\"),\n managedHookCommand(host, \"win32\"),\n managedHookCommand(host, \"linux\", true),\n managedHookCommand(host, \"win32\", true),\n `mason --setup-host ${host} hook --host ${host}`,\n `mason --setup-host ${host} auto hook --host ${host}`,\n ];\n}\n/** Migration recognizes both platforms; runtime compatibility is platform-specific. */\nexport function compatibleManagedHookCommands(host: Host, platform = process.platform) {\n return [\n managedHookCommand(host, platform),\n managedHookCommand(host, platform, true),\n `mason --setup-host ${host} hook --host ${host}`,\n `mason --setup-host ${host} auto hook --host ${host}`,\n ];\n}\nexport function hookConfig(host: Host, command = \"npx --no-install --package mason-context mason\") {\n const handler = {\n type: \"command\",\n command: [`mason --setup-host ${host}`, `mason --setup-host ${host} auto`].includes(command)\n ? managedHookCommand(host)\n : command + \" hook --host \" + host,\n timeout: 30,\n };\n return {\n hooks: Object.fromEntries(\n hookEvents(host).map((name) => [\n name,\n [\n {\n ...([\"PreToolUse\", \"PostToolUse\", \"PostToolUseFailure\"].includes(name)\n ? { matcher: \".*\" }\n : {}),\n hooks: [{ ...handler }],\n },\n ],\n ]),\n ),\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { readBoundedFile } from \"../utils/files.js\";\nimport { storePath } from \"../utils/storage.js\";\n\nexport interface FileEdit {\n path: string;\n before: string | null;\n after: string;\n}\nexport interface RemovalEdit {\n path: string;\n before: string | null;\n after: null;\n}\nexport async function readText(root: string, file: string): Promise<string | null> {\n try {\n const text = await readBoundedFile(await storePath(root, file), 2 * 1024 * 1024);\n if (text === null)\n throw new Error(\"Setup input is not a regular file or exceeds 2 MiB: \" + file);\n return text;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\n/** Preserve all bytes outside one unambiguous managed block. */\nexport function managedBlock(text: string, start: string, end: string, body: string): string {\n const starts = text.split(start).length - 1,\n ends = text.split(end).length - 1;\n if (starts !== ends || starts > 1 || (starts === 1 && text.indexOf(end) < text.indexOf(start))) {\n throw new Error(\n \"Ambiguous Mason instruction/configuration markers; repair the marked block before setup.\",\n );\n }\n const eol = text.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const block = [start, body.replace(/\\r?\\n/g, eol), end].join(eol);\n if (starts)\n return text.slice(0, text.indexOf(start)) + block + text.slice(text.indexOf(end) + end.length);\n return (\n text + (text.length && !text.endsWith(\"\\n\") ? eol : \"\") + (text.length ? eol : \"\") + block + eol\n );\n}\n\n/** Compare before replacing or removing: retain a user's concurrent edit. */\nexport async function applyEdit(root: string, edit: FileEdit | RemovalEdit): Promise<boolean> {\n const current = await readText(root, edit.path);\n if (current === edit.after) return false;\n if (current !== edit.before)\n throw new Error(\n \"Integration input changed during update: \" +\n edit.path +\n \". Rerun the requested command to resume.\",\n );\n if (edit.after === null) {\n const file = await storePath(root, edit.path);\n if ((await readText(root, edit.path)) !== edit.before)\n throw new Error(\"Input changed during removal: \" + edit.path);\n await fs.unlink(file);\n return true;\n }\n const file = await storePath(root, edit.path, true);\n const temporary = path.join(path.dirname(file), \".mason-setup-\" + randomUUID() + \".tmp\");\n try {\n const mode = await fs.stat(file).then(\n (s) => s.mode & 0o777,\n () => 0o600,\n );\n const handle = await fs.open(temporary, \"wx\", mode);\n try {\n await handle.writeFile(edit.after, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n if ((await readText(root, edit.path)) !== edit.before)\n throw new Error(\"Integration input changed during update: \" + edit.path);\n await fs.rename(temporary, file);\n return true;\n } finally {\n await fs.rm(temporary, { force: true });\n }\n}\n","import { z } from \"zod\";\nimport { parse } from \"smol-toml\";\nimport { hash } from \"../automation/evidence.js\";\nimport { readText, type FileEdit } from \"./files.js\";\n\nexport const OWNERSHIP_PATH = \".mason/local/integration.json\";\nexport const BLOCKS = [\n [\"<!-- mason:start -->\", \"<!-- mason:end -->\"],\n [\"<!-- mason:agents:start -->\", \"<!-- mason:agents:end -->\"],\n [\"# mason:mcp:start\", \"# mason:mcp:end\"],\n] as const;\nconst fileSchema = z.object({\n created: z.boolean(),\n initialHash: z.string(),\n blocks: z.record(z.string()),\n mcpHash: z.string().optional(),\n hookCommands: z.array(z.string()).optional(),\n hooks: z.record(z.array(z.string())).optional(),\n});\nexport const ownershipSchema = z.object({ version: z.literal(1), files: z.record(fileSchema) });\nexport type Ownership = z.infer<typeof ownershipSchema>;\n\nexport function blockSpan(text: string, start: string, end: string) {\n const starts = text.split(start).length - 1,\n ends = text.split(end).length - 1;\n if (!starts && !ends) return null;\n const from = text.indexOf(start),\n to = text.indexOf(end) + end.length;\n if (starts !== 1 || ends !== 1 || to <= from)\n throw new Error(\"Ambiguous Mason markers; inspect the marked block manually.\");\n return { from, to, text: text.slice(from, to) };\n}\n\n/** Persist ownership before shared edits so interrupted setup remains removable. */\nexport async function ownershipEdit(\n root: string,\n edits: FileEdit[],\n hookCommands: Record<string, string> = {},\n): Promise<FileEdit> {\n const before = await readText(root, OWNERSHIP_PATH);\n const record: Ownership =\n before === null ? { version: 1, files: {} } : ownershipSchema.parse(JSON.parse(before));\n for (const edit of edits) {\n const previous = record.files[edit.path];\n const entry = {\n created: edit.before === null || (previous?.created ?? false),\n initialHash:\n edit.before === null || previous?.initialHash === hash(edit.before)\n ? hash(edit.after)\n : (previous?.initialHash ?? hash(edit.after)),\n blocks: Object.fromEntries(\n BLOCKS.flatMap(([start, end]) => {\n const block = blockSpan(edit.after, start, end);\n return block ? [[start, hash(block.text)]] : [];\n }),\n ),\n };\n const hostConfig: unknown = edit.path.endsWith(\".json\") ? JSON.parse(edit.after) : undefined;\n const parsedHost = z\n .object({\n mcpServers: z.record(z.unknown()).optional(),\n hooks: z.record(z.array(z.object({ hooks: z.array(z.unknown()) }))).optional(),\n })\n .parse(hostConfig ?? {});\n const mcp =\n edit.path === \".codex/config.toml\"\n ? (parse(edit.after).mcp_servers as Record<string, unknown>)?.mason\n : edit.path === \".mcp.json\"\n ? parsedHost.mcpServers?.mason\n : undefined;\n const hooks =\n edit.path === \".codex/hooks.json\" || edit.path === \".claude/settings.json\"\n ? parsedHost.hooks\n : undefined;\n record.files[edit.path] = {\n ...entry,\n ...(mcp === undefined ? {} : { mcpHash: hash(mcp) }),\n ...(hookCommands[edit.path]\n ? {\n hookCommands: [\n ...new Set([...(previous?.hookCommands ?? []), hookCommands[edit.path]]),\n ],\n }\n : {}),\n ...(hooks === undefined\n ? {}\n : {\n hooks: Object.fromEntries(\n Object.entries(hooks).map(([event, groups]) => [\n event,\n groups.flatMap((group) => group.hooks.map(hash)),\n ]),\n ),\n }),\n };\n }\n return { path: OWNERSHIP_PATH, before, after: JSON.stringify(record, null, 2) + \"\\n\" };\n}\n\n/** Forget earlier commands only after their replacement and installation record were saved. */\nexport async function completedHookOwnership(\n root: string,\n file: string,\n command: string,\n): Promise<FileEdit> {\n const before = await readText(root, OWNERSHIP_PATH);\n const record = ownershipSchema.parse(JSON.parse(before ?? \"null\"));\n record.files[file].hookCommands = [command];\n return { path: OWNERSHIP_PATH, before, after: JSON.stringify(record, null, 2) + \"\\n\" };\n}\n","import { z } from \"zod\";\nimport { readStoreJson } from \"../utils/storage.js\";\nimport { applyEdit, readText, type FileEdit } from \"../setup/files.js\";\n\nexport interface ProjectMarker {\n version: 1;\n initializedAt: string;\n features?: Record<string, unknown>;\n}\n\nconst markerSchema = z\n .object({\n version: z.literal(1),\n initializedAt: z.string(),\n features: z.record(z.unknown()).optional(),\n })\n .passthrough();\n\nexport async function loadProjectMarker(rootDir: string): Promise<ProjectMarker | null> {\n const raw = await readStoreJson(rootDir, \".mason/local/project.json\");\n if (raw === null) return null;\n const marker = markerSchema.parse(raw);\n return { ...marker, features: await loadProjectFeatures(rootDir) };\n}\n\nexport async function loadProjectFeatures(rootDir: string) {\n const config = z\n .record(z.unknown())\n .parse((await readStoreJson(rootDir, \".mason/config.json\")) ?? {});\n return z.record(z.unknown()).parse(config.features ?? {});\n}\n\nexport async function saveProjectMarker(rootDir: string, marker: ProjectMarker): Promise<void> {\n const { ancillaryEdits } = await import(\"../setup/config.js\");\n for (const edit of [\n ...(await ancillaryEdits(rootDir)),\n ...(await projectMarkerEdits(rootDir, marker)),\n ])\n await applyEdit(rootDir, edit);\n}\n\nasync function projectMarkerEdits(rootDir: string, marker: ProjectMarker): Promise<FileEdit[]> {\n const { features, ...local } = markerSchema.parse(marker);\n const file = \".mason/local/project.json\";\n const edits = [\n {\n path: file,\n before: await readText(rootDir, file),\n after: JSON.stringify(local, null, 2) + \"\\n\",\n },\n ];\n if (features && Object.keys(features).length) {\n const configPath = \".mason/config.json\",\n before = await readText(rootDir, configPath);\n const config = z.record(z.unknown()).parse(JSON.parse(before ?? \"{}\"));\n config.features = { ...z.record(z.unknown()).parse(config.features ?? {}), ...features };\n edits.push({ path: configPath, before, after: JSON.stringify(config, null, 2) + \"\\n\" });\n }\n return edits;\n}\n\n/** Marker-delimited project instructions make the tools useful in later sessions. */\nexport const CLAUDE_MD_SECTION = `<!-- mason:start -->\n## Mason project knowledge\n\nMason provides recorded decisions and file impact over MCP. A concept map is optional.\n\n- Task, bug, change request, or investigation of why the project works this way → \\`get_context\\` with the task text and known files: matching decisions, related tests, impact, and any available map entries.\n- Before editing a file → \\`get_impact\\` to check references, tests, and historical change partners.\n- Investigation or correction reveals a reusable project lesson → \\`save_decision\\` as soon as the lesson is supported by evidence; do not wait for implementation, task completion, or merge. Record the established observation now and identify unimplemented remedies as tentative. Capture only the lasting constraint and reason, with anchors and known sources, owner, and recorder. This creates a proposal; never infer approval. Preserve uncertain causes and unknown attribution. Route project lessons here; keep personal preferences in agent memory. Skip code summaries, current checkout status, temporary task permissions, session trivia, and secrets. No qualifying lesson means no record.\n- Before saving, compare the lesson with matching \\`get_context\\` records and any pending proposal. If new evidence changes the same lesson's assumptions, scope, or recommended action, revise it with \\`save_decision(id: existingId)\\`, including when it is accepted. Preserve supported rationale and sources, replace obsolete instructions, and add the new evidence. Create a separate record for a genuinely distinct lesson; skip unchanged restatements. Revision preserves history and leaves the accepted version operative until authorized review.\n- Consult trust metadata before relying on entries: unknown or changed freshness requires inspection, stale or unknown map verification requires a fresh evidence review, and a recorded failed verdict means the description must be corrected. Check approval too: proposals are suggestions, legacy records are unreviewed, and accepted decisions are recorded constraints subject to freshness checks. An accepted revision remains operative while a pending proposal is reviewed; keep both versions and their freshness distinct.\n- Asked to review pending project knowledge → \\`mason_automation(action: \"status\")\\` lists pending proposals and uncommitted records. For ordinary tasks, inspect matching proposals through \\`get_context\\`; do not request acceptance merely because a proposal exists.\n- Asked to review or re-verify a decision → \\`review_decision\\` first to inspect content, sources, history, and code changes. To inspect accepted guidance separately, use inspectionScope \\`operative\\` on both preparation and inspection; a pending draft remains visible and unassessed. Default all scope covers both revisions. After source inspection finds no contradiction in the selected scope, record action \\`inspect\\` with the actual inspector, note, and prepared token; this does not claim human approval. Record acceptance, reaffirmation, or retirement only when authorized by the user or a cited team review, with the actual reviewer and reason. Never infer approval from unchanged code. Review and commit the local record through the normal project workflow.\n- Use \\`mason status\\` or \\`mason_automation(action: \"status\")\\` to inspect configuration and observed use. Lifecycle hooks check decision anchors and surface guidance; changed anchors request inspection and do not prove the rationale obsolete.\n- Audits and repair verification are explicit workflows. Run \\`mason audit --help\\` or \\`mason check\\` when that work is requested; setup does not perform an audit or prepare repairs.\n\nInspect source for what the retrieved context does not answer.\n<!-- mason:end -->`;\n\nexport type InitMode = \"quickstart\" | \"init\" | \"setup\";\n\nconst ASSISTANT_SETUP = `UNIFIED SETUP\nWhen the user requests Mason setup, call mason_init again with mode: \"setup\" and host: \"codex\" or \"claude\" for the assistant being configured. Default setup validates existing shared configuration and writes local activation state only. To explicitly prepare or update shared configuration for review and commit, use mode: \"init\" (CLI: mason init); dryRun: true previews without writes. Initialization does not activate the checkout. This uses the same engine as mason init: use the installed mason command on PATH, merge project MCP configuration and hooks, update marker-delimited instructions and Git ignore rules, and record setup. A concept map is optional.\nIf the user only requested inspection or review, report findings without running setup. The setup result distinguishes configured from observed activation. Explain the host's native trust step and request a new session; never trust hooks on the user's behalf or claim activation from generated configuration alone. After a normal task finishes, mason_automation(action: \"status\") or mason status reports observed context use and hook events. Existing findings remain reviewable; setup does not approve advisories or manufacture decisions.\n\nThe managed project guidance is:\n${CLAUDE_MD_SECTION}`;\n\nconst QUICKSTART_PLAYBOOK = `Start with the audit and review results included in this response. No concept map is required.\n\n1. Explain the actionable findings with their source evidence. Separate audit issues, advisories, and skipped checks. The review covers committed changes from the merge base to HEAD; workingTree paths are not included in that review. An unavailable or empty check is not proof that the project is correct. Use the CLI for full output if a summary is truncated.\n2. Address findings within the user's requested scope. Initialization prepares shared configuration; setup only activates existing configuration locally; rewriting existing project claims requires repair scope. If repair is authorized, run \\`mason audit --prepare-repair --json\\` before editing; it saves the full original findings even when this summary is truncated. Inspect relevant source, make grounded edits, then run \\`mason audit --verify-repair <baselinePath> --json\\` with that same baseline, including after any final doc commit. Report resolved, unresolved, review-required, unverified, and new findings. Keep suppressed advisories visible even when initialization has already edited an instruction file. Do not invent a decision just to populate the store.\n3. Capture a supported lesson as soon as it is established; do not wait for implementation, task completion, or merge. Keep unimplemented remedies tentative. When the task reveals a real lesson or constraint, compare matching \\`get_context\\` records first. If its assumptions, scope, or recommended action changed, revise that record using \\`save_decision(id: existingId)\\`; create a separate record for a genuinely distinct lesson and skip unchanged restatements. Include title, body, category, anchors, and known owner/source/actor information. Preserve supported rationale and sources, replace obsolete instructions, and add new evidence. Missing attribution can be added later. The tool writes a local proposal; editing it preserves revision history and requires a new acceptance, while any earlier accepted revision remains operative. An unchanged save never refreshes its evidence. When decision review is requested, \\`review_decision\\` prepares the record and code evidence before any authorized verdict. Review and commit records through the normal workflow. Retrieve it on the next relevant task with \\`get_context(dir, task, files)\\`.\n\n${ASSISTANT_SETUP}\n\nOPTIONAL ARCHITECTURE MAP\nExisting maps remain readable for legacy projects. Managed map creation has been removed; use the agent's own source tools for architecture investigations.`;\n\nexport function setupPlaybook(): string {\n return QUICKSTART_PLAYBOOK;\n}\n","import fs from \"node:fs/promises\";\nimport { readBoundedFile } from \"../utils/files.js\";\nimport { decisionSchema } from \"./provenance.js\";\n\nexport const MERGE_DRIVER_NAME = \"mason-decision\";\nexport const MERGE_ATTRIBUTE = `.mason/decisions/*.json merge=${MERGE_DRIVER_NAME}`;\n/** A refused or unavailable semantic merge falls back to Git's ordinary text conflict.\n * Git keeps %A unchanged when a driver fails, so the fallback must write the markers. */\nexport const MERGE_DRIVER_COMMAND =\n \"mason merge-decision %O %A %B %L %P || git merge-file --marker-size=%L -L ours -L base -L theirs %A %O %B\";\n\n/** Inspections and review history only grow; each side may append to the common prefix. */\nconst APPEND_ONLY = new Set([\"history\", \"inspections\"]);\n\nexport type DecisionMerge =\n { status: \"merged\"; text: string } | { status: \"conflict\"; reason: string };\n\nconst canonical = (value: unknown): string | undefined =>\n JSON.stringify(value, (_, item: unknown) =>\n item && typeof item === \"object\" && !Array.isArray(item)\n ? Object.fromEntries(Object.entries(item).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))\n : item,\n );\n\nfunction appendOnly(base: unknown, ours: unknown, theirs: unknown): unknown[] | null | undefined {\n if (base === undefined && ours === undefined && theirs === undefined) return undefined;\n const lists = [base ?? [], ours ?? [], theirs ?? []];\n if (!lists.every(Array.isArray)) return null;\n const [common, current, incoming] = lists as unknown[][];\n const extendsCommon = (list: unknown[]) =>\n list.length >= common.length &&\n common.every((entry, i) => canonical(entry) === canonical(list[i]));\n if (!extendsCommon(current) || !extendsCommon(incoming)) return null;\n const added = new Map<string, unknown>();\n for (const entry of [...current.slice(common.length), ...incoming.slice(common.length)])\n added.set(canonical(entry)!, entry);\n const at = (entry: unknown) => String((entry as { at?: unknown }).at ?? \"\");\n // Sort by time, then content, so merging in either direction gives identical bytes.\n const appended = [...added].sort(([a, x], [b, y]) =>\n at(x) < at(y) ? -1 : at(x) > at(y) ? 1 : a < b ? -1 : a > b ? 1 : 0,\n );\n return [...common, ...appended.map(([, entry]) => entry)];\n}\n\n/** Three-way merge of one decision record. Both sides and the result must be valid records;\n * anything a person should decide (two revisions, two verdicts) is returned as a conflict. */\nexport function mergeDecisionRecords(\n baseText: string,\n oursText: string,\n theirsText: string,\n expectedId?: string,\n): DecisionMerge {\n const conflict = (reason: string): DecisionMerge => ({ status: \"conflict\", reason });\n let parsed: unknown[];\n try {\n parsed = [baseText, oursText, theirsText].map((text) => JSON.parse(text) as unknown);\n } catch {\n return conflict(\"a version is not valid JSON\");\n }\n if (!parsed.every((value) => value && typeof value === \"object\" && !Array.isArray(value)))\n return conflict(\"a version is not a JSON object\");\n const [base, ours, theirs] = parsed as Record<string, unknown>[];\n for (const [label, side] of [\n [\"current\", ours],\n [\"incoming\", theirs],\n ] as const)\n if (!decisionSchema.safeParse(side).success)\n return conflict(`the ${label} version is not a valid decision record`);\n\n const merged: Record<string, unknown> = {};\n for (const key of new Set([...Object.keys(ours), ...Object.keys(theirs), ...Object.keys(base)])) {\n if (APPEND_ONLY.has(key)) {\n const list = appendOnly(base[key], ours[key], theirs[key]);\n if (list === null) return conflict(`${key} on one side does not extend the common version`);\n if (list !== undefined) merged[key] = list;\n continue;\n }\n const [b, o, t] = [base[key], ours[key], theirs[key]].map(canonical);\n if (o !== t && o !== b && t !== b) return conflict(`both sides changed ${key}`);\n // Take the side that changed the field; unchanged or identical sides agree.\n const value = o === b ? theirs[key] : ours[key];\n if (value !== undefined) merged[key] = value;\n }\n const result = decisionSchema.safeParse(merged);\n if (!result.success)\n return conflict(`the combined record is invalid: ${result.error.issues[0].message}`);\n if (expectedId !== undefined && result.data.id !== expectedId)\n return conflict(\"the record id does not match its file name\");\n return { status: \"merged\", text: JSON.stringify(result.data, null, 2) + \"\\n\" };\n}\n\n/** `mason merge-decision <base> <current> <incoming> [marker-size] [path]`: exit 0 after\n * writing the merge to <current>, or 1 leaving it untouched for Git's text fallback. */\nexport async function runDecisionMerge(args: string[]): Promise<number> {\n const [basePath, oursPath, theirsPath, , pathname] = args;\n if (!basePath || !oursPath || !theirsPath || args.length > 5)\n throw new Error(\n \"Usage: mason merge-decision <base> <current> <incoming> [marker-size] [path]. Git runs this through the merge driver that mason setup configures.\",\n );\n const read = async (file: string) => {\n const text = await readBoundedFile(file, 10 * 1024 * 1024);\n if (text === null) throw new Error(`${file} is not a regular file or exceeds 10 MiB`);\n return text;\n };\n const id = pathname && /(?:^|\\/)\\.mason\\/decisions\\/([^/]+)\\.json$/.exec(pathname)?.[1];\n const result = mergeDecisionRecords(\n await read(basePath),\n await read(oursPath),\n await read(theirsPath),\n id || undefined,\n );\n if (result.status === \"conflict\") {\n console.error(\n `Mason: ${pathname || \"decision record\"}: ${result.reason}; leaving it to Git's text merge.`,\n );\n return 1;\n }\n await fs.writeFile(oursPath, result.text, \"utf8\");\n return 0;\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport { parse, stringify } from \"smol-toml\";\nimport { z } from \"zod\";\nimport { CLAUDE_MD_SECTION } from \"../mcp/init.js\";\nimport { DOC_CANDIDATES } from \"../audit/docs.js\";\nimport { HOOK_EVENTS, hookConfig, compatibleManagedHookCommands } from \"../automation/adapters.js\";\nimport { configPath, automationConfigSchema, AUTOMATION_PATH } from \"../automation/install.js\";\nimport type { Host } from \"../automation/store.js\";\nimport { readText, managedBlock, type FileEdit } from \"./files.js\";\nimport { hookCommand, mcpCommand } from \"./launcher.js\";\nimport { MERGE_ATTRIBUTE, MERGE_DRIVER_COMMAND, MERGE_DRIVER_NAME } from \"../decisions/merge.js\";\n\nconst object = z.record(z.unknown());\nexport const mcpPath = (host: Host) => (host === \"codex\" ? \".codex/config.toml\" : \".mcp.json\");\nconst TOML_START = \"# mason:mcp:start\",\n TOML_END = \"# mason:mcp:end\";\nconst POINTER_START = \"<!-- mason:agents:start -->\",\n POINTER_END = \"<!-- mason:agents:end -->\";\nexport async function instructionEdits(root: string, host?: Host) {\n const found = await Promise.all(\n DOC_CANDIDATES.map(async (file) => ({ path: file, text: await readText(root, file) })),\n );\n const existing = found.find((f) => f.text !== null);\n const primary =\n host === \"codex\" && found[0].text === null\n ? { path: \"AGENTS.md\", text: null }\n : (existing ?? { path: \"AGENTS.md\", text: null });\n const originalGuidance =\n primary.text === null && existing\n ? \"Follow the existing project conventions in \" + existing.path + \".\\n\"\n : \"\";\n const edits: FileEdit[] = [\n {\n path: primary.path,\n before: primary.text,\n after: managedBlock(\n primary.text ?? originalGuidance,\n \"<!-- mason:start -->\",\n \"<!-- mason:end -->\",\n CLAUDE_MD_SECTION.split(\"\\n\").slice(1, -1).join(\"\\n\"),\n ),\n },\n ];\n if (primary.path === \"AGENTS.md\") {\n const secondary = found.filter((f) => f.path !== \"AGENTS.md\" && f.text !== null);\n if (host === \"claude\" && !secondary.length) secondary.push({ path: \"CLAUDE.md\", text: null });\n for (const file of secondary) {\n const text = file.text ?? \"\";\n const legacy = text.includes(\"<!-- mason:start -->\") || text.includes(\"<!-- mason:end -->\");\n const imported = \"@\" + (file.path.startsWith(\".claude/\") ? \"../AGENTS.md\" : \"AGENTS.md\");\n if (text.trim() === imported) continue;\n // Claude expands native imports at session start; a prose mention does not load the guidance.\n const pointer = \"Mason project knowledge and shared project instructions:\\n\" + imported;\n edits.push({\n path: file.path,\n before: file.text,\n after: managedBlock(\n text,\n legacy ? \"<!-- mason:start -->\" : POINTER_START,\n legacy ? \"<!-- mason:end -->\" : POINTER_END,\n pointer,\n ),\n });\n }\n }\n return edits;\n}\n\n/** Retain host options and environment; replace only transport/launch details. */\nfunction managedMcp(previous: unknown, host: Host) {\n const options = previous === undefined ? {} : object.parse(previous);\n for (const key of [\n \"command\",\n \"args\",\n \"url\",\n \"type\",\n \"headers\",\n \"http_headers\",\n \"env_http_headers\",\n \"bearer_token_env_var\",\n ])\n delete options[key];\n return { ...options, ...(host === \"claude\" ? { type: \"stdio\" } : {}), ...mcpCommand(host) };\n}\n\nexport async function mcpEdit(root: string, host: Host): Promise<FileEdit> {\n const file = mcpPath(host),\n before = await readText(root, file);\n if (host === \"claude\") {\n const config = before === null ? {} : object.parse(JSON.parse(before));\n const servers = object.parse(config.mcpServers ?? {});\n // Mason owns only its named server; other servers and settings retain their values.\n return {\n path: file,\n before,\n after:\n JSON.stringify(\n { ...config, mcpServers: { ...servers, mason: managedMcp(servers.mason, host) } },\n null,\n 2,\n ) + \"\\n\",\n };\n }\n const config = parse(before ?? \"\");\n const managed = (before ?? \"\").includes(TOML_START);\n const servers = config.mcp_servers as Record<string, unknown> | undefined;\n const desired = managedMcp(servers?.mason, host);\n let base = before ?? \"\";\n if (servers?.mason && !managed) {\n // Migrate ordinary explicit tables without reserializing the rest of TOML.\n // Validate the whole semantic result afterwards, including multiline strings.\n const headers = [...base.matchAll(/^\\s*\\[\\[?.+?\\]\\]?[^\\S\\r\\n]*(?:#.*)?$/gm)];\n const spans = headers.flatMap((header, index) =>\n /^\\s*\\[mcp_servers\\.mason(?:\\.[A-Za-z0-9_-]+)*\\]/.test(header[0])\n ? [{ start: header.index!, end: headers[index + 1]?.index ?? base.length }]\n : [],\n );\n if (!spans.length)\n throw new Error(\n \"Cannot safely migrate the existing Mason MCP TOML entry. Use an explicit [mcp_servers.mason] table and rerun setup; the file was retained.\",\n );\n for (const span of spans.reverse()) base = base.slice(0, span.start) + base.slice(span.end);\n }\n const after = managedBlock(\n base,\n TOML_START,\n TOML_END,\n stringify({ mcp_servers: { mason: desired } }).trimEnd(),\n );\n const parsed = parse(after);\n const expected = { ...config, mcp_servers: { ...(servers ?? {}), mason: desired } };\n if (!isDeepStrictEqual(parsed, expected))\n throw new Error(\n \"Could not safely configure the Mason MCP entry without changing other settings.\",\n );\n return { path: file, before, after };\n}\n\nexport async function hookEdits(root: string, host: Host): Promise<FileEdit[]> {\n const file = configPath(host),\n before = await readText(root, file);\n const { planAutomationInstall } = await import(\"../automation/install.js\");\n const plan = await planAutomationInstall(root, host, hookCommand(host));\n return [\n { path: file, before, after: JSON.stringify(plan.config, null, 2) + \"\\n\" },\n {\n path: AUTOMATION_PATH,\n before: await readText(root, AUTOMATION_PATH),\n after: JSON.stringify(plan.record, null, 2) + \"\\n\",\n },\n ];\n}\n\nexport async function ancillaryEdits(root: string) {\n const ignore = await readText(root, \".gitignore\");\n const attributes = await readText(root, \".gitattributes\");\n const rules = [\n \"!/.mason/\",\n \"/.mason/*\",\n \"!/.mason/decisions/\",\n \"!/.mason/decisions/**\",\n \"!/.mason/reviews/\",\n \"!/.mason/reviews/**\",\n \"!/.mason/config.json\",\n \"!/.mason/snapshot.json\",\n \"/.mason/local/\",\n \"/.mason/reports/\",\n ].join(\"\\n\");\n return [\n {\n path: \".gitignore\",\n before: ignore,\n after: managedBlock(ignore ?? \"\", \"# mason:ignore:start\", \"# mason:ignore:end\", rules),\n },\n // Unconfigured checkouts keep Git's text merge; mason setup enables the driver locally.\n {\n path: \".gitattributes\",\n before: attributes,\n after: managedBlock(\n attributes ?? \"\",\n \"# mason:merge:start\",\n \"# mason:merge:end\",\n MERGE_ATTRIBUTE,\n ),\n },\n ];\n}\n\n/** Repository-level state of the decision merge driver; linked worktrees share it. */\nexport async function decisionMergeStatus(root: string) {\n const { git } = await import(\"../automation/evidence.js\");\n const attribute = (\n await git(root, \"check-attr\", \"merge\", \"--\", \".mason/decisions/record.json\")\n ).trim();\n const driver = await git(root, \"config\", \"--get\", `merge.${MERGE_DRIVER_NAME}.driver`).then(\n (value) => value.trim(),\n () => null,\n );\n return {\n attribute: attribute.endsWith(`: merge: ${MERGE_DRIVER_NAME}`),\n driver: driver === null ? \"missing\" : driver === MERGE_DRIVER_COMMAND ? \"configured\" : \"custom\",\n } as const;\n}\n\nexport function mergeDriverSummary(state: Awaited<ReturnType<typeof decisionMergeStatus>>) {\n const driver =\n state.driver === \"configured\"\n ? \"Decision record merge driver: configured.\"\n : state.driver === \"custom\"\n ? \"Decision record merge driver: customized in Git config; Mason left it unchanged.\"\n : \"Decision record merge driver: not configured; Git text-merges decision records. Run mason setup to enable it.\";\n return state.attribute\n ? driver\n : driver + \" The .gitattributes entry is missing; a maintainer can add it with mason init.\";\n}\n\n/** Local activation only: Git cannot share driver commands through committed files. */\nexport async function configureDecisionMerge(root: string) {\n const status = await decisionMergeStatus(root);\n if (status.driver !== \"missing\") return status;\n const { git } = await import(\"../automation/evidence.js\");\n const section = `merge.${MERGE_DRIVER_NAME}`;\n await git(root, \"config\", \"--local\", `${section}.name`, \"Mason decision record merge\");\n await git(root, \"config\", \"--local\", `${section}.driver`, MERGE_DRIVER_COMMAND);\n return { ...status, driver: \"configured\" } as const;\n}\n\nexport async function inspectHostConfig(root: string, host: Host, plannedMcp?: string) {\n const text = plannedMcp ?? (await readText(root, mcpPath(host)));\n const config = host === \"codex\" ? parse(text ?? \"\") : object.parse(JSON.parse(text ?? \"{}\"));\n const servers = (host === \"codex\" ? config.mcp_servers : config.mcpServers) as\n Record<string, unknown> | undefined;\n const hooks = automationConfigSchema.parse(\n JSON.parse((await readText(root, configPath(host))) ?? \"{}\"),\n );\n const expected = hookConfig(host, hookCommand(host));\n const compatible = compatibleManagedHookCommands(host);\n const mcp = servers?.mason === undefined ? null : object.parse(servers.mason);\n return {\n mcp,\n mcpDisabled: mcp?.enabled === false,\n hooks: Object.fromEntries(\n Object.keys(expected.hooks).map((event) => [\n event,\n (hooks.hooks?.[event] ?? []).flatMap(\n (group) =>\n group.hooks\n .filter((handler) => compatible.includes(handler.command ?? \"\"))\n .map((handler) => ({ ...group, hooks: [handler] })) ?? [],\n ),\n ]),\n ),\n disabled:\n hooks.disableAllHooks === true ||\n (config.features as Record<string, unknown> | undefined)?.hooks === false ||\n (config.features as Record<string, unknown> | undefined)?.codex_hooks === false,\n };\n}\n\n/** Runtime compatibility is independent of the current generated template. */\nexport async function inspectIntegration(root: string, host: Host) {\n const config = await inspectHostConfig(root, host);\n const instructions = await instructionEdits(root, host);\n const primary = instructions[0]?.before ?? \"\";\n const { blockSpan } = await import(\"./ownership.js\");\n const block = blockSpan(primary, \"<!-- mason:start -->\", \"<!-- mason:end -->\");\n const instructionCompatible =\n !!block &&\n [\"get_context\", \"save_decision\", \"review_decision\"].every((tool) =>\n block.text.includes(tool),\n ) &&\n instructions.slice(1).every((edit) => {\n const imported = edit.path.startsWith(\".claude/\") ? \"@../AGENTS.md\" : \"@AGENTS.md\";\n return (edit.before ?? \"\").split(/\\r?\\n/).some((line) => line.trim() === imported);\n });\n const expectedHooks = hookConfig(host, hookCommand(host)).hooks;\n const normalizedHooks = Object.fromEntries(\n Object.entries(config.hooks).map(([event, groups]) => [\n event,\n groups.map((group) => ({\n ...group,\n hooks: group.hooks.map((handler) => ({\n ...handler,\n command: expectedHooks.SessionStart[0].hooks[0].command,\n })),\n })),\n ]),\n );\n const mcpCompatible =\n isDeepStrictEqual({ command: config.mcp?.command, args: config.mcp?.args }, mcpCommand(host)) &&\n (config.mcp?.type === undefined || config.mcp.type === \"stdio\");\n // Optional events (Claude's PostToolUseFailure) may be absent from older configuration.\n const required = new Set<string>(HOOK_EVENTS);\n const hooksCompatible = Object.entries(expectedHooks).every(\n ([event, groups]) =>\n isDeepStrictEqual(normalizedHooks[event], groups) ||\n (!required.has(event) && !normalizedHooks[event]?.length),\n );\n return {\n ...config,\n instructions,\n instructionCompatible,\n instructionsCurrent: instructions.every((edit) => edit.before === edit.after),\n mcpCompatible,\n hooksCompatible,\n hooksCurrent: isDeepStrictEqual(config.hooks, expectedHooks),\n compatible: instructionCompatible && mcpCompatible && hooksCompatible,\n };\n}\n","import { z } from \"zod\";\nimport { readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport { workspace } from \"./evidence.js\";\nimport { HOOK_EVENTS, hookConfig, hookEvents, knownManagedHookCommands } from \"./adapters.js\";\nimport { withLock, type Host } from \"./store.js\";\nimport { readText } from \"../setup/files.js\";\nimport { OWNERSHIP_PATH, ownershipSchema } from \"../setup/ownership.js\";\n\nconst groupSchema = z\n .object({\n hooks: z.array(z.object({ type: z.string(), command: z.string().optional() }).passthrough()),\n })\n .passthrough();\nexport const automationConfigSchema = z\n .object({ hooks: z.record(z.array(groupSchema)).optional() })\n .passthrough();\nexport const recordSchema = z.object({\n version: z.literal(1),\n hosts: z.record(z.object({ command: z.string() })),\n});\nexport const AUTOMATION_PATH = \".mason/local/automation.json\";\nasync function installationRecord(root: string) {\n return recordSchema.parse(\n (await readStoreJson(root, AUTOMATION_PATH)) ?? { version: 1, hosts: {} },\n );\n}\nexport const configPath = (host: Host) =>\n host === \"claude\" ? \".claude/settings.json\" : \".codex/hooks.json\";\n\n/** Explicit install preserves other settings and hooks, replacing only Mason's recorded handlers. */\nexport async function installAutomation(dir: string, host: Host, command?: string) {\n const ws = await workspace(dir);\n return withLock(ws.root, \".mason/reports/setup-lock\", () =>\n installLocked(ws.root, host, command),\n );\n}\n\nexport async function planAutomationInstall(root: string, host: Host, command?: string) {\n const file = configPath(host);\n const before = await readText(root, file);\n const existing = automationConfigSchema.parse(JSON.parse(before ?? \"{}\"));\n const record = await installationRecord(root);\n const desired = hookConfig(host, command);\n const newCommand = desired.hooks.SessionStart[0].hooks[0].command;\n const previous = record.hosts[host]?.command;\n const ownershipText = await readText(root, OWNERSHIP_PATH);\n const pending =\n ownershipText === null\n ? []\n : (ownershipSchema.parse(JSON.parse(ownershipText)).files[file]?.hookCommands ?? []);\n // A clone has shared hooks but no local ownership receipt.\n const owned = new Set([previous, ...pending, newCommand, ...knownManagedHookCommands(host)]);\n const hooks = existing.hooks ?? {};\n for (const event of hookEvents(host)) {\n hooks[event] = (hooks[event] ?? [])\n .map((group) => ({\n ...group,\n hooks: group.hooks.filter(\n (handler) =>\n !(\n handler.type === \"command\" &&\n typeof handler.command === \"string\" &&\n owned.has(handler.command)\n ),\n ),\n }))\n .filter((group) => group.hooks.length);\n hooks[event].push(...desired.hooks[event]);\n }\n record.hosts[host] = { command: newCommand };\n return { file, before, config: { ...existing, hooks }, record, newCommand };\n}\n\nasync function installLocked(root: string, host: Host, command?: string) {\n const { file, before, config, record, newCommand } = await planAutomationInstall(\n root,\n host,\n command,\n );\n const { ancillaryEdits } = await import(\"../setup/config.js\");\n const { applyEdit } = await import(\"../setup/files.js\");\n const { ownershipEdit, completedHookOwnership } = await import(\"../setup/ownership.js\");\n const edit = { path: file, before, after: JSON.stringify(config, null, 2) + \"\\n\" };\n const ancillary = await ancillaryEdits(root);\n await applyEdit(root, await ownershipEdit(root, [edit], { [file]: newCommand }));\n for (const edit of ancillary) await applyEdit(root, edit);\n await applyEdit(root, edit);\n // Keep the previous command until its replacement is installed. Ownership\n // records the pending command so teardown/reinstallation can resume either side.\n await writeStoreJson(root, AUTOMATION_PATH, record);\n await applyEdit(root, await completedHookOwnership(root, file, newCommand));\n return {\n version: 1,\n host,\n configPath: file,\n status: \"configured\",\n command: newCommand,\n events: hookEvents(host),\n next:\n host === \"codex\"\n ? \"Review/trust these hooks using Codex /hooks and start a new session. mason status reports observed events separately from configuration.\"\n : \"Start a new Claude Code session. mason status reports observed events separately from configuration.\",\n note: \"Install mason-context in the project before using the default command. Ignore .mason/reports/ to keep local evidence out of commits. Hooks preserve evidence and suggest scoped repairs; they do not approve edits or decisions.\",\n };\n}\n\nexport async function installedAutomation(dir: string) {\n const ws = await workspace(dir);\n const record = await installationRecord(ws.root);\n const result: Record<string, unknown> = {};\n for (const host of [\"claude\", \"codex\"] as const) {\n const expected = record.hosts[host];\n if (!expected) continue;\n const current = automationConfigSchema.parse(\n (await readStoreJson(ws.root, configPath(host))) ?? {},\n );\n const configuredEvents = hookEvents(host).filter((event) =>\n current.hooks?.[event]?.some((group) =>\n group.hooks.some(\n (handler) => handler.type === \"command\" && handler.command === expected.command,\n ),\n ),\n );\n result[host] = {\n configPath: configPath(host),\n configuredEvents,\n status:\n current.disableAllHooks === true\n ? \"disabled\"\n : HOOK_EVENTS.every((event) => configuredEvents.includes(event))\n ? \"configured\"\n : \"incomplete\",\n runtime:\n \"Host version, trust, policy, and tool coverage still determine execution; inspect observed events.\",\n };\n }\n return result;\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse, stringify } from \"smol-toml\";\nimport fg from \"fast-glob\";\nimport { z } from \"zod\";\nimport { git, hash, workspace } from \"../automation/evidence.js\";\nimport { withLock, type Host } from \"../automation/store.js\";\nimport {\n AUTOMATION_PATH,\n automationConfigSchema,\n configPath,\n recordSchema,\n} from \"../automation/install.js\";\nimport { hookConfig, knownManagedHookCommands } from \"../automation/adapters.js\";\nimport { DOC_CANDIDATES } from \"../audit/docs.js\";\nimport { CLAUDE_MD_SECTION } from \"../mcp/init.js\";\nimport { applyEdit, managedBlock, readText, type FileEdit, type RemovalEdit } from \"./files.js\";\nimport { mcpPath } from \"./config.js\";\nimport { hookCommand, mcpCommand } from \"./launcher.js\";\nimport {\n loadSetupReceipt,\n SETUP_PATH,\n setupSchema,\n INACTIVE_HOSTS_PATH,\n inactiveHostsSchema,\n} from \"./model.js\";\nimport { BLOCKS, blockSpan, OWNERSHIP_PATH, ownershipSchema, type Ownership } from \"./ownership.js\";\n\ntype Edit = FileEdit | RemovalEdit;\nconst hosts = [\"codex\", \"claude\"] as const;\nconst object = z.record(z.unknown());\nconst json = (value: unknown) => JSON.stringify(value, null, 2) + \"\\n\";\n\nasync function planProjectTeardown(root: string, selected: readonly Host[]) {\n const edits: Edit[] = [],\n diagnostics: Array<{ path: string; message: string }> = [];\n const inputs = new Map<string, string | null>();\n const read = async (file: string) => {\n if (!inputs.has(file)) inputs.set(file, await readText(root, file));\n return inputs.get(file)!;\n };\n const attempt = async (file: string, action: () => Promise<void>) => {\n try {\n await action();\n } catch (error) {\n diagnostics.push({\n path: file,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n };\n // Invalid local ownership is not a license to guess. Fail before any edits.\n const ownershipBefore = await read(OWNERSHIP_PATH);\n const ownership: Ownership =\n ownershipBefore === null\n ? { version: 1, files: {} }\n : ownershipSchema.parse(JSON.parse(ownershipBefore));\n const setupBefore = await read(SETUP_PATH);\n const setup = setupBefore === null ? null : setupSchema.parse(JSON.parse(setupBefore));\n const linked =\n (await workspace(root)).gitDir !==\n (await fs.realpath(\n path.resolve(root, (await git(root, \"rev-parse\", \"--git-common-dir\")).trim()),\n ));\n const inactiveBefore = linked && !setup ? await read(INACTIVE_HOSTS_PATH) : null;\n const inactive =\n inactiveBefore === null\n ? { version: 1 as const, hosts: [] as Host[] }\n : inactiveHostsSchema.parse(JSON.parse(inactiveBefore));\n const automationBefore = await read(AUTOMATION_PATH);\n const automation =\n automationBefore === null ? null : recordSchema.parse(JSON.parse(automationBefore));\n const commands = (host: Host) =>\n new Set(\n [\n automation?.hosts[host]?.command,\n ...(ownership.files[configPath(host)]?.hookCommands ?? []),\n ...knownManagedHookCommands(host),\n hookConfig(host, hookCommand(host)).hooks.SessionStart[0].hooks[0].command,\n hookConfig(host).hooks.SessionStart[0].hooks[0].command,\n ].filter((command): command is string => !!command),\n );\n const possibleHook = (command: string, host: Host) =>\n commands(host).has(command) || /\\bmason(?:-auto|-hook)?\\b/.test(command);\n const add = (file: string, before: string, after: string, empty: boolean) => {\n edits.push({\n path: file,\n before,\n after:\n ownership.files[file]?.created &&\n (empty || ownership.files[file].initialHash === hash(before))\n ? null\n : after,\n });\n };\n\n let remainingHost = hosts.some(\n (host) =>\n !selected.includes(host) &&\n (setup?.hosts[host] ||\n automation?.hosts[host] ||\n ownership.files[mcpPath(host)] ||\n ownership.files[configPath(host)]),\n );\n // A clone or manually configured second host can still need the shared guidance.\n for (const host of hosts.filter((host) => !selected.includes(host))) {\n await attempt(mcpPath(host), async () => {\n const text = await read(mcpPath(host));\n const config = host === \"codex\" ? parse(text ?? \"\") : object.parse(JSON.parse(text ?? \"{}\"));\n const servers = object.parse(\n (host === \"codex\" ? config.mcp_servers : config.mcpServers) ?? {},\n );\n remainingHost ||= servers.mason !== undefined;\n });\n await attempt(configPath(host), async () => {\n const config = automationConfigSchema.parse(\n JSON.parse((await read(configPath(host))) ?? \"{}\"),\n );\n remainingHost ||= Object.values(config.hooks ?? {}).some((groups) =>\n groups.some((group) =>\n group.hooks.some((handler) => handler.command && possibleHook(handler.command, host)),\n ),\n );\n });\n }\n\n for (const host of selected) {\n const mcpFile = mcpPath(host);\n await attempt(mcpFile, async () => {\n const before = await read(mcpFile);\n if (before === null) return;\n const config = host === \"codex\" ? parse(before) : object.parse(JSON.parse(before));\n const key = host === \"codex\" ? \"mcp_servers\" : \"mcpServers\";\n const servers = object.parse(config[key] ?? {});\n if (servers.mason === undefined) {\n if (host === \"codex\" && BLOCKS[2].some((marker) => before.includes(marker)))\n throw new Error(\n \"The marked Mason MCP entry was removed or renamed; inspect the retained block manually.\",\n );\n return;\n }\n const ownedHash = ownership.files[mcpFile]?.mcpHash;\n const expected = ownedHash\n ? [ownedHash]\n : [\n hash(mcpCommand(host)),\n ...(host === \"claude\" ? [hash({ type: \"stdio\", ...mcpCommand(host) })] : []),\n ];\n if (!expected.includes(hash(servers.mason)))\n throw new Error(\n \"The Mason MCP entry was edited or its ownership is uncertain; retained for manual cleanup.\",\n );\n delete servers.mason;\n const desired = { ...config, [key]: servers };\n if (!Object.keys(servers).length) delete desired[key];\n if (host === \"claude\") {\n add(mcpFile, before, json(desired), !Object.keys(desired).length);\n return;\n }\n const [start, end] = BLOCKS[2],\n block = blockSpan(before, start, end);\n if (!block) throw new Error(\"Mason MCP markers are missing; retained for manual cleanup.\");\n const expectedBlock = ownership.files[mcpFile]?.blocks[start];\n const canonicalBlock = managedBlock(\n \"\",\n start,\n end,\n stringify({ mcp_servers: { mason: mcpCommand(host) } }).trimEnd(),\n ).trimEnd();\n if (\n expectedBlock\n ? hash(block.text) !== expectedBlock\n : block.text.replace(/\\r\\n/g, \"\\n\") !== canonicalBlock\n ) {\n throw new Error(\"The Mason MCP block was edited; retained for manual cleanup.\");\n }\n const after = before.slice(0, block.from) + before.slice(block.to).replace(/^\\r?\\n/, \"\");\n const parsed = parse(after);\n // An existing empty parent table is meaningful user text; retain it.\n if (!Object.keys(servers).length && parsed[key] !== undefined) desired[key] = {};\n if (!isDeepStrictEqual(parsed, desired))\n throw new Error(\n \"Removing the marked block would change other TOML settings; retained for manual cleanup.\",\n );\n add(mcpFile, before, after, !after.trim());\n });\n const hookFile = configPath(host);\n await attempt(hookFile, async () => {\n const before = await read(hookFile);\n if (before === null) return;\n const config = automationConfigSchema.parse(JSON.parse(before));\n let changed = false;\n for (const [event, groups] of Object.entries(config.hooks ?? {})) {\n const known = ownership.files[hookFile]?.hooks?.[event];\n const handlers = groups.flatMap((group) => group.hooks);\n if (\n known &&\n !handlers.some(\n (handler) =>\n handler.type === \"command\" && handler.command && commands(host).has(handler.command),\n ) &&\n handlers.some((handler) => !known.includes(hash(handler)))\n ) {\n diagnostics.push({\n path: hookFile,\n message:\n \"A recorded Mason hook is missing beside a new or edited handler (\" +\n event +\n \"); inspect ownership manually.\",\n });\n }\n const kept = groups.flatMap((group) => {\n const handlers = group.hooks.filter((handler) => {\n if (\n handler.type === \"command\" &&\n handler.command &&\n commands(host).has(handler.command)\n ) {\n changed = true;\n return false;\n }\n if (handler.command && possibleHook(handler.command, host))\n diagnostics.push({\n path: hookFile,\n message:\n \"An unrecognized Mason hook was retained for manual cleanup (\" + event + \").\",\n });\n return true;\n });\n return handlers.length === group.hooks.length\n ? [group]\n : handlers.length\n ? [{ ...group, hooks: handlers }]\n : [];\n });\n if (kept.length || !groups.length) config.hooks![event] = kept;\n else delete config.hooks![event];\n }\n if (!changed) return;\n if (!Object.keys(config.hooks ?? {}).length) delete config.hooks;\n add(hookFile, before, json(config), !Object.keys(config).length);\n });\n }\n\n // Keep instructions and ownership until all selected integration removals are unambiguous.\n const instructionEditStart = edits.length;\n if (!remainingHost && !diagnostics.length)\n for (const file of DOC_CANDIDATES)\n await attempt(file, async () => {\n const before = await read(file);\n if (before === null) return;\n let after = before;\n for (const [start, end] of BLOCKS.slice(0, 2)) {\n const block = blockSpan(after, start, end);\n if (!block) continue;\n const pointer =\n \"Mason project knowledge and shared project instructions:\\n@\" +\n (file.startsWith(\".claude/\") ? \"../AGENTS.md\" : \"AGENTS.md\");\n const canonical = [CLAUDE_MD_SECTION, managedBlock(\"\", start, end, pointer).trimEnd()];\n const expected = ownership.files[file]?.blocks[start];\n if (\n expected\n ? hash(block.text) !== expected\n : !canonical.includes(block.text.replace(/\\r\\n/g, \"\\n\"))\n ) {\n throw new Error(\n \"The Mason instruction block was edited or is unrecognized; retained for manual cleanup.\",\n );\n }\n after = after.slice(0, block.from) + after.slice(block.to).replace(/^\\r?\\n/, \"\");\n }\n if (after !== before) add(file, before, after, !after.trim());\n });\n // Do not leave a retained native import pointing at a document we just removed.\n if (diagnostics.length) edits.splice(instructionEditStart);\n\n if (!diagnostics.length) {\n const cleanup: Edit[] = [];\n const receiptFiles = await fg(\n selected.map((host) => \".mason/reports/automation/*/setup-\" + host + \".json\"),\n { cwd: root, dot: true, onlyFiles: false, followSymbolicLinks: false },\n );\n if (receiptFiles.length > 1000)\n throw new Error(\"Too many setup receipts; inspect local setup history before teardown.\");\n for (const file of receiptFiles.sort())\n await attempt(file, async () => {\n const host = file.endsWith(\"setup-codex.json\") ? \"codex\" : \"claude\";\n await loadSetupReceipt(root, file.slice(0, file.lastIndexOf(\"/\")), host);\n cleanup.push({ path: file, before: await read(file), after: null });\n });\n if (!remainingHost)\n await attempt(\".mason/local/project.json\", async () => {\n const before = await read(\".mason/local/project.json\");\n if (before === null) return;\n z.object({ version: z.literal(1), initializedAt: z.string() })\n .strict()\n .parse(JSON.parse(before));\n cleanup.push({ path: \".mason/local/project.json\", before, after: null });\n });\n // Final bookkeeping is last. On interruption, original ownership can safely resume removals.\n if (!diagnostics.length) {\n for (const host of selected) {\n if (setup) delete setup.hosts[host];\n if (automation) delete automation.hosts[host];\n delete ownership.files[mcpPath(host)];\n delete ownership.files[configPath(host)];\n }\n if (!remainingHost) for (const file of DOC_CANDIDATES) delete ownership.files[file];\n if (setupBefore !== null)\n cleanup.push({\n path: SETUP_PATH,\n before: setupBefore,\n after: linked || Object.keys(setup!.hosts).length ? json(setup) : null,\n });\n else if (linked)\n cleanup.push({\n path: INACTIVE_HOSTS_PATH,\n before: inactiveBefore,\n after: json({ version: 1, hosts: [...new Set([...inactive.hosts, ...selected])].sort() }),\n });\n if (automationBefore !== null)\n cleanup.push({\n path: AUTOMATION_PATH,\n before: automationBefore,\n after: Object.keys(automation!.hosts).length ? json(automation) : null,\n });\n if (ownershipBefore !== null)\n cleanup.push({\n path: OWNERSHIP_PATH,\n before: ownershipBefore,\n after: Object.keys(ownership.files).length ? json(ownership) : null,\n });\n edits.push(...cleanup);\n }\n }\n return {\n edits: edits.filter((edit) => edit.before !== edit.after),\n diagnostics,\n remainingHost,\n inputs,\n };\n}\n\nasync function planLocalTeardown(root: string, selected: readonly Host[]) {\n const inputs = new Map<string, string | null>();\n const read = async (file: string) => {\n const value = await readText(root, file);\n inputs.set(file, value);\n return value;\n };\n const edits: Edit[] = [];\n const setupBefore = await read(SETUP_PATH);\n const setup = setupBefore === null ? null : setupSchema.parse(JSON.parse(setupBefore));\n const automationBefore = await read(AUTOMATION_PATH);\n const automation =\n automationBefore === null ? null : recordSchema.parse(JSON.parse(automationBefore));\n for (const host of selected) {\n if (setup) delete setup.hosts[host];\n if (automation) delete automation.hosts[host];\n }\n if (setup) edits.push({ path: SETUP_PATH, before: setupBefore, after: json(setup) });\n if (automation)\n edits.push({ path: AUTOMATION_PATH, before: automationBefore, after: json(automation) });\n // A local opt-out must also suppress activation inherited from the primary checkout.\n const linked =\n (await workspace(root)).gitDir !==\n (await fs.realpath(\n path.resolve(root, (await git(root, \"rev-parse\", \"--git-common-dir\")).trim()),\n ));\n if (linked && !setup) {\n const before = await read(INACTIVE_HOSTS_PATH);\n const inactive =\n before === null\n ? { version: 1, hosts: [] as Host[] }\n : inactiveHostsSchema.parse(JSON.parse(before));\n edits.push({\n path: INACTIVE_HOSTS_PATH,\n before,\n after: json({ version: 1, hosts: [...new Set([...inactive.hosts, ...selected])].sort() }),\n });\n }\n const receipts = await fg(\n selected.map((host) => \".mason/reports/automation/*/setup-\" + host + \".json\"),\n { cwd: root, dot: true, onlyFiles: false, followSymbolicLinks: false },\n );\n if (receipts.length > 1000)\n throw new Error(\"Too many setup receipts; inspect local setup history before teardown.\");\n for (const file of receipts) {\n const host = file.endsWith(\"setup-codex.json\") ? \"codex\" : \"claude\";\n await loadSetupReceipt(root, file.slice(0, file.lastIndexOf(\"/\")), host);\n edits.push({ path: file, before: await read(file), after: null });\n }\n return {\n edits: edits.filter((edit) => edit.before !== edit.after),\n inputs,\n diagnostics: [] as Array<{ path: string; message: string }>,\n remainingHost: true,\n };\n}\n\nexport async function teardownProject(\n dir: string,\n options: { host?: Host; dryRun?: boolean; project?: boolean } = {},\n) {\n const { root } = await workspace(dir);\n const selected = options.host ? [options.host] : [...hosts];\n const run = async (apply: boolean) => {\n const plan = options.project\n ? await planProjectTeardown(root, selected)\n : await planLocalTeardown(root, selected);\n if (apply) {\n // Include the other host and shared instructions in the concurrency check.\n for (const [file, before] of plan.inputs)\n if ((await readText(root, file)) !== before)\n throw new Error(\"Input changed during teardown: \" + file + \". Rerun teardown.\");\n for (const edit of plan.edits) await applyEdit(root, edit);\n }\n return {\n version: 1,\n action: \"teardown\",\n scope: options.project ? \"project\" : \"local\",\n status: plan.diagnostics.length ? \"incomplete\" : \"complete\",\n root,\n hosts: selected,\n dryRun: !!options.dryRun,\n changes: plan.edits.map((edit) => ({\n path: edit.path,\n action: edit.after === null ? \"delete\" : \"update\",\n })),\n diagnostics: plan.diagnostics,\n sharedInstructionsRetained: plan.remainingHost || !!plan.diagnostics.length,\n next: plan.diagnostics.length\n ? \"Inspect the retained entries, remove or correct them, then rerun teardown.\"\n : options.project\n ? \"Review and commit shared removals. Run mason init to restore shared configuration.\"\n : \"Restart running assistants to unload the local integration. Shared configuration is retained; run mason setup to reconnect.\",\n };\n };\n // A preview (including an untouched project) must not create local state or locks.\n const preview = await run(false);\n if (options.dryRun || !preview.changes.length) return preview;\n if (\n (\n await git(\n root,\n \"ls-files\",\n \"--\",\n \".mason/local\",\n \".mason/reports/setup-lock\",\n ...preview.changes\n .filter((change) => change.path.startsWith(\".mason/reports/\"))\n .map((change) => change.path),\n )\n ).trim()\n )\n throw new Error(\"Mason local state must be untracked before teardown.\");\n return withLock(root, \".mason/reports/setup-lock\", () => run(true));\n}\n\nexport function summarizeTeardown(result: Awaited<ReturnType<typeof teardownProject>>) {\n return [\n `Mason ${result.scope} teardown${result.dryRun ? \" preview\" : \"\"}: ${result.status}.`,\n ...result.changes.map(\n (change) => ` ${result.dryRun ? \"Would \" : \"\"}${change.action}: ${change.path}`,\n ),\n ...result.diagnostics.map((item) => ` Retained ${item.path}: ${item.message}`),\n ...(!result.changes.length ? [\"No changes.\"] : []),\n \"Shared knowledge, repair evidence, ignore rules, the decision merge driver and the installed Mason command are retained.\",\n ...(result.scope === \"project\" && result.sharedInstructionsRetained\n ? [\n \"Shared instruction cleanup is deferred while another host or incomplete removal needs inspection.\",\n ]\n : []),\n ...(result.dryRun ? [\"Preview only; no files were changed.\"] : [result.next]),\n ].join(\"\\n\");\n}\n","import { hash, workspace } from \"../automation/evidence.js\";\nimport { events } from \"../automation/store.js\";\nimport { automationStatus } from \"../automation/runtime.js\";\nimport { loadDecisionStore } from \"../decisions/decisions.js\";\nimport { effectiveSetup, loadSetupReceipt } from \"./model.js\";\nimport { decisionMergeStatus, inspectIntegration, mergeDriverSummary } from \"./config.js\";\nimport { installedCommand } from \"./launcher.js\";\nimport { readObservation } from \"./observations.js\";\n\nexport async function setupStatus(dir: string) {\n const ws = await workspace(dir);\n const activation = await effectiveSetup(ws.root);\n const setup = activation.setup;\n const mergeDriver = await decisionMergeStatus(ws.root);\n if (!setup || !Object.keys(setup.hosts).length) {\n const partial = await Promise.all(\n ([\"codex\", \"claude\"] as const).map(async (host) => ({\n host,\n receipt: await loadSetupReceipt(ws.root, ws.directory, host),\n })),\n );\n const pending = partial.filter((item) => item.receipt !== null).map((item) => item.host);\n const configuration: Record<\n string,\n { compatible: boolean; disabled?: boolean; diagnostic?: string }\n > = {};\n await Promise.all(\n ([\"codex\", \"claude\"] as const).map(async (host) => {\n try {\n const inspected = await inspectIntegration(ws.root, host);\n configuration[host] = {\n compatible: inspected.compatible,\n disabled: inspected.disabled || inspected.mcpDisabled,\n };\n } catch (error) {\n configuration[host] = {\n compatible: false,\n diagnostic: error instanceof Error ? error.message : String(error),\n };\n }\n }),\n );\n return {\n version: 1,\n status: pending.length ? \"incomplete\" : \"not-configured\",\n hosts: {},\n configuration,\n mergeDriver,\n next: pending.length\n ? \"Setup did not finish. Rerun mason setup --host \" +\n pending[0] +\n \" to resume local activation; use mason init if shared configuration needs updating.\"\n : \"Project hooks are inactive. Run mason setup --host codex or --host claude for compatible shared configuration; a maintainer uses mason init to prepare missing or incompatible configuration.\",\n };\n }\n const hosts: Record<\n string,\n {\n status: string;\n runtime: string;\n mcp: string;\n instructions: string;\n hookConfiguration: string;\n observedEvents: string[];\n contextCalls: number;\n verificationStatus: string;\n verificationScope: string;\n pending: string[];\n updates: string[];\n }\n > = {};\n const installed = await installedCommand();\n const automation = await automationStatus(ws.root);\n for (const host of [\"codex\", \"claude\"] as const) {\n const entry = setup.hosts[host];\n if (!entry) continue;\n const config = await inspectIntegration(ws.root, host);\n const instructionsCurrent = config.instructionsCurrent;\n const mcp =\n config.mcpCompatible && !config.mcpDisabled && hash(config.mcp) === entry.mcpFingerprint;\n const currentHooks = config.hooksCurrent;\n const hooks = config.hooksCompatible && !config.disabled;\n const local = await loadSetupReceipt(ws.root, ws.directory, host);\n const configured =\n activation.root !== ws.root ||\n (local?.status === \"configured\" &&\n local.root === ws.root &&\n local.revision === entry.revision);\n const observation = await readObservation(\n ws.root,\n ws.directory,\n host,\n entry.revision,\n installed.version ?? \"unavailable\",\n );\n // Complete lifecycle evidence must come from one session in this worktree/branch.\n const sessions = Object.values(observation?.sessions ?? {}).sort((a, b) =>\n b.at.localeCompare(a.at),\n );\n const complete = sessions.find((session) =>\n events.every((event) => session.events.includes(event)),\n );\n const observedEvents = complete?.events ?? sessions[0]?.events ?? [];\n const pending: string[] = [];\n if (!installed.available) pending.push(installed.message!);\n if (!mcp || !hooks || !config.instructionCompatible || !configured)\n pending.push(\n \"Run mason setup to activate existing configuration; incompatible shared configuration needs mason init and review. Inspect any disabled host settings.\",\n );\n if (!observation?.contextCalls)\n pending.push(\n \"Start a new assistant session and request task context through Mason's get_context tool.\",\n );\n if (!complete)\n pending.push(\n \"Review/trust the host configuration, then complete a normal task to observe the full hook lifecycle.\",\n );\n if (automation.status === \"unavailable\")\n pending.push(\n \"The latest automation attempt did not establish verification. Run mason check and inspect its diagnostics.\",\n );\n const healthy =\n installed.available &&\n mcp &&\n hooks &&\n config.instructionCompatible &&\n configured &&\n automation.status !== \"unavailable\";\n hosts[host] = {\n status: healthy\n ? complete && observation?.contextCalls\n ? \"active\"\n : \"pending\"\n : \"attention\",\n runtime: installed.available ? \"global (\" + installed.version + \")\" : \"unavailable-on-path\",\n mcp: mcp ? \"configured\" : \"changed\",\n instructions: instructionsCurrent\n ? \"current\"\n : config.instructionCompatible\n ? \"compatible\"\n : \"incompatible\",\n hookConfiguration: hooks\n ? currentHooks\n ? \"configured\"\n : \"compatible\"\n : \"disabled-or-changed\",\n observedEvents,\n contextCalls: observation?.contextCalls ?? 0,\n verificationScope: automation.scope,\n verificationStatus:\n automation.status === \"current\"\n ? (automation.verificationStatus ?? \"unavailable\")\n : \"unavailable\",\n pending,\n updates:\n config.compatible && (!currentHooks || !instructionsCurrent)\n ? [\n \"Updated integration templates are available. A maintainer can run mason init --host \" +\n host +\n \" to update it when convenient; review and commit the configuration changes.\",\n ]\n : [],\n };\n }\n const statuses = Object.values(hosts).map((host) => host.status);\n const decisions = await loadDecisionStore(ws.root);\n return {\n version: 1,\n status:\n statuses.length && statuses.every((status) => status === \"active\")\n ? \"active\"\n : statuses.includes(\"attention\")\n ? \"attention\"\n : \"pending\",\n root: ws.root,\n hosts,\n activationRoot: activation.root,\n decisionRecords: decisions.records.length,\n mergeDriver,\n diagnostics: decisions.diagnostics,\n scope:\n \"Activation receipts record observed use after setup, not complete interception, correct repairs, or measured usefulness. Host trust and higher-priority settings may prevent execution. Receipts are local to this worktree and branch.\",\n };\n}\n\nexport function summarizeActivation(status: Awaited<ReturnType<typeof setupStatus>>): string {\n const lines = [\"Mason setup: \" + status.status + \".\"];\n if (status.activationRoot && status.activationRoot !== status.root) {\n lines.push(\n \"Activation inherited from \" + status.activationRoot + \"; evidence belongs to this worktree.\",\n );\n }\n for (const [host, state] of Object.entries(status.hosts)) {\n lines.push(\n `${host}: ${state.status}`,\n ` Runtime: ${state.runtime}; MCP: ${state.mcp}; instructions: ${state.instructions}.`,\n ` Hooks: ${state.hookConfiguration}; observed: ${state.observedEvents.join(\", \") || \"none\"}.`,\n ` Task context requests: ${state.contextCalls}; verification: ${state.verificationStatus} (${state.verificationScope}).`,\n ...state.pending.map((message) => \" Next: \" + message),\n );\n lines.push(...state.updates.map((message) => \" Optional: \" + message));\n }\n if (\"decisionRecords\" in status) lines.push(`Decision records: ${status.decisionRecords}.`);\n if (status.mergeDriver.attribute || status.mergeDriver.driver !== \"missing\")\n lines.push(mergeDriverSummary(status.mergeDriver));\n if (status.next) lines.push(status.next);\n return lines.join(\"\\n\");\n}\n","import { randomUUID } from \"node:crypto\";\nimport { git, hash, workspace } from \"../automation/evidence.js\";\nimport { withLock, type Host } from \"../automation/store.js\";\nimport { writeStoreJson } from \"../utils/storage.js\";\nimport { applyEdit, readText } from \"./files.js\";\nimport {\n ancillaryEdits,\n configureDecisionMerge,\n mergeDriverSummary,\n hookEdits,\n instructionEdits,\n mcpEdit,\n inspectIntegration,\n mcpPath,\n} from \"./config.js\";\nimport { hookConfig } from \"../automation/adapters.js\";\nimport { configPath } from \"../automation/install.js\";\nimport { hookCommand, installedCommand } from \"./launcher.js\";\nimport { loadSetup, loadSetupReceipt, SETUP_PATH, type SetupConfig } from \"./model.js\";\nimport { setupStatus } from \"./status.js\";\nimport { ownershipEdit, completedHookOwnership } from \"./ownership.js\";\nimport type { Progress } from \"../utils/progress.js\";\n\nexport async function selectHost(root: string, explicit?: Host): Promise<Host> {\n if (explicit) return explicit;\n if (process.env.MASON_SETUP_HOST === \"codex\" || process.env.MASON_SETUP_HOST === \"claude\")\n return process.env.MASON_SETUP_HOST;\n const found: Host[] = [];\n if (\n (await readText(root, \".codex/config.toml\")) !== null ||\n (await readText(root, \".codex/hooks.json\")) !== null\n )\n found.push(\"codex\");\n if (\n (await readText(root, \".claude/settings.json\")) !== null ||\n (await readText(root, \".mcp.json\")) !== null\n )\n found.push(\"claude\");\n if (found.length === 1) return found[0];\n throw new Error(\"Choose the assistant for setup with --host codex or --host claude.\");\n}\n\nexport async function setupProject(\n dir: string,\n options: { host?: Host; progress?: Progress } = {},\n) {\n options.progress?.step(\"Checking project configuration\");\n const ws = await workspace(dir);\n const host = await selectHost(ws.root, options.host);\n if (\n (\n await git(\n ws.root,\n \"ls-files\",\n \"--\",\n \".mason/local\",\n ws.directory,\n \".mason/reports/setup-lock\",\n )\n ).trim()\n )\n throw new Error(\"Mason local state must be untracked before setup can activate this checkout.\");\n return withLock(ws.root, \".mason/reports/setup-lock\", async () => {\n const existing = await loadSetup(ws.root);\n const previousReceipt = await loadSetupReceipt(ws.root, ws.directory, host);\n const installed = await installedCommand();\n if (!installed.available) throw new Error(installed.message!);\n const configured = await inspectIntegration(ws.root, host);\n if (!configured.compatible)\n throw new Error(\n \"Shared Mason configuration is missing or incompatible. A maintainer should run mason init --host \" +\n host +\n \" and review/commit the changes. Local setup did not edit shared files.\",\n );\n const privatePaths = [SETUP_PATH, ws.directory + \"/setup-\" + host + \".json\"];\n const ignored = (\n await git(ws.root, \"check-ignore\", \"--no-index\", \"--\", ...privatePaths).catch(() => \"\")\n )\n .trim()\n .split(\"\\n\");\n if (!privatePaths.every((file) => ignored.includes(file)))\n throw new Error(\n \"Mason local state must be ignored. A maintainer should run mason init and commit the ignore rules.\",\n );\n const instructions = configured.instructions;\n const sharedInputs = [\n ...instructions.map((edit) => ({ path: edit.path, before: edit.before })),\n { path: mcpPath(host), before: await readText(ws.root, mcpPath(host)) },\n { path: configPath(host), before: await readText(ws.root, configPath(host)) },\n ];\n const hooks = await hookEdits(ws.root, host);\n const edits = hooks.slice(1);\n const setupBefore = await readText(ws.root, SETUP_PATH);\n const mcpFingerprint = hash(configured.mcp);\n const fingerprint = hash({\n command: \"mason\",\n mcp: mcpFingerprint,\n hooks: configured.hooks,\n instructions: instructions.map((edit) => edit.path),\n });\n const previous = existing?.hosts[host];\n const changed =\n edits.some((edit) => edit.before !== edit.after) || previous?.fingerprint !== fingerprint;\n const revision = !changed && previous ? previous.revision : randomUUID();\n const setup: SetupConfig = existing ?? { version: 2, hosts: {} };\n setup.hosts[host] = {\n configuredVersion: installed.version!,\n revision,\n fingerprint,\n mcpFingerprint,\n instructions: instructions.map((e) => e.path),\n };\n\n const receiptPath = ws.directory + \"/setup-\" + host + \".json\";\n // Preserve legacy audit pointers without reading or verifying their artifacts.\n const legacyEvidence = previousReceipt?.initialReportPath\n ? {\n initialReportPath: previousReceipt.initialReportPath,\n initialBaselinePaths: previousReceipt.initialBaselinePaths ?? [],\n }\n : {};\n options.progress?.step(`Activating ${host === \"codex\" ? \"Codex\" : \"Claude Code\"} integration`);\n await writeStoreJson(ws.root, receiptPath, {\n version: 1,\n host,\n status: \"installing\",\n ...legacyEvidence,\n root: ws.root,\n revision,\n });\n const changedFiles: string[] = [];\n for (const edit of edits) if (await applyEdit(ws.root, edit)) changedFiles.push(edit.path);\n if (\n await applyEdit(ws.root, {\n path: SETUP_PATH,\n before: setupBefore,\n after: JSON.stringify(setup, null, 2) + \"\\n\",\n })\n )\n changedFiles.push(SETUP_PATH);\n const mergeDriver = await configureDecisionMerge(ws.root);\n options.progress?.step(\"Checking agent configuration\");\n for (const input of sharedInputs)\n if ((await readText(ws.root, input.path)) !== input.before)\n throw new Error(input.path + \" changed during setup; inspect it and retry.\");\n await writeStoreJson(ws.root, receiptPath, {\n version: 1,\n host,\n status: \"configured\",\n ...legacyEvidence,\n root: ws.root,\n revision,\n configuredAt: new Date().toISOString(),\n });\n return {\n version: 1,\n action: \"setup\",\n mode: \"activate\",\n status: \"configured\",\n host,\n root: ws.root,\n runtime: { kind: \"global\", command: \"mason\", version: installed.version },\n changedFiles,\n receiptPath,\n mergeDriver,\n activation: await setupStatus(ws.root),\n next:\n configured.disabled || configured.mcpDisabled\n ? \"Mason hooks or MCP are disabled in project configuration. Review that setting before activation.\"\n : host === \"codex\"\n ? \"Review/trust this project's MCP configuration and hooks in Codex (/hooks in the CLI), then start a new session and give it a normal task.\"\n : \"Approve the project MCP server in Claude Code, then start a new session and give it a normal task.\",\n };\n });\n}\n\nexport function summarizeSetup(result: Awaited<ReturnType<typeof setupProject>>): string {\n return [\n `Mason configured for ${result.host}.`,\n \" MCP server and lifecycle hooks use mason from PATH.\",\n \" Existing shared configuration validated; only local activation state was written.\",\n ` ${result.changedFiles.length} files changed.`,\n \" \" + mergeDriverSummary(result.mergeDriver),\n \"Activation: \" + result.activation.status + \".\",\n result.next,\n \"If the assistant cannot find mason, restart the desktop app so it picks up PATH.\",\n \"After the task finishes, run mason status. Configuration alone does not establish activation.\",\n ].join(\"\\n\");\n}\n\nexport async function initializeProject(\n dir: string,\n options: { host?: Host; dryRun?: boolean; progress?: Progress } = {},\n) {\n const ws = await workspace(dir);\n const host = await selectHost(ws.root, options.host);\n const run = async (apply: boolean) => {\n const instructions = await instructionEdits(ws.root, host);\n const mcp = await mcpEdit(ws.root, host);\n const hooks = await hookEdits(ws.root, host);\n const edits = [...(await ancillaryEdits(ws.root)), ...instructions, mcp, hooks[0]];\n // Ownership is local bookkeeping for safe removal, never an activation receipt.\n const configuredHook = hookConfig(host, hookCommand(host)).hooks.SessionStart[0].hooks[0]\n .command;\n const ownership = await ownershipEdit(ws.root, [...instructions, mcp, hooks[0]], {\n [hooks[0].path]: configuredHook,\n });\n if (apply) {\n options.progress?.step(\"Preparing shared agent configuration\");\n await applyEdit(ws.root, ownership);\n for (const edit of edits) await applyEdit(ws.root, edit);\n await applyEdit(\n ws.root,\n await completedHookOwnership(ws.root, hooks[0].path, configuredHook),\n );\n }\n return {\n version: 1,\n action: \"init\",\n status: options.dryRun ? \"preview\" : \"initialized\",\n host,\n root: ws.root,\n dryRun: !!options.dryRun,\n changes: edits\n .filter((edit) => edit.before !== edit.after)\n .map((edit) => ({\n path: edit.path,\n action: edit.before === null ? \"create\" : \"update\",\n })),\n next:\n \"Review and commit shared configuration, then run mason setup --host \" +\n host +\n \" in each developer's checkout.\",\n };\n };\n if (options.dryRun) return run(false);\n if ((await git(ws.root, \"ls-files\", \"--\", \".mason/local\", \".mason/reports/setup-lock\")).trim())\n throw new Error(\"Mason local bookkeeping must be untracked before initialization.\");\n return withLock(ws.root, \".mason/reports/setup-lock\", () => run(true));\n}\n\nexport function summarizeInitialization(result: Awaited<ReturnType<typeof initializeProject>>) {\n return [\n `Mason initialization${result.dryRun ? \" preview\" : \"\"} for ${result.host}.`,\n ...result.changes.map(\n (change) => ` ${result.dryRun ? \"Would \" : \"\"}${change.action}: ${change.path}`,\n ),\n ...(!result.changes.length ? [\"Shared configuration is current; no changes needed.\"] : []),\n result.dryRun ? \"Preview only; no files were changed.\" : result.next,\n ].join(\"\\n\");\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\n\nconst execute = promisify(execFile);\nexport const pathChangeSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"profile\"),\n file: z.string(),\n block: z.string(),\n created: z.boolean(),\n }),\n z.object({ kind: z.literal(\"windows\"), entry: z.string(), created: z.boolean() }),\n]);\nexport type PathChange = z.infer<typeof pathChangeSchema>;\nexport type PathResult = {\n status: \"configured\" | \"manual\";\n message: string;\n changes: PathChange[];\n};\nexport type PathOptions = {\n platform?: NodeJS.Platform;\n userHome?: string;\n env?: NodeJS.ProcessEnv;\n};\nconst quote = (s: string) => \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n\n// Store the ownership intent before changing settings, so interrupted installs\n// can resume and uninstall can distinguish our addition from existing settings.\nexport async function configurePath(\n bin: string,\n previous: PathChange[],\n save: (changes: PathChange[]) => Promise<void>,\n options: PathOptions = {},\n): Promise<PathResult> {\n const env = options.env ?? process.env,\n platform = options.platform ?? process.platform;\n const changes = [...previous];\n // Profile/registry changes affect future shells. The inherited PATH tells us\n // whether this terminal already has the installation directory available.\n const currentPath =\n platform === \"win32\"\n ? Object.entries(env).find(([key]) => key.toLowerCase() === \"path\")?.[1]\n : env.PATH;\n const alreadyOnPath =\n platform === \"win32\"\n ? hasWindowsEntry(currentPath ?? null, bin, env)\n : (currentPath ?? \"\")\n .split(\":\")\n .some(\n (entry) =>\n path.posix.isAbsolute(entry) && path.posix.resolve(entry) === path.posix.resolve(bin),\n );\n const setupHint =\n \"To prepare a new project for review, run one of these inside its directory (use mason setup to activate existing team configuration):\\n Codex: mason init --host codex\\n Claude Code: mason init --host claude\";\n const message = (alreadyOnPath ? \"\" : \"Open a new terminal to use mason.\\n\") + setupHint;\n const manual = (reason: string): PathResult => ({\n status: \"manual\",\n changes,\n message: `${reason}\\n${alreadyOnPath ? \"\" : `Add ${bin} to your PATH.\\n`}${setupHint}`,\n });\n if (env.MASON_NO_MODIFY_PATH === \"1\")\n return manual(\"Automatic PATH setup is disabled (MASON_NO_MODIFY_PATH=1).\");\n if (/[\\r\\n\\0]/.test(bin) || bin.includes(platform === \"win32\" ? \";\" : \":\"))\n return manual(\"This installation path cannot be represented safely in PATH.\");\n try {\n if (platform === \"win32\") {\n const current = await windowsPath(\"read\");\n if (!hasWindowsEntry(current.value, bin)) {\n if (!changes.some((c) => c.kind === \"windows\" && c.entry === bin)) {\n changes.push({ kind: \"windows\", entry: bin, created: current.value === null });\n await save(changes);\n }\n await windowsPath(\"add\", bin, current);\n }\n return { status: \"configured\", changes, message };\n }\n const shell = path.basename(env.SHELL ?? os.userInfo().shell ?? \"\");\n const userHome = options.userHome ?? os.homedir();\n let profiles: string[];\n if (![\"bash\", \"zsh\", \"sh\"].includes(shell))\n return manual(`Automatic PATH setup is unavailable for ${shell || \"an unknown shell\"}.`);\n if (env.MASON_PROFILE) profiles = [path.resolve(env.MASON_PROFILE)];\n else if (shell === \"zsh\") profiles = [path.join(env.ZDOTDIR || userHome, \".zshrc\")];\n else if (shell === \"sh\") profiles = [path.join(userHome, \".profile\")];\n else {\n const candidates = [\".bash_profile\", \".bash_login\", \".profile\"].map((name) =>\n path.join(userHome, name),\n );\n let login = candidates[2];\n for (const file of candidates)\n if (\n await fs.lstat(file).then(\n () => true,\n (error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return false;\n throw error;\n },\n )\n ) {\n login = file;\n break;\n }\n profiles = [path.join(userHome, \".bashrc\"), login];\n }\n const marker = `# >>> mason PATH ${createHash(\"sha256\").update(bin).digest(\"hex\").slice(0, 12)} >>>`;\n for (const profile of profiles) {\n // Preserve symlinked dotfiles by updating their target. A dangling link is\n // an error, not permission to replace the link with an unrelated file.\n const stat = await fs.lstat(profile).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n const file = stat?.isSymbolicLink() ? await fs.realpath(profile) : path.resolve(profile);\n const original = await fs.readFile(file).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\") && !stat) return null;\n throw error;\n });\n if (original && !Buffer.from(original.toString(\"utf8\")).equals(original))\n return manual(`Shell profile is not UTF-8: ${profile}.`);\n const text = original?.toString(\"utf8\") ?? \"\";\n const owned = changes.find(\n (c): c is Extract<PathChange, { kind: \"profile\" }> =>\n c.kind === \"profile\" && c.file === file,\n );\n if (owned && text.includes(owned.block)) continue;\n if (text.includes(marker) || (owned && text.includes(\"# <<< mason PATH\")))\n return manual(`Mason's PATH block was edited; retained ${profile}.`);\n const newline = text.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const block =\n owned?.block ??\n (\n \"\\n\" +\n marker +\n '\\ncase \":${PATH-}:\" in\\n *:' +\n quote(bin) +\n \":*) ;;\\n *) export PATH=\" +\n quote(bin) +\n ':\"${PATH-}\" ;;\\nesac\\n# <<< mason PATH <<<\\n'\n ).replaceAll(\"\\n\", newline);\n if (!owned) {\n changes.push({ kind: \"profile\", file, block, created: original === null });\n await save(changes);\n }\n await fs.mkdir(path.dirname(file), { recursive: true });\n // Append without rewriting existing bytes, modes or symlinks. Recheck the\n // bytes on the opened file to detect edits since the preflight read.\n const handle = await fs.open(file, original === null ? \"ax+\" : \"a+\", 0o600);\n try {\n if (!(await handle.readFile()).equals(original ?? Buffer.alloc(0)))\n throw new Error(`Shell profile changed during installation: ${profile}`);\n await handle.writeFile(block);\n await handle.sync();\n } finally {\n await handle.close();\n }\n }\n return { status: \"configured\", changes, message };\n } catch (error) {\n return manual(\n `Could not configure PATH: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport async function removePath(changes: PathChange[]): Promise<string[]> {\n const warnings: string[] = [];\n for (const change of changes) {\n try {\n if (change.kind === \"windows\") {\n const current = await windowsPath(\"read\");\n if (\n !(current.value ?? \"\").split(\";\").includes(change.entry) &&\n hasWindowsEntry(current.value, change.entry)\n )\n throw new Error(\"PATH entry was edited\");\n await windowsPath(\"remove\", change.entry, current, change.created);\n continue;\n }\n const stat = await fs.lstat(change.file).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n if (!stat) continue;\n if (!stat.isFile()) throw new Error(\"profile type changed\");\n const bytes = await fs.readFile(change.file),\n text = bytes.toString(\"utf8\");\n if (!Buffer.from(text).equals(bytes)) throw new Error(\"profile encoding changed\");\n const index = text.indexOf(change.block);\n if (index < 0 || text.indexOf(change.block, index + change.block.length) >= 0)\n throw new Error(\"PATH block was edited or removed\");\n const prefix = text.slice(0, index),\n suffix = text.slice(index + change.block.length);\n const separator =\n prefix && suffix && !prefix.endsWith(\"\\n\")\n ? change.block.startsWith(\"\\r\\n\")\n ? \"\\r\\n\"\n : \"\\n\"\n : \"\";\n const next = Buffer.from(prefix + separator + suffix);\n const temporary = change.file + \".mason-\" + randomUUID();\n try {\n if (stat.nlink > 1) throw new Error(\"profile has multiple hard links\");\n const handle = await fs.open(temporary, \"wx\", stat.mode & 0o777);\n try {\n await handle.writeFile(next);\n await handle.chmod(stat.mode & 0o777);\n if (process.platform !== \"win32\") await handle.chown(stat.uid, stat.gid);\n await handle.sync();\n } finally {\n await handle.close();\n }\n const current = await fs.lstat(change.file);\n if (\n !current.isFile() ||\n current.ino !== stat.ino ||\n !(await fs.readFile(change.file)).equals(bytes)\n )\n throw new Error(\"profile changed during uninstall\");\n await fs.rename(temporary, change.file);\n } finally {\n await fs.rm(temporary, { force: true });\n }\n // Empty created profiles are harmless; retain them to avoid masking any\n // dotfile another process created or linked since installation.\n } catch (error) {\n warnings.push(\n `Retained PATH setting ${change.kind === \"profile\" ? change.file : change.entry}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return warnings;\n}\n\nexport type WindowsPath = { value: string | null; kind: string | null };\nconst normalizeWindowsEntry = (value: string) =>\n path.win32\n .normalize(value.trim().replace(/^\"(.*)\"$/, \"$1\"))\n .replace(/[\\\\/]+$/, \"\")\n .toLowerCase();\nexport const hasWindowsEntry = (\n value: string | null,\n entry: string,\n env: NodeJS.ProcessEnv = process.env,\n) => {\n const variables = new Map(Object.entries(env).map(([key, value]) => [key.toLowerCase(), value]));\n const expand = (part: string) =>\n part.replace(/%([^%]+)%/g, (match, key: string) => variables.get(key.toLowerCase()) ?? match);\n return (value ?? \"\")\n .split(\";\")\n .some((part) => normalizeWindowsEntry(expand(part)) === normalizeWindowsEntry(entry));\n};\n\n// Read unexpanded registry text and preserve its value kind. No machine PATH,\n// setx truncation, or expanded copy of the process environment is written.\nexport async function windowsPath(\n action: \"read\" | \"add\" | \"remove\",\n entry = \"\",\n expected?: WindowsPath,\n removeEmpty = false,\n): Promise<WindowsPath> {\n const payload = Buffer.from(JSON.stringify({ action, entry, expected, removeEmpty })).toString(\n \"base64\",\n );\n const script = `$ErrorActionPreference = 'Stop'\n[Console]::OutputEncoding = New-Object Text.UTF8Encoding($false)\n$p = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${payload}')) | ConvertFrom-Json\n$key = [Microsoft.Win32.Registry]::CurrentUser.CreateSubKey('Environment')\ntry {\n $value = $key.GetValue('Path', $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)\n $kind = if ($null -eq $value) { $null } else { $key.GetValueKind('Path').ToString() }\n if ($null -ne $kind -and $kind -notin @('String','ExpandString')) { throw 'User PATH is not a string.' }\n if ($p.action -eq 'read') { @{ value = $value; kind = $kind } | ConvertTo-Json -Compress; exit 0 }\n if ($p.expected -and ($value -cne $p.expected.value -or $kind -cne $p.expected.kind)) { throw 'User PATH changed concurrently; retry the operation.' }\n $parts = if ($null -eq $value -or $value -eq '') { @() } else { @($value.Split(';')) }\n if ($p.action -eq 'add') { $next = (@($p.entry) + $parts) -join ';' }\n else { $next = (@($parts | Where-Object { $_ -cne $p.entry })) -join ';' }\n if ($next -cne $value) {\n $writeKind = if ($kind) { [Microsoft.Win32.RegistryValueKind]$kind } else { [Microsoft.Win32.RegistryValueKind]::ExpandString }\n if ($p.action -eq 'remove' -and $p.removeEmpty -and $next -eq '') { $key.DeleteValue('Path', $false) }\n else { $key.SetValue('Path', $next, $writeKind) }\n Add-Type -TypeDefinition 'using System; using System.Runtime.InteropServices; public class MasonEnvironment { [DllImport(\"user32.dll\", CharSet=CharSet.Unicode, SetLastError=true)] public static extern IntPtr SendMessageTimeout(IntPtr h, uint m, UIntPtr w, string l, uint f, uint t, out UIntPtr r); }'\n $result = [UIntPtr]::Zero\n [void][MasonEnvironment]::SendMessageTimeout([IntPtr]0xffff, 0x1a, [UIntPtr]::Zero, 'Environment', 2, 1000, [ref]$result)\n }\n @{ value = $next; kind = $kind } | ConvertTo-Json -Compress\n} finally { $key.Dispose() }\n`;\n const { stdout } = await execute(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-EncodedCommand\",\n Buffer.from(script, \"utf16le\").toString(\"base64\"),\n ],\n { windowsHide: true, timeout: 15000, maxBuffer: 1024 * 1024 },\n );\n return z\n .object({ value: z.string().nullable(), kind: z.string().nullable() })\n .parse(JSON.parse(stdout.replace(/^\\uFEFF/, \"\").trim()));\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport fs from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport { readStoreJson } from \"../utils/storage.js\";\nimport { pathChangeSchema } from \"./path.js\";\n\nexport const releaseVersion = z.string().regex(/^\\d+\\.\\d+\\.\\d+(?:-[A-Za-z0-9.-]+)?$/);\nconst bundleId = z.string().regex(/^[a-f0-9]{24}$/);\nexport const updatePolicySchema = z.object({\n enabled: z.boolean(),\n revision: z.string(),\n pinnedVersion: releaseVersion.optional(),\n mirror: z.string().optional(),\n});\nexport const recordSchema = z.object({\n format: z.literal(1),\n home: z.string(),\n bin: z.string(),\n current: bundleId,\n version: releaseVersion,\n launchers: z.record(z.string()),\n previousLaunchers: z.record(z.string()).optional(),\n pathChanges: z.array(pathChangeSchema).optional(),\n updates: updatePolicySchema.optional(),\n previous: z.object({ id: bundleId, version: releaseVersion }).optional(),\n pending: z\n .object({ id: bundleId, version: releaseVersion, policyRevision: z.string() })\n .optional(),\n});\nexport type InstallRecord = z.infer<typeof recordSchema>;\nexport const defaultHome = () =>\n process.env.MASON_HOME ??\n (process.platform === \"win32\"\n ? path.join(process.env.LOCALAPPDATA ?? os.homedir(), \"Mason\")\n : path.join(os.homedir(), \".local/share/mason\"));\n\nexport async function readInstallation(home: string): Promise<InstallRecord> {\n const raw = await readStoreJson(home, \"install.json\");\n if (!raw)\n throw new Error(\n \"Run this command from a standalone installation. npm users can upgrade with npm.\",\n );\n const record = recordSchema.parse(raw);\n if (record.home !== (await fs.realpath(home)))\n throw new Error(\"Invalid standalone installation receipt.\");\n return record;\n}\n\nexport function standaloneLocation() {\n // Distribution modules are bundled into app/dist/mason.js (or mason-mcp.js).\n const bundle = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../..\");\n const home = path.dirname(path.dirname(bundle));\n if (\n path.dirname(bundle) !== path.join(home, \"versions\") ||\n !/^[a-f0-9]{24}$/.test(path.basename(bundle))\n ) {\n return null;\n }\n return { home, bundle };\n}\n\nexport async function currentInstallation() {\n const location = standaloneLocation();\n if (!location)\n throw new Error(\n \"Run this command from a standalone installation. npm users can upgrade with npm.\",\n );\n const { home, bundle } = location;\n const record = await readInstallation(home);\n return { home, bundle, record };\n}\n\nexport function automaticUpdatesAllowed(\n record: InstallRecord,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n return (\n record.updates?.enabled === true &&\n !record.updates.pinnedVersion &&\n !record.updates.mirror &&\n !env.CI &&\n env.MASON_NO_AUTO_UPDATE !== \"1\" &&\n !env.MASON_RELEASE_BASE &&\n !env.MASON_VERSION\n );\n}\n\n/** Automatic updates accept stable releases only and never downgrade. */\nexport function newerStableVersion(candidate: string, installed: string): boolean {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(candidate)) return false;\n const a = candidate.split(\".\").map(BigInt),\n b = installed.split(\"-\")[0].split(\".\").map(BigInt);\n for (let i = 0; i < 3; i++) {\n if (a[i] !== b[i]) return a[i] > b[i];\n }\n return installed.includes(\"-\");\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { storePath } from \"../utils/storage.js\";\n\nexport const targets = [\n \"darwin-arm64\",\n \"darwin-x64\",\n \"linux-arm64\",\n \"linux-x64\",\n \"win32-arm64\",\n \"win32-x64\",\n] as const;\nconst digest = z.string().regex(/^[a-f0-9]{64}$/);\nexport const bundleSchema = z\n .object({\n format: z.literal(1),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+(?:-[A-Za-z0-9.-]+)?$/),\n target: z.enum(targets),\n nodeVersion: z.string(),\n files: z.record(digest),\n })\n .strict();\nexport const sha256 = (bytes: Buffer | string) => createHash(\"sha256\").update(bytes).digest(\"hex\");\n\nexport async function readBundle(root: string) {\n const bytes = await fs.readFile(await storePath(root, \"bundle.json\"));\n const manifest = bundleSchema.parse(JSON.parse(bytes.toString(\"utf8\")));\n const windows = manifest.target.startsWith(\"win32-\");\n for (const file of Object.keys(manifest.files)) {\n if (\n file.includes(\"\\\\\") ||\n file.split(\"/\").some((p) => !p || p === \".\" || p === \"..\") ||\n path.isAbsolute(file)\n ) {\n throw new Error(\"Unsafe path in Mason bundle: \" + file);\n }\n }\n for (const required of [\n windows ? \"node.exe\" : \"node\",\n \"app/package.json\",\n \"app/dist/mason.js\",\n \"app/dist/mason-mcp.js\",\n ]) {\n if (!manifest.files[required]) throw new Error(\"Incomplete Mason bundle: \" + required);\n }\n return { manifest, manifestHash: sha256(bytes) };\n}\n\n/** Verify every shipped file before copying or selecting a standalone distribution. */\nexport async function verifyBundle(root: string, expectedHash?: string) {\n const bundle = await readBundle(root);\n if (expectedHash && bundle.manifestHash !== expectedHash)\n throw new Error(\"Mason bundle manifest changed.\");\n if (bundle.manifest.target !== `${process.platform}-${process.arch}`)\n throw new Error(\n \"Mason bundle is for another platform. Install this platform's bundle and rerun setup.\",\n );\n const files = Object.keys(bundle.manifest.files);\n // Bound concurrent reads; Node itself is a large file.\n for (let i = 0; i < files.length; i += 8)\n await Promise.all(\n files.slice(i, i + 8).map(async (file) => {\n if (sha256(await fs.readFile(await storePath(root, file))) !== bundle.manifest.files[file])\n throw new Error(\"Mason bundle checksum mismatch: \" + file);\n }),\n );\n return bundle;\n}\n","import tls from \"node:tls\";\n\n/** Called by standalone startup before any application network requests. */\nexport function configureSystemTrust() {\n if (process.env.NODE_USE_SYSTEM_CA === \"0\") return;\n // Older runtimes may lack these APIs; the bundled Node supports both.\n if (\n typeof tls.getCACertificates !== \"function\" ||\n typeof tls.setDefaultCACertificates !== \"function\"\n )\n return;\n tls.setDefaultCACertificates([\n ...tls.getCACertificates(\"default\"),\n ...tls.getCACertificates(\"system\"),\n ]);\n}\n\nexport function releaseRequestError(error: unknown): Error {\n const cause = error instanceof Error ? error.cause : undefined;\n const code =\n cause && typeof cause === \"object\" && \"code\" in cause ? String(cause.code) : undefined;\n const detail = code ?? (error instanceof Error ? error.message : String(error));\n const certificateError = code && /CERT|SELF_SIGNED|UNABLE_TO_VERIFY_LEAF_SIGNATURE/.test(code);\n const hint = certificateError\n ? \" Check that your company's CA certificate is trusted by your operating system, or provide its PEM file with NODE_EXTRA_CA_CERTS.\"\n : \" Check network and proxy access to GitHub.\";\n return new Error(`Could not check the latest Mason release on GitHub (${detail}).${hint}`, {\n cause: error,\n });\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport { unlinkSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { withLock } from \"../automation/store.js\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\nimport { readInstallation, standaloneLocation } from \"./state.js\";\nimport { verifyBundle } from \"./bundle.js\";\nimport { configureSystemTrust } from \"./trust.js\";\n\nconst leaseSchema = z.object({\n pid: z.number().int().positive(),\n host: z.string(),\n bundle: z.string().regex(/^[a-f0-9]{24}$/),\n});\n\n/** Every standalone entry point registers before executing application code. */\nexport async function registerRuntime() {\n const location = standaloneLocation();\n if (!location) return;\n configureSystemTrust();\n const { home, bundle } = location;\n const name = `runtimes/${randomUUID()}.json`;\n await withLock(home, \".install-lock\", async () => {\n await readInstallation(home);\n await fs.access(bundle);\n await writeStoreJson(home, name, {\n pid: process.pid,\n host: os.hostname(),\n bundle: path.basename(bundle),\n });\n });\n const file = await storePath(home, name);\n process.once(\"exit\", () => {\n try {\n unlinkSync(file);\n } catch {\n /* Stale leases are recovered by the next worker. */\n }\n });\n}\n\n/** Caller holds the update lock, before staging starts; startup shares the install lock. */\nexport async function pruneUnusedVersions(home: string) {\n // Full bundle verification and recursive deletion can be slow. Keep them\n // outside the lock needed by commands and new MCP sessions.\n const versions = await storePath(home, \"versions\");\n const candidates: { id: string; directory: string; retired: boolean }[] = [];\n const initial = await readInstallation(home);\n const initialKeep = new Set([initial.current, initial.previous?.id, initial.pending?.id]);\n for (const name of await fs.readdir(versions)) {\n const retired = /^\\.retired-([a-f0-9]{24})-[a-f0-9-]+$/.exec(name);\n const id = retired?.[1] ?? name;\n if (!/^[a-f0-9]{24}$/.test(id) || initialKeep.has(id)) continue;\n try {\n const directory = await storePath(home, `versions/${name}`);\n await fs.access(await storePath(directory, \"app/dist/mason-runtime.js\"));\n const bundle = await verifyBundle(directory);\n if (\n bundle.manifestHash.slice(0, 24) === id &&\n bundle.manifest.files[\"app/dist/mason-runtime.js\"]\n )\n candidates.push({ id, directory, retired: !!retired });\n } catch {\n /* Legacy, edited, or unknown bundles remain untouched. */\n }\n }\n if (!candidates.length) return;\n const garbage: string[] = [];\n await withLock(home, \".install-lock\", async () => {\n const record = await readInstallation(home);\n const keep = new Set([record.current, record.previous?.id, record.pending?.id]);\n const directory = await storePath(home, \"runtimes\");\n const leases = await fs.readdir(directory).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return [];\n throw error;\n });\n for (const name of leases) {\n if (!/^[a-f0-9-]+\\.json$/.test(name)) return;\n try {\n const raw = await readStoreJson(home, `runtimes/${name}`);\n if (raw === null) continue;\n const lease = leaseSchema.parse(raw);\n if (lease.host !== os.hostname()) return;\n try {\n process.kill(lease.pid, 0);\n keep.add(lease.bundle);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ESRCH\") return;\n await fs.rm(await storePath(home, `runtimes/${name}`), { force: true });\n }\n } catch {\n return;\n } // Uncertain process ownership means no deletion.\n }\n for (const candidate of candidates) {\n if (keep.has(candidate.id)) continue;\n try {\n const retired = candidate.retired\n ? candidate.directory\n : await storePath(home, `versions/.retired-${candidate.id}-${randomUUID()}`);\n if (!candidate.retired) await fs.rename(candidate.directory, retired);\n garbage.push(retired);\n } catch {\n /* Busy files remain available for the next check. */\n }\n }\n });\n for (const directory of garbage) await fs.rm(directory, { recursive: true }).catch(() => {});\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\n\nconst leaseSchema = z.object({ pid: z.number().int().positive(), host: z.string() });\n\n/** Called under the installation lock; uncertain ownership defers activation. */\nexport async function hasRunningMcp(home: string): Promise<boolean> {\n const directory = await storePath(home, \"sessions\");\n const files = await fs.readdir(directory).catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return [];\n throw error;\n });\n for (const name of files) {\n if (!/^[a-f0-9-]+\\.json$/.test(name)) return true;\n const relative = \"sessions/\" + name;\n try {\n const raw = await readStoreJson(home, relative);\n if (raw === null) continue;\n const lease = leaseSchema.parse(raw);\n if (lease.host !== os.hostname()) return true;\n try {\n process.kill(lease.pid, 0);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ESRCH\") return true;\n }\n await fs.rm(await storePath(home, relative), { force: true });\n } catch {\n return true;\n }\n }\n return false;\n}\n\nexport async function registerMcp(home: string): Promise<() => Promise<void>> {\n const name = `sessions/${randomUUID()}.json`;\n await writeStoreJson(home, name, { pid: process.pid, host: os.hostname() });\n return async () => {\n await fs.rm(await storePath(home, name), { force: true }).catch(() => {});\n };\n}\n","import { hasErrorCode } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { execFile, spawn } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { randomUUID } from \"node:crypto\";\nimport { verifyBundle } from \"./bundle.js\";\nimport { storePath, readStoreJson, writeStoreJson } from \"../utils/storage.js\";\nimport { withLock } from \"../automation/store.js\";\nimport { configurePath, removePath } from \"./path.js\";\nimport type { Progress } from \"../utils/progress.js\";\nimport {\n automaticUpdatesAllowed,\n currentInstallation,\n defaultHome,\n newerStableVersion,\n readInstallation,\n recordSchema,\n type InstallRecord,\n} from \"./state.js\";\nimport { hasRunningMcp, registerMcp } from \"./sessions.js\";\nimport { releaseRequestError } from \"./trust.js\";\n\nexport { defaultHome } from \"./state.js\";\nconst shQuote = (s: string) => \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\nconst psQuote = (s: string) => \"'\" + s.replace(/'/g, \"''\") + \"'\";\n// Leave batch context before invoking PowerShell, as npm's cmd-shim does. A\n// continuing batch can lose the child exit code or reopen its deleted launcher.\n// https://github.com/npm/cmd-shim/blob/main/lib/index.js\nexport const WINDOWS_BATCH_LAUNCHER =\n '@echo off\\r\\ngoto #_mason_handoff_# 2>NUL || title %COMSPEC% & powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File \"%~dp0mason-launcher.ps1\" %*\\r\\n';\nconst launcherNames = [\"mason\", \"mason.cmd\", \"mason.ps1\", \"mason-launcher.ps1\"];\n\nasync function replace(file: string, content: string, mode = 0o600) {\n const temp = file + \".tmp-\" + randomUUID();\n try {\n await fs.writeFile(temp, content, { mode, flag: \"wx\" });\n await fs.rename(temp, file);\n } finally {\n await fs.rm(temp, { force: true });\n }\n}\n\n/** User installation only. Project runtimes and host trust remain independent. */\nexport interface InstallOptions {\n stageOnly?: boolean;\n policyRevision?: string;\n preservePolicy?: boolean;\n rollback?: boolean;\n}\n\nexport async function installStandalone(\n source: string,\n progress?: Progress,\n options: InstallOptions = {},\n) {\n progress?.step(\"Checking installation files and location\");\n const bundle = await verifyBundle(source);\n const selectedHome = path.resolve(defaultHome());\n if (!options.stageOnly) await fs.mkdir(selectedHome, { recursive: true });\n const home = await fs.realpath(selectedHome);\n if (options.stageOnly) {\n assertUpdatePolicy(\n await readInstallation(home),\n bundle.manifest.version,\n options.policyRevision,\n );\n const destination = await storePath(home, \"versions/\" + bundle.manifestHash.slice(0, 24));\n // Copying and starting the candidate must not hold the lock MCP startup needs.\n // The worker's update lock serializes downloads; recheck policy at publication.\n await copyBundle(home, source, destination, bundle);\n const { stdout } = await promisify(execFile)(\n path.join(destination, process.platform === \"win32\" ? \"node.exe\" : \"node\"),\n [path.join(destination, \"app/dist/mason.js\"), \"--version\"],\n { timeout: 30000, windowsHide: true, env: { ...process.env, MASON_NO_AUTO_UPDATE: \"1\" } },\n );\n if (stdout.trim() !== bundle.manifest.version)\n throw new Error(\"Downloaded Mason failed its version health check.\");\n }\n return withLock(home, \".install-lock\", () =>\n installLocked(home, source, bundle, progress, options),\n );\n}\n\nfunction assertUpdatePolicy(record: InstallRecord | null, version: string, revision?: string) {\n if (\n !record ||\n !automaticUpdatesAllowed(record, { ...process.env, MASON_VERSION: \"\" }) ||\n record.updates?.revision !== revision ||\n !newerStableVersion(version, record.version)\n ) {\n throw new Error(\"Update policy or installed version changed; download was not activated.\");\n }\n}\n\nasync function installLocked(\n home: string,\n source: string,\n bundle: Awaited<ReturnType<typeof verifyBundle>>,\n progress: Progress | undefined,\n options: InstallOptions,\n alreadyStaged = false,\n) {\n const raw = await readStoreJson(home, \"install.json\");\n const previous = raw === null ? null : recordSchema.parse(raw);\n if (options.stageOnly)\n assertUpdatePolicy(previous, bundle.manifest.version, options.policyRevision);\n if (!previous)\n for (const file of await fs.readdir(home)) {\n if (file === \".install-lock\") continue;\n // An interrupted preflight may leave an empty scaffold, never unowned content.\n const directory = path.join(home, file);\n const stat = await fs.lstat(directory);\n if (\n ![\"versions\", \"bin\"].includes(file) ||\n !stat.isDirectory() ||\n (await fs.readdir(directory)).length\n ) {\n throw new Error(\"Mason installation directory is not empty and has no ownership receipt.\");\n }\n }\n const selectedBin = path.resolve(\n process.env.MASON_BIN_DIR ??\n previous?.bin ??\n (process.platform === \"win32\"\n ? path.join(home, \"bin\")\n : path.join(os.homedir(), \".local/bin\")),\n );\n await fs.mkdir(selectedBin, { recursive: true });\n const bin = await fs.realpath(selectedBin);\n if (previous && (previous.home !== home || previous.bin !== bin))\n throw new Error(\"Installation paths differ from the existing Mason receipt.\");\n const id = bundle.manifestHash.slice(0, 24);\n const destination = await storePath(home, \"versions/\" + id);\n if (options.stageOnly) {\n const receipt: InstallRecord = {\n ...previous!,\n pending: { id, version: bundle.manifest.version, policyRevision: options.policyRevision! },\n };\n await writeStoreJson(home, \"install.json\", receipt);\n return {\n home,\n bin,\n version: bundle.manifest.version,\n previousVersion: previous!.version,\n path: { message: \"Update staged for a future MCP launch.\" },\n };\n }\n const launchers: Record<string, string> =\n process.platform === \"win32\"\n ? {\n \"mason.cmd\": WINDOWS_BATCH_LAUNCHER,\n \"mason-launcher.ps1\": `$ErrorActionPreference = 'Stop'\n$previousToken = $env:MASON_UNINSTALL_TOKEN\n$token = [Guid]::NewGuid().ToString()\n$env:MASON_UNINSTALL_TOKEN = $token\ntry {\n & ${psQuote(path.join(destination, \"node.exe\"))} ${psQuote(path.join(destination, \"app/dist/mason.js\"))} @args\n $code = $LASTEXITCODE\n if ($code -eq 0 -and $args.Count -eq 1 -and $args[0] -eq 'uninstall') {\n if ([IO.File]::ReadAllText(${psQuote(path.join(home, \".uninstall-request.txt\"))}) -cne $token) { throw 'Mason did not authorize installation cleanup.' }\n Remove-Item -LiteralPath ${psQuote(home)} -Recurse -Force\n Write-Output ${psQuote(\"Removed standalone installation: \" + home)}\n }\n exit $code\n} catch { [Console]::Error.WriteLine($_.Exception.Message); exit 2 }\nfinally { $env:MASON_UNINSTALL_TOKEN = $previousToken }\n`,\n }\n : {\n mason: `#!/bin/sh\\nexec ${shQuote(path.join(destination, \"node\"))} ${shQuote(path.join(destination, \"app/dist/mason.js\"))} \"$@\"\\n`,\n };\n for (const [name, content] of Object.entries(launchers)) {\n const file = await storePath(bin, name);\n const old = await fs.readFile(file, \"utf8\").catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n if (\n old !== null &&\n old !== previous?.launchers[name] &&\n old !== previous?.previousLaunchers?.[name] &&\n old !== content\n )\n throw new Error(\"Refusing to replace an unrelated or edited launcher: \" + file);\n }\n // The 0.14.0 mason.ps1 shadows mason.cmd in PowerShell, where default script\n // policy can block it. Keep the helper under a different command name and\n // remove the old one only when its recorded ownership still matches.\n const retired = Object.entries({ ...previous?.previousLaunchers, ...previous?.launchers }).filter(\n ([name]) => !(name in launchers),\n );\n const checkRetired = async (name: string, expected: string) => {\n if (!launcherNames.includes(name)) throw new Error(\"Invalid owned launcher name.\");\n const actual = await fs.readFile(await storePath(bin, name), \"utf8\").catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n if (actual !== null && actual !== expected)\n throw new Error(\"Retired launcher was edited; retained: \" + name);\n };\n for (const [name, expected] of retired) await checkRetired(name, expected);\n progress?.step(`Installing Mason ${bundle.manifest.version}`);\n const updates =\n options.preservePolicy && previous?.updates\n ? { ...previous.updates }\n : {\n ...(previous?.updates ?? {\n enabled: !previous && !process.env.CI && process.env.MASON_NO_AUTO_UPDATE !== \"1\",\n }),\n revision: randomUUID(),\n pinnedVersion: process.env.MASON_VERSION?.replace(/^v/, \"\") || undefined,\n mirror: process.env.MASON_RELEASE_BASE || previous?.updates?.mirror,\n };\n if (options.rollback) {\n updates.pinnedVersion = bundle.manifest.version;\n updates.revision = randomUUID();\n }\n const receipt: InstallRecord = {\n format: 1,\n home,\n bin,\n current: id,\n version: bundle.manifest.version,\n launchers,\n pathChanges: previous?.pathChanges ?? [],\n updates,\n previous:\n previous && previous.current !== id\n ? { id: previous.current, version: previous.version }\n : previous?.previous,\n };\n // Claim only the preflighted installation, retaining old launchers for interrupted upgrades.\n await writeStoreJson(\n home,\n \"install.json\",\n previous ? { ...previous, previousLaunchers: launchers } : receipt,\n );\n try {\n if (!alreadyStaged) await copyBundle(home, source, destination, bundle);\n for (const [name, content] of Object.entries(launchers))\n await replace(await storePath(bin, name, true), content, 0o755);\n for (const [name, expected] of retired) {\n await checkRetired(name, expected);\n await fs.rm(await storePath(bin, name), { force: true });\n }\n await writeStoreJson(home, \"install.json\", receipt);\n } catch (error) {\n // Preserve the working version when an unattended activation fails.\n if (previous) {\n for (const [name, content] of Object.entries(previous.launchers))\n await replace(await storePath(bin, name, true), content, 0o755);\n await writeStoreJson(home, \"install.json\", previous);\n }\n throw error;\n }\n if (options.preservePolicy)\n return {\n home,\n bin,\n version: receipt.version,\n previousVersion: previous?.version,\n path: { message: \"Installation selected.\" },\n };\n progress?.step(\"Checking terminal command availability\");\n const pathResult = await configurePath(bin, receipt.pathChanges ?? [], async (changes) => {\n receipt.pathChanges = changes;\n await writeStoreJson(home, \"install.json\", receipt);\n });\n return {\n home,\n bin,\n version: bundle.manifest.version,\n previousVersion: previous?.version,\n path: pathResult,\n };\n}\n\nasync function copyBundle(\n home: string,\n source: string,\n destination: string,\n bundle: Awaited<ReturnType<typeof verifyBundle>>,\n) {\n const exists = await fs.lstat(destination).then(\n () => true,\n (error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return false;\n throw error;\n },\n );\n if (exists) {\n await verifyBundle(destination, bundle.manifestHash);\n return;\n }\n const stage = await storePath(home, \"versions/.install-\" + randomUUID(), true);\n await fs.mkdir(stage);\n try {\n for (const file of [\"bundle.json\", ...Object.keys(bundle.manifest.files)]) {\n const from = await storePath(source, file),\n to = await storePath(stage, file, true);\n await fs.copyFile(from, to);\n await fs.chmod(to, (await fs.stat(from)).mode & 0o777);\n }\n await verifyBundle(stage, bundle.manifestHash);\n try {\n await fs.rename(stage, destination);\n } catch (error) {\n // A manual upgrade can finish the same immutable bundle while we stage it.\n try {\n await verifyBundle(destination, bundle.manifestHash);\n } catch {\n throw error;\n }\n }\n } finally {\n await fs.rm(stage, { recursive: true, force: true });\n }\n}\n\n/** Activation and lease registration share a lock, including concurrent host launches. */\nexport async function prepareStandaloneMcp(home: string) {\n const before = await readInstallation(home),\n candidate = before.pending;\n let verified: Awaited<ReturnType<typeof verifyBundle>> | undefined, verificationError: unknown;\n if (candidate && automaticUpdatesAllowed(before) && !(await hasRunningMcp(home))) {\n try {\n verified = await verifyBundle(await storePath(home, \"versions/\" + candidate.id));\n if (\n verified.manifestHash.slice(0, 24) !== candidate.id ||\n verified.manifest.version !== candidate.version\n )\n throw new Error(\"Staged update changed.\");\n } catch (error) {\n verificationError = error;\n }\n }\n return withLock(home, \".install-lock\", async () => {\n let record = await readInstallation(home);\n const pending = record.pending;\n if (\n pending &&\n candidate?.id === pending.id &&\n (verified || verificationError) &&\n automaticUpdatesAllowed(record) &&\n pending.policyRevision === record.updates?.revision &&\n newerStableVersion(pending.version, record.version) &&\n !(await hasRunningMcp(home))\n ) {\n try {\n if (verificationError) throw verificationError;\n const source = await storePath(home, \"versions/\" + pending.id);\n await installLocked(home, source, verified!, undefined, { preservePolicy: true }, true);\n record = await readInstallation(home);\n } catch (error) {\n // A bad staged version must not repeatedly delay host startup.\n record = await readInstallation(home);\n delete record.pending;\n await writeStoreJson(home, \"install.json\", record);\n await writeStoreJson(home, \"update-status.json\", {\n lastAttempt: Date.now(),\n error: String(error),\n });\n }\n }\n const release = await registerMcp(home);\n return { bundle: await storePath(home, \"versions/\" + record.current), release };\n });\n}\n\nexport async function rollbackStandalone() {\n const { home } = await currentInstallation();\n return withLock(home, \".install-lock\", async () => {\n const record = await readInstallation(home);\n if (!record.previous) throw new Error(\"No previous installation is available.\");\n if (await hasRunningMcp(home))\n throw new Error(\"Close running Mason MCP sessions before rolling back.\");\n const source = await storePath(home, \"versions/\" + record.previous.id);\n const bundle = await verifyBundle(source);\n if (\n bundle.manifestHash.slice(0, 24) !== record.previous.id ||\n bundle.manifest.version !== record.previous.version\n )\n throw new Error(\"Previous installation changed.\");\n return installLocked(home, source, bundle, undefined, { preservePolicy: true, rollback: true });\n });\n}\n\nexport async function upgradeStandalone(version?: string, progress?: Progress) {\n if (version && !/^v?\\d+\\.\\d+\\.\\d+(?:-[A-Za-z0-9.-]+)?$/.test(version))\n throw new Error(\"Expected a release version such as 0.14.0.\");\n progress?.step(\"Checking current installation\");\n const { home, bundle, record } = await currentInstallation();\n await verifyBundle(bundle);\n const mirror = process.env.MASON_RELEASE_BASE || record.updates?.mirror || \"\";\n if (mirror && !version)\n throw new Error(\n \"Specify a version when upgrading from a company mirror; no public latest-version lookup was made.\",\n );\n let selected = version?.replace(/^v/, \"\");\n if (!selected) {\n progress?.step(\"Checking the latest release\");\n const response = await fetch(\"https://github.com/adrianczuczka/mason/releases/latest\", {\n method: \"HEAD\",\n redirect: \"follow\",\n signal: AbortSignal.timeout(30000),\n }).catch((error: unknown) => {\n throw releaseRequestError(error);\n });\n if (!response.ok) throw new Error(`Latest release request failed (HTTP ${response.status}).`);\n selected = new URL(response.url).pathname.split(\"/\").pop()?.replace(/^v/, \"\");\n if (!selected || !/^\\d+\\.\\d+\\.\\d+(?:-[A-Za-z0-9.-]+)?$/.test(selected))\n throw new Error(\"Invalid Mason release version.\");\n }\n const alreadyInstalled = await withLock(home, \".install-lock\", async () => {\n const current = await readInstallation(home);\n if (current.version !== selected) return false;\n await verifyBundle(await storePath(home, \"versions/\" + current.current));\n current.updates = {\n ...(current.updates ?? { enabled: false }),\n revision: randomUUID(),\n pinnedVersion: version ? selected : undefined,\n mirror: mirror || undefined,\n };\n delete current.pending;\n await writeStoreJson(home, \"install.json\", current);\n return true;\n });\n if (alreadyInstalled) {\n progress?.stop();\n console.log(`Mason ${selected} is already installed.`);\n return 0;\n }\n const windows = process.platform === \"win32\";\n const script = path.join(bundle, windows ? \"install.ps1\" : \"install.sh\");\n // The installer owns progress from here; do not animate over its inherited IO.\n progress?.stop();\n const code = await new Promise<number>((resolve, reject) => {\n const child = spawn(\n windows ? \"powershell.exe\" : \"sh\",\n windows\n ? [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-File\",\n script,\n selected!,\n ]\n : [script, selected!],\n {\n stdio: \"inherit\",\n windowsHide: true,\n env: {\n ...process.env,\n MASON_HOME: home,\n MASON_BIN_DIR: record.bin,\n MASON_RELEASE_BASE: process.env.MASON_RELEASE_BASE || record.updates?.mirror || \"\",\n MASON_VERSION: version ?? \"\",\n MASON_UPDATE_POLICY_REVISION: \"\",\n MASON_EXPECTED_SHA256: \"\",\n },\n },\n );\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => resolve(code ?? 2));\n });\n if (code === 0)\n console.log(\n \"Restart running assistants to use this installation. Existing project integrations use mason from PATH.\",\n );\n return code;\n}\n\nexport async function uninstallStandalone() {\n const { home, record } = await currentInstallation();\n const token = process.env.MASON_UNINSTALL_TOKEN;\n if (process.platform === \"win32\" && (!token || !/^[a-f0-9-]{36}$/i.test(token))) {\n throw new Error(\n \"Run mason uninstall through the installed Windows launcher so it can remove Node after exit.\",\n );\n }\n await withLock(home, \".install-lock\", async () => {\n for (const [name, expected] of Object.entries(record.launchers)) {\n if (!launcherNames.includes(name)) throw new Error(\"Invalid owned launcher name.\");\n const file = await storePath(record.bin, name);\n const actual = await fs.readFile(file, \"utf8\").catch((error: unknown) => {\n if (hasErrorCode(error, \"ENOENT\")) return null;\n throw error;\n });\n if (actual !== null && actual !== expected)\n throw new Error(\"Launcher was edited; retained: \" + file);\n }\n for (const warning of await removePath(record.pathChanges ?? [])) console.error(warning);\n if (process.platform === \"win32\")\n await replace(await storePath(home, \".uninstall-request.txt\", true), token!);\n for (const name of Object.keys(record.launchers))\n await fs.rm(await storePath(record.bin, name), { force: true });\n });\n // The Windows launcher supervises Node and removes its locked executable only\n // after this process exits. Its exit status includes cleanup failures. Detached\n // PowerShell did not start reliably: https://github.com/nodejs/node/issues/51018\n if (process.platform !== \"win32\") await fs.rm(home, { recursive: true, force: true });\n return home;\n}\n","import { isRecord } from \"../utils/validation.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { withLock } from \"../automation/store.js\";\nimport { readStoreJson, storePath, writeStoreJson } from \"../utils/storage.js\";\nimport {\n standaloneLocation,\n automaticUpdatesAllowed,\n currentInstallation,\n newerStableVersion,\n readInstallation,\n type InstallRecord,\n} from \"./state.js\";\nimport { verifyBundle } from \"./bundle.js\";\nimport { pruneUnusedVersions } from \"./runtime.js\";\nimport { prepareStandaloneMcp } from \"./install.js\";\n\nexport const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\nexport const RELEASE_AGE_MS = 24 * 60 * 60 * 1000;\nconst releaseBase = \"https://github.com/adrianczuczka/mason/releases\";\nconst releaseListSchema = z.array(\n z.object({\n tag_name: z.string(),\n draft: z.boolean(),\n prerelease: z.boolean(),\n published_at: z.string().nullable(),\n }),\n);\nexport const updateManifestSchema = z\n .object({\n format: z.literal(1),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/),\n publishedAt: z.string().datetime(),\n assets: z.record(z.string().regex(/^[a-f0-9]{64}$/)),\n })\n .strict();\nconst statusSchema = z.object({\n lastAttempt: z.number(),\n availableVersion: z.string().optional(),\n error: z.string().optional(),\n});\n\nasync function boundedDownload(url: string): Promise<Buffer> {\n const response = await fetch(url, { signal: AbortSignal.timeout(15000), redirect: \"follow\" });\n if (!response.ok || !response.body)\n throw new Error(`Update metadata request failed (HTTP ${response.status}).`);\n if (Number(response.headers.get(\"content-length\")) > 1024 * 1024)\n throw new Error(\"Update metadata is too large.\");\n const reader = response.body.getReader(),\n chunks: Uint8Array[] = [];\n let size = 0;\n try {\n for (;;) {\n const chunk: unknown = await reader.read();\n if (!isRecord(chunk) || typeof chunk.done !== \"boolean\")\n throw new Error(\"Invalid update metadata stream.\");\n const { value, done } = chunk;\n if (done) break;\n if (!(value instanceof Uint8Array)) throw new Error(\"Invalid update metadata stream.\");\n size += value.length;\n if (size > 1024 * 1024) throw new Error(\"Update metadata is too large.\");\n chunks.push(value);\n }\n } finally {\n await reader.cancel();\n }\n return Buffer.concat(chunks);\n}\n\n/** Bind both the release contents and exact tag workflow identity before using a download hash. */\nexport async function fetchVerifiedRelease(home: string, now = Date.now()) {\n // Select the newest eligible release, not just /latest: daily releases must\n // not keep every automatic update perpetually inside the waiting period.\n const releases = releaseListSchema.parse(\n JSON.parse(\n (\n await boundedDownload(\n \"https://api.github.com/repos/adrianczuczka/mason/releases?per_page=30\",\n )\n ).toString(\"utf8\"),\n ),\n );\n const installed = (await readInstallation(home)).version;\n let selected: string | undefined;\n for (const release of releases) {\n const version = release.tag_name.replace(/^v/, \"\");\n if (\n release.tag_name !== \"v\" + version ||\n release.draft ||\n release.prerelease ||\n !release.published_at ||\n !(now - Date.parse(release.published_at) >= RELEASE_AGE_MS) ||\n !newerStableVersion(version, installed)\n )\n continue;\n if (!selected || newerStableVersion(version, selected)) selected = version;\n }\n if (!selected) return null;\n const bytes = await boundedDownload(`${releaseBase}/download/v${selected}/update.json`);\n const manifest = updateManifestSchema.parse(JSON.parse(bytes.toString(\"utf8\")));\n if (manifest.version !== selected)\n throw new Error(\"Signed manifest does not match the selected release.\");\n const signature: unknown = JSON.parse(\n (\n await boundedDownload(`${releaseBase}/download/v${manifest.version}/update.sigstore.json`)\n ).toString(\"utf8\"),\n );\n // DSSE verifies its embedded payload, ignoring an external artifact argument.\n // Accept only detached message signatures that bind these exact manifest bytes.\n if (\n !isRecord(signature) ||\n !isRecord(signature.messageSignature) ||\n signature.dsseEnvelope !== undefined\n )\n throw new Error(\"Update metadata requires a detached message signature.\");\n const { bundleFromJSON, bundleToJSON } = await import(\"@sigstore/bundle\");\n const bundle = bundleToJSON(bundleFromJSON(signature));\n const { verify } = await import(\"sigstore\");\n await verify(bundle, bytes, {\n certificateIdentityURI: `https://github.com/adrianczuczka/mason/.github/workflows/publish.yml@refs/tags/v${manifest.version}`,\n certificateIssuer: \"https://token.actions.githubusercontent.com\",\n tufCachePath: await storePath(home, \"sigstore-cache\"),\n timeout: 10000,\n retry: 0,\n ctLogThreshold: 1,\n tlogThreshold: 1,\n });\n return manifest;\n}\n\nasync function runInstaller(home: string, version: string, digest: string, revision: string) {\n const record = await readInstallation(home);\n const bundle = await storePath(home, \"versions/\" + record.current);\n await verifyBundle(bundle);\n const windows = process.platform === \"win32\",\n script = path.join(bundle, windows ? \"install.ps1\" : \"install.sh\");\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n windows ? \"powershell.exe\" : \"sh\",\n windows\n ? [\"-NoProfile\", \"-NonInteractive\", \"-ExecutionPolicy\", \"Bypass\", \"-File\", script]\n : [script],\n {\n cwd: home,\n windowsHide: true,\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n timeout: 10 * 60 * 1000,\n env: {\n ...process.env,\n MASON_HOME: home,\n MASON_BIN_DIR: record.bin,\n MASON_VERSION: version,\n MASON_RELEASE_BASE: \"\",\n MASON_EXPECTED_SHA256: digest,\n MASON_UPDATE_POLICY_REVISION: revision,\n },\n },\n );\n let diagnostic = \"\";\n child.stderr!.on(\"data\", (bytes) => {\n diagnostic = (diagnostic + bytes).slice(-4000);\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`Update download failed (${code}): ${diagnostic.trim()}`)),\n );\n });\n}\n\n/** Separate worker: no inherited MCP/hook streams, one attempt per installation per day. */\nexport async function runAutomaticUpdate(\n home: string,\n dependencies = { fetchRelease: fetchVerifiedRelease, install: runInstaller },\n now = Date.now(),\n) {\n await withLock(\n home,\n \".update-lock\",\n async () => {\n const record = await readInstallation(home);\n if (!automaticUpdatesAllowed(record)) return;\n const old = statusSchema.safeParse(await readStoreJson(home, \"update-status.json\"));\n if (\n old.success &&\n now - old.data.lastAttempt < CHECK_INTERVAL_MS &&\n old.data.lastAttempt <= now\n )\n return;\n const status: z.infer<typeof statusSchema> = { lastAttempt: now };\n await writeStoreJson(home, \"update-status.json\", status);\n try {\n await pruneUnusedVersions(home).catch(() => {});\n const release = await dependencies.fetchRelease(home);\n if (!release) return;\n status.availableVersion = release.version;\n const age = now - Date.parse(release.publishedAt);\n if (\n age >= RELEASE_AGE_MS &&\n newerStableVersion(release.version, record.version) &&\n (!record.pending || newerStableVersion(release.version, record.pending.version))\n ) {\n const asset = `mason-${process.platform}-${process.arch}.${process.platform === \"win32\" ? \"zip\" : \"tar.gz\"}`;\n const digest = release.assets[asset];\n if (!digest) throw new Error(\"Signed release has no archive for this platform.\");\n // Users may disable, pin, manually upgrade, or uninstall while network requests run.\n const fresh = await readInstallation(home);\n if (\n automaticUpdatesAllowed(fresh) &&\n fresh.updates?.revision === record.updates!.revision &&\n newerStableVersion(release.version, fresh.version)\n ) {\n await dependencies.install(home, release.version, digest, record.updates!.revision);\n }\n }\n } catch (error) {\n status.error = error instanceof Error ? error.message : String(error);\n }\n // Do not recreate an installation removed while the worker was downloading.\n if (\n await fs.access(path.join(home, \"install.json\")).then(\n () => true,\n () => false,\n )\n )\n await writeStoreJson(home, \"update-status.json\", status);\n },\n 0,\n );\n}\n\nexport async function scheduleAutomaticUpdate(): Promise<void> {\n try {\n const { home, record } = await currentInstallation();\n if (!automaticUpdatesAllowed(record)) return;\n const status = statusSchema.safeParse(await readStoreJson(home, \"update-status.json\"));\n const now = Date.now();\n if (\n status.success &&\n status.data.lastAttempt <= now &&\n now - status.data.lastAttempt < CHECK_INTERVAL_MS\n )\n return;\n const bundle = await storePath(home, \"versions/\" + record.current);\n const child = spawn(\n path.join(bundle, process.platform === \"win32\" ? \"node.exe\" : \"node\"),\n [path.join(bundle, \"app/dist/mason.js\"), \"internal-update\"],\n { cwd: home, env: process.env, stdio: \"ignore\", detached: true, windowsHide: true },\n );\n child.on(\"error\", () => {});\n child.unref();\n } catch {\n /* npm, offline, read-only, or damaged installations must still run. */\n }\n}\n\nexport async function updateSettings(home: string, action: \"enable\" | \"disable\" | \"pin\" | \"unpin\") {\n return withLock(home, \".install-lock\", async () => {\n const record = await readInstallation(home);\n const updates: NonNullable<InstallRecord[\"updates\"]> = {\n ...(record.updates ?? { enabled: false }),\n revision: randomUUID(),\n };\n if (action === \"enable\") updates.enabled = true;\n if (action === \"disable\") updates.enabled = false;\n if (action === \"pin\") updates.pinnedVersion = record.version;\n if (action === \"unpin\") delete updates.pinnedVersion;\n record.updates = updates;\n delete record.pending;\n await writeStoreJson(home, \"install.json\", record);\n return record;\n });\n}\n\nexport async function updateStatus(home: string) {\n const record = await readInstallation(home);\n const lastCheck = statusSchema.parse(\n (await readStoreJson(home, \"update-status.json\")) ?? { lastAttempt: 0 },\n );\n return {\n version: record.version,\n enabled: record.updates?.enabled ?? false,\n effective: automaticUpdatesAllowed(record),\n pinnedVersion: record.updates?.pinnedVersion ?? null,\n mirror: record.updates?.mirror ?? null,\n pendingVersion: record.pending?.version ?? null,\n lastCheck: lastCheck.lastAttempt ? lastCheck : null,\n };\n}\n\n/** The MCP process holds a lease for its lifetime; pending versions activate before the first new server. */\nexport async function startMcpWithUpdates(start: (onClose?: () => void) => Promise<void>) {\n const current = standaloneLocation();\n if (!current) {\n await start();\n return;\n }\n // A standalone server must never run without a lease: another process could\n // otherwise treat it as idle and activate an update underneath that server.\n const session = await prepareStandaloneMcp(current.home);\n if (session.bundle !== current.bundle) {\n const child = spawn(\n path.join(session.bundle, process.platform === \"win32\" ? \"node.exe\" : \"node\"),\n [path.join(session.bundle, \"app/dist/mason-mcp.js\"), ...process.argv.slice(2)],\n { stdio: \"inherit\", windowsHide: true },\n );\n const interrupt = () => {\n child.kill(\"SIGINT\");\n },\n terminate = () => {\n child.kill(\"SIGTERM\");\n };\n process.on(\"SIGINT\", interrupt);\n process.on(\"SIGTERM\", terminate);\n try {\n process.exitCode = await new Promise<number>((resolve, reject) => {\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => resolve(code ?? 1));\n });\n } finally {\n process.off(\"SIGINT\", interrupt);\n process.off(\"SIGTERM\", terminate);\n await session.release();\n }\n return;\n }\n const timer = setInterval(\n () => {\n void scheduleAutomaticUpdate();\n },\n 60 * 60 * 1000,\n );\n timer.unref();\n const stop = () => {\n clearInterval(timer);\n void session?.release();\n };\n try {\n await start(stop);\n void scheduleAutomaticUpdate();\n } catch (error) {\n stop();\n throw error;\n }\n}\n","import { fileURLToPath } from \"node:url\";\nimport { runAutomationCli, isHookCommand } from \"../src/automation/cli.js\";\nimport { createProgress, type Progress } from \"../src/utils/progress.js\";\n\ndeclare const PKG_VERSION: string;\nconst inputArgs = process.argv.slice(2);\nconst managedLaunch = inputArgs[0] === \"--setup-host\";\nconst setupHost = managedLaunch ? inputArgs.splice(0, 2)[1] : undefined;\nconst [command, ...args] = inputArgs;\nconst usage = `Mason ${PKG_VERSION}\n\nUsage: mason <command> [options]\n\n setup --host codex|claude Activate this checkout without editing shared files\n init --host codex|claude Prepare shared configuration for review\n teardown [--host codex|claude] Disconnect locally; --project removes shared configuration\n status Show configuration, observed use and verification\n stats Show local stats and feedback\n install --host codex|claude Install lifecycle hooks\n config Configure lifecycle hooks and Stop behavior\n hook --host codex|claude Process an assistant lifecycle event\n check Resume and verify retained documentation findings\n audit Audit project instructions\n review --base <ref> Review committed changes\n drift Check an optional architecture map\n mcp Run the MCP server (stdio)\n merge-decision <base> <current> <incoming>\n Git merge driver for decision records (set by setup)\n upgrade [version] Upgrade the standalone user installation\n updates [status|enable|disable|pin|unpin]\n Manage automatic standalone updates\n rollback Restore and pin the previous standalone version\n uninstall Remove that installation; retain project data\n\nUse mason <command> --help for options. npm users can also use\nmason-audit, mason-review, mason-drift, mason-hook and mason-mcp.`;\n\n// Bare hook and --print-config retain the standalone decision injector.\nconst lifecycleHook =\n (command === \"auto\" && isHookCommand(args)) ||\n (command === \"hook\" && !args.includes(\"--print-config\") && (managedLaunch || args.length > 0));\nlet progress: Progress | undefined;\ntry {\n if (managedLaunch) {\n if (\n !setupHost ||\n ![\"codex\", \"claude\"].includes(setupHost) ||\n !([\"mcp\", \"auto\"].includes(command) || lifecycleHook)\n )\n throw new Error(\"Invalid setup invocation.\");\n // Hook setup is checked against the parsed payload's checkout, after stdin\n // is read. MCP can explain missing setup over the protocol in a fresh clone.\n if (!lifecycleHook) {\n const { prepareLaunch } = await import(\"../src/setup/launcher.js\");\n await prepareLaunch(setupHost as \"codex\" | \"claude\", { allowInactive: command === \"mcp\" });\n }\n }\n if (command === \"internal-integration-version\")\n console.log(JSON.stringify({ protocol: 1, version: PKG_VERSION }));\n else if (!command || [\"--help\", \"-h\", \"help\"].includes(command)) console.log(usage);\n else if ([\"--version\", \"-v\"].includes(command)) console.log(PKG_VERSION);\n else if (command === \"internal-update\") {\n if (args.length) throw new Error(\"internal-update takes no arguments.\");\n const { currentInstallation } = await import(\"../src/distribution/state.js\");\n const { runAutomaticUpdate } = await import(\"../src/distribution/updates.js\");\n await runAutomaticUpdate((await currentInstallation()).home);\n } else if (command === \"internal-install\") {\n if (args.length) throw new Error(\"internal-install takes no arguments.\");\n const { installStandalone } = await import(\"../src/distribution/install.js\");\n const bundleRoot = fileURLToPath(new URL(\"../..\", import.meta.url));\n progress = createProgress();\n const policyRevision = process.env.MASON_UPDATE_POLICY_REVISION;\n if (policyRevision && !/^[a-f0-9]{64}$/.test(process.env.MASON_EXPECTED_SHA256 ?? \"\"))\n throw new Error(\"Automatic staging requires a verified release checksum.\");\n const installed = await installStandalone(bundleRoot, progress, {\n stageOnly: !!policyRevision,\n policyRevision,\n });\n progress.stop();\n const outcome =\n installed.previousVersion && installed.previousVersion !== installed.version\n ? `Updated Mason ${installed.previousVersion} → ${installed.version}`\n : `Installed Mason ${installed.version}`;\n if (policyRevision)\n console.log(\n `Staged Mason ${installed.version}. It will activate at a future MCP launch after existing servers exit.`,\n );\n else {\n const { updateStatus } = await import(\"../src/distribution/updates.js\");\n const status = await updateStatus(installed.home);\n const policy = status.pinnedVersion\n ? `pinned to ${status.pinnedVersion}`\n : status.mirror\n ? \"managed by your mirror\"\n : status.enabled\n ? \"enabled\"\n : \"disabled\";\n console.log(\n `${outcome} in ${installed.home}.\\n${installed.path.message}\\nAutomatic updates: ${policy}. Manage with mason updates.`,\n );\n }\n } else if (command === \"merge-decision\") {\n const { runDecisionMerge } = await import(\"../src/decisions/merge.js\");\n process.exitCode = await runDecisionMerge(args);\n } else if (command === \"updates\") {\n if (args.includes(\"--help\"))\n console.log(\n \"Usage: mason updates [status|enable|disable|pin|unpin] [--json]. Pin holds the installed version; mason upgrade <version> installs and pins a specific release. Environment and mirror restrictions still apply.\",\n );\n else {\n const action = args.filter((arg) => arg !== \"--json\")[0] ?? \"status\";\n if (\n args.filter((arg) => arg !== \"--json\").length > 1 ||\n ![\"status\", \"enable\", \"disable\", \"pin\", \"unpin\"].includes(action)\n )\n throw new Error(\"Usage: mason updates [status|enable|disable|pin|unpin] [--json]\");\n const { currentInstallation } = await import(\"../src/distribution/state.js\");\n const { updateSettings, updateStatus, scheduleAutomaticUpdate } =\n await import(\"../src/distribution/updates.js\");\n const { home } = await currentInstallation();\n if (action !== \"status\")\n await updateSettings(home, action as \"enable\" | \"disable\" | \"pin\" | \"unpin\");\n const status = await updateStatus(home);\n if (args.includes(\"--json\")) console.log(JSON.stringify(status));\n else {\n console.log(\n `Mason ${status.version}\\nAutomatic updates: ${status.effective ? \"enabled\" : \"inactive\"} (preference: ${status.enabled ? \"enabled\" : \"disabled\"}).`,\n );\n if (status.pinnedVersion)\n console.log(\n `Pinned to ${status.pinnedVersion}. Run mason updates unpin to follow stable releases.`,\n );\n if (status.mirror)\n console.log(\"Company mirror installation: automatic public updates are disabled.\");\n if (!status.effective && status.enabled && !status.pinnedVersion && !status.mirror)\n console.log(\n \"Suppressed by CI, MASON_NO_AUTO_UPDATE, MASON_VERSION, or MASON_RELEASE_BASE.\",\n );\n if (status.pendingVersion)\n console.log(\n `Downloaded ${status.pendingVersion}; activates on a future MCP launch after existing servers exit.`,\n );\n if (status.lastCheck) {\n console.log(`Last check: ${new Date(status.lastCheck.lastAttempt).toISOString()}`);\n if (status.lastCheck.availableVersion)\n console.log(`Available stable release: ${status.lastCheck.availableVersion}`);\n if (status.lastCheck.error) console.log(`Last update problem: ${status.lastCheck.error}`);\n }\n }\n if (action === \"enable\" || action === \"unpin\") void scheduleAutomaticUpdate();\n }\n } else if (command === \"rollback\") {\n if (args.includes(\"--help\"))\n console.log(\n \"Usage: mason rollback. Close running Mason MCP servers, then restore and pin the previous installed version.\",\n );\n else {\n if (args.length) throw new Error(\"rollback takes no arguments.\");\n const { rollbackStandalone } = await import(\"../src/distribution/install.js\");\n const restored = await rollbackStandalone();\n console.log(\n `Restored Mason ${restored.version} and pinned it. Run mason updates unpin to resume automatic updates.`,\n );\n }\n } else if (command === \"upgrade\" || command === \"uninstall\") {\n if (args.includes(\"--help\"))\n console.log(\n command === \"upgrade\"\n ? \"Usage: mason upgrade [version]. Configured projects use the upgraded command on their next launch. Restart running assistants.\"\n : \"Usage: mason uninstall. Removes the standalone user installation; project configuration and knowledge are retained. Run mason teardown in each project first to disconnect its integrations.\",\n );\n else {\n const { upgradeStandalone, uninstallStandalone } =\n await import(\"../src/distribution/install.js\");\n if (args.length > (command === \"upgrade\" ? 1 : 0)) throw new Error(\"Unexpected arguments.\");\n if (command === \"upgrade\") {\n progress = createProgress();\n process.exitCode = await upgradeStandalone(args[0], progress);\n } else\n console.log(\n (process.platform === \"win32\"\n ? \"Finishing installation cleanup after runtime exit: \"\n : \"Removed standalone installation: \") +\n (await uninstallStandalone()) +\n \". Project configuration and knowledge were retained. Reinstall Mason to use its integrations.\",\n );\n }\n } else if (\n [\"init\", \"setup\", \"teardown\", \"status\", \"check\", \"stats\", \"install\", \"config\", \"auto\"].includes(\n command,\n ) ||\n lifecycleHook\n ) {\n const forwarded = command === \"auto\" ? args : [command, ...args];\n let input = \"\";\n if (isHookCommand(forwarded) && !process.stdin.isTTY)\n for await (const chunk of process.stdin) {\n const value: unknown = chunk;\n if (typeof value === \"string\") input += value;\n else if (value instanceof Uint8Array) input += Buffer.from(value).toString();\n else throw new Error(\"Unsupported stdin chunk.\");\n if (Buffer.byteLength(input) > 1024 * 1024) break;\n }\n process.exitCode = await runAutomationCli(forwarded, input, undefined, {\n managedHost: managedLaunch ? (setupHost as \"codex\" | \"claude\") : undefined,\n });\n } else if ([\"audit\", \"review\", \"drift\", \"hook\", \"mcp\"].includes(command)) {\n const binary = new URL(`./mason-${command}.js`, import.meta.url);\n process.argv = [process.execPath, fileURLToPath(binary), ...args];\n await import(binary.href);\n } else throw new Error(\"Unknown command: \" + command + \". Run mason --help.\");\n} catch (error) {\n progress?.stop(false);\n const message = \"Mason: \" + (error instanceof Error ? error.message : String(error));\n if (lifecycleHook) {\n console.log(JSON.stringify({ systemMessage: message + \" Verification was not established.\" }));\n process.exitCode = 0;\n } else {\n console.error(message);\n process.exitCode = 2;\n }\n}\n","import { configureStopBlock } from \"./config.js\";\nimport {\n configureUsefulness,\n rateUsefulness,\n usefulnessRating,\n usefulnessStatus,\n summarizeUsefulness,\n} from \"./usefulness.js\";\nimport { automationFailure, failureMessage } from \"./execution.js\";\nimport { parseArgs } from \"node:util\";\nimport { automate, automationStatus, summarize } from \"./runtime.js\";\nimport { runAutomationHook, hookConfig } from \"./adapters.js\";\nimport { installAutomation, installedAutomation } from \"./install.js\";\nimport { hostSchema } from \"./store.js\";\nimport { createProgress, type Progress } from \"../utils/progress.js\";\nimport { withProfile } from \"../utils/profile.js\";\n\nconst TEARDOWN_USAGE = `Usage: mason teardown [--project] [options]\n\nDisconnect Mason locally. Defaults to all locally configured hosts.\n\n --host codex|claude Disconnect only this host\n --project Remove shared integration files for review and commit\n --dir <path> Project directory (defaults to cwd; subdirectories work)\n --dry-run Preview changes without writing\n --json Machine-readable changes and diagnostics\n\nKeeps shared knowledge, repair evidence, ignore rules and the Mason installation.\nEdited or ambiguous entries are retained for manual cleanup. Restart assistants\nafter teardown. Run mason setup --host codex or --host claude to reconnect.\nExit 0: complete/no-op. Exit 2: cleanup needs attention (also in dry runs).`;\n\nconst STATS_USAGE = `Usage: mason stats [options]\n\nShow aggregate local observations, or inspect one session.\n\n --enable | --disable Enable/disable collection (disabled by default)\n --json Include session/finding IDs and evidence paths\n --dir <path> Project directory (defaults to cwd)\n --session <id> Filter to one retained session\n --session <id> --finding <id> --rating helpful|already-knew|irrelevant|deferred\n Supply feedback without changing audit status\n\nNo uploads. Observed resolution does not establish causation.`;\n\nconst USAGE = `Usage: mason <init|setup|teardown|install|config|status|check|hook|stats> [options]\n\n setup [--host claude|codex] Activate existing shared configuration locally\n init --host claude|codex Prepare shared configuration for review and commit\n teardown [--host claude|codex] Disconnect locally; --project removes shared configuration\n install --host claude|codex Merge lifecycle hooks into this project's host config\n config --host claude|codex Print the host config without writing\n config --stop-block off|drift Set local Claude Stop review behavior (default: drift)\n status Read configured hooks and observed runtime events\n stats Aggregate local observations; --enable/--disable to configure\n Rate with --session <id> --finding <id> --rating helpful|already-knew|irrelevant|deferred\n check Capture/resume and verify retained audit evidence\n hook --host claude|codex Handle host JSON on stdin\n\n --dir <path> Project directory (defaults to cwd)\n --command <prefix> Installed executable prefix for install/config\n --dry-run Preview init or teardown without writing\n --json Machine-readable output (status also uses JSON when piped)\n --profile Local phase timings on stderr for check/hook; no file contents\n\ncheck exits 0 for verified checks, 1 for issues, 2 for incomplete/unavailable.\nteardown exits 0 for complete/no-op, 2 when cleanup needs attention (also in dry runs).\nHooks check decision anchors only, without creating or verifying repair baselines.\nHooks exit 0; Claude Stop can block once for uninspected session anchor edits.\nRe-entry and Codex remain advisory; failed captures are reported explicitly.\nLocal evidence is written under .mason/reports/. No LLM calls or source edits.`;\n\nconst parseCli = (argv: string[]) =>\n parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n dir: { type: \"string\" },\n host: { type: \"string\" },\n command: { type: \"string\" },\n \"stop-block\": { type: \"string\" },\n json: { type: \"boolean\" },\n help: { type: \"boolean\", short: \"h\" },\n \"dry-run\": { type: \"boolean\" },\n project: { type: \"boolean\" },\n profile: { type: \"boolean\" },\n enable: { type: \"boolean\" },\n disable: { type: \"boolean\" },\n session: { type: \"string\" },\n finding: { type: \"string\" },\n rating: { type: \"string\" },\n },\n });\nexport function isHookCommand(argv: string[]): boolean {\n try {\n const parsed = parseCli(argv);\n return parsed.positionals[0] === \"hook\" && !parsed.values.help;\n } catch {\n return false;\n }\n}\n\nconst defaultIo = {\n out: (s: string) => process.stdout.write(s + \"\\n\"),\n err: (s: string) => process.stderr.write(s + \"\\n\"),\n};\nexport async function runAutomationCli(\n argv: string[],\n stdin = \"\",\n io = defaultIo,\n options: { managedHost?: \"codex\" | \"claude\" } = {},\n): Promise<number> {\n let action = \"\";\n let progress: Progress | undefined;\n try {\n const { values, positionals } = parseCli(argv);\n if (values.help || !positionals.length) {\n io.out(\n positionals[0] === \"teardown\"\n ? TEARDOWN_USAGE\n : positionals[0] === \"stats\"\n ? STATS_USAGE\n : USAGE,\n );\n return 0;\n }\n if (positionals.length !== 1) throw new Error(\"Expected one command.\");\n [action] = positionals;\n if (values.profile && ![\"check\", \"hook\"].includes(action))\n throw new Error(\"--profile applies only to check/hook.\");\n if (values.project !== undefined && action !== \"teardown\")\n throw new Error(\"--project applies only to teardown.\");\n const trackingOptions = [\n values.enable,\n values.disable,\n values.session,\n values.finding,\n values.rating,\n ].some((v) => v !== undefined);\n if (trackingOptions && action !== \"stats\")\n throw new Error(\"Tracking options apply only to stats.\");\n const measured = <T>(run: () => Promise<T>) =>\n values.profile ? withProfile(run, io.err) : run();\n const dir = values.dir ?? process.cwd();\n if (values[\"dry-run\"] !== undefined && ![\"init\", \"teardown\"].includes(action))\n throw new Error(\"--dry-run applies only to init/teardown.\");\n if (values[\"stop-block\"] !== undefined) {\n if (action !== \"config\" || values.host || values.command)\n throw new Error(\n \"--stop-block applies only to config, separately from host hook generation.\",\n );\n io.out(JSON.stringify(await configureStopBlock(dir, values[\"stop-block\"]), null, 2));\n return 0;\n }\n if (action === \"teardown\") {\n if (values.command !== undefined)\n throw new Error(\"--command applies only to install/config.\");\n const { teardownProject, summarizeTeardown } = await import(\"../setup/teardown.js\");\n const result = await teardownProject(dir, {\n host: values.host === undefined ? undefined : hostSchema.parse(values.host),\n dryRun: values[\"dry-run\"],\n project: values.project,\n });\n io.out(values.json ? JSON.stringify(result, null, 2) : summarizeTeardown(result));\n return result.status === \"complete\" ? 0 : 2;\n }\n if (action === \"hook\") {\n const host = hostSchema.parse(values.host);\n if (options.managedHost && options.managedHost !== host)\n throw new Error(\"Managed hook --host does not match its launcher.\");\n const output = await measured(() =>\n runAutomationHook(host, stdin, { managed: !!options.managedHost }),\n );\n if (output) io.out(JSON.stringify(output));\n return 0;\n }\n if (action === \"setup\" || action === \"init\") {\n if (values.command)\n throw new Error(\"--command applies to install/config, not managed setup.\");\n const { setupProject, summarizeSetup, initializeProject, summarizeInitialization } =\n await import(\"../setup/setup.js\");\n const host = values.host ? hostSchema.parse(values.host) : undefined;\n if (!values.json)\n progress = createProgress(\n io === defaultIo\n ? {}\n : {\n write: (text) => io.err(text.replace(/\\n$/, \"\")),\n interactive: false,\n },\n );\n if (action === \"init\") {\n const result = await initializeProject(dir, { host, dryRun: values[\"dry-run\"], progress });\n progress?.stop();\n io.out(values.json ? JSON.stringify(result, null, 2) : summarizeInitialization(result));\n } else {\n const result = await setupProject(dir, { host, progress });\n progress?.stop();\n io.out(values.json ? JSON.stringify(result, null, 2) : summarizeSetup(result));\n }\n return 0;\n }\n if (action === \"install\" || action === \"config\") {\n const host = hostSchema.parse(values.host);\n io.out(\n JSON.stringify(\n action === \"install\"\n ? await installAutomation(dir, host, values.command)\n : hookConfig(host, values.command),\n null,\n 2,\n ),\n );\n return 0;\n }\n if (values.host || values.command)\n throw new Error(\"--host and --command apply only to install/config/hook.\");\n if (action === \"stats\") {\n const configuring = values.enable !== undefined || values.disable !== undefined;\n const rating = values.finding !== undefined || values.rating !== undefined;\n if (\n (values.enable !== undefined && values.disable !== undefined) ||\n (configuring && (rating || values.session !== undefined))\n )\n throw new Error(\"Choose tracking configuration or session inspection/feedback separately.\");\n if (rating && (!values.session || !values.finding || !values.rating))\n throw new Error(\"Rating requires --session, --finding, and --rating.\");\n if (configuring) {\n const result = await configureUsefulness(dir, !!values.enable);\n io.out(\n values.json\n ? JSON.stringify(result, null, 2)\n : `Local stats ${result.enabled ? \"enabled\" : \"disabled\"}. Existing observations retained. View with mason stats.`,\n );\n return 0;\n }\n if (rating)\n await rateUsefulness(\n dir,\n values.session!,\n values.finding!,\n usefulnessRating.parse(values.rating),\n );\n const result = await usefulnessStatus(dir, values.session);\n io.out(values.json ? JSON.stringify(result, null, 2) : summarizeUsefulness(result));\n return 0;\n }\n if (action === \"status\") {\n const { setupStatus, summarizeActivation } = await import(\"../setup/status.js\");\n const setup = await setupStatus(dir);\n const result = {\n ...(await automationStatus(dir)),\n configured: await installedAutomation(dir),\n setup,\n };\n io.out(\n values.json || !process.stdout.isTTY\n ? JSON.stringify(result, null, 2)\n : [\n summarizeActivation(setup),\n `Claude Stop review blocking: ${result.stopBlock}`,\n result.knowledge,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\"),\n );\n return 0;\n }\n if (action !== \"check\") throw new Error(\"Unknown automation command: \" + action);\n const { report } = await measured(() => automate(dir, { event: \"task_end\" }));\n io.out(values.json ? JSON.stringify(report, null, 2) : summarize(report));\n return report.status === \"verified\" ? 0 : report.status === \"issues-remain\" ? 1 : 2;\n } catch (error) {\n progress?.stop(false);\n const message =\n action === \"setup\"\n ? \"Mason setup incomplete: \" +\n automationFailure(error).message +\n \". Rerun the same setup command to resume configuration.\"\n : action === \"teardown\"\n ? \"Mason teardown incomplete: \" +\n automationFailure(error).message +\n \". Inspect the reported input, then rerun teardown; knowledge and repair evidence are retained.\"\n : failureMessage(error);\n if (action === \"hook\" || isHookCommand(argv)) {\n io.out(JSON.stringify({ systemMessage: message }));\n return 0;\n }\n if (argv.includes(\"--json\"))\n io.out(\n JSON.stringify({\n version: 1,\n ...([\"init\", \"setup\", \"teardown\"].includes(action)\n ? {\n action,\n status: \"incomplete\",\n next: \"Inspect the reported input, then rerun the same command to resume.\",\n }\n : { status: \"unavailable\" }),\n failure: automationFailure(error),\n }),\n );\n else io.err(message);\n return 2;\n }\n}\n","/** Optional human-facing progress. Core callers stay silent unless supplied. */\nexport type Progress = {\n step: (message: string) => void;\n stop: (success?: boolean) => void;\n};\n\nexport function createProgress(\n options: {\n write?: (text: string) => void;\n interactive?: boolean;\n columns?: () => number;\n } = {},\n): Progress {\n const write =\n options.write ??\n ((text) => {\n process.stderr.write(text);\n });\n const interactive =\n options.interactive ??\n (!!process.stderr.isTTY && process.env.TERM !== \"dumb\" && !process.env.CI);\n const columns = options.columns ?? (() => process.stderr.columns || 80);\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let message = \"\",\n started = 0,\n frame = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n const elapsed = () => {\n const seconds = Math.floor((Date.now() - started) / 1000);\n return seconds ? ` (${seconds}s)` : \"\";\n };\n const render = (prefix: string) => {\n // Keep updates on one terminal line, including when the window narrows.\n const text = `${prefix} ${message}${elapsed()}`;\n const width = Math.max(1, columns() - 1);\n write(\"\\r\\u001b[2K\" + (text.length > width ? text.slice(0, width - 1) + \"…\" : text));\n };\n const stop = (success = true) => {\n if (timer) clearInterval(timer);\n timer = undefined;\n if (message && interactive) {\n render(success ? \"✓\" : \"✗\");\n write(\"\\n\");\n }\n message = \"\";\n };\n return {\n step(next) {\n stop();\n message = next.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \");\n started = Date.now();\n frame = 0;\n if (!interactive) {\n write(`Mason: ${message}…\\n`);\n return;\n }\n render(frames[frame]);\n timer = setInterval(() => {\n render(frames[++frame % frames.length]);\n }, 100);\n timer.unref();\n },\n stop,\n };\n}\n"],"mappings":"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","names":["scopes","args","command","path","configPath","raw","ALL_CHECKS","content","fs","path","fg","AsyncLocalStorage","path","args","fs","constants","fg","scopes","literal","z","fs","directory","z","repoPath","path","z","createHash","fs","path","createHash","z","content","fs","path","fg","readdir","directory","lstat","count","fg","file","path","quote","text","directory","hash","content","commands","fs","path","fg","priority","content","fs","path","directory","fs","path","path","fg","fs","path","text","count","path","content","path","directory","path","content","text","json","args","text","scopes","content","text","createHash","execFile","promisify","hash","text","path","hits","init_drift","init_drift","createHash","z","z","digest","evidenceSchema","z","z","directory","fs","z","git","evidenceSchema","record","events","event","commitSchema","eventSchema","init_drift","args","fs","path","hash","fs","path","randomUUID","z","content","head","count","git","fs","path","createHash","z","args","scopes","record","text","exists","commands","canonical","z","fs","z","configPath","configSchema","directory","empty","stateSchema","findingSchema","key","findingId","text","os","fs","randomUUID","z","directory","git","args","randomUUID","z","statePath","empty","git","verifications","record","previousPath","pendingKnowledge","hosts","text","fs","path","git","z","fs","path","os","createHash","init_drift","z","fs","path","git","directory","z","execFile","promisify","fs","args","git","fs","z","directory","z","prepareLaunch","observeActivation","warning","knowledge","command","fs","path","randomUUID","text","file","init_files","z","text","command","init_files","z","init_files","fs","text","args","parse","z","text","config","servers","configPath","planAutomationInstall","git","blockSpan","init_config","init_files","configPath","recordSchema","z","command","ancillaryEdits","applyEdit","ownershipEdit","completedHookOwnership","edit","init_files","isDeepStrictEqual","fs","path","parse","stringify","fg","z","git","recordSchema","commands","configPath","command","empty","host","text","object","handlers","canonical","init_files","init_config","hosts","init_config","randomUUID","git","configPath","init_files","init_config","fs","os","path","execFile","promisify","createHash","randomUUID","z","profiles","text","execute","value","recordSchema","os","path","fs","z","fs","path","createHash","z","digest","init_trust","fs","os","path","randomUUID","z","directory","init_runtime","init_trust","fs","os","randomUUID","z","directory","leaseSchema","install_exports","fs","os","path","execFile","promisify","randomUUID","content","progress","installLocked","recordSchema","directory","receipt","exists","code","init_install","init_trust","fs","path","spawn","randomUUID","z","digest","statusSchema","init_runtime","init_install","fileURLToPath","text","progress","teardownProject","summarizeTeardown","setupProject","summarizeSetup","initializeProject","summarizeInitialization","text","result","setupStatus","summarizeActivation","prepareLaunch","currentInstallation","runAutomaticUpdate","installStandalone","fileURLToPath","updateStatus","runDecisionMerge","updateSettings","scheduleAutomaticUpdate","rollbackStandalone","upgradeStandalone","uninstallStandalone"]}