bravenlab 0.1.0 → 0.1.3

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/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli.ts", "../../agent-tools/src/catalog.ts", "../../agent-tools/src/tools.ts", "../../agent-tools/src/errors.ts", "../../agent-tools/src/server.ts", "../../pipeline-sync/src/compiler.ts", "../../pipeline-sync/src/errors.ts", "../../agent-tools/src/access.ts", "../../identity-store/src/environment.ts", "../../agent-tools/src/api.ts", "../../pipeline-ir/src/ir.ts", "../../pipeline-ir/src/content-hash.ts", "../../pipeline-ir/src/patch.ts", "../../pipeline-sync/src/client.ts", "../../pipeline-sync/src/apply.ts", "../../pipeline-sync/src/patch.ts", "../../pipeline-sync/src/merge.ts", "../../pipeline-sync/src/resolve.ts", "../../pipeline-sync/src/source.ts", "../../pipeline-sync/src/diff.ts", "../../pipeline-sync/src/engine.ts", "../../pipeline-sync/src/state.ts", "../../pipeline-sync/src/sync.ts", "../../pipeline-sync/src/snapshot.ts", "../../pipeline-sync/src/store.ts", "../../agent-tools/src/params.ts", "../../agent-tools/src/credential.ts", "../../identity-store/src/errors.ts", "../../identity-store/src/identity.ts", "../../agent-tools/src/email.ts", "../../agent-tools/src/handlers.ts", "../../agent-tools/src/baseHandlers.ts", "../../agent-tools/src/run.ts", "../../agent-tools/src/confirmation.ts", "../../agent-tools/src/baseTools.ts", "../../agent-tools/src/pull.ts", "../../agent-tools/src/push.ts", "../../agent-tools/src/watcher.ts", "../src/commands.ts", "../../identity-store/src/login.ts", "../src/auth.ts", "../src/files.ts", "../src/pipeline.ts", "../src/pipeline/commands.ts", "../src/pipeline/results.ts", "../src/mcp-install.ts"],
4
- "sourcesContent": ["import { Argument, CliError, Command, Flag } from \"effect/cli\";\nimport { Cause, Console, Effect, Match, Option } from \"effect\";\nimport type { BadArgument, PlatformError } from \"effect/PlatformError\";\nimport { AgentToolError } from \"@braven/agent-tools\";\nimport { runMcp } from \"@braven/agent-tools/server\";\nimport * as Arr from \"effect/Array\";\nimport {\n CliFailure,\n EXIT_USAGE,\n Environment,\n fail,\n oneLine,\n resolveOrigin,\n} from \"@braven/identity-store\";\nimport { SyncFailure } from \"@braven/pipeline-sync\";\nimport {\n configSet,\n configShow,\n configUse,\n keyAdd,\n loginCommand,\n logout,\n push,\n whoami,\n} from \"./commands.ts\";\nimport {\n CompilerUnavailable,\n EXIT_PIPELINE_USAGE,\n PipelineExit,\n pipelineCommand,\n} from \"./pipeline.ts\";\nimport { CLIENTS, installCommand } from \"./mcp-install.ts\";\n\n/** The CLI's version, shown by `braven --version`. */\nexport const VERSION = \"0.0.0\";\n\nconst originFlag = Flag.String(\"origin\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the Braven API origin (default: $BRAVEN_API_URL, else the hosted API)\",\n ),\n);\n\nconst emailFlag = Flag.String(\"email\").pipe(\n Flag.optional,\n Flag.withDescription(\"the account's email\"),\n);\n\nconst login = Command.make(\n \"login\",\n {\n origin: originFlag,\n webOrigin: Flag.String(\"web-origin\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the web app that performs the sign-in (default: $BRAVEN_WEB_URL, else the hosted site)\",\n ),\n ),\n device: Flag.Boolean(\"device\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"poll better-auth's device authorization grant instead of the loopback handoff\",\n ),\n ),\n clientId: Flag.String(\"client-id\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the public client id for --device (default: $BRAVEN_CLIENT_ID, else braven-cli)\",\n ),\n ),\n watcher: Flag.Boolean(\"watcher\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"use the sign-in the Braven app already made on this machine (the app, its agent and the CLI share one store)\",\n ),\n ),\n api: Flag.Boolean(\"api\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"store an API key instead of opening a browser (with --key or $BRAVEN_API_KEY)\",\n ),\n ),\n key: Flag.String(\"key\").pipe(\n Flag.optional,\n Flag.withDescription(\"the API key for --api (default: $BRAVEN_API_KEY)\"),\n ),\n email: emailFlag,\n },\n Effect.fn(function* ({\n origin,\n webOrigin,\n device,\n clientId,\n watcher,\n api,\n key,\n email,\n }) {\n if (watcher && api)\n return yield* fail(\n \"--watcher and --api are alternatives: pick one sign-in\",\n EXIT_USAGE,\n );\n yield* loginCommand({\n origin,\n webOrigin,\n device,\n clientId,\n method: watcher ? \"watcher\" : api ? \"api\" : \"browser\",\n apiKey: key,\n email,\n });\n }),\n).pipe(\n Command.withDescription(\n \"sign in with the app's session (--watcher), the browser, or an API key (--api)\",\n ),\n);\n\nconst keyAddCommand = Command.make(\n \"add\",\n {\n key: Argument.String(\"key\").pipe(\n Argument.withMetavar(\"bvn_api_...\"),\n Argument.withDescription(\"the key, shown once in Settings \u2192 API keys\"),\n ),\n email: emailFlag,\n label: Flag.String(\"label\").pipe(\n Flag.optional,\n Flag.withDescription(\"a name for the key, such as `ci`\"),\n ),\n origin: originFlag,\n },\n Effect.fn(function* ({ key, email, label, origin }) {\n const environment = yield* Environment;\n yield* keyAdd({\n origin: resolveOrigin(origin, environment),\n key,\n email,\n label,\n });\n }),\n).pipe(Command.withDescription(\"store an API key as an account\"));\n\nconst key = Command.make(\"key\").pipe(\n Command.withDescription(\"manage API keys\"),\n Command.withSubcommands([keyAddCommand]),\n);\n\nconst whoamiCommand = Command.make(\"whoami\", {}, () => whoami()).pipe(\n Command.withDescription(\"print the identity you would use\"),\n);\n\nconst pushCommand = Command.make(\n \"push\",\n {\n file: Argument.File(\"file\", { mustExist: true }).pipe(\n Argument.withMetavar(\"path\"),\n Argument.withDescription(\"the local file to upload\"),\n ),\n override: Flag.Boolean(\"override\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"replace that path's Experiment and File instead of deduping or adding a sibling\",\n ),\n ),\n path: Flag.String(\"path\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the file's path relative to the watched folder (default: its basename)\",\n ),\n ),\n projectId: Flag.String(\"project-id\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the project to ingest into (default: $BRAVEN_PROJECT_ID, else the stored default)\",\n ),\n ),\n },\n Effect.fn(function* ({ file, override, path, projectId }) {\n yield* push({ file, override, path, projectId });\n }),\n).pipe(\n Command.withDescription(\n \"upload a local file through `files.ingest`, keeping one Experiment per path\",\n ),\n);\n\nconst agentCommand = Command.make(\"agent\").pipe(\n Command.withDescription(\n \"run the local watch agent (same program as `braven-agent`)\",\n ),\n);\n\nconst configSetCommand = Command.make(\n \"set\",\n {\n name: Argument.Literals(\"name\", [\"company\", \"project\"]),\n value: Argument.String(\"value\"),\n },\n Effect.fn(function* ({ name, value }) {\n yield* configSet({ name, value });\n }),\n).pipe(Command.withDescription(\"set a default\"));\n\nconst configUseCommand = Command.make(\n \"use\",\n { email: Argument.String(\"email\") },\n Effect.fn(function* ({ email }) {\n yield* configUse(email);\n }),\n).pipe(Command.withDescription(\"switch the current account\"));\n\nconst configCommand = Command.make(\"config\", {}, () => configShow()).pipe(\n Command.withDescription(\"show or change the stored defaults\"),\n Command.withSubcommands([\n Command.make(\"show\", {}, () => configShow()).pipe(\n Command.withDescription(\"show the stored accounts and defaults\"),\n ),\n configSetCommand,\n configUseCommand,\n ]),\n);\n\nconst logoutCommand = Command.make(\n \"logout\",\n { email: emailFlag },\n Effect.fn(function* ({ email }) {\n yield* logout(email);\n }),\n).pipe(\n Command.withDescription(\n \"forget an account and its secret (default: the current one)\",\n ),\n);\n\nconst mcpInstallCommand = Command.make(\n \"install\",\n {\n client: Flag.Literals(\"client\", CLIENTS).pipe(\n Flag.withDescription(\"the client whose MCP config to write\"),\n ),\n force: Flag.Boolean(\"force\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"replace a differing `braven` entry (the file is backed up first)\",\n ),\n ),\n path: Flag.String(\"path\").pipe(\n Flag.optional,\n Flag.withDescription(\"write this file instead of the client's default\"),\n ),\n },\n Effect.fn(function* ({ client, force, path }) {\n yield* installCommand({ client, force, path });\n }),\n).pipe(\n Command.withDescription(\n \"merge the Braven server into a client's MCP config (Claude, Cursor, Zed, VS Code)\",\n ),\n);\n\nconst mcpCommand = Command.make(\"mcp\", {}, () => runMcp(VERSION)).pipe(\n Command.withDescription(\n \"run the Braven MCP server over stdio (connect Claude, Cursor, or Zed here)\",\n ),\n Command.withSubcommands([mcpInstallCommand]),\n);\n\n/** The whole `braven` command tree. */\nexport const braven = Command.make(\"braven\").pipe(\n Command.withDescription(\n \"Sign in once per machine and let the CLI, the watcher and the SDK read the same identity.\",\n ),\n Command.withSubcommands([\n login,\n key,\n pipelineCommand,\n pushCommand,\n agentCommand,\n mcpCommand,\n whoamiCommand,\n configCommand,\n logoutCommand,\n ]),\n);\n\n/** Runs one command line; `renderErrors: false` leaves error rendering to `main`. */\nexport const runCli = (args: ReadonlyArray<string>) =>\n Command.runWith(braven, { version: VERSION, renderErrors: false })(args);\n\ninterface Described {\n readonly code: number;\n readonly message: string;\n}\n\n/** Plan 069's exit codes, one per `SyncFailureKind`. */\nconst syncExit = (failure: SyncFailure): number => {\n if (failure.kind === \"usage\") return 3;\n if (failure.kind === \"conflict\") return 2;\n if (failure.kind === \"network\") return 4;\n return 2;\n};\n\nconst describe = (\n error:\n | CliError.CliError\n | CliFailure\n | CompilerUnavailable\n | PipelineExit\n | SyncFailure\n | AgentToolError\n | BadArgument\n | PlatformError\n | Cause.IllegalArgumentError,\n): Described =>\n Match.value(error).pipe(\n Match.tag(\"PipelineExit\", (exit) => ({\n code: exit.code,\n message: exit.message,\n })),\n Match.tag(\"CompilerUnavailable\", (unavailable) => ({\n code: EXIT_PIPELINE_USAGE,\n message: unavailable.message,\n })),\n Match.tag(\"SyncFailure\", (failure) => ({\n code: syncExit(failure),\n message: failure.message,\n })),\n Match.tag(\"CliFailure\", (failure) => ({\n code: failure.exitCode,\n message: failure.message,\n })),\n Match.tag(\"ShowHelp\", (help) =>\n help.errors.length === 0\n ? { code: 0, message: \"\" }\n : {\n code: EXIT_USAGE,\n message: Option.getOrElse(\n Arr.head(help.errors).pipe(Option.map((item) => item.message)),\n () => \"invalid arguments\",\n ),\n },\n ),\n Match.tag(\"UserError\", (user) => ({\n code: EXIT_USAGE,\n message: user.userMessage ?? oneLine(user.cause),\n })),\n Match.orElse((other) => ({ code: EXIT_USAGE, message: other.message })),\n );\n\n/**\n * Runs the CLI and returns its exit code.\n *\n * Help is a success; anything else becomes exactly one `braven: \u2026` line on\n * stderr. The effect never fails, so the process boundary only has to assign\n * the code.\n */\nexport const main = Effect.fn(\"braven\")(function* (\n args: ReadonlyArray<string>,\n) {\n return yield* runCli(args).pipe(\n Effect.as(0),\n Effect.catch((error) => {\n const described = describe(error);\n if (described.code === 0) return Effect.succeed(0);\n if (described.message.length === 0) return Effect.succeed(described.code);\n return Console.error(`braven: ${oneLine(described.message)}`).pipe(\n Effect.as(described.code),\n );\n }),\n );\n});\n", "import { Tool } from \"effect/ai\";\nimport * as Context from \"effect/Context\";\nimport type { JsonSchema } from \"effect/JsonSchema\";\nimport * as Option from \"effect/Option\";\nimport * as Schema from \"effect/Schema\";\nimport { CatalogMeta, tools, webTools } from \"./tools.ts\";\nimport type { Scope, Surface } from \"./tools.ts\";\n\n/** A protocol-neutral view of one tool, safe to ship to a browser. */\nexport interface CatalogEntry {\n readonly name: string;\n readonly title: string;\n readonly description: string;\n readonly inputSchema: JsonSchema;\n readonly outputSchema: JsonSchema;\n readonly scopes: ReadonlyArray<Scope>;\n readonly surfaces: ReadonlyArray<Surface>;\n /** Needs this machine (a workspace checkout, or the running watcher). */\n readonly local: boolean;\n readonly annotations: {\n readonly readOnly: boolean;\n readonly destructive: boolean;\n readonly idempotent: boolean;\n readonly openWorld: boolean;\n readonly consequential: boolean;\n };\n}\n\nconst titleOf = (tool: Tool.Any): string =>\n Option.getOrElse(\n Context.getOption(tool.annotations, Tool.Title),\n () => tool.name,\n );\n\nconst metaOf = (tool: Tool.Any): CatalogMeta =>\n Schema.decodeUnknownSync(CatalogMeta)(\n Option.getOrElse(\n Context.getOption(tool.annotations, Tool.Meta),\n () => ({}),\n ),\n );\n\n/** The scopes a tool declares; the catalog is the one source for them. */\nexport const scopesOf = (tool: Tool.Any): ReadonlyArray<Scope> =>\n metaOf(tool).scopes;\n\nconst toEntry = (tool: Tool.Any): CatalogEntry => {\n const meta = metaOf(tool);\n return {\n name: tool.name,\n title: titleOf(tool),\n description: tool.description ?? \"\",\n inputSchema: Schema.toJsonSchemaDocument(tool.parametersSchema).schema,\n outputSchema: Schema.toJsonSchemaDocument(tool.successSchema).schema,\n scopes: meta.scopes,\n surfaces: meta.surfaces,\n local: meta.local ?? false,\n annotations: {\n readOnly: Context.get(tool.annotations, Tool.Readonly),\n destructive: Context.get(tool.annotations, Tool.Destructive),\n idempotent: Context.get(tool.annotations, Tool.Idempotent),\n openWorld: Context.get(tool.annotations, Tool.OpenWorld),\n consequential: meta.consequential ?? false,\n },\n };\n};\n\n/**\n * The one catalog. MCP, WebMCP, and any future adapter must read this, never\n * maintain a second list of names, descriptions, or schemas.\n */\nexport const catalog: ReadonlyArray<CatalogEntry> = [...tools, ...webTools].map(\n toEntry,\n);\n\n/**\n * The tools a remote endpoint can serve: everything the stdio server offers\n * except the ones that read this machine \u2014 a workspace checkout, or the agent\n * running here. Those stay local by design.\n */\nexport const remoteTools: ReadonlyArray<CatalogEntry> = catalog.filter(\n (entry) => entry.surfaces.includes(\"mcp\") && !entry.local,\n);\n", "import { Tool } from \"effect/ai\";\nimport * as Schema from \"effect/Schema\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** What a tool is allowed to do. Enforced by the server, not by the model. */\nexport const Scope = Schema.Literals([\"read\", \"write\", \"run\", \"watcher\"]);\nexport type Scope = typeof Scope.Type;\n\n/** Where a tool is exposed. A descriptor may be offered by both MCP and the page. */\nexport const Surface = Schema.Literals([\"mcp\", \"web\"]);\nexport type Surface = typeof Surface.Type;\n\n/** Catalog-only metadata carried in the tool's `Tool.Meta` annotation. */\nexport const CatalogMeta = Schema.Struct({\n scopes: Schema.NonEmptyArray(Scope),\n surfaces: Schema.NonEmptyArray(Surface),\n /** A write that changes scientific state and needs explicit confirmation. */\n consequential: Schema.optionalKey(Schema.Boolean),\n /** Needs this machine: a workspace checkout, or the running watcher. */\n local: Schema.optionalKey(Schema.Boolean),\n});\nexport type CatalogMeta = typeof CatalogMeta.Type;\n\nconst readMeta = {\n scopes: [\"read\"],\n surfaces: [\"mcp\"],\n} satisfies CatalogMeta;\n\nconst read = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, readMeta);\n\n/**\n * The catalog is the contract every surface shares. Names are stable and\n * prefixed; descriptions state intent, never a procedure the model must follow.\n */\n/** Identify the signed-in account and the origin this server uses. */\nexport const WhoAmI = read(\"braven_whoami\", {\n description:\n \"Identify the signed-in Braven account and the origin this server is using. Never returns a credential.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n email: Schema.optionalKey(Schema.String),\n origin: Schema.String,\n company: Schema.optionalKey(Schema.String),\n project: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Who am I\");\n\n/** List accessible projects, optionally scoped to one company. */\nexport const ListProjects = read(\"braven_list_projects\", {\n description:\n \"List the projects the signed-in account can access, optionally within one company. Returns ids and names, not experiment data.\",\n parameters: Schema.Struct({\n companyId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n companyId: Schema.String,\n companyName: Schema.optionalKey(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List projects\");\n\n/** Find the Experiments recorded in one project. */\nexport const ListExperiments = read(\"braven_list_experiments\", {\n description:\n \"Find the Experiments in one project by the hardware, pipeline or name they were recorded with. Names are resolved case-insensitively; an unknown name fails instead of returning an empty list. Use get_experiment for Config, Summary, notes and files.\",\n parameters: Schema.Struct({\n projectId: Schema.String,\n /** A Device's name or id. */\n device: Schema.optionalKey(Schema.String),\n /** A pipeline's name or id. */\n pipeline: Schema.optionalKey(Schema.String),\n nameContains: Schema.optionalKey(Schema.String),\n stage: Schema.optionalKey(Schema.Literals([\"simulation\", \"experiment\"])),\n limit: Schema.optionalKey(\n Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 200 })),\n ),\n offset: Schema.optionalKey(\n Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n ),\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n name: Schema.optionalKey(Schema.String),\n createdAt: Schema.String,\n isSimulation: Schema.Boolean,\n childCount: Schema.Int,\n fileCount: Schema.Int,\n deviceName: Schema.optionalKey(Schema.String),\n pipelineName: Schema.optionalKey(Schema.String),\n tags: Schema.Array(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List experiments\");\n\n/** Read one Experiment's record. */\nexport const GetExperiment = read(\"braven_get_experiment\", {\n description:\n \"Read one Experiment: its notes, the hardware and parent it belongs to, its Config and Summary values, its tags, and the names of its files. File contents are not returned.\",\n parameters: Schema.Struct({\n experimentId: Schema.String,\n }),\n success: Schema.Struct({\n id: Schema.String,\n name: Schema.optionalKey(Schema.String),\n notes: Schema.optionalKey(Schema.String),\n createdAt: Schema.String,\n parentId: Schema.optionalKey(Schema.String),\n childCount: Schema.Int,\n deviceName: Schema.optionalKey(Schema.String),\n tags: Schema.Array(Schema.String),\n config: Schema.Record(Schema.String, Schema.String),\n summary: Schema.Record(Schema.String, Schema.String),\n files: Schema.Array(Schema.String),\n }),\n}).annotate(Tool.Title, \"Get an experiment\");\n\n/** Read one Device by name or id. */\nexport const GetHardware = read(\"braven_get_hardware\", {\n description:\n \"Read one piece of hardware in a company by name or id: its type, model, aliases, field values, how many it stands for, and how many Experiments used it. Pass exactly one of name or deviceId.\",\n parameters: Schema.Struct({\n companyId: Schema.String,\n name: Schema.optionalKey(Schema.String),\n deviceId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n typeName: Schema.String,\n model: Schema.optionalKey(Schema.String),\n notes: Schema.optionalKey(Schema.String),\n tracked: Schema.Boolean,\n count: Schema.Int,\n experimentCount: Schema.Int,\n aliases: Schema.Array(Schema.String),\n fields: Schema.Array(\n Schema.Struct({\n key: Schema.String,\n value: Schema.optionalKey(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Get hardware\");\n\n/** Read one report by name or id. */\nexport const GetReport = read(\"braven_get_report\", {\n description:\n \"Read one report in a project by name or id: its segments in order, each with a bounded excerpt of its text. Pass exactly one of name or reportId.\",\n parameters: Schema.Struct({\n projectId: Schema.String,\n name: Schema.optionalKey(Schema.String),\n reportId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n createdAt: Schema.String,\n updatedAt: Schema.String,\n segments: Schema.Array(\n Schema.Struct({\n position: Schema.Int,\n type: Schema.String,\n excerpt: Schema.optionalKey(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Get a report\");\n\n/** List a company's pipelines. */\nexport const ListPipelines = read(\"braven_list_pipelines\", {\n description:\n \"List the pipelines in a company. Use pipeline_status for the head revision and get_pipeline for the definition.\",\n parameters: Schema.Struct({\n companyId: Schema.String,\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n stage: Schema.optionalKey(Schema.String),\n lastRunAt: Schema.optionalKey(Schema.String),\n experimentCount: Schema.Int,\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List pipelines\");\n\n/** Read one pipeline and its head revision. */\nexport const GetPipeline = read(\"braven_get_pipeline\", {\n description:\n \"Read a pipeline in one company: its latest revision, and with includeIr the IR text for inspection, not for editing. The company scopes the lookup.\",\n parameters: Schema.Struct({\n companyId: Schema.String,\n pipelineId: Schema.String,\n includeIr: Schema.optionalKey(Schema.Boolean),\n }),\n success: Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n headRevisionId: Schema.optionalKey(Schema.String),\n headNumber: Schema.optionalKey(Schema.Int),\n contentHash: Schema.optionalKey(Schema.String),\n irText: Schema.optionalKey(Schema.String),\n createdAt: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Get a pipeline\");\n\n/** Report the server's head revision for one pipeline. */\nexport const PipelineStatus = read(\"braven_pipeline_status\", {\n description:\n \"Report the server's head revision for a pipeline. This is the publication view, not the local workspace diff.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n }),\n success: Schema.Struct({\n pipelineId: Schema.String,\n head: Schema.NullOr(\n Schema.Struct({\n revisionId: Schema.String,\n number: Schema.Int,\n contentHash: Schema.String,\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Pipeline status\");\n\n/** List runs for a pipeline or an experiment. */\nexport const ListRuns = read(\"braven_list_runs\", {\n description:\n \"List recent runs for a pipeline or an experiment. Returns each run's identity and status; use get_result for outputs.\",\n parameters: Schema.Struct({\n pipelineId: Schema.optionalKey(Schema.String),\n experimentId: Schema.optionalKey(Schema.String),\n status: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n pipelineId: Schema.String,\n experimentId: Schema.String,\n status: Schema.String,\n createdAt: Schema.String,\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List runs\");\n\n/** Read one immutable result and its output references. */\nexport const GetResult = read(\"braven_get_result\", {\n description:\n \"Read one immutable analysis result: its summary and the references to its output files. Results are never overwritten.\",\n parameters: Schema.Struct({\n resultId: Schema.String,\n }),\n success: Schema.Struct({\n id: Schema.String,\n runId: Schema.optionalKey(Schema.String),\n summary: Schema.Record(Schema.String, Schema.Json),\n outputs: Schema.Array(\n Schema.Struct({\n name: Schema.String,\n contentHash: Schema.optionalKey(Schema.String),\n bytes: Schema.optionalKey(Schema.Int),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Get a result\");\n\n/** List a pipeline's proposals without applying them. */\nexport const ListProposals = read(\"braven_list_proposals\", {\n description:\n \"List dashboard proposals for a pipeline, including whether each is open or resolved. Reading a proposal does not apply it.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n status: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n status: Schema.String,\n rationale: Schema.optionalKey(Schema.String),\n createdAt: Schema.optionalKey(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List proposals\");\n\n/** Compare two immutable results with their axis. */\nexport const CompareResults = read(\"braven_compare_results\", {\n description:\n \"Compare two immutable results with the server's method \u00D7 evidence axis. A delta is never returned without saying which axis moved.\",\n parameters: Schema.Struct({\n leftResultId: Schema.String,\n rightResultId: Schema.String,\n }),\n success: Schema.Struct({\n axis: Schema.String,\n sameMethod: Schema.Boolean,\n sameEvidence: Schema.Boolean,\n sameConfiguration: Schema.Boolean,\n left: Schema.String,\n right: Schema.String,\n }),\n}).annotate(Tool.Title, \"Compare results\");\n\n/** A parameter value a proposal may set. */\nexport const ParamValue = Schema.Union([\n Schema.String,\n Schema.Number,\n Schema.Boolean,\n]);\nexport type ParamValue = typeof ParamValue.Type;\n\n/** A write that creates a proposal; it does not apply anything. */\nconst write = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, false)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"write\"],\n surfaces: [\"mcp\"],\n } satisfies CatalogMeta);\n\n/** Create one Experiment in a project. */\nexport const CreateExperiment = write(\"braven_create_experiment\", {\n description:\n \"Create an Experiment in one project. Name, notes, a Device and a pipeline can be set now and edited later. It writes a real Experiment the team sees; nothing is deleted.\",\n parameters: Schema.Struct({\n projectId: Schema.String,\n name: Schema.optionalKey(Schema.String),\n notes: Schema.optionalKey(Schema.String),\n deviceId: Schema.optionalKey(Schema.String),\n pipelineId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({ id: Schema.String }),\n}).annotate(Tool.Title, \"Create an experiment\");\n\n/** Rename or re-annotate one Experiment. */\nexport const UpdateExperiment = write(\"braven_update_experiment\", {\n description:\n \"Change one Experiment's name or notes. Omitted fields stay as they are; a Device or pipeline is not changed here.\",\n parameters: Schema.Struct({\n projectId: Schema.String,\n experimentId: Schema.String,\n name: Schema.optionalKey(Schema.String),\n notes: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({ id: Schema.String }),\n}).annotate(Tool.Title, \"Update an experiment\");\n\n/** Propose a parameter change against the current head; a human still applies it. */\nexport const ProposeParameter = write(\"braven_propose_parameter\", {\n description:\n \"Create a dashboard proposal for one parameter. The effective target is derived from the IR: a pipeline-bound parameter targets the declaration, a step literal targets the step. It never applies the change.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n param: Schema.String,\n value: ParamValue,\n stepId: Schema.optionalKey(Schema.String),\n baseRevisionId: Schema.optionalKey(Schema.String),\n rationale: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n proposalId: Schema.String,\n baseRevisionId: Schema.String,\n target: Schema.String,\n }),\n}).annotate(Tool.Title, \"Propose a parameter change\");\n\n/** A run executes a pipeline and writes scientific state; it is never idempotent. */\nconst runWrite = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, false)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"run\"],\n surfaces: [\"mcp\"],\n consequential: true,\n } satisfies CatalogMeta);\n\n/** Queue one run at a pinned revision. A human confirms it first. */\nexport const RunPipeline = runWrite(\"braven_run_pipeline\", {\n description:\n \"Queue a pipeline run for one experiment, pinned to a revision \u2014 the one named, or the current head. This executes the pipeline and writes a result, so the user must confirm it.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n experimentId: Schema.String,\n revisionId: Schema.optionalKey(Schema.String),\n parameters: Schema.optionalKey(Schema.Record(Schema.String, ParamValue)),\n dryRun: Schema.optionalKey(Schema.Boolean),\n }),\n success: Schema.Struct({\n runId: Schema.String,\n status: Schema.String,\n revisionId: Schema.String,\n experimentId: Schema.String,\n }),\n}).annotate(Tool.Title, \"Run a pipeline\");\n\n/** Queue a rerun of one run, exact or with the current inputs. */\nexport const Rerun = runWrite(\"braven_rerun\", {\n description:\n \"Queue another run of an existing run \u2014 exact (same pinned inputs) or current-inputs. It writes a new run/result, never overwrites the original, and requires confirmation.\",\n parameters: Schema.Struct({\n runId: Schema.String,\n mode: Schema.Literals([\"exact\", \"current-inputs\"]),\n }),\n success: Schema.Struct({\n runId: Schema.String,\n status: Schema.String,\n revisionId: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Rerun\");\n\n/** Reanalyse one snapshot at a revision; a new result is written. */\nexport const Recompute = runWrite(\"braven_recompute\", {\n description:\n \"Reanalyse a published revision against an existing input snapshot. This writes a new result and leaves the previous one intact; it requires confirmation.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n revisionId: Schema.String,\n inputSnapshotId: Schema.String,\n parameters: Schema.optionalKey(Schema.Record(Schema.String, ParamValue)),\n }),\n success: Schema.Struct({\n runId: Schema.String,\n status: Schema.String,\n inputSnapshotId: Schema.String,\n }),\n}).annotate(Tool.Title, \"Recompute\");\n\n/** Preview or apply the remote proposals into a local checkout. */\nexport const PullPipeline = write(\"braven_pipeline_pull\", {\n description:\n \"Pull a pipeline into a local checkout. By default this is a preview (check) and writes nothing; apply writes only round-trip-safe proposals, after the user confirms. The workspace must be inside the MCP server's working directory and already have .braven/pipeline.json.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n workspacePath: Schema.optionalKey(Schema.String),\n apply: Schema.optionalKey(Schema.Boolean),\n }),\n success: Schema.Struct({\n status: Schema.String,\n message: Schema.String,\n }),\n})\n .annotate(Tool.Meta, {\n scopes: [\"write\"],\n surfaces: [\"mcp\"],\n consequential: true,\n local: true,\n } satisfies CatalogMeta)\n .annotate(Tool.Title, \"Pull a pipeline\");\n\n/** Publish the local checkout as a new immutable revision. */\nexport const PushPipeline = write(\"braven_pipeline_push\", {\n description:\n \"Push a local pipeline checkout. Dry-run by default: it computes the merge and publishes nothing. Pass dryRun:false to publish after the user confirms. A stale base is refused, never overwritten.\",\n parameters: Schema.Struct({\n pipelineId: Schema.optionalKey(Schema.String),\n workspacePath: Schema.optionalKey(Schema.String),\n baseRevisionId: Schema.optionalKey(Schema.String),\n summary: Schema.optionalKey(Schema.String),\n dryRun: Schema.optionalKey(Schema.Boolean),\n }),\n success: Schema.Struct({\n status: Schema.String,\n message: Schema.String,\n }),\n})\n .annotate(Tool.Meta, {\n scopes: [\"write\"],\n surfaces: [\"mcp\"],\n consequential: true,\n local: true,\n } satisfies CatalogMeta)\n .annotate(Tool.Title, \"Push a pipeline\");\n\nconst watcherRead = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"watcher\"],\n surfaces: [\"mcp\"],\n local: true,\n } satisfies CatalogMeta);\n\nconst watcherWrite = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, false)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"watcher\"],\n surfaces: [\"mcp\"],\n consequential: true,\n local: true,\n } satisfies CatalogMeta);\n\n/** Report whether `braven-agent` is running and how much work is pending. */\nexport const WatcherStatus = watcherRead(\"braven_watcher_status\", {\n description:\n \"Report whether the Braven watcher is running, its version/folders, and how many uploads are pending. Safe when no watcher is running: returns available false.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n available: Schema.Boolean,\n version: Schema.optionalKey(Schema.String),\n pid: Schema.optionalKey(Schema.Int),\n folders: Schema.optionalKey(Schema.Array(Schema.String)),\n pending: Schema.optionalKey(Schema.Int),\n paused: Schema.optionalKey(Schema.Boolean),\n startedAt: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Watcher status\");\n\n/** Read the watcher's pending upload queue. */\nexport const WatcherQueue = watcherRead(\"braven_watcher_queue\", {\n description:\n \"Read the watcher's pending upload queue. Fails with watcher-unavailable when no watcher is running.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.Int,\n folder: Schema.String,\n path: Schema.String,\n size: Schema.Int,\n state: Schema.String,\n attempts: Schema.Int,\n reason: Schema.optionalKey(Schema.String),\n updatedAt: Schema.String,\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Watcher queue\");\n\n/** Ask the watcher to reconcile, rescan, and drain now. */\nexport const WatcherSync = watcherWrite(\"braven_watcher_sync\", {\n description:\n \"Ask the running watcher to reconcile its queue, rescan the folders, and upload what changed now. This uploads files; it does not change a pipeline definition.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n ok: Schema.Boolean,\n uploaded: Schema.Int,\n failed: Schema.Int,\n repaired: Schema.Int,\n }),\n}).annotate(Tool.Title, \"Watcher sync now\");\n\n/** Ask the watcher to rescan the folders once. */\nexport const WatcherRescan = watcherWrite(\"braven_watcher_rescan\", {\n description:\n \"Ask the running watcher to walk its folders once and queue files whose content changed. This uploads files; it does not change a pipeline definition.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n ok: Schema.Boolean,\n changed: Schema.Int,\n new: Schema.Int,\n skipped: Schema.Int,\n }),\n}).annotate(Tool.Title, \"Watcher rescan\");\n\n/** Stop claiming upload jobs without stopping the watcher. */\nexport const WatcherPause = watcherWrite(\"braven_watcher_pause\", {\n description:\n \"Pause the running watcher's uploads. The folders are still watched and files are still queued; resume to drain them. Fails with watcher-unavailable when no watcher is running.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({ ok: Schema.Boolean, paused: Schema.Boolean }),\n}).annotate(Tool.Title, \"Pause the watcher\");\n\n/** Open a watched file or folder with the OS default app. */\nexport const WatcherOpen = watcherWrite(\"braven_watcher_open\", {\n description:\n \"Open one file or folder with its default application. The path must lie inside a watched folder; the agent canonicalises it and refuses anything outside. This launches a local app, so the user is asked to confirm first.\",\n parameters: Schema.Struct({ path: Schema.NonEmptyString }),\n success: Schema.Struct({ ok: Schema.Boolean, opened: Schema.String }),\n}).annotate(Tool.Title, \"Open a watched path\");\n\n/** Resume uploads and drain the backlog. */\nexport const WatcherResume = watcherWrite(\"braven_watcher_resume\", {\n description:\n \"Resume the running watcher's uploads and drain what accumulated while paused. Fails with watcher-unavailable when no watcher is running.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({ ok: Schema.Boolean, paused: Schema.Boolean }),\n}).annotate(Tool.Title, \"Resume the watcher\");\n\nconst webRead = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"read\"],\n surfaces: [\"web\"],\n } satisfies CatalogMeta);\n\nconst webWrite = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"write\"],\n surfaces: [\"web\"],\n } satisfies CatalogMeta);\n\nconst webRun = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, false)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"run\"],\n surfaces: [\"web\"],\n consequential: true,\n } satisfies CatalogMeta);\n\n/** Queue a run from the page after the app's confirmation. */\nexport const RunFromPage = webRun(\"braven_run_pipeline_from_page\", {\n description:\n \"Queue a pipeline run for an experiment from the open page, after the user confirms. This executes the pipeline and writes a result.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n experimentId: Schema.String,\n }),\n success: Schema.Struct({\n runId: Schema.String,\n status: Schema.String,\n }),\n}).annotate(Tool.Title, \"Run a pipeline from the page\");\n\n/** The page the user is on, for an in-page browser agent. */\nexport const CurrentContext = webRead(\"braven_current_context\", {\n description:\n \"Return the current Braven page path and, when inside a project, its project id. Read-only context for the open page.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n path: Schema.String,\n projectId: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Current Braven context\");\n\n/** Navigate the page to an experiment's detail view. */\nexport const OpenExperiment = webWrite(\"braven_open_experiment\", {\n description:\n \"Navigate the current Braven tab to an experiment's detail page. Use the page's project when projectId is omitted; a call with neither fails rather than guessing.\",\n parameters: Schema.Struct({\n experimentId: Schema.String,\n projectId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({ path: Schema.String }),\n}).annotate(Tool.Title, \"Open an experiment\");\n\n/** Navigate the page to a project's overview. */\nexport const OpenProject = webWrite(\"braven_open_project\", {\n description:\n \"Navigate the current Braven tab to a project's overview. Use a project id returned by the page or the project list.\",\n parameters: Schema.Struct({ projectId: Schema.String }),\n success: Schema.Struct({ path: Schema.String }),\n}).annotate(Tool.Title, \"Open a project\");\n\n/** Every tool the MCP catalog exposes, in stable order. */\n/** WebMCP-only page tools; never registered on the MCP server. */\nexport const webTools = [\n CurrentContext,\n OpenProject,\n OpenExperiment,\n RunFromPage,\n] as const;\n\nexport const tools = [\n WhoAmI,\n ListProjects,\n ListExperiments,\n GetExperiment,\n CreateExperiment,\n UpdateExperiment,\n GetHardware,\n GetReport,\n ListPipelines,\n GetPipeline,\n PipelineStatus,\n ListRuns,\n GetResult,\n ListProposals,\n CompareResults,\n ProposeParameter,\n RunPipeline,\n Rerun,\n Recompute,\n PullPipeline,\n PushPipeline,\n WatcherStatus,\n WatcherQueue,\n WatcherSync,\n WatcherRescan,\n WatcherPause,\n WatcherOpen,\n WatcherResume,\n] as const;\n", "import * as Schema from \"effect/Schema\";\n\n/** An expected tool failure: the model gets an actionable `isError` result. */\nexport class AgentToolError extends Schema.TaggedError<AgentToolError>()(\n \"AgentToolError\",\n {\n message: Schema.String,\n code: Schema.optionalKey(Schema.String),\n },\n) {}\n", "import { NodeStdio } from \"@effect/platform-node\";\nimport { Effect, Layer, Logger } from \"effect\";\nimport { FetchHttpClient } from \"effect/http\";\nimport { layer as compilerLayer } from \"@braven/pipeline-sync/compiler\";\nimport { McpProtocol, McpServer } from \"effect/ai\";\nimport { layer as accessLayer } from \"./access.ts\";\nimport { BravenApi, make } from \"./api.ts\";\nimport { Credential, layer as credentialLayer } from \"./credential.ts\";\nimport { AgentEmail } from \"./email.ts\";\nimport { AgentTools, handlers } from \"./handlers.ts\";\nimport { layer as watcherLayer } from \"./watcher.ts\";\n\n/** The API service is built from the credential resolved at startup. */\nconst bravenApi = Layer.effect(BravenApi)(\n Effect.map(Credential, (credential) =>\n make({ origin: credential.origin, secret: credential.secret }),\n ),\n);\n\n/** The signed-in email is the local credential's; a remote request has none. */\nconst emailLayer = Layer.effect(AgentEmail)(\n Effect.map(Credential, (credential) =>\n AgentEmail.of(\n credential.email === undefined ? {} : { email: credential.email },\n ),\n ),\n);\n\nconst appLayer = Layer.mergeAll(\n credentialLayer,\n Layer.provide(emailLayer, credentialLayer),\n Layer.provide(bravenApi, credentialLayer),\n FetchHttpClient.layer,\n watcherLayer,\n compilerLayer,\n accessLayer,\n);\n\n/**\n * The stdio server. stdout is the protocol; every log goes to stderr.\n *\n * Both the stateful and stateless revisions are offered on stdio. The remote\n * Worker uses only the stateless revision; see plan 076.\n */\nexport const layer = (version: string) =>\n Layer.mergeAll(\n McpServer.toolkit(AgentTools).pipe(Layer.provideMerge(handlers)),\n ).pipe(\n Layer.provide(\n McpServer.layerStdio({\n name: \"braven\",\n version,\n instructions:\n \"Braven is an R&D experiment tracker. Reads are safe. Creating a \" +\n \"proposal is reversible. Runs and watcher controls change state and \" +\n \"ask the user to confirm before they proceed. A tool outside this \" +\n \"server's BRAVEN_MCP_SCOPES allowlist fails with `forbidden`.\",\n protocols: [McpProtocol.v2026_07_28, McpProtocol.v2025_11_25],\n }),\n ),\n Layer.provide(NodeStdio.layer),\n Layer.provide(appLayer),\n Layer.provide(Logger.layer([Logger.consolePretty()])),\n Layer.provideMerge(Layer.succeed(Logger.LogToStderr, true)),\n );\n\n/** Runs until stdin closes. stdout is the protocol; even layer failures log to stderr. */\nexport const runMcp = (version: string) =>\n Layer.launch(layer(version)).pipe(\n Effect.provide(Logger.layer([Logger.consolePretty()])),\n Effect.provide(Layer.succeed(Logger.LogToStderr, true)),\n );\n", "/**\n * The Python authoring compiler boundary.\n *\n * The compiler owns the IR, its canonical bytes and its diagnostics. The CLI\n * only resolves how to invoke it, passes stdin/stdout/stderr through unchanged\n * and mirrors its exit code (`2` validation, `3` usage/config). Sync compiles\n * through this module so it never grows a second implementation of the\n * contract.\n */\nimport { Console, Context, Effect, Layer, Schema } from \"effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { ChildProcess } from \"effect/process\";\nimport { ChildProcessSpawner } from \"effect/process/ChildProcessSpawner\";\nimport * as Stream from \"effect/Stream\";\nimport { SyncFailure } from \"./errors.ts\";\n\n/** Where the compiler ran and what it said; `code` is the process exit code. */\nexport interface CompilerResult {\n readonly code: number;\n readonly stdout: string;\n readonly stderr: string;\n}\n\n/** `validate -` hands the parent's stdin to the compiler. */\nexport interface CompilerOptions {\n readonly stdin?: \"inherit\" | undefined;\n /** The directory the source path is relative to. */\n readonly cwd?: string | undefined;\n}\n\n/** A compiler invocation that cannot start or cannot be observed. */\nexport class CompilerUnavailable extends Schema.TaggedError<CompilerUnavailable>()(\n \"CompilerUnavailable\",\n { message: Schema.String },\n) {}\n\n/** From the compiler contract: `2` is validation, `3` is usage/config. */\nexport const EXIT_PIPELINE_USAGE = 3;\n\n/** The compiler's own exit status, carried through `effect/cli` unchanged. */\nexport class PipelineExit extends Schema.TaggedError<PipelineExit>()(\n \"PipelineExit\",\n { code: Schema.Int, message: Schema.String },\n) {}\n\n/** The Python compiler boundary; a service so tests never spawn `uv`. */\nexport interface PythonCompilerService {\n readonly run: (\n args: ReadonlyArray<string>,\n options?: CompilerOptions,\n ) => Effect.Effect<CompilerResult, CompilerUnavailable>;\n}\n\nexport class PythonCompiler extends Context.Service<\n PythonCompiler,\n PythonCompilerService\n>()(\"PipelinePythonCompiler\") {}\n\nconst stripTrailingNewline = (text: string): string =>\n text.endsWith(\"\\n\") ? text.slice(0, -1) : text;\n\n/** Print what the compiler printed, then mirror its exit status. */\nconst passThrough = (result: CompilerResult) =>\n Effect.gen(function* () {\n if (result.stdout.length > 0) {\n yield* Console.log(stripTrailingNewline(result.stdout));\n }\n if (result.stderr.length > 0) {\n yield* Console.error(stripTrailingNewline(result.stderr));\n }\n if (result.code !== 0) {\n return yield* Effect.fail(\n new PipelineExit({ code: result.code, message: \"\" }),\n );\n }\n });\n\nconst invoke = (args: ReadonlyArray<string>, options?: CompilerOptions) =>\n Effect.gen(function* () {\n const compiler = yield* PythonCompiler;\n const result = yield* compiler.run(args, options);\n yield* passThrough(result);\n return result;\n });\n\nexport const withSource = (\n command: \"compile\" | \"validate\",\n source: string,\n flags: ReadonlyArray<string>,\n options?: CompilerOptions,\n) => invoke([command, source, ...flags], options);\n\n/**\n * Compiles one source to its canonical IR text without printing it.\n *\n * Diagnostics still go to stderr; a non-zero exit mirrors the compiler's own\n * code, so a validation failure stays exit 2 and a usage failure exit 3.\n */\nexport const compileIr = (source: string, options?: CompilerOptions) =>\n Effect.gen(function* () {\n const compiler = yield* PythonCompiler;\n const result = yield* compiler.run([\"compile\", source, \"--json\"], options);\n if (result.code !== 0) {\n if (result.stderr.length > 0)\n yield* Console.error(stripTrailingNewline(result.stderr));\n return yield* Effect.fail(\n new PipelineExit({ code: result.code, message: \"\" }),\n );\n }\n return result.stdout;\n });\n\n/**\n * One actionable sentence for a compiler that produced no IR.\n *\n * Shared by every compile boundary (local source, staged patch) so a rejected\n * source reads the same wherever it was observed.\n */\nexport const compilerFailure = (\n source: string,\n error: CompilerUnavailable | PipelineExit,\n): SyncFailure =>\n error instanceof CompilerUnavailable\n ? new SyncFailure({ kind: \"source\", message: error.message })\n : new SyncFailure({\n kind: \"source\",\n message:\n error.message.length > 0\n ? error.message\n : `the compiler rejected ${source} (exit ${error.code})`,\n });\n\n/**\n * Resolves the compiler from the CLI's own checkout: a monorepo build uses\n * `uv run --project packages/sdk-python`, an installed CLI uses `python3`.\n * Checking the CLI's location (not the caller's cwd) keeps it deterministic.\n */\nexport const layer = Layer.effect(\n PythonCompiler,\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const spawner = yield* ChildProcessSpawner;\n const project = yield* path.fromFileUrl(\n new URL(\"../../../packages/sdk-python\", import.meta.url),\n );\n const local = yield* fs.exists(path.join(project, \"pyproject.toml\"));\n const bin = local ? \"uv\" : \"python3\";\n const prefix = local\n ? [\"run\", \"--project\", project, \"python\", \"-m\", \"braven.pipeline\"]\n : [\"-m\", \"braven.pipeline\"];\n\n return PythonCompiler.of({\n run: (args, options) =>\n Effect.scoped(\n Effect.gen(function* () {\n const command = ChildProcess.make(\n bin,\n [...prefix, ...args],\n options === undefined\n ? undefined\n : { cwd: options.cwd, stdin: options.stdin },\n );\n const handle = yield* spawner.spawn(command).pipe(\n Effect.mapError(\n (error) =>\n new CompilerUnavailable({\n message: `cannot run ${bin}: ${error.message}`,\n }),\n ),\n );\n const [stdout, stderr, code] = yield* Effect.all(\n [\n Stream.mkString(Stream.decodeText(handle.stdout)),\n Stream.mkString(Stream.decodeText(handle.stderr)),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n ).pipe(\n Effect.mapError(\n (error) =>\n new CompilerUnavailable({\n message: `${bin} could not be observed: ${error.message}`,\n }),\n ),\n );\n return { stdout, stderr, code };\n }),\n ),\n });\n }),\n);\n", "/**\n * The engine's typed failures.\n *\n * The package never throws and never speaks CLI exit codes: every expected\n * failure is a `SyncFailure` whose `kind` says what the caller can do about it.\n * The CLI maps the kind to its exit code; the watcher maps it to a panel state.\n */\nimport { Effect } from \"effect\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\n\n/** The four recoverable failure classes, one per caller decision. */\nexport const SyncFailureKind = Schema.Literals([\n \"usage\",\n \"conflict\",\n \"network\",\n \"source\",\n]);\nexport type SyncFailureKind = typeof SyncFailureKind.Type;\n\n/** One expected failure: what happened, and which decision it forces. */\nexport class SyncFailure extends Schema.TaggedError<SyncFailure>()(\n \"SyncFailure\",\n { kind: SyncFailureKind, message: Schema.String },\n) {}\n\n/** Fails with one `SyncFailure`. */\nexport const fail = (kind: SyncFailureKind, message: string) =>\n Effect.fail(new SyncFailure({ kind, message }));\n\n/** Collapses provider text to one line, bounded so a stack dump cannot leak. */\nexport const oneLine = (value: unknown): string =>\n Str.trim(Str.replace(/\\s+/g, \" \")(String(value))).slice(0, 300);\n", "import { Context, Effect, Layer, Option } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\nimport type { Tool } from \"effect/ai\";\nimport { Environment } from \"@braven/identity-store/environment\";\nimport { scopesOf } from \"./catalog.ts\";\nimport { AgentToolError } from \"./errors.ts\";\nimport { Scope } from \"./tools.ts\";\n\n/** Every scope a server grants when the environment restricts none. */\nexport const ALL_SCOPES: ReadonlyArray<Scope> = [\n \"read\",\n \"write\",\n \"run\",\n \"watcher\",\n];\n\nconst decodeScope = Schema.decodeUnknownOption(Scope);\n\n/**\n * Parses `BRAVEN_MCP_SCOPES=read,write`. An unknown or empty allowlist is a\n * startup failure: a typo must not silently grant the default.\n */\nexport const parseScopes = (\n input: string,\n): Effect.Effect<ReadonlyArray<Scope>, AgentToolError> =>\n Effect.gen(function* () {\n const names = Arr.filter(\n Arr.map(Str.split(\",\")(input), Str.trim),\n Str.isNonEmpty,\n );\n const unknown = Arr.filter(names, (name) =>\n Option.isNone(decodeScope(name)),\n );\n if (!Arr.isReadonlyArrayEmpty(unknown)) {\n return yield* Effect.fail(\n new AgentToolError({\n message: `Unknown MCP scope(s): ${Arr.join(unknown, \", \")}. Use any of ${Arr.join(ALL_SCOPES, \", \")}.`,\n code: \"invalid-scope\",\n }),\n );\n }\n if (Arr.isReadonlyArrayEmpty(names)) {\n return yield* Effect.fail(\n new AgentToolError({\n message: `BRAVEN_MCP_SCOPES names no scope. Use any of ${Arr.join(ALL_SCOPES, \", \")}.`,\n code: \"invalid-scope\",\n }),\n );\n }\n return Arr.dedupe(\n Arr.getSomes(Arr.map(names, (name) => decodeScope(name))),\n );\n });\n\n/** The scopes this server process may use; every tool declares one. */\nexport interface AccessValue {\n readonly scopes: ReadonlyArray<Scope>;\n}\n\nexport class Scopes extends Context.Service<Scopes, AccessValue>()(\n \"braven/Access\",\n) {}\n\n/** The allowlist is the environment's, or every scope when it names none. */\nexport const layer = Layer.effect(Scopes)(\n Effect.gen(function* () {\n const environment = yield* Environment;\n const configured = Option.fromNullishOr(\n environment.values.BRAVEN_MCP_SCOPES,\n ).pipe(Option.filter(Str.isNonEmpty));\n const scopes = yield* Option.match(configured, {\n onNone: () => Effect.succeed(ALL_SCOPES),\n onSome: parseScopes,\n });\n return Scopes.of({ scopes });\n }),\n);\n\n/**\n * Refuses a tool whose declared scope this server was not granted, before the\n * action's effect runs. The catalog decides the scope; a handler never does.\n */\nexport const permit = <A, E, R>(\n access: AccessValue,\n tool: Tool.Any,\n run: Effect.Effect<A, E, R>,\n): Effect.Effect<A, E | AgentToolError, R> =>\n Arr.some(scopesOf(tool), (scope) => Arr.contains(access.scopes, scope))\n ? run\n : Effect.fail(\n new AgentToolError({\n message:\n `${tool.name} needs the ${scopesOf(tool).join(\"/\")} scope; ` +\n `this server allows ${access.scopes.join(\", \")}. Nothing was changed. ` +\n `Set BRAVEN_MCP_SCOPES to include it, or run it from the CLI or dashboard.`,\n code: \"forbidden\",\n }),\n );\n", "import { Context, Layer, Match, Option } from \"effect\";\nimport * as Str from \"effect/String\";\n\n/** The hosted API origin used when neither the flag nor the environment names one. */\nexport const DEFAULT_API_ORIGIN = \"https://api.bravenlab.com\";\n\n/** The hosted web origin that performs the browser sign-in. */\nexport const DEFAULT_WEB_ORIGIN = \"https://bravenlab.com\";\n\n/** The public client id `braven login --device` presents to better-auth. */\nexport const DEFAULT_DEVICE_CLIENT_ID = \"braven-cli\";\n\n/**\n * The process facts the identity convention depends on.\n *\n * `values` is the process environment (`process.env`) captured at the CLI's\n * boundary; everything below is a pure function of this shape, so tests point\n * the store at a temp directory and a literal environment.\n */\nexport interface EnvironmentShape {\n readonly platform: NodeJS.Platform;\n readonly home: string;\n /** The directory the command was run in; `.braven/` lives here. */\n readonly cwd: string;\n readonly values: Readonly<Record<string, string | undefined>>;\n}\n\n/** The process environment, injected so no command reads `process.env` directly. */\nexport class Environment extends Context.Service<\n Environment,\n EnvironmentShape\n>()(\"braven/Environment\") {}\n\n/** Provides a fixed environment; `bin.ts` supplies the real one. */\nexport const environmentLayer = (\n shape: EnvironmentShape,\n): Layer.Layer<Environment> => Layer.succeed(Environment)(shape);\n\nconst value = (shape: EnvironmentShape, name: string): Option.Option<string> =>\n Option.fromNullishOr(shape.values[name]).pipe(Option.filter(Str.isNonEmpty));\n\nconst stripTrailing = (path: string): string =>\n Str.replace(/[\\\\/]+$/, \"\")(path);\n\n/**\n * The non-secret config file's path \u2014 the convention in\n * `packages/identity/README.md`, mirrored exactly:\n *\n * - macOS: `~/Library/Application Support/braven/config.json` (XDG wins)\n * - Linux: `${XDG_CONFIG_HOME:-~/.config}/braven/config.json`\n * - Windows: `%APPDATA%\\braven\\config.json`\n */\nexport const configPath = (shape: EnvironmentShape): string => {\n const xdg = value(shape, \"XDG_CONFIG_HOME\");\n const base = Match.value(shape.platform).pipe(\n Match.when(\"darwin\", () =>\n Option.getOrElse(xdg, () => `${shape.home}/Library/Application Support`),\n ),\n Match.when(\"win32\", () =>\n Option.getOrElse(\n value(shape, \"APPDATA\"),\n () => `${shape.home}\\\\AppData\\\\Roaming`,\n ),\n ),\n Match.orElse(() => Option.getOrElse(xdg, () => `${shape.home}/.config`)),\n );\n const separator = shape.platform === \"win32\" ? \"\\\\\" : \"/\";\n return `${stripTrailing(base)}${separator}braven${separator}config.json`;\n};\n\n/**\n * `--origin` > `$BRAVEN_API_URL` > the stored default > the hosted API; trailing\n * slashes go. The stored default is what the shell's Settings \u2192 Backend writes,\n * so an agent launched later joins the same server without a flag.\n */\nexport const resolveOrigin = (\n flag: Option.Option<string>,\n shape: EnvironmentShape,\n stored: Option.Option<string> = Option.none(),\n): string =>\n stripTrailing(\n Option.getOrElse(flag, () =>\n Option.getOrElse(value(shape, \"BRAVEN_API_URL\"), () =>\n Option.getOrElse(stored, () => DEFAULT_API_ORIGIN),\n ),\n ),\n );\n\n/** `--web-origin` > `$BRAVEN_WEB_URL` > the stored default > the hosted web app. */\nexport const resolveWebOrigin = (\n flag: Option.Option<string>,\n shape: EnvironmentShape,\n stored: Option.Option<string> = Option.none(),\n): string =>\n stripTrailing(\n Option.getOrElse(flag, () =>\n Option.getOrElse(value(shape, \"BRAVEN_WEB_URL\"), () =>\n Option.getOrElse(stored, () => DEFAULT_WEB_ORIGIN),\n ),\n ),\n );\n\n/** `--client-id` > `$BRAVEN_CLIENT_ID` > `braven-cli`. */\nexport const resolveClientId = (\n flag: Option.Option<string>,\n shape: EnvironmentShape,\n): string =>\n Option.getOrElse(flag, () =>\n Option.getOrElse(\n value(shape, \"BRAVEN_CLIENT_ID\"),\n () => DEFAULT_DEVICE_CLIENT_ID,\n ),\n );\n\n/** `--project-id` > `$BRAVEN_PROJECT_ID`; the store's default is the fallback. */\nexport const resolveProjectFlag = (\n flag: Option.Option<string>,\n shape: EnvironmentShape,\n): Option.Option<string> =>\n Option.isSome(flag) ? flag : value(shape, \"BRAVEN_PROJECT_ID\");\n", "import { Context, Effect, Layer, Option, Schema } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as P from \"effect/Predicate\";\nimport * as R from \"effect/Record\";\nimport * as Str from \"effect/String\";\nimport type * as HttpClient from \"effect/http/HttpClient\";\nimport {\n decodePipelineIr,\n SetParamOp,\n SetPipelineParamOp,\n} from \"@braven/pipeline-ir\";\nimport {\n PipelineApiError,\n rpcRequest,\n type Router,\n} from \"@braven/pipeline-sync\";\nimport { AgentToolError } from \"./errors.ts\";\nimport { resolveParamTarget } from \"./params.ts\";\n\n/** The API rows the read tools need. Excess wire fields are ignored. */\nclass ProjectRow extends Schema.Class<ProjectRow>(\"AgentProjectRow\")({\n id: Schema.String,\n name: Schema.String,\n company_id: Schema.String,\n company_name: Schema.NullOr(Schema.String),\n}) {}\n\nclass PipelineRow extends Schema.Class<PipelineRow>(\"AgentPipelineRow\")({\n id: Schema.String,\n name: Schema.String,\n stage: Schema.NullOr(Schema.String),\n created_at: Schema.String,\n last_run_at: Schema.NullOr(Schema.String),\n experiment_count: Schema.Number,\n}) {}\n\nclass HeadRow extends Schema.Class<HeadRow>(\"AgentHeadRow\")({\n revisionId: Schema.String,\n number: Schema.Int,\n contentHash: Schema.String,\n}) {}\n\nclass RevisionRow extends Schema.Class<RevisionRow>(\"AgentRevisionRow\")({\n revision: Schema.Struct({\n id: Schema.String,\n number: Schema.Int,\n contentHash: Schema.String,\n }),\n ir: Schema.String,\n}) {}\n\nclass RunRow extends Schema.Class<RunRow>(\"AgentRunRow\")({\n id: Schema.String,\n pipeline_id: Schema.String,\n experiment_id: Schema.String,\n status: Schema.String,\n revision_id: Schema.NullOr(Schema.String),\n created_at: Schema.String,\n}) {}\n\nclass RecomputeRow extends Schema.Class<RecomputeRow>(\"AgentRecomputeRow\")({\n run: Schema.Struct({\n id: Schema.String,\n status: Schema.String,\n revision_id: Schema.NullOr(Schema.String),\n }),\n input_snapshot_id: Schema.String,\n}) {}\n\nclass ResultRow extends Schema.Class<ResultRow>(\"AgentResultRow\")({\n id: Schema.String,\n run_id: Schema.String,\n summary: Schema.Record(Schema.String, Schema.Json),\n outputs: Schema.Array(\n Schema.Struct({\n name: Schema.String,\n content_hash: Schema.NullOr(Schema.String),\n bytes: Schema.NullOr(Schema.Number),\n }),\n ),\n}) {}\n\nclass ProposalRow extends Schema.Class<ProposalRow>(\"AgentProposalRow\")({\n id: Schema.String,\n status: Schema.String,\n rationale: Schema.NullOr(Schema.String),\n createdAt: Schema.optionalKey(Schema.String),\n}) {}\n\n/** An Experiment-list row: the summary the dashboard list reads. */\nclass ExperimentRow extends Schema.Class<ExperimentRow>(\"AgentExperimentRow\")({\n id: Schema.String,\n name: Schema.NullOr(Schema.String),\n created_at: Schema.String,\n is_simulation: Schema.Boolean,\n child_count: Schema.Int,\n file_count: Schema.Int,\n device_id: Schema.NullOr(Schema.String),\n device_name: Schema.NullOr(Schema.String),\n pipeline_id: Schema.NullOr(Schema.String),\n pipeline_name: Schema.NullOr(Schema.String),\n tags: Schema.Array(Schema.Struct({ name: Schema.String })),\n}) {}\n\n/** One Experiment's own record: notes, lineage, files, and its metadata. */\nclass ExperimentDetailRow extends Schema.Class<ExperimentDetailRow>(\n \"AgentExperimentDetailRow\",\n)({\n id: Schema.String,\n name: Schema.NullOr(Schema.String),\n notes: Schema.NullOr(Schema.String),\n created_at: Schema.String,\n parent_experiment_id: Schema.NullOr(Schema.String),\n child_count: Schema.Int,\n device_name: Schema.NullOr(Schema.String),\n tags: Schema.Array(Schema.Struct({ name: Schema.String })),\n metadata: Schema.Array(\n Schema.Struct({\n key: Schema.String,\n value: Schema.NullOr(Schema.String),\n category: Schema.String,\n }),\n ),\n files: Schema.Array(Schema.Struct({ filename: Schema.String })),\n}) {}\n\n/** A company Device as the list returns it: enough to resolve a name. */\nclass DeviceRow extends Schema.Class<DeviceRow>(\"AgentDeviceRow\")({\n id: Schema.String,\n name: Schema.String,\n type_name: Schema.String,\n}) {}\n\n/** The id a create/update answers with; the rest of the row is not needed. */\nclass IdRow extends Schema.Class<IdRow>(\"AgentIdRow\")({ id: Schema.String }) {}\n\n/** One Device's full record: model, aliases, counts and field values. */\nclass HardwareRow extends Schema.Class<HardwareRow>(\"AgentHardwareRow\")({\n id: Schema.String,\n name: Schema.String,\n type_name: Schema.String,\n model: Schema.NullOr(Schema.String),\n notes: Schema.NullOr(Schema.String),\n tracked: Schema.Boolean,\n count: Schema.Int,\n experiment_count: Schema.Int,\n aliases: Schema.Array(Schema.String),\n field_values: Schema.Array(\n Schema.Struct({\n field_key: Schema.String,\n value: Schema.NullOr(Schema.String),\n }),\n ),\n}) {}\n\n/** A report's identity, for resolving one by name. */\nclass ReportSummaryRow extends Schema.Class<ReportSummaryRow>(\n \"AgentReportSummaryRow\",\n)({\n id: Schema.String,\n name: Schema.String,\n created_at: Schema.String,\n}) {}\n\n/** A report with its segments, in order. */\nclass ReportRow extends Schema.Class<ReportRow>(\"AgentReportRow\")({\n id: Schema.String,\n name: Schema.String,\n created_at: Schema.String,\n updated_at: Schema.String,\n segments: Schema.Array(\n Schema.Struct({\n position: Schema.Int,\n type: Schema.String,\n content: Schema.NullOr(Schema.String),\n }),\n ),\n}) {}\n\n/** A run `pipelineRuns.create` queued, at the revision it pinned. */\nclass CreatedRunRow extends Schema.Class<CreatedRunRow>(\"AgentCreatedRunRow\")({\n id: Schema.String,\n status: Schema.String,\n revision_id: Schema.String,\n}) {}\n\nclass ComparisonRow extends Schema.Class<ComparisonRow>(\"AgentComparisonRow\")({\n axis: Schema.String,\n same_method: Schema.Boolean,\n same_evidence: Schema.Boolean,\n same_configuration: Schema.Boolean,\n left: Schema.Struct({ id: Schema.String }),\n right: Schema.Struct({ id: Schema.String }),\n}) {}\n\n/** A project the caller can access. */\nexport interface ProjectSummary {\n readonly id: string;\n readonly name: string;\n readonly companyId: string;\n readonly companyName?: string;\n}\n\n/** A company pipeline without its definition. */\nexport interface PipelineSummary {\n readonly id: string;\n readonly name: string;\n readonly stage?: string;\n readonly lastRunAt?: string;\n readonly experimentCount: number;\n}\n\nexport interface PipelineDetail extends PipelineSummary {\n readonly headRevisionId?: string;\n readonly headNumber?: number;\n readonly contentHash?: string;\n readonly irText?: string;\n readonly createdAt?: string;\n}\n\n/** The identity of a published head revision. */\nexport interface Head {\n readonly revisionId: string;\n readonly number: number;\n readonly contentHash: string;\n}\n\n/** A run's identity and terminal state. */\nexport interface RunSummary {\n readonly id: string;\n readonly pipelineId: string;\n readonly experimentId: string;\n readonly status: string;\n readonly createdAt: string;\n}\n\n/** A run's identity and the revision it pins. */\nexport interface RunHandle {\n readonly runId: string;\n readonly status: string;\n readonly revisionId: string;\n readonly experimentId: string;\n}\n\n/** An immutable result and its output references. */\nexport interface ResultDetail {\n readonly id: string;\n readonly runId: string;\n readonly summary: Readonly<Record<string, Schema.Json>>;\n readonly outputs: ReadonlyArray<{\n readonly name: string;\n readonly contentHash?: string;\n readonly bytes?: number;\n }>;\n}\n\n/** A dashboard proposal without its patch. */\nexport interface ProposalSummary {\n readonly id: string;\n readonly status: string;\n readonly rationale?: string;\n readonly createdAt?: string;\n}\n\n/** Two result ids with the axis the server derived. */\nexport interface ComparisonDetail {\n readonly axis: string;\n readonly sameMethod: boolean;\n readonly sameEvidence: boolean;\n readonly sameConfiguration: boolean;\n readonly left: string;\n readonly right: string;\n}\n\n/** An Experiment as a list row: identity, what it was measured on, its tags. */\nexport interface ExperimentSummary {\n readonly id: string;\n readonly name?: string;\n readonly createdAt: string;\n readonly isSimulation: boolean;\n readonly childCount: number;\n readonly fileCount: number;\n readonly deviceName?: string;\n readonly pipelineName?: string;\n readonly tags: ReadonlyArray<string>;\n}\n\n/** Which Experiments to read: a names-or-ids filter, never a raw query blob. */\nexport interface ExperimentQuery {\n readonly projectId: string;\n /** A Device's name or id. */\n readonly device?: string;\n /** A pipeline's name or id. */\n readonly pipeline?: string;\n /** A case-insensitive part of the Experiment's name. */\n readonly nameContains?: string;\n readonly stage?: \"simulation\" | \"experiment\";\n readonly limit?: number;\n readonly offset?: number;\n}\n\n/** One Experiment with its notes, files and Config/Summary values. */\nexport interface ExperimentDetail {\n readonly id: string;\n readonly name?: string;\n readonly notes?: string;\n readonly createdAt: string;\n readonly parentId?: string;\n readonly childCount: number;\n readonly deviceName?: string;\n readonly tags: ReadonlyArray<string>;\n readonly config: Readonly<Record<string, string>>;\n readonly summary: Readonly<Record<string, string>>;\n readonly files: ReadonlyArray<string>;\n}\n\n/** One Device: what it is, what it is made of, and what it was measured in. */\nexport interface HardwareDetail {\n readonly id: string;\n readonly name: string;\n readonly typeName: string;\n readonly model?: string;\n readonly notes?: string;\n readonly tracked: boolean;\n readonly count: number;\n readonly experimentCount: number;\n readonly aliases: ReadonlyArray<string>;\n readonly fields: ReadonlyArray<{\n readonly key: string;\n readonly value?: string;\n }>;\n}\n\n/** A report: its segments, with a bounded excerpt of each one's text. */\nexport interface ReportDetail {\n readonly id: string;\n readonly name: string;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly segments: ReadonlyArray<{\n readonly position: number;\n readonly type: string;\n readonly excerpt?: string;\n }>;\n}\n\n/** The API surface the agent tools need, implemented over the API's oRPC wire. */\nexport class BravenApi extends Context.Service<\n BravenApi,\n {\n /** The origin every call goes to; whoami reports it. */\n readonly origin: string;\n readonly listProjects: (input: {\n readonly companyId?: string;\n }) => Effect.Effect<\n ReadonlyArray<ProjectSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly listPipelines: (input: {\n readonly companyId: string;\n }) => Effect.Effect<\n ReadonlyArray<PipelineSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly getPipeline: (input: {\n readonly companyId: string;\n readonly pipelineId: string;\n readonly includeIr?: boolean;\n }) => Effect.Effect<PipelineDetail, AgentToolError, HttpClient.HttpClient>;\n readonly pipelineStatus: (input: {\n readonly pipelineId: string;\n }) => Effect.Effect<\n { readonly pipelineId: string; readonly head: Head | null },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly listRuns: (input: {\n readonly pipelineId?: string;\n readonly experimentId?: string;\n readonly status?: string;\n }) => Effect.Effect<\n ReadonlyArray<RunSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly getResult: (input: {\n readonly resultId: string;\n }) => Effect.Effect<ResultDetail, AgentToolError, HttpClient.HttpClient>;\n readonly listProposals: (input: {\n readonly pipelineId: string;\n readonly status?: string;\n }) => Effect.Effect<\n ReadonlyArray<ProposalSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly compare: (input: {\n readonly leftResultId: string;\n readonly rightResultId: string;\n }) => Effect.Effect<\n ComparisonDetail,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly listExperiments: (\n input: ExperimentQuery,\n ) => Effect.Effect<\n ReadonlyArray<ExperimentSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly createExperiment: (input: {\n readonly projectId: string;\n readonly name?: string;\n readonly notes?: string;\n readonly deviceId?: string;\n readonly pipelineId?: string;\n }) => Effect.Effect<\n { readonly id: string },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly updateExperiment: (input: {\n readonly projectId: string;\n readonly experimentId: string;\n readonly name?: string;\n readonly notes?: string;\n }) => Effect.Effect<\n { readonly id: string },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly getExperiment: (input: {\n readonly experimentId: string;\n }) => Effect.Effect<\n ExperimentDetail,\n AgentToolError,\n HttpClient.HttpClient\n >;\n /** Resolve a name or id to one Device, then read its full record. */\n readonly getHardware: (input: {\n readonly companyId: string;\n readonly deviceId?: string;\n readonly name?: string;\n }) => Effect.Effect<HardwareDetail, AgentToolError, HttpClient.HttpClient>;\n /** Resolve a name or id to one report, then read its segments. */\n readonly getReport: (input: {\n readonly projectId: string;\n readonly reportId?: string;\n readonly name?: string;\n }) => Effect.Effect<ReportDetail, AgentToolError, HttpClient.HttpClient>;\n readonly proposeParameter: (input: {\n readonly pipelineId: string;\n readonly param: string;\n readonly value: string | number | boolean;\n readonly stepId?: string;\n readonly baseRevisionId?: string;\n readonly rationale?: string;\n }) => Effect.Effect<\n {\n readonly proposalId: string;\n readonly baseRevisionId: string;\n readonly target: string;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly createRun: (input: {\n readonly pipelineId: string;\n readonly experimentId: string;\n readonly revisionId: string;\n readonly parameters?: Readonly<Record<string, string | number | boolean>>;\n readonly dryRun: boolean;\n }) => Effect.Effect<RunHandle, AgentToolError, HttpClient.HttpClient>;\n readonly rerun: (input: {\n readonly runId: string;\n readonly mode: \"exact\" | \"current-inputs\";\n }) => Effect.Effect<\n {\n readonly runId: string;\n readonly status: string;\n readonly revisionId?: string;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly recompute: (input: {\n readonly pipelineId: string;\n readonly revisionId: string;\n readonly inputSnapshotId: string;\n readonly parameters?: Readonly<Record<string, string | number | boolean>>;\n }) => Effect.Effect<\n {\n readonly runId: string;\n readonly status: string;\n readonly inputSnapshotId: string;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n }\n>()(\"braven/BravenApi\") {}\n\n/**\n * An absent wire code is an absent key, not `undefined`: `optionalKey` rejects\n * a present-but-undefined value, and constructing the error would throw.\n */\nconst toToolError = (error: PipelineApiError): AgentToolError =>\n Option.match(error.code, {\n onNone: () => new AgentToolError({ message: error.message }),\n onSome: (code) => new AgentToolError({ message: error.message, code }),\n });\n\n/** Builds the API service for one credential. The secret never leaves the header. */\nexport const make = (options: {\n readonly origin: string;\n readonly secret: string;\n}): BravenApi[\"Service\"] => {\n const call = <A>(\n router: Router,\n procedure: string,\n body: unknown,\n schema: Schema.ConstraintDecoder<A>,\n headers: Readonly<Record<string, string>> = {},\n ) =>\n rpcRequest(options, procedure, body, schema, router, headers).pipe(\n Effect.mapError(toToolError),\n );\n\n /** A project-scoped procedure reads the Project from the header. */\n const inProject = (projectId: string) => ({ \"x-project-id\": projectId });\n\n const projectCompany = (projectId: string) =>\n call<ReadonlyArray<ProjectRow>>(\n \"projects\",\n \"list\",\n {},\n Schema.Array(ProjectRow),\n ).pipe(\n Effect.flatMap((rows) =>\n Option.match(\n Arr.findFirst(rows, (row) => row.id === projectId),\n {\n onNone: () =>\n Effect.fail(\n new AgentToolError({\n message: `No accessible project ${projectId}`,\n code: \"project-not-found\",\n }),\n ),\n onSome: (row) => Effect.succeed(row.company_id),\n },\n ),\n ),\n );\n\n /** A name or id to one id. Two rows sharing a name are refused, not guessed:\n * reading the wrong Device or report as \"the\" match is worse than failing. */\n const resolveId = <A extends { readonly id: string; readonly name: string }>(\n rows: ReadonlyArray<A>,\n options: {\n readonly label: string;\n readonly scope: string;\n readonly nameOrId: string;\n readonly missing: string;\n readonly ambiguous: string;\n },\n ) => {\n const key = options.nameOrId.toLowerCase();\n const matches = Arr.filter(\n rows,\n (row) => row.id === options.nameOrId || row.name.toLowerCase() === key,\n );\n return Arr.match(matches, {\n onEmpty: () =>\n Effect.fail(\n new AgentToolError({\n message: `No ${options.label} named ${options.nameOrId} in this ${options.scope}`,\n code: options.missing,\n }),\n ),\n onNonEmpty: ([first, ...rest]) =>\n Arr.isReadonlyArrayEmpty(rest)\n ? Effect.succeed(first.id)\n : Effect.fail(\n new AgentToolError({\n message: `${matches.length} ${options.label}s are named ${options.nameOrId}; pass an id instead`,\n code: options.ambiguous,\n }),\n ),\n });\n };\n\n /** A Device by name (case-insensitive) or id; the API never resolves names. */\n const deviceIdOf = (companyId: string, nameOrId: string) =>\n call<ReadonlyArray<DeviceRow>>(\n \"devices\",\n \"listDevices\",\n { companyId },\n Schema.Array(DeviceRow),\n ).pipe(\n Effect.flatMap((rows) =>\n resolveId(rows, {\n label: \"hardware\",\n scope: \"company\",\n nameOrId,\n missing: \"hardware-not-found\",\n ambiguous: \"ambiguous-hardware\",\n }),\n ),\n );\n\n const pipelineIdOf = (companyId: string, nameOrId: string) =>\n call<ReadonlyArray<PipelineRow>>(\n \"pipelines\",\n \"list\",\n { companyId },\n Schema.Array(PipelineRow),\n ).pipe(\n Effect.flatMap((rows) =>\n resolveId(rows, {\n label: \"pipeline\",\n scope: \"company\",\n nameOrId,\n missing: \"pipeline-not-found\",\n ambiguous: \"ambiguous-pipeline\",\n }),\n ),\n );\n\n const reportIdOf = (projectId: string, name: string) =>\n call<ReadonlyArray<ReportSummaryRow>>(\n \"reports\",\n \"list\",\n {},\n Schema.Array(ReportSummaryRow),\n inProject(projectId),\n ).pipe(\n Effect.flatMap((rows) =>\n resolveId(rows, {\n label: \"report\",\n scope: \"project\",\n nameOrId: name,\n missing: \"report-not-found\",\n ambiguous: \"ambiguous-report\",\n }),\n ),\n );\n\n /** The segments of a report, each text cut to what a tool result may carry. */\n const EXCERPT = 240;\n const decodeDocument = Schema.decodeUnknownOption(\n Schema.fromJsonString(Schema.Unknown),\n );\n\n /** A rich-text document's words in reading order: TipTap keeps them in\n * `text` nodes, so the keys are not read out as content. */\n const wordsOf = (value: unknown): ReadonlyArray<string> =>\n Arr.isArray(value)\n ? Arr.flatMap(value, wordsOf)\n : P.isObject(value)\n ? Arr.flatMap(R.toEntries(value), ([key, inner]) =>\n key === \"text\" && P.isString(inner) ? [inner] : wordsOf(inner),\n )\n : [];\n\n /** A segment's text: a rich-text document's words, or the raw content. */\n const excerptOf = (content: string | null) => {\n if (content === null) return {};\n const text = Option.match(decodeDocument(content), {\n onNone: () => content,\n onSome: (document) => Str.trim(Arr.join(wordsOf(document), \" \")),\n });\n return Str.isNonEmpty(text) ? { excerpt: text.slice(0, EXCERPT) } : {};\n };\n\n /** One metadata category as a key\u2192value map; an empty value is dropped. */\n const valuesOf = (\n entries: ReadonlyArray<{\n readonly key: string;\n readonly value: string | null;\n readonly category: string;\n }>,\n category: string,\n ): Readonly<Record<string, string>> =>\n R.fromEntries(\n Arr.flatMap(entries, (entry) =>\n entry.category === category && entry.value !== null\n ? [[entry.key, entry.value] as const]\n : [],\n ),\n );\n\n return {\n origin: options.origin,\n listProjects: (input) =>\n call<ReadonlyArray<ProjectRow>>(\n \"projects\",\n \"list\",\n { companyId: input.companyId },\n Schema.Array(ProjectRow),\n ).pipe(\n Effect.map((rows) =>\n rows.map((row) => ({\n id: row.id,\n name: row.name,\n companyId: row.company_id,\n ...(row.company_name === null\n ? {}\n : { companyName: row.company_name }),\n })),\n ),\n ),\n listPipelines: (input) =>\n call<ReadonlyArray<PipelineRow>>(\n \"pipelines\",\n \"list\",\n { companyId: input.companyId },\n Schema.Array(PipelineRow),\n ).pipe(\n Effect.map((rows) =>\n rows.map((row) => ({\n id: row.id,\n name: row.name,\n experimentCount: row.experiment_count,\n ...(row.stage === null ? {} : { stage: row.stage }),\n ...(row.last_run_at === null ? {} : { lastRunAt: row.last_run_at }),\n })),\n ),\n ),\n getPipeline: ({ companyId, pipelineId, includeIr = false }) =>\n Effect.gen(function* () {\n // Company-scoped and read-only: never `pipelines.get` (auth-only) or\n // `pipelines.list` (imports legacy scripts as a side effect).\n const pipeline = yield* call<PipelineRow>(\n \"pipelines\",\n \"getInCompany\",\n { companyId, pipelineId },\n PipelineRow,\n );\n const head = yield* call<HeadRow | null>(\n \"pipelines\",\n \"head\",\n { pipelineId },\n Schema.NullOr(HeadRow),\n );\n const revision =\n includeIr && head !== null\n ? yield* call<RevisionRow>(\n \"pipelines\",\n \"revision\",\n { pipelineId, revisionId: head.revisionId },\n RevisionRow,\n )\n : undefined;\n return {\n id: pipeline.id,\n name: pipeline.name,\n createdAt: pipeline.created_at,\n experimentCount: pipeline.experiment_count,\n ...(pipeline.stage === null ? {} : { stage: pipeline.stage }),\n ...(pipeline.last_run_at === null\n ? {}\n : { lastRunAt: pipeline.last_run_at }),\n ...(head === null\n ? {}\n : {\n headRevisionId: head.revisionId,\n headNumber: head.number,\n contentHash: head.contentHash,\n }),\n ...(revision === undefined ? {} : { irText: revision.ir }),\n };\n }),\n pipelineStatus: ({ pipelineId }) =>\n call<HeadRow | null>(\n \"pipelines\",\n \"head\",\n { pipelineId },\n Schema.NullOr(HeadRow),\n ).pipe(\n Effect.map((head) => ({\n pipelineId,\n head: head === null ? null : head,\n })),\n ),\n listRuns: (input) =>\n call<ReadonlyArray<RunRow>>(\n \"pipelineRuns\",\n \"list\",\n {\n pipelineId: input.pipelineId,\n experimentId: input.experimentId,\n status: input.status,\n },\n Schema.Array(RunRow),\n ).pipe(\n Effect.map((rows) =>\n rows.map((row) => ({\n id: row.id,\n pipelineId: row.pipeline_id,\n experimentId: row.experiment_id,\n status: row.status,\n createdAt: row.created_at,\n })),\n ),\n ),\n getResult: ({ resultId }) =>\n call<ResultRow>(\"pipelineRuns\", \"result\", { resultId }, ResultRow).pipe(\n Effect.map((row) => ({\n id: row.id,\n runId: row.run_id,\n summary: row.summary,\n outputs: row.outputs.map((output) => ({\n name: output.name,\n ...(output.content_hash === null\n ? {}\n : { contentHash: output.content_hash }),\n ...(output.bytes === null ? {} : { bytes: output.bytes }),\n })),\n })),\n ),\n listProposals: ({ pipelineId, status }) =>\n call<ReadonlyArray<ProposalRow>>(\n \"pipelines\",\n \"proposals\",\n { pipelineId, status },\n Schema.Array(ProposalRow),\n ).pipe(\n Effect.map((rows) =>\n rows.map((row) => ({\n id: row.id,\n status: row.status,\n ...(row.rationale === null ? {} : { rationale: row.rationale }),\n ...(row.createdAt === undefined\n ? {}\n : { createdAt: row.createdAt }),\n })),\n ),\n ),\n compare: ({ leftResultId, rightResultId }) =>\n call<ComparisonRow>(\n \"pipelineRuns\",\n \"compare\",\n { leftResultId, rightResultId },\n ComparisonRow,\n ).pipe(\n Effect.map((row) => ({\n axis: row.axis,\n sameMethod: row.same_method,\n sameEvidence: row.same_evidence,\n sameConfiguration: row.same_configuration,\n left: row.left.id,\n right: row.right.id,\n })),\n ),\n listExperiments: (input) =>\n Effect.gen(function* () {\n const companyId = yield* projectCompany(input.projectId);\n const deviceIds =\n input.device === undefined\n ? undefined\n : [yield* deviceIdOf(companyId, input.device)];\n const pipelineIds =\n input.pipeline === undefined\n ? undefined\n : [yield* pipelineIdOf(companyId, input.pipeline)];\n const rows = yield* call<ReadonlyArray<ExperimentRow>>(\n \"experiments\",\n \"list\",\n {\n filters: {\n deviceIds,\n pipelineIds,\n nameQuery: input.nameContains,\n stage: input.stage,\n },\n limit: input.limit ?? 50,\n offset: input.offset ?? 0,\n },\n Schema.Array(ExperimentRow),\n inProject(input.projectId),\n );\n return rows.map((row) => ({\n id: row.id,\n createdAt: row.created_at,\n isSimulation: row.is_simulation,\n childCount: row.child_count,\n fileCount: row.file_count,\n tags: row.tags.map((tag) => tag.name),\n ...(row.name === null ? {} : { name: row.name }),\n ...(row.device_name === null ? {} : { deviceName: row.device_name }),\n ...(row.pipeline_name === null\n ? {}\n : { pipelineName: row.pipeline_name }),\n }));\n }),\n createExperiment: (input) =>\n call<IdRow>(\n \"experiments\",\n \"create\",\n {\n name: input.name,\n notes: input.notes,\n device_id: input.deviceId,\n pipeline_id: input.pipelineId,\n },\n IdRow,\n inProject(input.projectId),\n ).pipe(Effect.map((row) => ({ id: row.id }))),\n updateExperiment: (input) =>\n call<IdRow>(\n \"experiments\",\n \"update\",\n {\n experimentId: input.experimentId,\n name: input.name,\n notes: input.notes,\n },\n IdRow,\n inProject(input.projectId),\n ).pipe(Effect.map((row) => ({ id: row.id }))),\n getExperiment: ({ experimentId }) =>\n call<ExperimentDetailRow>(\n \"experiments\",\n \"get\",\n { experimentId },\n ExperimentDetailRow,\n ).pipe(\n Effect.map((row) => ({\n id: row.id,\n createdAt: row.created_at,\n childCount: row.child_count,\n tags: row.tags.map((tag) => tag.name),\n config: valuesOf(row.metadata, \"config\"),\n summary: valuesOf(row.metadata, \"summary\"),\n files: row.files.map((file) => file.filename),\n ...(row.name === null ? {} : { name: row.name }),\n ...(row.notes === null ? {} : { notes: row.notes }),\n ...(row.parent_experiment_id === null\n ? {}\n : { parentId: row.parent_experiment_id }),\n ...(row.device_name === null ? {} : { deviceName: row.device_name }),\n })),\n ),\n getHardware: (input) =>\n Effect.gen(function* () {\n const deviceId =\n input.deviceId ??\n (input.name === undefined\n ? undefined\n : yield* deviceIdOf(input.companyId, input.name));\n if (deviceId === undefined) {\n return yield* Effect.fail(\n new AgentToolError({\n message: \"Pass a deviceId or a name to read hardware\",\n code: \"hardware-required\",\n }),\n );\n }\n const row = yield* call<HardwareRow>(\n \"devices\",\n \"getDevice\",\n { deviceId },\n HardwareRow,\n );\n return {\n id: row.id,\n name: row.name,\n typeName: row.type_name,\n tracked: row.tracked,\n count: row.count,\n experimentCount: row.experiment_count,\n aliases: row.aliases,\n fields: row.field_values.map((field) => ({\n key: field.field_key,\n ...(field.value === null ? {} : { value: field.value }),\n })),\n ...(row.model === null ? {} : { model: row.model }),\n ...(row.notes === null ? {} : { notes: row.notes }),\n };\n }),\n getReport: (input) =>\n Effect.gen(function* () {\n const reportId =\n input.reportId ??\n (input.name === undefined\n ? undefined\n : yield* reportIdOf(input.projectId, input.name));\n if (reportId === undefined) {\n return yield* Effect.fail(\n new AgentToolError({\n message: \"Pass a reportId or a name to read a report\",\n code: \"report-required\",\n }),\n );\n }\n const row = yield* call<ReportRow>(\n \"reports\",\n \"get\",\n { reportId },\n ReportRow,\n inProject(input.projectId),\n );\n return {\n id: row.id,\n name: row.name,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n segments: row.segments.map((segment) => ({\n position: segment.position,\n type: segment.type,\n ...excerptOf(segment.content),\n })),\n };\n }),\n proposeParameter: (input) =>\n Effect.gen(function* () {\n const headRow =\n input.baseRevisionId === undefined\n ? yield* call<HeadRow | null>(\n \"pipelines\",\n \"head\",\n { pipelineId: input.pipelineId },\n Schema.NullOr(HeadRow),\n )\n : null;\n const baseRevisionId = input.baseRevisionId ?? headRow?.revisionId;\n if (baseRevisionId === undefined) {\n return yield* Effect.fail(\n new AgentToolError({\n message: \"Pipeline has no published revision to propose against\",\n code: \"no-head\",\n }),\n );\n }\n const revision = yield* call<RevisionRow>(\n \"pipelines\",\n \"revision\",\n { pipelineId: input.pipelineId, revisionId: baseRevisionId },\n RevisionRow,\n );\n const ir = yield* decodePipelineIr(revision.ir).pipe(\n Effect.mapError(\n (error) =>\n new AgentToolError({\n message: `Cannot read the pipeline IR: ${Arr.map(\n error.issues,\n (issue) => issue.message,\n ).join(\"; \")}`,\n code: \"invalid-ir\",\n }),\n ),\n );\n const target = yield* resolveParamTarget(ir, {\n param: input.param,\n stepId: input.stepId,\n });\n const op =\n target.kind === \"pipeline\"\n ? new SetPipelineParamOp({\n name: target.name,\n value: input.value,\n })\n : new SetParamOp({\n stepId: target.stepId,\n name: target.name,\n value: input.value,\n });\n const rationale =\n input.rationale === undefined || input.rationale.length === 0\n ? `Change ${input.param} to ${String(input.value)} from an agent proposal.`\n : input.rationale;\n const { proposalId } = yield* call<{ proposalId: string }>(\n \"pipelines\",\n \"propose\",\n {\n pipelineId: input.pipelineId,\n baseRevisionId,\n patch: [op],\n rationale,\n },\n Schema.Struct({ proposalId: Schema.String }),\n );\n return { proposalId, baseRevisionId, target: target.path };\n }),\n createRun: (input) =>\n call<CreatedRunRow>(\n \"pipelineRuns\",\n \"create\",\n {\n pipelineId: input.pipelineId,\n experimentId: input.experimentId,\n revisionId: input.revisionId,\n parameters: input.parameters,\n dryRun: input.dryRun,\n },\n CreatedRunRow,\n ).pipe(\n Effect.map((row) => ({\n runId: row.id,\n status: row.status,\n revisionId: row.revision_id,\n experimentId: input.experimentId,\n })),\n ),\n rerun: (input) =>\n call<RunRow>(\n \"pipelineRuns\",\n \"rerun\",\n { runId: input.runId, mode: input.mode },\n RunRow,\n ).pipe(\n Effect.map((row) => ({\n runId: row.id,\n status: row.status,\n ...(row.revision_id === null ? {} : { revisionId: row.revision_id }),\n })),\n ),\n recompute: (input) =>\n call<RecomputeRow>(\n \"pipelineRuns\",\n \"recompute\",\n {\n pipelineId: input.pipelineId,\n revisionId: input.revisionId,\n inputSnapshotId: input.inputSnapshotId,\n parameters: input.parameters ?? null,\n },\n RecomputeRow,\n ).pipe(\n Effect.map((row) => ({\n runId: row.run.id,\n status: row.run.status,\n inputSnapshotId: row.input_snapshot_id,\n })),\n ),\n };\n};\n\n/** Provides the read service for one credential. */\nexport const layer = (options: {\n readonly origin: string;\n readonly secret: string;\n}): Layer.Layer<BravenApi> => Layer.succeed(BravenApi)(make(options));\n", "/**\n * The pipeline IR: the versioned data contract between the Python authoring\n * compiler and the Effect platform.\n *\n * The IR is canonical: object keys sort lexicographically, absent optionals are\n * omitted and numbers keep the lexeme the compiler emitted. `irHashOf` hashes\n * the graph without its line numbers, so reordering independent functions\n * keeps the hash while the bytes and `sourceHash` move.\n */\nimport { Effect, Match } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Hex from \"effect/encoding/Hex\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as P from \"effect/Predicate\";\nimport * as R from \"effect/Record\";\nimport * as Schema from \"effect/Schema\";\nimport * as SchemaIssue from \"effect/SchemaIssue\";\nimport * as SchemaParser from \"effect/SchemaParser\";\nimport * as SchemaTransformation from \"effect/SchemaTransformation\";\nimport * as Str from \"effect/String\";\nimport { ContentHash } from \"./content-hash.js\";\n\nconst SupportedVersion = { major: 1, minor: 0 } as const;\n\nconst versionSupported = Schema.makeFilter(\n (value: string) => {\n const [major = Number.NaN, minor = Number.NaN] =\n Str.split(\".\")(value).map(Number);\n return major === SupportedVersion.major && minor <= SupportedVersion.minor;\n },\n {\n identifier: \"PipelineIrVersionSupported\",\n title: \"Pipeline IR version\",\n description: `A version this reader understands (${SupportedVersion.major}.x, minor <= ${SupportedVersion.minor}).`,\n message: `expected a ${SupportedVersion.major}.x IR with minor <= ${SupportedVersion.minor}`,\n },\n);\n\n/**\n * The IR's major/minor version. A reader accepts its major and any minor no\n * newer than its own; `patch` is not part of the contract.\n */\nexport const IrVersion = Schema.String.check(\n Schema.isPattern(/^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/),\n).check(versionSupported);\nexport type IrVersion = typeof IrVersion.Type;\n\n/**\n * A JSON number that remembers the exact text the compiler wrote.\n *\n * Python's `json.dumps` emits `2.0` for a float and `2` for an int; JavaScript\n * has one number type. Keeping the lexeme is what makes the hash and the bytes\n * identical on both sides of the boundary.\n */\nexport class IrNumber extends Schema.Class<IrNumber>(\"IrNumber\")({\n value: Schema.Finite,\n text: Schema.NonEmptyString,\n}) {}\n\nclass NumberLexeme extends Schema.Class<NumberLexeme>(\"NumberLexeme\")({\n value: Schema.Finite,\n text: Schema.NonEmptyString.check(\n Schema.isPattern(/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/),\n ),\n}) {}\n\nconst numberLiteral = Schema.Union([NumberLexeme, Schema.Finite]).pipe(\n Schema.decodeTo(\n IrNumber,\n SchemaTransformation.transform({\n decode: (input) =>\n typeof input === \"number\"\n ? new IrNumber({ value: input, text: String(input) })\n : new IrNumber({ value: input.value, text: input.text }),\n encode: (input) => input.value,\n }),\n ),\n);\n\n/** A step parameter's default: a JSON scalar, with numbers keeping their lexeme. */\nexport const IrDefaultValue = Schema.Union([\n Schema.String,\n Schema.Boolean,\n numberLiteral,\n]).annotate({\n title: \"IrDefaultValue\",\n description: \"A declared parameter default: string, boolean or number.\",\n});\nexport type IrDefaultValue = typeof IrDefaultValue.Type;\n\n/** The seven port kinds the compiler emits. */\nexport const IrTypeKind = Schema.Literals([\n \"dataset\",\n \"table\",\n \"figure\",\n \"file\",\n \"scalar\",\n \"model\",\n \"opaque\",\n]);\nexport type IrTypeKind = typeof IrTypeKind.Type;\n\n/** One declared column in a dataset schema. */\nexport class IrColumn extends Schema.Class<IrColumn>(\"IrColumn\")({\n name: Schema.NonEmptyString,\n type: Schema.NonEmptyString,\n unit: Schema.OptionFromOptionalKey(Schema.NonEmptyString),\n}) {}\n\n/** A dataset's advisory, validation-authoritative column schema. */\nexport class IrDatasetSchema extends Schema.Class<IrDatasetSchema>(\n \"IrDatasetSchema\",\n)({\n columns: Schema.Array(IrColumn),\n}) {}\n\n/** A port's optional semantic constraints. No constraints means \"unknown\". */\nexport class IrType extends Schema.Class<IrType>(\"IrType\")({\n kind: IrTypeKind,\n schema: Schema.OptionFromOptionalKey(IrDatasetSchema),\n units: Schema.OptionFromOptionalKey(Schema.NonEmptyString),\n cardinality: Schema.OptionFromOptionalKey(Schema.Literals([\"one\", \"many\"])),\n}) {}\n\n/** A parameter is always a scalar the dashboard can edit. */\nexport class IrParamType extends Schema.Class<IrParamType>(\"IrParamType\")({\n kind: Schema.Literals([\"string\", \"number\", \"boolean\"]),\n}) {}\n\n/** A named port on a step. `required` is absent when the port is optional. */\nexport class IrPort extends Schema.Class<IrPort>(\"IrPort\")({\n id: Schema.NonEmptyString,\n type: IrType,\n required: Schema.OptionFromOptionalKey(Schema.Boolean),\n}) {}\n\n/** A builder-visible source span. Line numbers are navigation, not meaning. */\nexport class IrSourceSpan extends Schema.Class<IrSourceSpan>(\"IrSourceSpan\")({\n startLine: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),\n endLine: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),\n}) {}\n\n/** Where a step was written. */\nexport class IrSource extends Schema.Class<IrSource>(\"IrSource\")({\n path: Schema.NonEmptyString,\n span: IrSourceSpan,\n}) {}\n\n/**\n * How a step parameter got its effective value.\n *\n * `step` is the step call's own literal or the signature default; `pipeline`\n * is a reference to a `@pipeline` parameter, which is the effective default.\n */\nexport const IrParamBinding = Schema.Literals([\"step\", \"pipeline\"]);\nexport type IrParamBinding = typeof IrParamBinding.Type;\n\n/** One knob declared on the `@pipeline` signature, addressable by a proposal. */\nexport class IrPipelineParam extends Schema.Class<IrPipelineParam>(\n \"IrPipelineParam\",\n)({\n name: Schema.NonEmptyString,\n type: IrParamType,\n default: Schema.OptionFromOptionalKey(IrDefaultValue),\n editable: Schema.OptionFromOptionalKey(Schema.Boolean),\n source: IrSource,\n}) {}\n\n/** One declared knob on a step. */\nexport class IrParam extends Schema.Class<IrParam>(\"IrParam\")({\n name: Schema.NonEmptyString,\n type: IrParamType,\n required: Schema.OptionFromOptionalKey(Schema.Boolean),\n default: Schema.OptionFromOptionalKey(IrDefaultValue),\n editable: Schema.OptionFromOptionalKey(Schema.Boolean),\n /** Absent on pre-provenance revisions; a reader treats it as `step`. */\n binding: Schema.OptionFromOptionalKey(IrParamBinding),\n /** The `@pipeline` parameter this step param is bound to, when it is. */\n pipelineParam: Schema.OptionFromOptionalKey(Schema.NonEmptyString),\n}) {}\n\n/** A Python function the compiler resolved to a module and symbol. */\nexport class IrPythonImplementation extends Schema.Class<IrPythonImplementation>(\n \"IrPythonImplementation\",\n)({\n type: Schema.Literal(\"python\"),\n module: Schema.NonEmptyString,\n function: Schema.NonEmptyString,\n}) {}\n\n/** An opaque step's honest boundary: declared ports, internals unknown. */\nexport class IrOpaqueDeclared extends Schema.Class<IrOpaqueDeclared>(\n \"IrOpaqueDeclared\",\n)({\n inputs: Schema.Array(Schema.NonEmptyString),\n outputs: Schema.Array(Schema.NonEmptyString),\n params: Schema.Array(Schema.NonEmptyString),\n}) {}\n\n/** An opaque step: the graph knows its boundary, not its body. */\nexport class IrOpaqueImplementation extends Schema.Class<IrOpaqueImplementation>(\n \"IrOpaqueImplementation\",\n)({\n type: Schema.Literal(\"opaque\"),\n sourceHash: ContentHash,\n declared: IrOpaqueDeclared,\n}) {}\n\n/** How a step is implemented: resolved Python or an opaque boundary. */\nexport const IrImplementation = Schema.Union([\n IrPythonImplementation,\n IrOpaqueImplementation,\n]);\nexport type IrImplementation = typeof IrImplementation.Type;\n\n/** One typed box in the graph. */\nexport class IrStep extends Schema.Class<IrStep>(\"IrStep\")({\n id: Schema.NonEmptyString,\n kind: Schema.Literals([\"function\", \"source\", \"sink\", \"opaque\"]),\n name: Schema.NonEmptyString,\n inputs: Schema.Array(IrPort),\n outputs: Schema.Array(IrPort),\n params: Schema.Array(IrParam),\n source: IrSource,\n implementation: IrImplementation,\n}) {}\n\n/** One end of an edge: a step id and a port id. */\nexport class IrEdgeEndpoint extends Schema.Class<IrEdgeEndpoint>(\n \"IrEdgeEndpoint\",\n)({\n step: Schema.NonEmptyString,\n port: Schema.NonEmptyString,\n}) {}\n\n/** A typed data flow. `fan` is always present, even for the trivial case. */\nexport class IrEdge extends Schema.Class<IrEdge>(\"IrEdge\")({\n from: IrEdgeEndpoint,\n to: IrEdgeEndpoint,\n fan: Schema.Literals([\"one-to-one\", \"one-to-many\", \"many-to-one\"]),\n}) {}\n\n/** The runtime the pipeline needs. Paths are relative to the project root. */\nexport class IrRequirements extends Schema.Class<IrRequirements>(\n \"IrRequirements\",\n)({\n path: Schema.NonEmptyString,\n hash: ContentHash,\n}) {}\n\nexport class IrRuntime extends Schema.Class<IrRuntime>(\"IrRuntime\")({\n python: Schema.NonEmptyString,\n entry: Schema.String,\n requirements: Schema.OptionFromOptionalKey(IrRequirements),\n imports: Schema.Array(Schema.NonEmptyString),\n}) {}\n\n/** The compiler's identity and the two hashes that anchor a revision. */\nexport class IrMetadata extends Schema.Class<IrMetadata>(\"IrMetadata\")({\n compiler: Schema.NonEmptyString,\n sourceHash: ContentHash,\n irHash: Schema.OptionFromOptionalKey(ContentHash),\n}) {}\n\n/** The pipeline's author-facing identity and lifecycle stage. */\nexport class IrPipeline extends Schema.Class<IrPipeline>(\"IrPipeline\")({\n name: Schema.NonEmptyString,\n description: Schema.OptionFromOptionalKey(Schema.String),\n stage: Schema.Literals([\"simulation\", \"experiment\"]),\n /** The `@pipeline` signature's knobs; absent when it declares none. */\n params: Schema.OptionFromOptionalKey(Schema.Array(IrPipelineParam)),\n}) {}\n\n/** The complete, compact pipeline document the Python compiler emits. */\nexport class PipelineIr extends Schema.Class<PipelineIr>(\"PipelineIr\")({\n irVersion: IrVersion,\n pipeline: IrPipeline,\n runtime: IrRuntime,\n steps: Schema.Array(IrStep),\n edges: Schema.Array(IrEdge),\n metadata: IrMetadata,\n}) {}\n\n/** One decode failure, addressed by an RFC 6901 JSON pointer. */\nexport class PipelineIrIssue extends Schema.Class<PipelineIrIssue>(\n \"PipelineIrIssue\",\n)({\n pointer: Schema.String,\n message: Schema.String,\n}) {}\n\n/** A decode failure: one or more issues, each with its JSON pointer. */\nexport class PipelineIrError extends Schema.TaggedError<PipelineIrError>()(\n \"PipelineIrError\",\n { issues: Schema.NonEmptyArray(PipelineIrIssue) },\n) {\n get message(): string {\n return Arr.join(\n this.issues.map((issue) => `${issue.pointer || \"/\"}: ${issue.message}`),\n \"; \",\n );\n }\n}\n\n/** An untrusted IR value: JSON text (lexeme-preserving) or a parsed value. */\nexport type PipelineIrInput = string | unknown;\n\nconst pointerToken = (token: PropertyKey): string =>\n Str.replaceAll(\"~\", \"~0\")(Str.replaceAll(\"/\", \"~1\")(String(token)));\n\nconst pointerOf = (path: ReadonlyArray<PropertyKey>): string =>\n path.length === 0 ? \"\" : `/${path.map(pointerToken).join(\"/\")}`;\n\nconst formatLeaf = SchemaIssue.makeFormatterDefault();\n\nconst issueAt = (\n issue: SchemaIssue.Issue,\n path: ReadonlyArray<PropertyKey>,\n): PipelineIrIssue =>\n new PipelineIrIssue({ pointer: pointerOf(path), message: formatLeaf(issue) });\n\nconst collectIssues = (\n issue: SchemaIssue.Issue,\n path: ReadonlyArray<PropertyKey> = [],\n): ReadonlyArray<PipelineIrIssue> =>\n Match.value(issue).pipe(\n Match.tag(\"Pointer\", (pointer) =>\n collectIssues(pointer.issue, Arr.appendAll(path, pointer.path)),\n ),\n Match.tag(\"Composite\", (composite) =>\n Arr.match(composite.issues, {\n onEmpty: () => [issueAt(composite, path)],\n onNonEmpty: (issues) =>\n Arr.flatMap(issues, (child) => collectIssues(child, path)),\n }),\n ),\n Match.tag(\"AnyOf\", (anyOf) =>\n Arr.match(anyOf.issues, {\n onEmpty: () => [issueAt(anyOf, path)],\n onNonEmpty: (issues) =>\n Arr.flatMap(issues, (child) => collectIssues(child, path)),\n }),\n ),\n Match.tag(\"Filter\", (filter) =>\n Match.value(filter.issue).pipe(\n Match.tag(\"InvalidValue\", () => [issueAt(filter, path)]),\n Match.orElse((inner) => collectIssues(inner, path)),\n ),\n ),\n Match.tag(\"Encoding\", (encoding) => collectIssues(encoding.issue, path)),\n Match.orElse((leaf) => [issueAt(leaf, path)]),\n );\n\nconst issueEquivalence = (self: PipelineIrIssue, that: PipelineIrIssue) =>\n self.pointer === that.pointer && self.message === that.message;\n\nconst parseText = (text: string): unknown =>\n JSON.parse(\n text,\n (_key: string, value: unknown, context?: { readonly source?: string }) =>\n typeof value === \"number\" && context?.source !== undefined\n ? /[.eE]/.test(context.source)\n ? { value, text: context.source }\n : value\n : value,\n );\n\n/**\n * Decodes an untrusted IR document.\n *\n * Pass the JSON text when it is available: the number lexemes survive, so\n * `canonicalJson` reproduces the compiler's bytes exactly. Excess properties\n * are rejected and every issue carries a JSON pointer.\n */\nexport const decodePipelineIr = Effect.fn(\"PipelineIr.decode\")(function* (\n input: PipelineIrInput,\n) {\n const value =\n typeof input === \"string\"\n ? yield* Effect.try({\n try: () => parseText(input),\n catch: (cause) =>\n new PipelineIrError({\n issues: [\n new PipelineIrIssue({\n pointer: \"\",\n message: `invalid JSON: ${String(cause)}`,\n }),\n ],\n }),\n })\n : input;\n return yield* SchemaParser.decodeUnknownEffect(PipelineIr, {\n errors: \"all\",\n onExcessProperty: \"error\",\n })(value).pipe(\n Effect.mapError((issue) => {\n const issues = Arr.dedupeWith(collectIssues(issue), issueEquivalence);\n return new PipelineIrError({\n issues: Arr.match(issues, {\n onEmpty: () => [issueAt(issue, [])],\n onNonEmpty: (nonEmpty) => nonEmpty,\n }),\n });\n }),\n );\n});\n\n/** The volatile fields: line numbers and hashes that describe, not define. */\nconst withoutVolatile = (ir: PipelineIr): unknown => {\n const { irHash: _irHash, sourceHash: _sourceHash, ...metadata } = ir.metadata;\n return {\n ...ir,\n metadata,\n pipeline: {\n ...ir.pipeline,\n params: Option.match(ir.pipeline.params, {\n onNone: () => undefined,\n onSome: (params) =>\n params.map((param) => ({\n ...param,\n source: { ...param.source, span: undefined },\n })),\n }),\n },\n steps: ir.steps.map((step) => ({\n ...step,\n source: { ...step.source, span: undefined },\n })),\n };\n};\n\n/**\n * Hand-written rather than `Schema.fromJsonString`: the encoders cannot preserve\n * a numeric lexeme (`2.0` vs `2`), and byte identity with the Python emitter is\n * the point. Object keys still sort like Python's `sort_keys=True`.\n */\nconst canonicalValue = (value: unknown): string => {\n if (value instanceof IrNumber) return value.text;\n if (Option.isOption(value)) {\n return Option.match(value, {\n onNone: () => \"null\",\n onSome: canonicalValue,\n });\n }\n if (Array.isArray(value)) {\n return `[${Arr.map(value, canonicalValue).join(\",\")}]`;\n }\n if (P.isObject(value)) {\n const entries = Arr.flatMap(\n Arr.sort(\n Object.entries(value),\n Order.mapInput(\n Order.String,\n (entry: readonly [string, unknown]) => entry[0],\n ),\n ),\n ([key, field]) => {\n if (field === undefined) return [];\n if (Option.isOption(field) && Option.isNone(field)) return [];\n return [`${JSON.stringify(key)}:${canonicalValue(field)}`];\n },\n );\n return `{${entries.join(\",\")}}`;\n }\n return JSON.stringify(value);\n};\n\n/**\n * The canonical JSON of an IR document: sorted keys, no whitespace, non-ASCII\n * unescaped and no trailing newline.\n */\nexport const canonicalJson = (ir: PipelineIr): string => canonicalValue(ir);\n\n/**\n * `sha256:` of the canonical IR without `irHash`, `sourceHash` and every\n * `source.span` \u2014 the graph's identity across line-number churn.\n */\nexport const irHashOf = Effect.fn(\"PipelineIr.hash\")(function* (\n ir: PipelineIr,\n) {\n const bytes = new TextEncoder().encode(canonicalValue(withoutVolatile(ir)));\n const digest = yield* Effect.tryPromise({\n try: () => crypto.subtle.digest(\"SHA-256\", bytes),\n catch: (cause) =>\n new PipelineIrError({\n issues: [\n new PipelineIrIssue({\n pointer: \"\",\n message: `cannot hash the IR: ${String(cause)}`,\n }),\n ],\n }),\n });\n return `sha256:${Hex.encode(new Uint8Array(digest))}`;\n});\n\n/** A structural or semantic rule the compiler and the server both enforce. */\nexport const IrValidationCode = Schema.Literals([\n \"duplicate-step-id\",\n \"duplicate-port-id\",\n \"duplicate-param-name\",\n \"unknown-edge-endpoint\",\n \"input-edge-count\",\n \"cycle\",\n \"missing-source\",\n \"missing-sink\",\n \"edge-type-mismatch\",\n \"param-default-mismatch\",\n \"opaque-ports\",\n \"empty-entry\",\n]);\nexport type IrValidationCode = typeof IrValidationCode.Type;\n\n/** One structural failure, addressed by a step id or JSON pointer. */\nexport class IrValidationIssue extends Schema.Class<IrValidationIssue>(\n \"IrValidationIssue\",\n)({\n code: IrValidationCode,\n path: Schema.String,\n message: Schema.String,\n}) {}\n\n/** The first structural failure. */\nexport class PipelineValidationError extends Schema.TaggedError<PipelineValidationError>()(\n \"PipelineValidationError\",\n {\n code: IrValidationCode,\n path: Schema.String,\n message: Schema.String,\n },\n) {}\n\nconst duplicates = (values: ReadonlyArray<string>): ReadonlyArray<string> =>\n Arr.map(\n Arr.filter(\n R.values(Arr.groupBy(values, String)),\n (group) => group.length > 1,\n ),\n (group) => group[0],\n );\n\nconst hasIncoming = (edges: ReadonlyArray<IrEdge>, step: string): boolean =>\n Arr.some(edges, (edge) => edge.to.step === step);\n\nconst hasOutgoing = (edges: ReadonlyArray<IrEdge>, step: string): boolean =>\n Arr.some(edges, (edge) => edge.from.step === step);\n\nconst edgeCount = (\n edges: ReadonlyArray<IrEdge>,\n step: string,\n port: string,\n): number =>\n Arr.countBy(edges, (edge) => edge.to.step === step && edge.to.port === port);\n\nconst portIds = (ports: ReadonlyArray<IrPort>): ReadonlyArray<string> =>\n ports.map((port) => port.id);\n\nconst sameNames = (\n left: ReadonlyArray<string>,\n right: ReadonlyArray<string>,\n): boolean =>\n Arr.length(left) === Arr.length(right) &&\n Arr.every(left, (name) => Arr.contains(right, name));\n\n/** Kahn's algorithm; a non-empty remainder means a cycle. */\nconst hasCycle = (\n steps: ReadonlyArray<IrStep>,\n edges: ReadonlyArray<IrEdge>,\n) => {\n const indegree = Arr.reduce(\n edges,\n HashMap.fromIterable<string, number>(\n steps.map((step) => [step.id, 0] as const),\n ),\n (counts, edge) =>\n HashMap.modifyAt(\n counts,\n edge.to.step,\n Option.map((n: number) => n + 1),\n ),\n );\n const ready = Arr.map(\n Arr.filter(steps, (step) =>\n Option.contains(HashMap.get(indegree, step.id), 0),\n ),\n (step) => step.id,\n );\n const walk = (\n pending: HashMap.HashMap<string, number>,\n queue: ReadonlyArray<string>,\n ): boolean =>\n Arr.match(queue, {\n onEmpty: () => !HashMap.isEmpty(pending),\n onNonEmpty: ([head, ...rest]) => {\n const [next, counts] = Arr.reduce(\n Arr.filter(edges, (edge) => edge.from.step === head),\n [rest, HashMap.remove(pending, head)] as const,\n ([remaining, current], edge) => {\n const decremented = HashMap.modifyAt(\n current,\n edge.to.step,\n Option.map((n: number) => n - 1),\n );\n return Option.contains(HashMap.get(decremented, edge.to.step), 0)\n ? ([Arr.append(remaining, edge.to.step), decremented] as const)\n : ([remaining, decremented] as const);\n },\n );\n return walk(counts, next);\n },\n });\n return walk(indegree, ready);\n};\n\n/**\n * Structural problems in an IR, in rule order.\n *\n * Pure: no I/O and no clock. The server re-runs this because a client's\n * compile is advisory. Each rule has its own code so a caller can react to it.\n */\nexport const structuralIssues = (\n ir: PipelineIr,\n): ReadonlyArray<IrValidationIssue> => {\n const stepIds = ir.steps.map((step) => step.id);\n const issue = (\n code: IrValidationCode,\n path: string,\n message: string,\n ): IrValidationIssue => new IrValidationIssue({ code, path, message });\n\n const duplicateSteps = duplicates(stepIds).map((id) =>\n issue(\"duplicate-step-id\", `/steps/${id}`, `step id \"${id}\" is used twice`),\n );\n\n const duplicatePorts = Arr.flatMap(ir.steps, (step) =>\n Arr.appendAll(\n duplicates(portIds(step.inputs)).map((id) =>\n issue(\n \"duplicate-port-id\",\n `/steps/${step.id}/inputs/${id}`,\n `input port \"${id}\" is declared twice on \"${step.id}\"`,\n ),\n ),\n duplicates(portIds(step.outputs)).map((id) =>\n issue(\n \"duplicate-port-id\",\n `/steps/${step.id}/outputs/${id}`,\n `output port \"${id}\" is declared twice on \"${step.id}\"`,\n ),\n ),\n ),\n );\n\n const duplicateParams = Arr.flatMap(ir.steps, (step) =>\n duplicates(step.params.map((param) => param.name)).map((name) =>\n issue(\n \"duplicate-param-name\",\n `/steps/${step.id}/params/${name}`,\n `parameter \"${name}\" is declared twice on \"${step.id}\"`,\n ),\n ),\n );\n\n const unknownEdges = Arr.flatMap(ir.edges, (edge, index) => {\n const from = ir.steps.find((step) => step.id === edge.from.step);\n const to = ir.steps.find((step) => step.id === edge.to.step);\n const problems: Array<IrValidationIssue> = [];\n if (\n from === undefined ||\n !Arr.contains(portIds(from.outputs), edge.from.port)\n ) {\n problems.push(\n issue(\n \"unknown-edge-endpoint\",\n `/edges/${index}/from`,\n `edge ${index} leaves \"${edge.from.step}.${edge.from.port}\", which is not an output port`,\n ),\n );\n }\n if (to === undefined || !Arr.contains(portIds(to.inputs), edge.to.port)) {\n problems.push(\n issue(\n \"unknown-edge-endpoint\",\n `/edges/${index}/to`,\n `edge ${index} enters \"${edge.to.step}.${edge.to.port}\", which is not an input port`,\n ),\n );\n }\n return problems;\n });\n\n const badInputs = Arr.flatMap(ir.steps, (step) =>\n Arr.flatMap(step.inputs, (port) => {\n const required = Option.getOrElse(port.required, () => false);\n const count = edgeCount(ir.edges, step.id, port.id);\n const valid = required ? count === 1 : count <= 1;\n return valid\n ? []\n : [\n issue(\n \"input-edge-count\",\n `/steps/${step.id}/inputs/${port.id}`,\n `input \"${step.id}.${port.id}\" has ${count} incoming edges, expected ${required ? \"exactly one\" : \"at most one\"}`,\n ),\n ];\n }),\n );\n\n const cycle = hasCycle(ir.steps, ir.edges)\n ? [\n issue(\n \"cycle\",\n \"/edges\",\n \"the graph has a cycle; a topological order does not exist\",\n ),\n ]\n : [];\n\n const missingSource = Arr.some(\n ir.steps,\n (step) => !hasIncoming(ir.edges, step.id),\n )\n ? []\n : [issue(\"missing-source\", \"/steps\", \"the pipeline has no source step\")];\n const missingSink = Arr.some(\n ir.steps,\n (step) => !hasOutgoing(ir.edges, step.id),\n )\n ? []\n : [issue(\"missing-sink\", \"/steps\", \"the pipeline has no sink step\")];\n\n const opaque = Arr.flatMap(ir.steps, (step) => {\n if (!(step.implementation instanceof IrOpaqueImplementation)) return [];\n const declared =\n sameNames(step.implementation.declared.inputs, portIds(step.inputs)) &&\n sameNames(step.implementation.declared.outputs, portIds(step.outputs));\n return declared\n ? []\n : [\n issue(\n \"opaque-ports\",\n `/steps/${step.id}/implementation/declared`,\n `opaque step \"${step.id}\" does not declare exactly its input and output ports`,\n ),\n ];\n });\n\n const emptyEntry =\n ir.runtime.entry.length === 0\n ? [\n issue(\n \"empty-entry\",\n \"/runtime/entry\",\n \"runtime.entry must be non-empty\",\n ),\n ]\n : [];\n\n return Arr.flatten([\n duplicateSteps,\n duplicatePorts,\n duplicateParams,\n unknownEdges,\n badInputs,\n cycle,\n missingSource,\n missingSink,\n opaque,\n emptyEntry,\n ]);\n};\n\nconst columnsEqual = (left: IrDatasetSchema, right: IrDatasetSchema): boolean =>\n Arr.length(left.columns) === Arr.length(right.columns) &&\n Arr.every(left.columns, (column) =>\n Arr.some(\n right.columns,\n (candidate) =>\n candidate.name === column.name &&\n candidate.type === column.type &&\n Option.getOrElse(candidate.unit, () => \"\") ===\n Option.getOrElse(column.unit, () => \"\"),\n ),\n );\n\n/** Whether a value produced as `from` satisfies a port declared as `to`.\n * An opaque side is unknown, not wrong: the platform checks what is declared. */\nexport const typesCompatible = (from: IrType, to: IrType): boolean => {\n if (from.kind === \"opaque\" || to.kind === \"opaque\") return true;\n if (from.kind !== to.kind) return false;\n if (\n Option.isSome(from.units) &&\n Option.isSome(to.units) &&\n from.units.value !== to.units.value\n )\n return false;\n if (Option.isSome(from.schema) && Option.isSome(to.schema))\n return columnsEqual(from.schema.value, to.schema.value);\n return !(\n Option.isSome(from.cardinality) &&\n Option.isSome(to.cardinality) &&\n from.cardinality.value !== to.cardinality.value\n );\n};\n\nconst defaultValueMatches = (\n value: IrDefaultValue,\n kind: IrParamType[\"kind\"],\n) =>\n Match.value(kind).pipe(\n Match.when(\"string\", () => typeof value === \"string\"),\n Match.when(\"boolean\", () => typeof value === \"boolean\"),\n Match.when(\"number\", () => value instanceof IrNumber),\n Match.exhaustive,\n );\n\n/**\n * Semantic problems in an IR, in rule order.\n *\n * Pure, like `structuralIssues`: it checks the meaning the graph declares \u2014\n * types along edges and parameter defaults \u2014 and never executes Python.\n */\nexport const semanticIssues = (\n ir: PipelineIr,\n): ReadonlyArray<IrValidationIssue> => {\n const issue = (\n code: IrValidationCode,\n path: string,\n message: string,\n ): IrValidationIssue => new IrValidationIssue({ code, path, message });\n\n const steps = ir.steps;\n const stepById = (id: string) => steps.find((step) => step.id === id);\n const portOf = (step: IrStep, id: string, side: \"inputs\" | \"outputs\") =>\n step[side].find((port) => port.id === id);\n\n const edges = Arr.flatMap(ir.edges, (edge, index) => {\n const fromStep = stepById(edge.from.step);\n const toStep = stepById(edge.to.step);\n const from = fromStep && portOf(fromStep, edge.from.port, \"outputs\");\n const to = toStep && portOf(toStep, edge.to.port, \"inputs\");\n // A missing endpoint is `unknown-edge-endpoint`'s finding, not ours.\n if (!from || !to || typesCompatible(from.type, to.type)) return [];\n return [\n issue(\n \"edge-type-mismatch\",\n `/edges/${index}`,\n `edge ${index} sends ${from.type.kind} to ${edge.to.step}.${edge.to.port}, which declares ${to.type.kind}`,\n ),\n ];\n });\n\n const params = Arr.flatMap(ir.steps, (step) =>\n Arr.flatMap(step.params, (param) =>\n Option.match(param.default, {\n onNone: () => [],\n onSome: (value) =>\n defaultValueMatches(value, param.type.kind)\n ? []\n : [\n issue(\n \"param-default-mismatch\",\n `/steps/${step.id}/params/${param.name}/default`,\n `default of \"${step.id}.${param.name}\" is not a ${param.type.kind}`,\n ),\n ],\n }),\n ),\n );\n\n return Arr.appendAll(edges, params);\n};\n\n/**\n * Fails with the first structural or semantic issue, or returns the IR\n * unchanged.\n *\n * Call after `decodePipelineIr`; the server runs the same function so a client\n * cannot publish a graph the platform could not execute.\n */\nexport const validatePipelineIr = Effect.fn(\"PipelineIr.validate\")(function* (\n ir: PipelineIr,\n) {\n const [first] = Arr.appendAll(structuralIssues(ir), semanticIssues(ir));\n if (first === undefined) return ir;\n return yield* Effect.fail(\n new PipelineValidationError({\n code: first.code,\n path: first.path,\n message: first.message,\n }),\n );\n});\n", "/**\n * The content identity shared by revisions, inputs and outputs: a SHA-256\n * digest written as `sha256:` plus 64 lowercase hex digits.\n *\n * Lives in the IR package because the compiler's canonical hash and every\n * addressable IR value are compared by it, on both sides of the wire.\n */\nimport * as Schema from \"effect/Schema\";\n\n/** A `sha256:<64 hex>` digest. */\nexport const ContentHash = Schema.NonEmptyString.check(\n Schema.isPattern(/^sha256:[0-9a-f]{64}$/),\n).pipe(\n Schema.brand(\"ContentHash\"),\n Schema.annotate({\n title: \"ContentHash\",\n description: \"A `sha256:` digest of canonical bytes.\",\n }),\n);\nexport type ContentHash = typeof ContentHash.Type;\n", "/**\n * The typed operations a dashboard proposal may carry.\n *\n * An op names an IR construct, never a line of Python. The CLI decides whether\n * a named construct is round-trip-safe before it edits source (plan 069); the\n * server stores ops so both sides share one vocabulary.\n */\nimport * as Schema from \"effect/Schema\";\n\n/** A parameter value on one step. */\nexport class SetParamOp extends Schema.Class<SetParamOp>(\"SetParamOp\")({\n op: Schema.tag(\"set-param\"),\n stepId: Schema.NonEmptyString,\n name: Schema.NonEmptyString,\n value: Schema.Json,\n}) {}\n\n/**\n * A parameter default on the `@pipeline` declaration itself.\n *\n * This is the effective default of every step param bound to it, so it is the\n * target for those knobs; a step-path op on such a param is refused.\n */\nexport class SetPipelineParamOp extends Schema.Class<SetPipelineParamOp>(\n \"SetPipelineParamOp\",\n)({\n op: Schema.tag(\"set-pipeline-param\"),\n name: Schema.NonEmptyString,\n value: Schema.Json,\n}) {}\n\n/** The author-facing name of one step. */\nexport class SetStepNameOp extends Schema.Class<SetStepNameOp>(\"SetStepNameOp\")(\n {\n op: Schema.tag(\"set-step-name\"),\n stepId: Schema.NonEmptyString,\n name: Schema.NonEmptyString,\n },\n) {}\n\n/** The pipeline's description. */\nexport class SetDescriptionOp extends Schema.Class<SetDescriptionOp>(\n \"SetDescriptionOp\",\n)({\n op: Schema.tag(\"set-description\"),\n description: Schema.NonEmptyString,\n}) {}\n\n/** The declared runtime, as an IR-shaped record until 067 types it. */\nexport class SetRuntimeOp extends Schema.Class<SetRuntimeOp>(\"SetRuntimeOp\")({\n op: Schema.tag(\"set-runtime\"),\n runtime: Schema.Record(Schema.String, Schema.Json),\n}) {}\n\n/** Connect two declared ports. */\nexport class AddEdgeOp extends Schema.Class<AddEdgeOp>(\"AddEdgeOp\")({\n op: Schema.tag(\"add-edge\"),\n fromStep: Schema.NonEmptyString,\n fromPort: Schema.NonEmptyString,\n toStep: Schema.NonEmptyString,\n toPort: Schema.NonEmptyString,\n}) {}\n\n/** Remove a connection between two declared ports. */\nexport class RemoveEdgeOp extends Schema.Class<RemoveEdgeOp>(\"RemoveEdgeOp\")({\n op: Schema.tag(\"remove-edge\"),\n fromStep: Schema.NonEmptyString,\n fromPort: Schema.NonEmptyString,\n toStep: Schema.NonEmptyString,\n toPort: Schema.NonEmptyString,\n}) {}\n\n/** The operations a proposal may carry. */\nexport const IrOp = Schema.Union([\n SetParamOp,\n SetPipelineParamOp,\n SetStepNameOp,\n SetDescriptionOp,\n SetRuntimeOp,\n AddEdgeOp,\n RemoveEdgeOp,\n])\n .pipe(Schema.toTaggedUnion(\"op\"))\n .annotate({\n title: \"IrOp\",\n description: \"One typed change to a pipeline definition.\",\n });\nexport type IrOp = typeof IrOp.Type;\n", "/**\n * The sync protocol's only network module (plan 069).\n *\n * It speaks oRPC's plain HTTP shape: `POST {origin}/rpc/pipelines/<procedure>`\n * with a bearer credential and a JSON body. Every response is decoded with a\n * schema; every failure is a typed `PipelineApiError` carrying the HTTP status\n * and the server's wire code, so `push`/`pull` can tell a stale parent (409)\n * from a bad definition (422) from an unreachable API.\n */\nimport { Effect, Schema } from \"effect\";\nimport * as Option from \"effect/Option\";\nimport { HttpClient, HttpClientRequest, HttpClientResponse } from \"effect/http\";\nimport { IrOp } from \"@braven/pipeline-ir\";\n\n/** A request that failed, with the wire's own code where it had one. */\nexport class PipelineApiError extends Schema.TaggedError<PipelineApiError>()(\n \"PipelineApiError\",\n {\n procedure: Schema.String,\n message: Schema.String,\n status: Schema.OptionFromNullishOr(Schema.Int, {\n onNoneEncoding: null,\n }),\n code: Schema.OptionFromNullishOr(Schema.String, {\n onNoneEncoding: null,\n }),\n },\n) {}\n\n/** The head revision's identity, as `pipelines.head` returns it. */\nexport class RevisionHead extends Schema.Class<RevisionHead>(\"RevisionHead\")({\n revisionId: Schema.NonEmptyString,\n number: Schema.Int,\n contentHash: Schema.NonEmptyString,\n}) {}\n\n/** The fields of a revision the sync protocol needs. */\nexport class RevisionSummary extends Schema.Class<RevisionSummary>(\n \"RevisionSummary\",\n)({\n id: Schema.NonEmptyString,\n number: Schema.Int,\n contentHash: Schema.NonEmptyString,\n}) {}\n\n/** One revision and its exact canonical IR text. */\nexport class RevisionDocument extends Schema.Class<RevisionDocument>(\n \"RevisionDocument\",\n)({\n revision: RevisionSummary,\n ir: Schema.String,\n}) {}\n\n/** What a publish returns. */\nexport class PublishedRevision extends Schema.Class<PublishedRevision>(\n \"PublishedRevision\",\n)({\n revisionId: Schema.NonEmptyString,\n number: Schema.Int,\n contentHash: Schema.NonEmptyString,\n headRevisionId: Schema.NonEmptyString,\n}) {}\n\n/** One dashboard proposal, with its typed IR operations. */\nexport class ProposalSummary extends Schema.Class<ProposalSummary>(\n \"ProposalSummary\",\n)({\n id: Schema.NonEmptyString,\n baseRevisionId: Schema.NonEmptyString,\n authorId: Schema.NonEmptyString,\n patch: Schema.Array(IrOp),\n rationale: Schema.NullOr(Schema.String),\n status: Schema.Literals([\"open\", \"applied\", \"rejected\", \"superseded\"]),\n createdAt: Schema.DateFromString,\n}) {}\n\nexport interface PublishRequest {\n readonly pipelineId: string;\n /** The compiler's JSON bytes; the server re-derives the hash from them. */\n readonly irText: string;\n readonly irHash: string;\n readonly expectedParentId: string | null;\n readonly baseRevisionId: string | null;\n readonly summary?: string | undefined;\n}\n\nexport interface ProposeRequest {\n readonly pipelineId: string;\n readonly baseRevisionId: string;\n readonly patch: ReadonlyArray<IrOp>;\n readonly rationale: string;\n}\n\nexport interface ProposalsFilter {\n readonly status?: \"open\" | \"applied\" | \"rejected\" | \"superseded\";\n readonly base?: string;\n}\n\n/** One immutable result, as `pipelineRuns.results|result|compare|recompute`\n * return it (plan 072). Only the fields the CLI renders are decoded; the wire\n * object is larger. */\nexport class AnalysisResultRef extends Schema.Class<AnalysisResultRef>(\n \"AnalysisResultRef\",\n)({\n id: Schema.NonEmptyString,\n run_id: Schema.NonEmptyString,\n revision_id: Schema.NullOr(Schema.String),\n revision_hash: Schema.String,\n input_snapshot_hash: Schema.String,\n parameters_hash: Schema.String,\n created_at: Schema.DateFromString,\n is_latest: Schema.Boolean,\n outputs: Schema.Array(\n Schema.Struct({\n name: Schema.String,\n artifact_id: Schema.NullOr(Schema.String),\n content_hash: Schema.NullOr(Schema.String),\n }),\n ),\n}) {}\n\n/** The axes a comparison can name \u2014 the server derives it; the client renders\n * it and never re-derives a friendlier one. */\nexport const ComparisonAxis = Schema.Literals([\n \"identical\",\n \"configuration\",\n \"method\",\n \"evidence\",\n \"both\",\n]);\nexport type ComparisonAxis = typeof ComparisonAxis.Type;\n\n/** Two results with the axis they moved on and the per-output/metric deltas. */\nexport class Comparison extends Schema.Class<Comparison>(\"Comparison\")({\n axis: ComparisonAxis,\n same_method: Schema.Boolean,\n same_evidence: Schema.Boolean,\n same_configuration: Schema.Boolean,\n left: AnalysisResultRef,\n right: AnalysisResultRef,\n outputs: Schema.Array(\n Schema.Struct({\n name: Schema.String,\n left: Schema.NullOr(\n Schema.Struct({\n name: Schema.String,\n content_hash: Schema.NullOr(Schema.String),\n }),\n ),\n right: Schema.NullOr(\n Schema.Struct({\n name: Schema.String,\n content_hash: Schema.NullOr(Schema.String),\n }),\n ),\n changed: Schema.Boolean,\n }),\n ),\n metrics: Schema.Array(\n Schema.Struct({\n key: Schema.String,\n left: Schema.Json,\n right: Schema.Json,\n delta: Schema.NullOr(Schema.Number),\n }),\n ),\n}) {}\n\n/** A run the recompute queued, and the results already on its evidence. */\nexport class RecomputeOutcome extends Schema.Class<RecomputeOutcome>(\n \"RecomputeOutcome\",\n)({\n run: Schema.Struct({\n id: Schema.NonEmptyString,\n status: Schema.String,\n revision_id: Schema.NullOr(Schema.String),\n input_snapshot_id: Schema.optional(Schema.String),\n }),\n input_snapshot_id: Schema.NonEmptyString,\n previous_results: Schema.Array(AnalysisResultRef),\n}) {}\n\n/** The network surface `push`, `pull`, `diff` and `apply` share. */\nexport interface PipelineApi {\n readonly head: () => Effect.Effect<\n Option.Option<RevisionHead>,\n PipelineApiError,\n HttpClient.HttpClient\n >;\n readonly revision: (\n revisionId: string,\n ) => Effect.Effect<RevisionDocument, PipelineApiError, HttpClient.HttpClient>;\n readonly publish: (\n request: PublishRequest,\n ) => Effect.Effect<\n PublishedRevision,\n PipelineApiError,\n HttpClient.HttpClient\n >;\n readonly proposals: (\n filter?: ProposalsFilter,\n ) => Effect.Effect<\n ReadonlyArray<ProposalSummary>,\n PipelineApiError,\n HttpClient.HttpClient\n >;\n readonly propose: (\n request: ProposeRequest,\n ) => Effect.Effect<\n { readonly proposalId: string },\n PipelineApiError,\n HttpClient.HttpClient\n >;\n readonly reject: (\n proposalId: string,\n ) => Effect.Effect<void, PipelineApiError, HttpClient.HttpClient>;\n /** Reanalyze historical evidence: a new run on the same input snapshot. */\n readonly recompute: (input: {\n readonly revisionId: string;\n readonly inputSnapshotId: string;\n readonly parameters?: Readonly<Record<string, string | number | boolean>>;\n }) => Effect.Effect<\n RecomputeOutcome,\n PipelineApiError,\n HttpClient.HttpClient\n >;\n /** Compare two immutable results; the server derives the axis. */\n readonly compare: (\n leftResultId: string,\n rightResultId: string,\n ) => Effect.Effect<Comparison, PipelineApiError, HttpClient.HttpClient>;\n}\n\nclass WireError extends Schema.Class<WireError>(\"WireError\")({\n message: Schema.optional(Schema.String),\n code: Schema.optional(Schema.String),\n data: Schema.optional(\n Schema.Struct({ code: Schema.optional(Schema.String) }),\n ),\n}) {}\n\n/** What the oRPC RPC transport answers on success. */\nclass RpcEnvelope extends Schema.Class<RpcEnvelope>(\"RpcEnvelope\")({\n json: Schema.Unknown,\n}) {}\n\nconst ErrorBody = Schema.Struct({\n json: Schema.optional(WireError),\n message: Schema.optional(Schema.String),\n});\n\nconst decodeJson = Schema.decodeUnknownOption(\n Schema.fromJsonString(Schema.Unknown),\n);\n\n/** oRPC puts the error under `json`; a bare `{ message }` is accepted too. */\nconst wireError = (text: string): Option.Option<WireError> =>\n Option.flatMap(decodeJson(text), (parsed) =>\n Schema.decodeUnknownOption(ErrorBody)(parsed).pipe(\n Option.flatMap((body) =>\n Option.orElse(Option.fromNullishOr(body.json), () =>\n Option.map(\n Option.fromNullishOr(body.message),\n (message) => new WireError({ message }),\n ),\n ),\n ),\n ),\n );\n\nconst statusOf = (response: HttpClientResponse.HttpClientResponse): number =>\n response.status;\n\nconst failure = (\n procedure: string,\n message: string,\n status: Option.Option<number>,\n code: Option.Option<string>,\n) =>\n new PipelineApiError({\n procedure,\n message,\n status,\n code,\n });\n\n/** The oRPC namespaces this transport answers. */\nexport type Router =\n | \"devices\"\n | \"experiments\"\n | \"pipelines\"\n | \"pipelineRuns\"\n | \"projects\"\n | \"reports\"\n | \"tags\";\n\nconst request = <A>(\n options: { readonly origin: string; readonly secret: string },\n procedure: string,\n body: unknown,\n schema: Schema.ConstraintDecoder<A>,\n router: Router = \"pipelines\",\n /** Extra headers: a project-scoped procedure reads `x-project-id`. */\n headers: Readonly<Record<string, string>> = {},\n): Effect.Effect<A, PipelineApiError, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(procedure)) {\n return yield* Effect.fail(\n failure(\n procedure,\n \"invalid procedure name\",\n Option.none(),\n Option.none(),\n ),\n );\n }\n const client = yield* HttpClient.HttpClient;\n const built = yield* HttpClientRequest.post(\n `${options.origin}/rpc/${router}/${procedure}`,\n ).pipe(\n HttpClientRequest.bearerToken(options.secret),\n HttpClientRequest.setHeaders(headers),\n // The oRPC RPC transport's envelope: `{\"json\": <input>}` in and\n // `{\"json\": <output>}` out. A bare body is rejected as \"Expected object\".\n HttpClientRequest.bodyJson({ json: body }),\n Effect.mapError((cause) =>\n failure(\n procedure,\n `cannot encode the request: ${cause.message}`,\n Option.none(),\n Option.none(),\n ),\n ),\n );\n const response = yield* client\n .execute(built)\n .pipe(\n Effect.mapError((cause) =>\n failure(\n procedure,\n `cannot reach ${options.origin}: ${cause.message}`,\n Option.none(),\n Option.none(),\n ),\n ),\n );\n if (statusOf(response) < 200 || statusOf(response) >= 300) {\n const text = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* Effect.fail(\n Option.match(wireError(text), {\n onNone: () =>\n failure(\n procedure,\n `the API answered ${statusOf(response)}`,\n Option.some(statusOf(response)),\n Option.none(),\n ),\n onSome: (error) =>\n failure(\n procedure,\n error.message ?? `the API answered ${statusOf(response)}`,\n Option.some(statusOf(response)),\n Option.orElse(Option.fromNullishOr(error.code), () =>\n Option.flatMap(Option.fromNullishOr(error.data), (data) =>\n Option.fromNullishOr(data.code),\n ),\n ),\n ),\n }),\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(RpcEnvelope)(response).pipe(\n Effect.flatMap((envelope) =>\n Schema.decodeUnknownEffect(schema)(envelope.json),\n ),\n Effect.mapError((cause) =>\n failure(\n procedure,\n `cannot read the answer: ${cause.message}`,\n Option.some(statusOf(response)),\n Option.none(),\n ),\n ),\n );\n });\n\n/** The same transport, for procedures outside a single pipeline. */\nexport const rpcRequest = request;\n\n/** A stale expected parent: the head moved between the fetch and the publish. */\nexport const isStaleParent = (error: PipelineApiError): boolean =>\n Option.contains(error.status, 409) &&\n Option.contains(error.code, \"stale-parent\");\n\n/**\n * The API client for one pipeline. The credential stays in the header; it is\n * never part of a request body, an error message or a local state file.\n */\nexport const makeClient = (options: {\n readonly origin: string;\n readonly secret: string;\n readonly pipelineId: string;\n}): PipelineApi => ({\n head: () =>\n request(\n options,\n \"head\",\n { pipelineId: options.pipelineId },\n Schema.NullOr(RevisionHead),\n ).pipe(Effect.map(Option.fromNullishOr)),\n revision: (revisionId) =>\n request(\n options,\n \"revision\",\n { pipelineId: options.pipelineId, revisionId },\n RevisionDocument,\n ),\n publish: (input) =>\n request(\n options,\n \"publishRevision\",\n {\n pipelineId: input.pipelineId,\n irText: input.irText,\n irHash: input.irHash,\n expectedParentId: input.expectedParentId,\n baseRevisionId: input.baseRevisionId,\n summary: input.summary ?? null,\n },\n PublishedRevision,\n ),\n proposals: (filter = {}) =>\n request(\n options,\n \"proposals\",\n {\n pipelineId: options.pipelineId,\n status: filter.status ?? null,\n base: filter.base ?? null,\n },\n Schema.Array(ProposalSummary),\n ),\n propose: (input) =>\n request(\n options,\n \"propose\",\n {\n pipelineId: input.pipelineId,\n baseRevisionId: input.baseRevisionId,\n patch: input.patch,\n rationale: input.rationale,\n },\n Schema.Struct({ proposalId: Schema.NonEmptyString }),\n ),\n reject: (proposalId) =>\n request(\n options,\n \"resolveProposal\",\n { proposalId, resolution: \"rejected\" },\n Schema.Struct({ ok: Schema.Boolean }),\n ).pipe(Effect.asVoid),\n recompute: (input) =>\n request(\n options,\n \"recompute\",\n {\n pipelineId: options.pipelineId,\n revisionId: input.revisionId,\n inputSnapshotId: input.inputSnapshotId,\n parameters: input.parameters ?? null,\n },\n RecomputeOutcome,\n \"pipelineRuns\",\n ),\n compare: (leftResultId, rightResultId) =>\n request(\n options,\n \"compare\",\n { leftResultId, rightResultId },\n Comparison,\n \"pipelineRuns\",\n ),\n});\n", "/**\n * Applying a proposal only counts once the compiler agrees (plan 069).\n *\n * `set-param` names a step parameter, but the IR's effective default can be\n * bound in the `@pipeline` declaration. Editing the step signature then changes\n * no IR: the patcher succeeded, the source moved, and the definition did not.\n * The patched text is compiled from an auto-removed sibling copy before the\n * checkout's source is replaced, so a refusal leaves it byte-identical and only\n * a verified patch is ever written.\n *\n * This is the apply path for the engine, `pull` and the CLI. `applyPatch` alone\n * is the pure span check, not permission to write.\n */\nimport { Crypto, Effect, Match, Option, Schema } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as P from \"effect/Predicate\";\nimport {\n decodePipelineIr,\n IrNumber,\n PipelineIr,\n type IrDefaultValue,\n type IrOp,\n} from \"@braven/pipeline-ir\";\nimport { PythonCompiler, compileIr, compilerFailure } from \"./compiler.ts\";\nimport { SyncFailure } from \"./errors.ts\";\nimport { PatchRefusal, applyPatch, type ApplyResult } from \"./patch.ts\";\nimport { writeSource } from \"./source.ts\";\n\n/** What a checked apply needs; everything is read before the patch runs. */\nexport interface VerifiedApplyInput {\n readonly cwd: string;\n readonly source: string;\n /** The checkout's exact bytes; a refusal leaves them in place. */\n readonly sourceText: string;\n /** The compile of `sourceText`; spans address it. */\n readonly local: PipelineIr;\n /** The proposal's base, or `local` for a conflict resolution. */\n readonly base: PipelineIr;\n readonly ops: ReadonlyArray<IrOp>;\n /** Write the verified text; `false` computes only (`pull --check`). */\n readonly write: boolean;\n}\n\nconst refusal = (\n op: IrOp,\n path: string,\n reason: \"shadowed-default\" | \"not-effective\" | \"not-found\",\n detail: string,\n): PatchRefusal => new PatchRefusal({ op: op.op, path, reason, detail });\n\nconst pathOf = (op: IrOp): string =>\n Match.value(op).pipe(\n Match.discriminator(\"op\")(\n \"set-param\",\n (value) => `/steps/${value.stepId}/params/${value.name}`,\n ),\n Match.discriminator(\"op\")(\n \"set-pipeline-param\",\n (value) => `/pipeline/params/${value.name}/default`,\n ),\n Match.discriminator(\"op\")(\n \"set-step-name\",\n (value) => `/steps/${value.stepId}/name`,\n ),\n Match.discriminator(\"op\")(\"set-description\", () => \"/pipeline/description\"),\n Match.orElse(() => \"/\"),\n );\n\nconst findStep = (ir: PipelineIr, id: string) =>\n Arr.findFirst(ir.steps, (step) => step.id === id);\n\nconst findPipelineParam = (ir: PipelineIr, name: string) =>\n Option.flatMap(ir.pipeline.params, (params) =>\n Arr.findFirst(params, (param) => param.name === name),\n );\n\n/** The literal's author-facing spelling, matching the IR's number lexeme. */\nconst textOf = (value: IrDefaultValue | Schema.Json): string =>\n value instanceof IrNumber\n ? value.text\n : P.isString(value)\n ? `\"${value}\"`\n : String(value);\n\n/** The compiled default the op intended, not just the literal it wrote. */\nconst sameValue = (intended: Schema.Json, actual: IrDefaultValue): boolean =>\n Match.value(intended).pipe(\n Match.when(\n P.isNumber,\n (value) => actual instanceof IrNumber && actual.value === value,\n ),\n Match.when(P.isString, (value) => P.isString(actual) && actual === value),\n Match.when(P.isBoolean, (value) => P.isBoolean(actual) && actual === value),\n Match.orElse(() => false),\n );\n\n// TODO(065/067): a `@pipeline` binding has its own target\n// (`/pipeline/params/<name>/default`); a step-path op on a bound param is\n// always dead source, so it is refused rather than retargeted silently.\nconst paramRefusal = (\n compiled: PipelineIr,\n op: Extract<IrOp, { readonly op: \"set-param\" }>,\n): Option.Option<PatchRefusal> => {\n const path = pathOf(op);\n const param = Option.flatMap(findStep(compiled, op.stepId), (step) =>\n Arr.findFirst(step.params, (candidate) => candidate.name === op.name),\n );\n if (Option.isNone(param)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled definition has no ${op.stepId}.${op.name}`,\n ),\n );\n }\n const boundTo = Option.getOrNull(param.value.pipelineParam);\n if (boundTo !== null) {\n return Option.some(\n refusal(\n op,\n path,\n \"shadowed-default\",\n `the effective default for ${op.stepId}.${op.name} is the @pipeline parameter \"${boundTo}\" of pipeline \"${compiled.pipeline.name}\"; propose /pipeline/params/${boundTo}/default instead`,\n ),\n );\n }\n if (Option.isNone(param.value.default)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled ${op.stepId}.${op.name} has no default; the patched source does not make ${textOf(op.value)} effective`,\n ),\n );\n }\n const actual = param.value.default.value;\n if (sameValue(op.value, actual)) return Option.none();\n return Option.some(\n refusal(\n op,\n path,\n \"shadowed-default\",\n `the effective default for ${op.stepId}.${op.name} comes from the @pipeline declaration (pipeline \"${compiled.pipeline.name}\", step ${op.stepId}), not the step signature: compiled ${textOf(actual)}, intended ${textOf(op.value)}; edit the @pipeline default instead`,\n ),\n );\n};\n\nconst pipelineParamRefusal = (\n compiled: PipelineIr,\n op: Extract<IrOp, { readonly op: \"set-pipeline-param\" }>,\n): Option.Option<PatchRefusal> => {\n const path = pathOf(op);\n const param = findPipelineParam(compiled, op.name);\n if (Option.isNone(param)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-found\",\n `the compiled definition has no @pipeline parameter ${op.name}`,\n ),\n );\n }\n if (Option.isNone(param.value.default)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled @pipeline parameter ${op.name} has no default; the patched source does not make ${textOf(op.value)} effective`,\n ),\n );\n }\n const actual = param.value.default.value;\n return sameValue(op.value, actual)\n ? Option.none()\n : Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled @pipeline parameter ${op.name} is ${textOf(actual)}, intended ${textOf(op.value)}; the edit did not change it`,\n ),\n );\n};\n\nconst stepNameRefusal = (\n compiled: PipelineIr,\n op: Extract<IrOp, { readonly op: \"set-step-name\" }>,\n): Option.Option<PatchRefusal> => {\n const path = pathOf(op);\n const step = findStep(compiled, op.stepId);\n if (Option.isNone(step)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled definition has no step ${op.stepId}`,\n ),\n );\n }\n return step.value.name === op.name\n ? Option.none()\n : Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled definition still calls step ${op.stepId} \"${step.value.name}\"; the edit did not change it`,\n ),\n );\n};\n\nconst descriptionRefusal = (\n compiled: PipelineIr,\n op: Extract<IrOp, { readonly op: \"set-description\" }>,\n): Option.Option<PatchRefusal> =>\n Option.exists(\n compiled.pipeline.description,\n (value) => value === op.description,\n )\n ? Option.none()\n : Option.some(\n refusal(\n op,\n \"/pipeline/description\",\n \"not-effective\",\n `the compiled description is not ${textOf(op.description)}; the edit did not change it`,\n ),\n );\n\n/** Every op whose intended value the compiled source does not carry. */\nexport const verifyOps = (\n compiled: PipelineIr,\n ops: ReadonlyArray<IrOp>,\n): ReadonlyArray<PatchRefusal> =>\n Arr.flatMap(ops, (op) =>\n Option.match(\n Match.value(op).pipe(\n Match.discriminator(\"op\")(\"set-param\", (value) =>\n paramRefusal(compiled, value),\n ),\n Match.discriminator(\"op\")(\"set-pipeline-param\", (value) =>\n pipelineParamRefusal(compiled, value),\n ),\n Match.discriminator(\"op\")(\"set-step-name\", (value) =>\n stepNameRefusal(compiled, value),\n ),\n Match.discriminator(\"op\")(\"set-description\", (value) =>\n descriptionRefusal(compiled, value),\n ),\n Match.orElse(() => Option.none<PatchRefusal>()),\n ),\n { onNone: () => [], onSome: (value) => [value] },\n ),\n );\n\n/**\n * Compiles the staged text from a sibling of the source, so relative imports\n * resolve exactly as they do for the real file. The copy is removed afterwards,\n * whatever the compiler says.\n */\nconst compileStaged = (input: VerifiedApplyInput, text: string) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const crypto = yield* Crypto.Crypto;\n const directory = path.dirname(path.resolve(input.cwd, input.source));\n const nonce = yield* crypto.randomUUIDv4().pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot stage ${input.source} for verification: ${cause.message}`,\n }),\n ),\n );\n const file = path.join(directory, `.braven-verify-${nonce}.py`);\n yield* fs.writeFileString(file, text).pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot stage ${input.source} for verification: ${cause.message}`,\n }),\n ),\n );\n return yield* Effect.ensuring(\n Effect.gen(function* () {\n const compiled = yield* compileIr(file, { cwd: input.cwd }).pipe(\n Effect.mapError((error) => compilerFailure(input.source, error)),\n );\n return yield* decodePipelineIr(compiled).pipe(\n Effect.mapError(\n (error) =>\n new SyncFailure({\n kind: \"source\",\n message: `the compiler returned an unreadable IR for the patched ${input.source}: ${error.message}`,\n }),\n ),\n );\n }),\n fs.remove(file).pipe(Effect.orElseSucceed(() => undefined)),\n );\n });\n\n/**\n * Applies every op or none, proves the patch is effective, then writes.\n *\n * A refusal is returned as an `ApplyResult`, never as a partial write; a\n * staging, compiler or decode failure is a `SyncFailure` with the same\n * guarantee (the source was never replaced).\n */\nexport const applyVerified = (\n input: VerifiedApplyInput,\n): Effect.Effect<\n ApplyResult,\n SyncFailure,\n Crypto.Crypto | FileSystem.FileSystem | Path.Path | PythonCompiler\n> =>\n Effect.gen(function* () {\n const applied = yield* applyPatch({\n sourceText: input.sourceText,\n local: input.local,\n base: input.base,\n ops: input.ops,\n });\n if (applied.status === \"refused\") return applied;\n // An op can intend the value the literal already has; the compiled document\n // still decides whether that value is the effective one.\n if (input.ops.length === 0) return applied;\n\n const compiled = yield* compileStaged(input, applied.text);\n const refusals = verifyOps(compiled, input.ops);\n if (refusals.length > 0) return { status: \"refused\", refusals };\n\n if (input.write) yield* writeSource(input.cwd, input.source, applied.text);\n return applied;\n });\n", "/**\n * Round-trip-safe proposal application (plan 069).\n *\n * A proposal names an IR construct; this module turns the safe ones into an\n * exact source edit and refuses the rest. It never regenerates Python: the\n * edit replaces one literal (or inserts one decorator keyword) inside the span\n * the compiler reported, and only after the construct's canonical content still\n * matches the proposal's base revision. A mismatch is a `span-moved` refusal \u2014\n * the wrong line is never edited, and a refused plan leaves the text untouched.\n *\n * Safe in v1: `set-param` (a literal), `set-step-name` (the `@step(name=\u2026)`\n * keyword) and `set-description` (the `@pipeline(description=\u2026)` keyword).\n * Requirements, edges, types, steps and opaque code are refused with the exact\n * intent, because the engineer must write those.\n *\n * A span-checked edit can still be dead source when the effective value is\n * bound elsewhere (a `@pipeline` parameter shadowing a step default). That is\n * `apply.ts`'s post-compile check, not the patcher's; callers apply through\n * `applyVerified`, never through `applyPatch` alone.\n */\nimport { Crypto, Effect, Match, Schema } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Result from \"effect/Result\";\nimport * as Str from \"effect/String\";\nimport {\n IrDefaultValue,\n IrNumber,\n IrParam,\n IrPipeline,\n IrPipelineParam,\n IrStep,\n PipelineIr,\n type IrOp,\n} from \"@braven/pipeline-ir\";\nimport { pipelineParamContentKey, stepContentKey } from \"./merge.ts\";\n\n/** Why an op was not applied. */\nexport const RefusalReason = Schema.Literals([\n \"not-found\",\n \"span-moved\",\n \"no-default\",\n \"not-a-literal\",\n \"unsupported\",\n \"unsupported-value\",\n \"overlap\",\n /** The edited literal is not the effective default: a `@pipeline` binding wins. */\n \"shadowed-default\",\n /** The compiled document does not carry the value the op intended. */\n \"not-effective\",\n]);\nexport type RefusalReason = typeof RefusalReason.Type;\n\n/** One refused op, naming the construct and the exact intent. */\nexport class PatchRefusal extends Schema.Class<PatchRefusal>(\"PatchRefusal\")({\n op: Schema.String,\n path: Schema.String,\n reason: RefusalReason,\n detail: Schema.String,\n}) {}\n\n/** One exact source edit, for the report and for `pull --check`. */\nexport class PatchChange extends Schema.Class<PatchChange>(\"PatchChange\")({\n path: Schema.String,\n /** The text the edit replaces. */\n before: Schema.String,\n /** What replaces it. */\n after: Schema.String,\n}) {}\n\nexport interface ApplyInput {\n readonly sourceText: string;\n /** The local compile of `sourceText`; spans address this file. */\n readonly local: PipelineIr;\n /** The proposal's base revision; the construct must still match it. */\n readonly base: PipelineIr;\n readonly ops: ReadonlyArray<IrOp>;\n}\n\n/** The patched text and the IR it should compile to, or every refusal. */\nexport type ApplyResult =\n | {\n readonly status: \"applied\";\n readonly text: string;\n readonly changes: ReadonlyArray<PatchChange>;\n readonly expected: PipelineIr;\n }\n | {\n readonly status: \"refused\";\n readonly refusals: ReadonlyArray<PatchRefusal>;\n };\n\ninterface Edit {\n readonly start: number;\n readonly end: number;\n readonly replacement: string;\n readonly path: string;\n}\n\nconst refusal = (\n op: IrOp,\n path: string,\n reason: RefusalReason,\n detail: string,\n): PatchRefusal => new PatchRefusal({ op: op.op, path, reason, detail });\n\nconst hex = (bytes: Uint8Array): string =>\n Arr.join(\n Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")),\n \"\",\n );\n\nconst digest = (text: string) =>\n Effect.gen(function* () {\n const crypto = yield* Crypto.Crypto;\n const bytes = yield* crypto.digest(\n \"SHA-256\",\n new TextEncoder().encode(text),\n );\n return `sha256:${hex(bytes)}`;\n }).pipe(Effect.orDie);\n\nconst literalPattern =\n /^(?:True|False|None|[-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][-+]?\\d+)?|\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')$/;\n\nconst isLiteral = (text: string): boolean =>\n literalPattern.test(Str.trim(text));\n\n/**\n * The Python spelling of a literal. A JSON string is a valid Python string\n * literal, and a number keeps the lexeme the proposal carried.\n */\nconst renderDefault = (value: Schema.Json): Option.Option<string> =>\n typeof value === \"string\"\n ? Option.some(JSON.stringify(value))\n : typeof value === \"boolean\"\n ? Option.some(value ? \"True\" : \"False\")\n : typeof value === \"number\"\n ? Option.some(String(value))\n : Option.none();\n\n/** `[start, end)` of a 1-based, inclusive source span. */\nconst spanRange = (\n text: string,\n startLine: number,\n endLine: number,\n): { readonly start: number; readonly end: number } => {\n const lines = Str.split(\"\\n\")(text);\n const start = Arr.reduce(\n Arr.take(lines, Math.max(0, startLine - 1)),\n 0,\n (offset, line) => offset + line.length + 1,\n );\n const last = lines[endLine - 1] ?? \"\";\n return { start, end: start + last.length };\n};\n\ninterface Segment {\n readonly text: string;\n readonly start: number;\n}\n\n/** Skips a quoted Python string starting at `index`; returns its closing quote. */\nconst skipString = (text: string, index: number): number => {\n const quote = text[index];\n const step = (cursor: number): number => {\n if (cursor >= text.length) return text.length - 1;\n const char = text[cursor];\n if (char === \"\\\\\") return step(cursor + 2);\n if (char === quote) return cursor;\n return step(cursor + 1);\n };\n return step(index + 1);\n};\n\n/** The index of the `)` matching the `(` at `open`. */\nconst matchParen = (text: string, open: number): Option.Option<number> => {\n const walk = (cursor: number, depth: number): Option.Option<number> => {\n if (cursor >= text.length) return Option.none();\n const char = text[cursor];\n if (char === '\"' || char === \"'\")\n return walk(skipString(text, cursor) + 1, depth);\n if (char === \"(\") return walk(cursor + 1, depth + 1);\n if (char === \")\")\n return depth === 1 ? Option.some(cursor) : walk(cursor + 1, depth - 1);\n return walk(cursor + 1, depth);\n };\n return text[open] === \"(\" ? walk(open + 1, 1) : Option.none();\n};\n\n/** Splits `text` on top-level commas, keeping each segment's offset. */\nconst segments = (text: string, base: number): ReadonlyArray<Segment> => {\n const walk = (\n cursor: number,\n depth: number,\n start: number,\n found: ReadonlyArray<Segment>,\n ): ReadonlyArray<Segment> => {\n if (cursor >= text.length)\n return [...found, { text: text.slice(start), start: base + start }];\n const char = text[cursor];\n if (char === '\"' || char === \"'\")\n return walk(skipString(text, cursor) + 1, depth, start, found);\n if (char === \"(\" || char === \"[\" || char === \"{\")\n return walk(cursor + 1, depth + 1, start, found);\n if (char === \")\" || char === \"]\" || char === \"}\")\n return walk(cursor + 1, depth - 1, start, found);\n if (char === \",\" && depth === 0)\n return walk(cursor + 1, 0, cursor + 1, [\n ...found,\n { text: text.slice(start, cursor), start: base + start },\n ]);\n return walk(cursor + 1, depth, start, found);\n };\n return walk(0, 0, 0, []);\n};\n\nconst leadingSpace = (text: string): number =>\n text.length - Str.trimStart(text).length;\n\n/** The `name=value` keyword in a decorator body, if it has one. */\nconst keyword = (\n body: string,\n base: number,\n keywordName: string,\n): Option.Option<{ readonly start: number; readonly end: number }> =>\n Arr.head(\n Arr.flatMap(segments(body, base), (segment) => {\n const text = Str.trimStart(segment.text);\n const offset = segment.start + leadingSpace(segment.text);\n const equals = text.indexOf(\"=\");\n if (equals < 0) return [];\n if (Str.trim(text.slice(0, equals)) !== keywordName) return [];\n const raw = text.slice(equals + 1);\n const value = Str.trim(raw);\n const start = offset + equals + 1 + leadingSpace(raw);\n return [{ start, end: start + value.length }];\n }),\n );\n\nconst functionSignature = (\n text: string,\n span: { readonly start: number; readonly end: number },\n functionName: string,\n): Option.Option<{ readonly open: number; readonly close: number }> => {\n const region = text.slice(span.start, span.end);\n const needle = `def ${functionName}`;\n const first = region.indexOf(needle);\n if (first < 0 || region.indexOf(needle, first + 1) >= 0) return Option.none();\n const open = region.indexOf(\"(\", first + needle.length);\n if (open < 0) return Option.none();\n return Option.map(matchParen(region, open), (close) => ({\n open: span.start + open,\n close: span.start + close,\n }));\n};\n\nconst paramSegment = (\n signature: string,\n name: string,\n): Option.Option<Segment> =>\n Arr.findFirst(segments(signature, 0), (segment) => {\n const text = Str.trim(segment.text);\n const head = text.split(\":\")[0]?.split(\"=\")[0] ?? \"\";\n return Str.trim(head).replaceAll(\"*\", \"\") === name;\n });\n\nconst findStep = (ir: PipelineIr, id: string): Option.Option<IrStep> =>\n Arr.findFirst(ir.steps, (step) => step.id === id);\n\nconst findParam = (step: IrStep, name: string): Option.Option<IrParam> =>\n Arr.findFirst(step.params, (param) => param.name === name);\n\nconst findPipelineParam = (\n ir: PipelineIr,\n name: string,\n): Option.Option<IrPipelineParam> =>\n Option.flatMap(ir.pipeline.params, (params) =>\n Arr.findFirst(params, (param) => param.name === name),\n );\n\n/** The index of the first top-level `,`, newline or closing bracket. */\nconst endOfValue = (text: string, from: number): number => {\n const walk = (cursor: number, depth: number): number => {\n if (cursor >= text.length) return cursor;\n const char = text[cursor];\n if (char === '\"' || char === \"'\")\n return walk(skipString(text, cursor) + 1, depth);\n if (char === \"(\" || char === \"[\" || char === \"{\")\n return walk(cursor + 1, depth + 1);\n if (char === \")\" || char === \"]\" || char === \"}\")\n return depth === 0 ? cursor : walk(cursor + 1, depth - 1);\n if ((char === \",\" || char === \"\\n\") && depth === 0) return cursor;\n return walk(cursor + 1, depth);\n };\n return walk(from, 0);\n};\n\n/**\n * The `name: type = literal` argument inside a parameter's own source span.\n *\n * The compiler reports each parameter's lines, so the search is local: a name\n * that is no longer declared there is `span-moved`, never a guess.\n */\nconst parameterLiteral = (\n text: string,\n span: { readonly start: number; readonly end: number },\n name: string,\n): Option.Option<{\n readonly start: number;\n readonly end: number;\n readonly value: string;\n}> => {\n const region = text.slice(span.start, span.end);\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = new RegExp(`(?:^|[,(\\\\s])${escaped}\\\\s*:`).exec(region);\n if (match === null) return Option.none();\n const annotationEnd = endOfValue(region, match.index + match[0].length);\n const equals = region.indexOf(\"=\", match.index + match[0].length);\n // No default of its own: the next parameter's `=` is beyond the boundary.\n if (equals < 0 || equals > annotationEnd) return Option.none();\n const raw = region.slice(equals + 1, endOfValue(region, equals + 1));\n const value = Str.trim(raw);\n const start = span.start + equals + 1 + leadingSpace(raw);\n return Option.some({ start, end: start + value.length, value });\n};\n\n/** The decorator `@name` in `region`, with the body's `(`/`)` offsets. */\nconst decorator = (\n text: string,\n span: { readonly start: number; readonly end: number },\n name: string,\n): Option.Option<{\n readonly at: number;\n readonly open: number;\n readonly close: number;\n}> => {\n const region = text.slice(span.start, span.end);\n const needle = `@${name}`;\n const first = region.indexOf(needle);\n if (first < 0 || region.indexOf(needle, first + 1) >= 0) return Option.none();\n const after = first + needle.length;\n const rest = region.slice(after);\n const next = after + (rest.length - Str.trimStart(rest).length);\n if (region[next] !== \"(\")\n return Option.some({ at: span.start + first, open: -1, close: -1 });\n return Option.map(matchParen(region, next), (close) => ({\n at: span.start + first,\n open: span.start + next,\n close: span.start + close,\n }));\n};\n\nconst setParamEdit = (\n input: ApplyInput,\n op: Extract<IrOp, { readonly op: \"set-param\" }>,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> =>\n Effect.gen(function* () {\n const path = `/steps/${op.stepId}/params/${op.name}`;\n const fromBase = Option.flatMap(findStep(input.base, op.stepId), (step) =>\n Option.map(findParam(step, op.name), (param) => ({ step, param })),\n );\n const fromLocal = Option.flatMap(findStep(input.local, op.stepId), (step) =>\n Option.map(findParam(step, op.name), (param) => ({ step, param })),\n );\n if (Option.isNone(fromBase) || Option.isNone(fromLocal))\n return Result.fail(\n refusal(\n op,\n path,\n \"not-found\",\n \"the step or parameter no longer exists\",\n ),\n );\n\n const expectedHash = yield* digest(stepContentKey(fromBase.value.step));\n const actualHash = yield* digest(stepContentKey(fromLocal.value.step));\n if (expectedHash !== actualHash)\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the step changed locally (${actualHash} != ${expectedHash}); review the proposal by hand`,\n ),\n );\n if (Option.isNone(fromLocal.value.param.default))\n return Result.fail(\n refusal(op, path, \"no-default\", \"the parameter has no default literal\"),\n );\n const rendered = renderDefault(op.value);\n if (Option.isNone(rendered))\n return Result.fail(\n refusal(\n op,\n path,\n \"unsupported-value\",\n \"only string, number and boolean literals are round-trip-safe in v1\",\n ),\n );\n const replacement = rendered.value;\n\n const step = fromLocal.value.step;\n const span = spanRange(\n input.sourceText,\n step.source.span.startLine,\n step.source.span.endLine,\n );\n const signature = functionSignature(\n input.sourceText,\n span,\n step.implementation.type === \"python\"\n ? step.implementation.function\n : step.id,\n );\n if (Option.isNone(signature))\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n \"the step's function signature is no longer in its span\",\n ),\n );\n const open = signature.value.open;\n const body = input.sourceText.slice(open + 1, signature.value.close);\n const segment = paramSegment(body, op.name);\n if (Option.isNone(segment))\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the parameter is no longer declared in ${op.stepId}'s signature`,\n ),\n );\n const text = segment.value.text;\n const equals = text.indexOf(\"=\");\n if (equals < 0)\n return Result.fail(\n refusal(op, path, \"no-default\", \"the parameter has no default literal\"),\n );\n const raw = text.slice(equals + 1);\n const value = Str.trim(raw);\n if (!isLiteral(value))\n return Result.fail(\n refusal(\n op,\n path,\n \"not-a-literal\",\n `the default is not a literal: ${value}`,\n ),\n );\n const start =\n open + 1 + segment.value.start + equals + 1 + leadingSpace(raw);\n return Result.succeed({\n start,\n end: start + value.length,\n replacement,\n path,\n });\n });\n\nconst setPipelineParamEdit = (\n input: ApplyInput,\n op: Extract<IrOp, { readonly op: \"set-pipeline-param\" }>,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> =>\n Effect.gen(function* () {\n const path = `/pipeline/params/${op.name}/default`;\n const fromBase = findPipelineParam(input.base, op.name);\n const fromLocal = findPipelineParam(input.local, op.name);\n if (Option.isNone(fromBase) || Option.isNone(fromLocal))\n return Result.fail(\n refusal(\n op,\n path,\n \"not-found\",\n \"the @pipeline parameter no longer exists\",\n ),\n );\n\n const expectedHash = yield* digest(pipelineParamContentKey(fromBase.value));\n const actualHash = yield* digest(pipelineParamContentKey(fromLocal.value));\n if (expectedHash !== actualHash)\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the @pipeline parameter changed locally (${actualHash} != ${expectedHash}); review the proposal by hand`,\n ),\n );\n if (Option.isNone(fromLocal.value.default))\n return Result.fail(\n refusal(op, path, \"no-default\", \"the parameter has no default literal\"),\n );\n const rendered = renderDefault(op.value);\n if (Option.isNone(rendered))\n return Result.fail(\n refusal(\n op,\n path,\n \"unsupported-value\",\n \"only string, number and boolean literals are round-trip-safe in v1\",\n ),\n );\n\n const param = fromLocal.value;\n const found = parameterLiteral(\n input.sourceText,\n spanRange(\n input.sourceText,\n param.source.span.startLine,\n param.source.span.endLine,\n ),\n op.name,\n );\n if (Option.isNone(found))\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the parameter is no longer declared in the @pipeline signature`,\n ),\n );\n if (!isLiteral(found.value.value))\n return Result.fail(\n refusal(\n op,\n path,\n \"not-a-literal\",\n `the default is not a literal: ${found.value.value}`,\n ),\n );\n return Result.succeed({\n start: found.value.start,\n end: found.value.end,\n replacement: rendered.value,\n path,\n });\n });\n\nconst setStepNameEdit = (\n input: ApplyInput,\n op: Extract<IrOp, { readonly op: \"set-step-name\" }>,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> =>\n Effect.gen(function* () {\n const path = `/steps/${op.stepId}/name`;\n const fromBase = findStep(input.base, op.stepId);\n const fromLocal = findStep(input.local, op.stepId);\n if (Option.isNone(fromBase) || Option.isNone(fromLocal))\n return Result.fail(\n refusal(op, path, \"not-found\", \"the step no longer exists\"),\n );\n const expectedHash = yield* digest(stepContentKey(fromBase.value));\n const actualHash = yield* digest(stepContentKey(fromLocal.value));\n if (expectedHash !== actualHash)\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the step changed locally (${actualHash} != ${expectedHash}); review the proposal by hand`,\n ),\n );\n\n const step = fromLocal.value;\n const span = spanRange(\n input.sourceText,\n step.source.span.startLine,\n step.source.span.endLine,\n );\n const found = decorator(input.sourceText, span, \"step\");\n if (Option.isNone(found))\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n \"the step's @step decorator is no longer in its span\",\n ),\n );\n const literal = JSON.stringify(op.name);\n const existing =\n found.value.open < 0\n ? Option.none()\n : keyword(\n input.sourceText.slice(found.value.open + 1, found.value.close),\n found.value.open + 1,\n \"name\",\n );\n if (Option.isSome(existing))\n return Result.succeed({\n start: existing.value.start,\n end: existing.value.end,\n replacement: literal,\n path,\n });\n if (found.value.open < 0)\n return Result.succeed({\n start: found.value.at,\n end: found.value.at + \"@step\".length,\n replacement: `@step(name=${literal})`,\n path,\n });\n const body = input.sourceText.slice(\n found.value.open + 1,\n found.value.close,\n );\n const empty = Str.trim(body).length === 0;\n return Result.succeed({\n start: found.value.open + 1,\n end: found.value.open + 1,\n replacement: empty ? `name=${literal}` : `name=${literal}, `,\n path,\n });\n });\n\nconst setDescriptionEdit = (\n input: ApplyInput,\n op: Extract<IrOp, { readonly op: \"set-description\" }>,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> => {\n const path = \"/pipeline/description\";\n const expected = input.base.pipeline.description;\n const actual = input.local.pipeline.description;\n if (Option.getOrNull(expected) !== Option.getOrNull(actual))\n return Effect.succeed(\n Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n \"the description changed locally; review the proposal by hand\",\n ),\n ),\n );\n const found = decorator(\n input.sourceText,\n { start: 0, end: input.sourceText.length },\n \"pipeline\",\n );\n if (Option.isNone(found) || found.value.open < 0)\n return Effect.succeed(\n Result.fail(\n refusal(op, path, \"not-found\", \"no @pipeline(...) decorator found\"),\n ),\n );\n const literal = JSON.stringify(op.description);\n const existing = keyword(\n input.sourceText.slice(found.value.open + 1, found.value.close),\n found.value.open + 1,\n \"description\",\n );\n if (Option.isSome(existing))\n return Effect.succeed(\n Result.succeed({\n start: existing.value.start,\n end: existing.value.end,\n replacement: literal,\n path,\n }),\n );\n const body = input.sourceText.slice(found.value.open + 1, found.value.close);\n const empty = Str.trim(body).length === 0;\n return Effect.succeed(\n Result.succeed({\n start: found.value.open + 1,\n end: found.value.open + 1,\n replacement: empty\n ? `description=${literal}`\n : `description=${literal}, `,\n path,\n }),\n );\n};\n\nconst unsupported = (op: IrOp): PatchRefusal => {\n const details: Readonly<Record<IrOp[\"op\"], (candidate: IrOp) => string>> = {\n \"add-edge\": (candidate) =>\n candidate.op === \"add-edge\"\n ? `add the edge ${candidate.fromStep}.${candidate.fromPort} -> ${candidate.toStep}.${candidate.toPort}`\n : \"\",\n \"remove-edge\": (candidate) =>\n candidate.op === \"remove-edge\"\n ? `remove the edge ${candidate.fromStep}.${candidate.fromPort} -> ${candidate.toStep}.${candidate.toPort}`\n : \"\",\n \"set-runtime\": (candidate) =>\n candidate.op === \"set-runtime\"\n ? `set the runtime to ${Object.entries(candidate.runtime)\n .map(([key, value]) => `${key}=${String(value)}`)\n .join(\", \")}`\n : \"\",\n \"set-param\": () => \"\",\n \"set-pipeline-param\": () => \"\",\n \"set-step-name\": () => \"\",\n \"set-description\": () => \"\",\n };\n return refusal(\n op,\n op.op === \"add-edge\" || op.op === \"remove-edge\"\n ? \"/edges\"\n : op.op === \"set-runtime\"\n ? \"/runtime\"\n : \"/\",\n \"unsupported\",\n `${details[op.op](op)} \u2014 this changes control flow or a file the IR does not own; the engineer writes it`,\n );\n};\n\nconst editFor = (\n input: ApplyInput,\n op: IrOp,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> =>\n Match.value(op).pipe(\n Match.discriminator(\"op\")(\"set-param\", (value) =>\n setParamEdit(input, value),\n ),\n Match.discriminator(\"op\")(\"set-pipeline-param\", (value) =>\n setPipelineParamEdit(input, value),\n ),\n Match.discriminator(\"op\")(\"set-step-name\", (value) =>\n setStepNameEdit(input, value),\n ),\n Match.discriminator(\"op\")(\"set-description\", (value) =>\n setDescriptionEdit(input, value),\n ),\n Match.orElse((value) => Effect.succeed(Result.fail(unsupported(value)))),\n );\n\nconst defaultOf = (value: Schema.Json): Option.Option<IrDefaultValue> =>\n typeof value === \"number\"\n ? Option.some(new IrNumber({ value, text: String(value) }))\n : typeof value === \"string\" || typeof value === \"boolean\"\n ? Option.some(value)\n : Option.none();\n\n/** The IR the patched source must compile to; used to verify the edit. */\nexport const applyOpsToIr = (\n ir: PipelineIr,\n ops: ReadonlyArray<IrOp>,\n): PipelineIr =>\n Arr.reduce(ops, ir, (current, op) =>\n Match.value(op).pipe(\n Match.discriminator(\"op\")(\n \"set-param\",\n (value) =>\n new PipelineIr({\n ...current,\n steps: current.steps.map((step) =>\n step.id !== value.stepId\n ? step\n : new IrStep({\n ...step,\n params: step.params.map((param) =>\n param.name !== value.name\n ? param\n : new IrParam({\n ...param,\n default: Option.orElse(\n defaultOf(value.value),\n () => param.default,\n ),\n }),\n ),\n }),\n ),\n }),\n ),\n Match.discriminator(\"op\")(\"set-pipeline-param\", (value) =>\n Option.match(defaultOf(value.value), {\n onNone: () => current,\n onSome: (next) =>\n new PipelineIr({\n ...current,\n pipeline: new IrPipeline({\n ...current.pipeline,\n params: Option.map(current.pipeline.params, (params) =>\n params.map((param) =>\n param.name !== value.name\n ? param\n : new IrPipelineParam({\n ...param,\n default: Option.some(next),\n }),\n ),\n ),\n }),\n // A bound step param's effective default is the declaration's.\n steps: current.steps.map(\n (step) =>\n new IrStep({\n ...step,\n params: step.params.map((param) =>\n Option.contains(param.pipelineParam, value.name)\n ? new IrParam({\n ...param,\n default: Option.some(next),\n required: Option.none(),\n })\n : param,\n ),\n }),\n ),\n }),\n }),\n ),\n Match.discriminator(\"op\")(\n \"set-step-name\",\n (value) =>\n new PipelineIr({\n ...current,\n steps: current.steps.map((step) =>\n step.id === value.stepId\n ? new IrStep({ ...step, name: value.name })\n : step,\n ),\n }),\n ),\n Match.discriminator(\"op\")(\n \"set-description\",\n (value) =>\n new PipelineIr({\n ...current,\n pipeline: new IrPipeline({\n ...current.pipeline,\n description: Option.some(value.description),\n }),\n }),\n ),\n Match.orElse(() => current),\n ),\n );\n\n/**\n * Applies every op or none of them.\n *\n * Edits are collected against the original text, checked for overlap, then\n * applied from the end so offsets stay valid. A refusal anywhere returns the\n * untouched text implicitly (the caller keeps the original).\n */\nexport const applyPatch = (\n input: ApplyInput,\n): Effect.Effect<ApplyResult, never, Crypto.Crypto> =>\n Effect.gen(function* () {\n const results = yield* Effect.forEach(\n input.ops,\n (op) => editFor(input, op),\n {\n concurrency: 1,\n },\n );\n const refusals = Arr.flatMap(results, (result) =>\n Result.match(result, {\n onSuccess: () => [],\n onFailure: (failure) => [failure],\n }),\n );\n if (refusals.length > 0) return { status: \"refused\", refusals };\n\n const edits = Arr.flatMap(results, (result) =>\n Result.match(result, {\n onSuccess: (edit) => [edit],\n onFailure: () => [],\n }),\n );\n const ordered = Arr.sort(\n edits,\n Order.mapInput(Order.Number, (edit: Edit) => edit.start),\n );\n const overlaps = Arr.filter(\n Arr.zip(ordered, Arr.drop(ordered, 1)),\n ([left, right]) => right.start < left.end,\n );\n if (overlaps.length > 0)\n return {\n status: \"refused\",\n refusals: [\n new PatchRefusal({\n op: \"patch\",\n path: overlaps[0]?.[1].path ?? \"/\",\n reason: \"overlap\",\n detail: \"two operations edit the same source text\",\n }),\n ],\n };\n\n const text = Arr.reduceRight(\n ordered,\n input.sourceText,\n (current, edit) =>\n `${current.slice(0, edit.start)}${edit.replacement}${current.slice(edit.end)}`,\n );\n return {\n status: \"applied\",\n text,\n changes: ordered.map(\n (edit) =>\n new PatchChange({\n path: edit.path,\n before: input.sourceText.slice(edit.start, edit.end),\n after: edit.replacement,\n }),\n ),\n expected: applyOpsToIr(input.local, input.ops),\n };\n });\n", "/**\n * The three-way merge of pipeline definitions (plan 069).\n *\n * The merge unit is the IR, never Python text. Each addressable element \u2014 a\n * step by id, a port by `(step, id)`, a parameter by `(step, name)`, an edge by\n * its endpoints, runtime and metadata by field \u2014 is compared as `base`,\n * `local` and `remote`. A field changed on one side takes that side; a field\n * changed on both sides to different values is a conflict. There is no \"latest\n * wins\".\n *\n * Line numbers are navigation, not meaning: `source.span` never causes a\n * conflict, and a deletion is only a `delete/edit` conflict when the surviving\n * side changed the step's graph content. The merged document always drops\n * `metadata.irHash`; the publisher recomputes it from the merged bytes.\n */\nimport { Match } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as P from \"effect/Predicate\";\nimport * as R from \"effect/Record\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport {\n IrEdge,\n IrImplementation,\n IrMetadata,\n IrNumber,\n IrOpaqueImplementation,\n IrParam,\n IrParamBinding,\n IrParamType,\n IrOpaqueDeclared,\n IrPipeline,\n IrPipelineParam,\n IrPort,\n IrPythonImplementation,\n IrRequirements,\n IrRuntime,\n IrSource,\n IrSourceSpan,\n IrStep,\n IrDefaultValue,\n IrType,\n PipelineIr,\n typesCompatible,\n} from \"@braven/pipeline-ir\";\nimport {\n ResolutionRefusal,\n type ResolutionSide,\n settlement,\n} from \"./resolve.ts\";\n\n/** Why a field could not be merged. Each kind has one stable hint. */\nexport const ConflictKind = Schema.Literals([\n \"field-changed-both\",\n \"add/add\",\n \"delete/edit\",\n \"opaque-changed-both\",\n \"edge-type-conflict\",\n]);\nexport type ConflictKind = typeof ConflictKind.Type;\n\nconst hints: Readonly<Record<ConflictKind, string>> = {\n \"field-changed-both\": \"edit the source, then push\",\n \"add/add\":\n \"both sides added this element; keep one definition in the source, then push\",\n \"delete/edit\":\n \"one side removed this element while the other changed it; keep or remove it in the source, then push\",\n \"opaque-changed-both\":\n \"the code changed on both sides; reconcile the source by hand, then push\",\n \"edge-type-conflict\":\n \"the merged edge no longer type-checks; fix the port type in the source, then push\",\n};\n\n/** One field or element that both sides changed differently. */\nexport class IrConflict extends Schema.Class<IrConflict>(\"IrConflict\")({\n /** An RFC 6901 pointer into the IR: `/steps/filter/params/threshold`. */\n path: Schema.String,\n kind: ConflictKind,\n base: Schema.Json,\n local: Schema.Json,\n remote: Schema.Json,\n hint: Schema.String,\n}) {}\n\n/**\n * A clean merged definition, every conflict that prevented one, or the\n * resolutions the caller asked for that could not be honoured.\n */\nexport type MergeResult =\n | { readonly status: \"clean\"; readonly ir: PipelineIr }\n | {\n readonly status: \"conflict\";\n readonly conflicts: ReadonlyArray<IrConflict>;\n }\n | {\n readonly status: \"refused\";\n readonly refusals: ReadonlyArray<ResolutionRefusal>;\n };\n\nconst pointerToken = (token: string): string =>\n token.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n\nconst at = (path: string, ...tokens: ReadonlyArray<string>): string =>\n `${path}/${tokens.map(pointerToken).join(\"/\")}`;\n\n/**\n * Deterministic text for an encoded value: sorted keys, no whitespace.\n *\n * This is a comparison key, not a wire codec: strings are length-prefixed so\n * no value can collide with a separator, and no JSON parser is involved.\n */\nexport const stableText = (value: unknown): string =>\n Match.value(value).pipe(\n Match.when(Array.isArray, (items: ReadonlyArray<unknown>) =>\n items.map(stableText).join(\",\"),\n ),\n Match.when(P.isObject, (record: Readonly<Record<string, unknown>>) =>\n Arr.map(\n Arr.sort(\n Object.entries(record),\n Order.mapInput(\n Order.String,\n (entry: readonly [string, unknown]) => entry[0],\n ),\n ),\n ([key, field]) => `${key.length}:${key}=${stableText(field)}`,\n ).join(\";\"),\n ),\n Match.when(P.isString, (text: string) => `s${text.length}:${text}`),\n Match.when(P.isBoolean, (flag: boolean) => (flag ? \"b1\" : \"b0\")),\n Match.when(P.isNumber, (number: number) => `n${number}`),\n Match.when(P.isNull, () => \"z\"),\n Match.orElse(() => \"z\"),\n );\n\nconst encoded = <S extends Schema.ConstraintEncoder<unknown, never>>(\n schema: S,\n value: S[\"Type\"],\n): string => stableText(Schema.encodeSync(schema)(value));\n\n/** A step's canonical content, without its line numbers. */\nexport const stepContentKey = (step: IrStep): string =>\n encoded(\n IrStep,\n new IrStep({\n ...step,\n source: new IrSource({\n path: step.source.path,\n span: new IrSourceSpan({ startLine: 1, endLine: 1 }),\n }),\n }),\n );\n\nconst spanless = (param: IrPipelineParam): IrPipelineParam =>\n new IrPipelineParam({\n ...param,\n source: new IrSource({\n path: param.source.path,\n span: new IrSourceSpan({ startLine: 1, endLine: 1 }),\n }),\n });\n\n/** A `@pipeline` parameter's canonical content, without its line numbers. */\nexport const pipelineParamContentKey = (param: IrPipelineParam): string =>\n encoded(IrPipelineParam, spanless(param));\n\n/** The declaration with its parameter spans neutralised, for comparison. */\nconst stablePipeline = (pipeline: IrPipeline): IrPipeline =>\n new IrPipeline({\n ...pipeline,\n params: Option.map(pipeline.params, (params) =>\n Arr.map(params, (param) => spanless(param)),\n ),\n });\n\nconst edgeKey = (edge: IrEdge): string =>\n [edge.from.step, edge.from.port, edge.to.step, edge.to.port].join(\"\\u0000\");\n\nconst edgeJson = (edge: IrEdge): Schema.Json =>\n asJson(Schema.encodeSync(IrEdge)(edge));\n\nconst asJson = (value: unknown): Schema.Json =>\n Schema.decodeUnknownSync(Schema.Json)(value);\n\nconst jsonOf = <S extends Schema.ConstraintEncoder<unknown, never>>(\n schema: S,\n value: S[\"Type\"],\n): Schema.Json => asJson(Schema.encodeSync(schema)(value));\n\nconst optionJson = <A>(\n value: Option.Option<A>,\n render: (inner: A) => Schema.Json,\n): Schema.Json => Option.match(value, { onNone: () => null, onSome: render });\n\nconst defaultJson = (\n value: Option.Option<string | boolean | IrNumber>,\n): Schema.Json =>\n optionJson(value, (inner) =>\n inner instanceof IrNumber ? inner.value : inner,\n );\n\nconst stepJson = (step: IrStep): Schema.Json => jsonOf(IrStep, step);\n\nconst normalize = (ir: PipelineIr): PipelineIr =>\n new PipelineIr({\n ...ir,\n metadata: new IrMetadata({ ...ir.metadata, irHash: Option.none() }),\n });\n\n/** The documents' graph identity: no spans, no `irHash`. */\nexport const pipelineContentKey = (ir: PipelineIr): string =>\n stableText({\n irVersion: ir.irVersion,\n pipeline: Schema.encodeSync(IrPipeline)(stablePipeline(ir.pipeline)),\n runtime: Schema.encodeSync(IrRuntime)(ir.runtime),\n steps: ir.steps.map((step) => [\n step.id,\n stepContentKey(step),\n step.source.path,\n ]),\n edges: Schema.encodeSync(Schema.Array(IrEdge))(ir.edges),\n metadata: {\n compiler: ir.metadata.compiler,\n sourceHash: ir.metadata.sourceHash,\n },\n });\n\n/** What one merge pass accumulates; a fresh array per call keeps it pure. */\ninterface MergeState {\n readonly conflicts: Array<IrConflict>;\n /** The sides the caller asked for, by conflict path. */\n readonly resolutions: Readonly<Record<string, ResolutionSide>>;\n /** Paths a resolution settled, so a leftover is provably not a field. */\n readonly settled: Array<string>;\n readonly refusals: Array<ResolutionRefusal>;\n}\n\nconst conflict = (\n state: MergeState,\n path: string,\n kind: ConflictKind,\n base: Schema.Json,\n local: Schema.Json,\n remote: Schema.Json,\n): Option.Option<never> => {\n state.conflicts.push(\n new IrConflict({ path, kind, base, local, remote, hint: hints[kind] }),\n );\n return Option.none();\n};\n\n/**\n * Three-way pick of one field: one-side changes win, both-sides differ\n * conflicts \u2014 unless the caller settled that path, in which case the chosen\n * side wins and no conflict is reported. Settling is only ever a take: the\n * merge never edits source.\n */\nconst pick = <T>(\n state: MergeState,\n path: string,\n kind: ConflictKind,\n base: T,\n local: T,\n remote: T,\n keyOf: (value: T) => string,\n render: (value: T) => Schema.Json,\n): Option.Option<T> => {\n const b = keyOf(base);\n const l = keyOf(local);\n const r = keyOf(remote);\n if (l === r) return Option.some(local);\n if (b === l) return Option.some(remote);\n if (b === r) return Option.some(local);\n\n const side = state.resolutions[path];\n if (side !== undefined) {\n const settled =\n kind === \"field-changed-both\"\n ? settlement(path, render(local), render(remote), side)\n : Result.fail(\n new ResolutionRefusal({\n path,\n reason: \"structural\",\n detail: `${kind} conflicts are reconciled in the source`,\n }),\n );\n if (Result.isFailure(settled)) {\n state.refusals.push(settled.failure);\n return Option.none();\n }\n state.settled.push(path);\n return Option.some(side === \"local\" ? local : remote);\n }\n\n return conflict(\n state,\n path,\n kind,\n render(base),\n render(local),\n render(remote),\n );\n};\n\n/**\n * A resolution that never met its conflict is refused, never ignored: the map\n * is either stale (the path vanished with the head) or names a conflict the\n * watcher cannot write.\n */\nconst refuseLeftovers = (state: MergeState): void => {\n const leftovers = Arr.filter(\n R.keys(state.resolutions),\n (path) =>\n !Arr.contains(state.settled, path) &&\n !Arr.some(state.refusals, (refusal) => refusal.path === path),\n );\n Arr.forEach(leftovers, (path) => {\n const known = Arr.some(state.conflicts, (item) => item.path === path);\n state.refusals.push(\n new ResolutionRefusal({\n path,\n reason: known ? \"structural\" : \"unknown-path\",\n detail: known\n ? \"this conflict is not a field the watcher may write \u2014 edit the source\"\n : \"this conflict is no longer present \u2014 refresh, then resolve again\",\n }),\n );\n });\n};\n\nconst field = <T>(\n state: MergeState,\n path: string,\n base: T,\n local: T,\n remote: T,\n keyOf: (value: T) => string,\n render: (value: T) => Schema.Json,\n): Option.Option<T> =>\n pick(state, path, \"field-changed-both\", base, local, remote, keyOf, render);\n\nconst scalarKey = (value: string | boolean | number | null): string =>\n stableText(value);\n\nconst scalarJson = (value: string | boolean | number | null): Schema.Json =>\n value;\n\n/**\n * Three-way pick of an element addressed by an id.\n *\n * Absent in the base means an addition on each side (`add/add` when both add\n * the same id differently). Present in the base and absent on one side is a\n * deletion \u2014 a conflict only when the other side changed the element.\n */\nconst element = <T>(\n state: MergeState,\n path: string,\n base: Option.Option<T>,\n local: Option.Option<T>,\n remote: Option.Option<T>,\n keyOf: (value: T) => string,\n render: (value: T) => Schema.Json,\n mergeAll: (base: T, local: T, remote: T) => Option.Option<T>,\n): Option.Option<T> => {\n if (Option.isSome(base)) {\n if (Option.isSome(local) && Option.isSome(remote))\n return mergeAll(base.value, local.value, remote.value);\n const baseKey = keyOf(base.value);\n if (Option.isNone(local))\n return Option.match(remote, {\n onNone: () => Option.none(),\n onSome: (remoteValue) =>\n keyOf(remoteValue) === baseKey\n ? Option.none()\n : conflict(\n state,\n path,\n \"delete/edit\",\n render(base.value),\n null,\n render(remoteValue),\n ),\n });\n return keyOf(local.value) === baseKey\n ? Option.none()\n : conflict(\n state,\n path,\n \"delete/edit\",\n render(base.value),\n render(local.value),\n null,\n );\n }\n\n if (Option.isSome(local) && Option.isSome(remote))\n return keyOf(local.value) === keyOf(remote.value)\n ? Option.some(local.value)\n : conflict(\n state,\n path,\n \"add/add\",\n null,\n render(local.value),\n render(remote.value),\n );\n return Option.isSome(local) ? local : remote;\n};\n\nconst indexOf = <T>(\n items: ReadonlyArray<T>,\n keyOf: (item: T) => string,\n): HashMap.HashMap<string, T> =>\n HashMap.fromIterable(items.map((item) => [keyOf(item), item] as const));\n\nconst keysOf = <T>(\n items: ReadonlyArray<T>,\n keyOf: (item: T) => string,\n): ReadonlyArray<string> => Arr.dedupe(items.map(keyOf));\n\nconst ordered = <T>(\n base: ReadonlyArray<T>,\n local: ReadonlyArray<T>,\n remote: ReadonlyArray<T>,\n keyOf: (item: T) => string,\n): ReadonlyArray<string> =>\n Arr.dedupe(\n Arr.sort(\n Arr.appendAll(\n keysOf(base, keyOf),\n Arr.appendAll(keysOf(local, keyOf), keysOf(remote, keyOf)),\n ),\n Order.String,\n ),\n );\n\nconst lookup = <T>(\n index: HashMap.HashMap<string, T>,\n key: string,\n): Option.Option<T> => HashMap.get(index, key);\n\nconst mergePorts = (\n state: MergeState,\n path: string,\n base: ReadonlyArray<IrPort>,\n local: ReadonlyArray<IrPort>,\n remote: ReadonlyArray<IrPort>,\n): Option.Option<ReadonlyArray<IrPort>> => {\n const keys = ordered(base, local, remote, (port) => port.id);\n const [b, l, r] = [\n indexOf(base, (port) => port.id),\n indexOf(local, (port) => port.id),\n indexOf(remote, (port) => port.id),\n ];\n const merged = keys.map((id) =>\n element(\n state,\n at(path, id),\n lookup(b, id),\n lookup(l, id),\n lookup(r, id),\n (port) => encoded(IrPort, port),\n (port) => jsonOf(IrPort, port),\n (basePort, localPort, remotePort) => {\n const portPath = at(path, id);\n const type = field(\n state,\n at(portPath, \"type\"),\n basePort.type,\n localPort.type,\n remotePort.type,\n (value) => encoded(IrType, value),\n (value) => jsonOf(IrType, value),\n );\n const required = field(\n state,\n at(portPath, \"required\"),\n basePort.required,\n localPort.required,\n remotePort.required,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(Schema.Boolean))(value)),\n (value) => optionJson(value, (flag) => flag),\n );\n return Option.all({ type, required }).pipe(\n Option.map(\n (fields) =>\n new IrPort({\n id: id,\n type: fields.type,\n required: fields.required,\n }),\n ),\n );\n },\n ),\n );\n // `None` here means \"deleted\", a successful outcome; real failures are in\n // `state.conflicts` and the caller never reads this array then.\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, (port: IrPort) => port.id),\n ),\n );\n};\n\nconst mergeParams = (\n state: MergeState,\n path: string,\n base: ReadonlyArray<IrParam>,\n local: ReadonlyArray<IrParam>,\n remote: ReadonlyArray<IrParam>,\n): Option.Option<ReadonlyArray<IrParam>> => {\n const nameOf = (param: IrParam) => param.name;\n const keys = ordered(base, local, remote, nameOf);\n const [b, l, r] = [\n indexOf(base, nameOf),\n indexOf(local, nameOf),\n indexOf(remote, nameOf),\n ];\n const merged = keys.map((name) =>\n element(\n state,\n at(path, name),\n lookup(b, name),\n lookup(l, name),\n lookup(r, name),\n (param) => encoded(IrParam, param),\n (param) => jsonOf(IrParam, param),\n (baseParam, localParam, remoteParam) => {\n const paramPath = at(path, name);\n // A bound step param's value is the declaration's: the pipeline-param\n // merge owns it, so its derived fields never conflict on their own.\n const derived =\n Option.isSome(localParam.pipelineParam) &&\n Option.isSome(remoteParam.pipelineParam);\n const type = field(\n state,\n at(paramPath, \"type\"),\n baseParam.type,\n localParam.type,\n remoteParam.type,\n (value) => encoded(IrParamType, value),\n (value) => jsonOf(IrParamType, value),\n );\n const required = derived\n ? Option.some(localParam.required)\n : field(\n state,\n at(paramPath, \"required\"),\n baseParam.required,\n localParam.required,\n remoteParam.required,\n (value) =>\n stableText(\n Schema.encodeSync(Schema.Option(Schema.Boolean))(value),\n ),\n (value) => optionJson(value, (flag) => flag),\n );\n const defaultValue = derived\n ? Option.some(localParam.default)\n : field(\n state,\n at(paramPath, \"default\"),\n baseParam.default,\n localParam.default,\n remoteParam.default,\n (value) =>\n stableText(\n Schema.encodeSync(Schema.Option(IrDefaultValue))(value),\n ),\n defaultJson,\n );\n const editable = derived\n ? Option.some(localParam.editable)\n : field(\n state,\n at(paramPath, \"editable\"),\n baseParam.editable,\n localParam.editable,\n remoteParam.editable,\n (value) =>\n stableText(\n Schema.encodeSync(Schema.Option(Schema.Boolean))(value),\n ),\n (value) => optionJson(value, (flag) => flag),\n );\n const binding = field(\n state,\n at(paramPath, \"binding\"),\n baseParam.binding,\n localParam.binding,\n remoteParam.binding,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(IrParamBinding))(value)),\n (value) => optionJson(value, (kind) => kind),\n );\n const pipelineParam = field(\n state,\n at(paramPath, \"pipelineParam\"),\n baseParam.pipelineParam,\n localParam.pipelineParam,\n remoteParam.pipelineParam,\n (value) =>\n stableText(\n Schema.encodeSync(Schema.Option(Schema.NonEmptyString))(value),\n ),\n (value) => optionJson(value, (name) => name),\n );\n return Option.all({\n type,\n required,\n default: defaultValue,\n editable,\n binding,\n pipelineParam,\n }).pipe(\n Option.map(\n (fields) =>\n new IrParam({\n name,\n type: fields.type,\n required: fields.required,\n default: fields.default,\n editable: fields.editable,\n binding: fields.binding,\n pipelineParam: fields.pipelineParam,\n }),\n ),\n );\n },\n ),\n );\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, (param: IrParam) => param.name),\n ),\n );\n};\n\nconst mergeImplementation = (\n state: MergeState,\n path: string,\n base: IrImplementation,\n local: IrImplementation,\n remote: IrImplementation,\n): Option.Option<IrImplementation> => {\n const keyOf = (value: IrImplementation) => encoded(IrImplementation, value);\n const render = (value: IrImplementation) => jsonOf(IrImplementation, value);\n const b = keyOf(base);\n const l = keyOf(local);\n const r = keyOf(remote);\n if (l === r) return Option.some(local);\n if (b === l) return Option.some(remote);\n if (b === r) return Option.some(local);\n\n if (\n local instanceof IrPythonImplementation &&\n remote instanceof IrPythonImplementation\n ) {\n const module = field(\n state,\n at(path, \"module\"),\n base instanceof IrPythonImplementation ? base.module : local.module,\n local.module,\n remote.module,\n scalarKey,\n scalarJson,\n );\n const fn = field(\n state,\n at(path, \"function\"),\n base instanceof IrPythonImplementation ? base.function : local.function,\n local.function,\n remote.function,\n scalarKey,\n scalarJson,\n );\n return Option.all({ module, function: fn }).pipe(\n Option.map(\n (fields) =>\n new IrPythonImplementation({\n type: \"python\",\n module: fields.module,\n function: fields.function,\n }),\n ),\n );\n }\n\n if (\n local instanceof IrOpaqueImplementation &&\n remote instanceof IrOpaqueImplementation\n ) {\n // The opaque body is code the IR cannot see; both sides changing it is a\n // code conflict even when the declared boundary matches.\n const sourceHash = pick(\n state,\n at(path, \"sourceHash\"),\n \"opaque-changed-both\",\n base instanceof IrOpaqueImplementation\n ? base.sourceHash\n : local.sourceHash,\n local.sourceHash,\n remote.sourceHash,\n scalarKey,\n scalarJson,\n );\n const declared = field(\n state,\n at(path, \"declared\"),\n base instanceof IrOpaqueImplementation ? base.declared : local.declared,\n local.declared,\n remote.declared,\n (value) => encoded(IrOpaqueDeclared, value),\n (value) => jsonOf(IrOpaqueDeclared, value),\n );\n return Option.all({ sourceHash, declared }).pipe(\n Option.map(\n (fields) =>\n new IrOpaqueImplementation({\n type: \"opaque\",\n sourceHash: fields.sourceHash,\n declared: fields.declared,\n }),\n ),\n );\n }\n\n return conflict(\n state,\n path,\n \"field-changed-both\",\n render(base),\n render(local),\n render(remote),\n );\n};\n\nconst mergeStep = (\n state: MergeState,\n path: string,\n base: IrStep,\n local: IrStep,\n remote: IrStep,\n): Option.Option<IrStep> => {\n const name = field(\n state,\n at(path, \"name\"),\n base.name,\n local.name,\n remote.name,\n scalarKey,\n scalarJson,\n );\n const kind = field(\n state,\n at(path, \"kind\"),\n base.kind,\n local.kind,\n remote.kind,\n scalarKey,\n scalarJson,\n );\n const inputs = mergePorts(\n state,\n at(path, \"inputs\"),\n base.inputs,\n local.inputs,\n remote.inputs,\n );\n const outputs = mergePorts(\n state,\n at(path, \"outputs\"),\n base.outputs,\n local.outputs,\n remote.outputs,\n );\n const params = mergeParams(\n state,\n at(path, \"params\"),\n base.params,\n local.params,\n remote.params,\n );\n const implementation = mergeImplementation(\n state,\n at(path, \"implementation\"),\n base.implementation,\n local.implementation,\n remote.implementation,\n );\n const sourcePath = field(\n state,\n at(path, \"source\", \"path\"),\n base.source.path,\n local.source.path,\n remote.source.path,\n scalarKey,\n scalarJson,\n );\n // The span addresses the local file, which is what a later apply edits.\n const span = local.source.span;\n return Option.all({\n name,\n kind,\n inputs,\n outputs,\n params,\n implementation,\n sourcePath,\n }).pipe(\n Option.map(\n (fields) =>\n new IrStep({\n id: local.id,\n kind: fields.kind,\n name: fields.name,\n inputs: fields.inputs,\n outputs: fields.outputs,\n params: fields.params,\n source: new IrSource({ path: fields.sourcePath, span }),\n implementation: fields.implementation,\n }),\n ),\n );\n};\n\nconst mergeSteps = (\n state: MergeState,\n base: ReadonlyArray<IrStep>,\n local: ReadonlyArray<IrStep>,\n remote: ReadonlyArray<IrStep>,\n): Option.Option<ReadonlyArray<IrStep>> => {\n const idOf = (step: IrStep) => step.id;\n const keys = ordered(base, local, remote, idOf);\n const [b, l, r] = [\n indexOf(base, idOf),\n indexOf(local, idOf),\n indexOf(remote, idOf),\n ];\n const merged = keys.map((id) =>\n element(\n state,\n at(\"/steps\", id),\n lookup(b, id),\n lookup(l, id),\n lookup(r, id),\n stepContentKey,\n stepJson,\n (baseStep, localStep, remoteStep) =>\n mergeStep(state, at(\"/steps\", id), baseStep, localStep, remoteStep),\n ),\n );\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, idOf),\n ),\n );\n};\n\nconst mergeEdges = (\n state: MergeState,\n base: ReadonlyArray<IrEdge>,\n local: ReadonlyArray<IrEdge>,\n remote: ReadonlyArray<IrEdge>,\n): Option.Option<ReadonlyArray<IrEdge>> => {\n const keyOf = edgeKey;\n const fanOf = (edge: IrEdge) => `${edgeKey(edge)}\\u0000${edge.fan}`;\n const keys = ordered(base, local, remote, keyOf);\n const [b, l, r] = [\n indexOf(base, keyOf),\n indexOf(local, keyOf),\n indexOf(remote, keyOf),\n ];\n const merged = keys.map((key) =>\n element(\n state,\n at(\"/edges\", key.replaceAll(\"\\u0000\", \".\")),\n lookup(b, key),\n lookup(l, key),\n lookup(r, key),\n fanOf,\n edgeJson,\n (baseEdge, localEdge, remoteEdge) =>\n field(\n state,\n at(\"/edges\", key.replaceAll(\"\\u0000\", \".\"), \"fan\"),\n baseEdge.fan,\n localEdge.fan,\n remoteEdge.fan,\n scalarKey,\n scalarJson,\n ).pipe(\n Option.map(\n (fan) =>\n new IrEdge({\n from: localEdge.from,\n to: localEdge.to,\n fan,\n }),\n ),\n ),\n ),\n );\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, edgeKey),\n ),\n );\n};\n\n/**\n * Re-derives every bound step param from the merged declaration.\n *\n * A bound param's default is not its own: the declaration owns it. The field\n * merge suppresses those conflicts and this pass keeps the merged IR truthful.\n */\nconst withDerivedDefaults = (\n steps: ReadonlyArray<IrStep>,\n params: ReadonlyArray<IrPipelineParam>,\n): ReadonlyArray<IrStep> =>\n Arr.map(\n steps,\n (step) =>\n new IrStep({\n ...step,\n params: Arr.map(step.params, (param) => {\n const boundTo = Option.getOrNull(param.pipelineParam);\n const declared =\n boundTo === null\n ? undefined\n : params.find((candidate) => candidate.name === boundTo);\n return declared === undefined\n ? param\n : new IrParam({\n ...param,\n default: declared.default,\n required: declared.default.pipe(\n Option.match({\n onNone: () => Option.some(true),\n onSome: () => Option.none(),\n }),\n ),\n });\n }),\n }),\n );\n\nconst incompatibleEdges = (\n steps: ReadonlyArray<IrStep>,\n edges: ReadonlyArray<IrEdge>,\n): ReadonlyArray<IrEdge> =>\n Arr.filter(edges, (edge) => {\n const from = steps.find((step) => step.id === edge.from.step);\n const to = steps.find((step) => step.id === edge.to.step);\n const fromPort = from?.outputs.find((port) => port.id === edge.from.port);\n const toPort = to?.inputs.find((port) => port.id === edge.to.port);\n return (\n fromPort === undefined ||\n toPort === undefined ||\n !typesCompatible(fromPort.type, toPort.type)\n );\n });\n\nconst mergePipelineParams = (\n state: MergeState,\n path: string,\n base: ReadonlyArray<IrPipelineParam>,\n local: ReadonlyArray<IrPipelineParam>,\n remote: ReadonlyArray<IrPipelineParam>,\n): Option.Option<ReadonlyArray<IrPipelineParam>> => {\n const nameOf = (param: IrPipelineParam) => param.name;\n const keys = ordered(base, local, remote, nameOf);\n const [b, l, r] = [\n indexOf(base, nameOf),\n indexOf(local, nameOf),\n indexOf(remote, nameOf),\n ];\n const merged = keys.map((name) =>\n element(\n state,\n at(path, name),\n lookup(b, name),\n lookup(l, name),\n lookup(r, name),\n pipelineParamContentKey,\n (param) => jsonOf(IrPipelineParam, param),\n (baseParam, localParam, remoteParam) => {\n const paramPath = at(path, name);\n const type = field(\n state,\n at(paramPath, \"type\"),\n baseParam.type,\n localParam.type,\n remoteParam.type,\n (value) => encoded(IrParamType, value),\n (value) => jsonOf(IrParamType, value),\n );\n const defaultValue = field(\n state,\n at(paramPath, \"default\"),\n baseParam.default,\n localParam.default,\n remoteParam.default,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(IrDefaultValue))(value)),\n defaultJson,\n );\n const editable = field(\n state,\n at(paramPath, \"editable\"),\n baseParam.editable,\n localParam.editable,\n remoteParam.editable,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(Schema.Boolean))(value)),\n (value) => optionJson(value, (flag) => flag),\n );\n const sourcePath = field(\n state,\n at(paramPath, \"source\", \"path\"),\n baseParam.source.path,\n localParam.source.path,\n remoteParam.source.path,\n scalarKey,\n scalarJson,\n );\n // The span addresses the local file, which is what a later apply edits.\n const span = localParam.source.span;\n return Option.all({\n type,\n default: defaultValue,\n editable,\n sourcePath,\n }).pipe(\n Option.map(\n (fields) =>\n new IrPipelineParam({\n name,\n type: fields.type,\n default: fields.default,\n editable: fields.editable,\n source: new IrSource({ path: fields.sourcePath, span }),\n }),\n ),\n );\n },\n ),\n );\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, nameOf),\n ),\n );\n};\n\nconst mergePipeline = (\n state: MergeState,\n base: IrPipeline,\n local: IrPipeline,\n remote: IrPipeline,\n): Option.Option<IrPipeline> => {\n const name = field(\n state,\n \"/pipeline/name\",\n base.name,\n local.name,\n remote.name,\n scalarKey,\n scalarJson,\n );\n const description = field(\n state,\n \"/pipeline/description\",\n base.description,\n local.description,\n remote.description,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(Schema.String))(value)),\n (value) => optionJson(value, (text) => text),\n );\n const stage = field(\n state,\n \"/pipeline/stage\",\n base.stage,\n local.stage,\n remote.stage,\n scalarKey,\n scalarJson,\n );\n const params = mergePipelineParams(\n state,\n \"/pipeline/params\",\n Option.getOrElse(base.params, () => []),\n Option.getOrElse(local.params, () => []),\n Option.getOrElse(remote.params, () => []),\n );\n return Option.all({ name, description, stage, params }).pipe(\n Option.map(\n (fields) =>\n new IrPipeline({\n name: fields.name,\n description: fields.description,\n stage: fields.stage,\n params: Arr.match(fields.params, {\n onEmpty: () => Option.none(),\n onNonEmpty: (values) => Option.some(values),\n }),\n }),\n ),\n );\n};\n\nconst mergeRuntime = (\n state: MergeState,\n base: IrRuntime,\n local: IrRuntime,\n remote: IrRuntime,\n): Option.Option<IrRuntime> => {\n const python = field(\n state,\n \"/runtime/python\",\n base.python,\n local.python,\n remote.python,\n scalarKey,\n scalarJson,\n );\n const entry = field(\n state,\n \"/runtime/entry\",\n base.entry,\n local.entry,\n remote.entry,\n scalarKey,\n scalarJson,\n );\n const requirements = field(\n state,\n \"/runtime/requirements\",\n base.requirements,\n local.requirements,\n remote.requirements,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(IrRequirements))(value)),\n (value) => optionJson(value, (item) => jsonOf(IrRequirements, item)),\n );\n const imports = field(\n state,\n \"/runtime/imports\",\n base.imports,\n local.imports,\n remote.imports,\n (value) =>\n stableText(Schema.encodeSync(Schema.Array(Schema.String))(value)),\n (value) => asJson(Schema.encodeSync(Schema.Array(Schema.String))(value)),\n );\n return Option.all({ python, entry, requirements, imports }).pipe(\n Option.map(\n (fields) =>\n new IrRuntime({\n python: fields.python,\n entry: fields.entry,\n requirements: fields.requirements,\n imports: fields.imports,\n }),\n ),\n );\n};\n\nconst mergeMetadata = (\n state: MergeState,\n base: IrMetadata,\n local: IrMetadata,\n remote: IrMetadata,\n): Option.Option<IrMetadata> => {\n const compiler = field(\n state,\n \"/metadata/compiler\",\n base.compiler,\n local.compiler,\n remote.compiler,\n scalarKey,\n scalarJson,\n );\n const sourceHash = pick(\n state,\n \"/metadata/sourceHash\",\n \"opaque-changed-both\",\n base.sourceHash,\n local.sourceHash,\n remote.sourceHash,\n scalarKey,\n scalarJson,\n );\n return Option.all({ compiler, sourceHash }).pipe(\n Option.map(\n (fields) =>\n new IrMetadata({\n compiler: fields.compiler,\n sourceHash: fields.sourceHash,\n irHash: Option.none(),\n }),\n ),\n );\n};\n\n/**\n * Merges `local` and `remote` changes against their common `base`.\n *\n * Pure: no I/O, no clock, no LLM. A clean result is a complete IR whose\n * `metadata.irHash` is absent; a conflict result carries every overlapping\n * change, and the caller must publish nothing.\n *\n * `resolutions` settles named paths in favour of one side. A path the merge\n * cannot settle \u2014 an unknown one, a structural conflict, or a value that is not\n * a literal \u2014 refuses the whole merge rather than being silently dropped. A\n * document with nothing to merge (the short-circuits above) ignores the map: it\n * has no conflict left to settle.\n */\nexport const merge = (\n base: PipelineIr,\n local: PipelineIr,\n remote: PipelineIr,\n resolutions: Readonly<Record<string, ResolutionSide>> = {},\n): MergeResult => {\n const b = normalize(base);\n const l = normalize(local);\n const r = normalize(remote);\n\n const bk = pipelineContentKey(b);\n const lk = pipelineContentKey(l);\n const rk = pipelineContentKey(r);\n if (lk === rk) return { status: \"clean\", ir: l };\n if (bk === lk) return { status: \"clean\", ir: r };\n if (bk === rk) return { status: \"clean\", ir: l };\n\n const state: MergeState = {\n conflicts: [],\n resolutions,\n settled: [],\n refusals: [],\n };\n const irVersion = field(\n state,\n \"/irVersion\",\n b.irVersion,\n l.irVersion,\n r.irVersion,\n scalarKey,\n scalarJson,\n );\n const pipeline = mergePipeline(state, b.pipeline, l.pipeline, r.pipeline);\n const runtime = mergeRuntime(state, b.runtime, l.runtime, r.runtime);\n const metadata = mergeMetadata(state, b.metadata, l.metadata, r.metadata);\n const steps = mergeSteps(state, b.steps, l.steps, r.steps);\n const edges = mergeEdges(state, b.edges, l.edges, r.edges);\n\n refuseLeftovers(state);\n if (state.refusals.length > 0)\n return { status: \"refused\", refusals: state.refusals };\n if (state.conflicts.length > 0)\n return { status: \"conflict\", conflicts: state.conflicts };\n if (\n Option.isNone(irVersion) ||\n Option.isNone(pipeline) ||\n Option.isNone(runtime) ||\n Option.isNone(metadata) ||\n Option.isNone(steps) ||\n Option.isNone(edges)\n )\n return { status: \"conflict\", conflicts: state.conflicts };\n\n const mergedSteps = withDerivedDefaults(\n steps.value,\n Option.getOrElse(pipeline.value.params, () => []),\n );\n const broken = incompatibleEdges(mergedSteps, edges.value);\n if (broken.length > 0)\n return {\n status: \"conflict\",\n conflicts: broken.map(\n (edge) =>\n new IrConflict({\n path: at(\n \"/edges\",\n `${edge.from.step}.${edge.from.port}->${edge.to.step}.${edge.to.port}`,\n ),\n kind: \"edge-type-conflict\",\n base: edgeJson(edge),\n local: edgeJson(edge),\n remote: edgeJson(edge),\n hint: hints[\"edge-type-conflict\"],\n }),\n ),\n };\n\n return {\n status: \"clean\",\n ir: new PipelineIr({\n irVersion: irVersion.value,\n pipeline: pipeline.value,\n runtime: runtime.value,\n steps: mergedSteps,\n edges: edges.value,\n metadata: metadata.value,\n }),\n };\n};\n", "/**\n * Field-conflict resolution (plan 075 phase 4).\n *\n * A resolution is not a second merge: it names one IR field and the side whose\n * value the experimenter wants. `settlement` turns that choice into the exact op\n * the span-checked patcher would write, so the paths a resolution can settle are\n * the four the watcher is allowed to rewrite \u2014 a step parameter default, a\n * `@pipeline` parameter default, a step name and the pipeline description.\n * Everything else (edges, ports, types, runtime, opaque code, metadata) has no\n * settlement and is reconciled in source.\n *\n * Resolutions are in memory only, recorded against the head they were read at;\n * the store drops them when that head moves. They never reach `.braven`.\n */\nimport { Match } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Option from \"effect/Option\";\nimport * as P from \"effect/Predicate\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\nimport type { IrOp } from \"@braven/pipeline-ir\";\n\n/** Which side of a conflict the experimenter keeps. */\nexport const ResolutionSide = Schema.Literals([\"local\", \"remote\"]);\nexport type ResolutionSide = typeof ResolutionSide.Type;\n\n/** Why a conflict cannot be settled here; each reason has one sentence. */\nexport const ResolutionRefusalReason = Schema.Literals([\n \"unknown-path\",\n \"structural\",\n \"not-a-literal\",\n]);\nexport type ResolutionRefusalReason = typeof ResolutionRefusalReason.Type;\n\n/** One refused resolution, naming the path and the exact obstruction. */\nexport class ResolutionRefusal extends Schema.Class<ResolutionRefusal>(\n \"ResolutionRefusal\",\n)({\n path: Schema.String,\n reason: ResolutionRefusalReason,\n detail: Schema.String,\n}) {}\n\n/**\n * Resolutions recorded against one remote head.\n *\n * The `against` revision is the guard: a set is only ever applied to the head\n * that produced the conflicts, never to a newer one.\n */\nexport class ConflictResolutions extends Schema.Class<ConflictResolutions>(\n \"ConflictResolutions\",\n)({\n against: Schema.NonEmptyString,\n sides: Schema.Record(Schema.String, ResolutionSide),\n}) {}\n\n/** The four source edits a resolution may make. */\nexport type FieldTarget =\n | {\n readonly kind: \"param-default\";\n readonly stepId: string;\n readonly name: string;\n }\n | { readonly kind: \"pipeline-param-default\"; readonly name: string }\n | { readonly kind: \"step-name\"; readonly stepId: string }\n | { readonly kind: \"description\" };\n\nconst unescape = (token: string): string =>\n Str.replaceAll(\"~0\", \"~\")(Str.replaceAll(\"~1\", \"/\")(token));\n\n/** `/steps/a/params/b/default` \u2192 `[\"steps\", \"a\", \"params\", \"b\", \"default\"]`. */\nconst segmentsOf = (path: string): ReadonlyArray<string> =>\n Arr.map(Arr.drop(Str.split(\"/\")(path), 1), unescape);\n\n/** The source construct a conflict path addresses, if the watcher may write it. */\nexport const fieldTarget = (path: string): Option.Option<FieldTarget> => {\n const segments = segmentsOf(path);\n const at = (index: number): Option.Option<string> =>\n Option.fromNullishOr(segments[index]);\n const is = (index: number, expected: string): boolean =>\n segments[index] === expected;\n return Match.value(segments.length).pipe(\n Match.when(\n (count) => count === 2 && is(0, \"pipeline\") && is(1, \"description\"),\n () => Option.some<FieldTarget>({ kind: \"description\" }),\n ),\n Match.when(\n (count) => count === 3 && is(0, \"steps\") && is(2, \"name\"),\n () =>\n Option.map(\n at(1),\n (stepId): FieldTarget => ({ kind: \"step-name\", stepId }),\n ),\n ),\n Match.when(\n (count) =>\n count === 4 && is(0, \"pipeline\") && is(1, \"params\") && is(3, \"default\"),\n () =>\n Option.map(\n at(2),\n (name): FieldTarget => ({ kind: \"pipeline-param-default\", name }),\n ),\n ),\n Match.when(\n (count) =>\n count === 5 && is(0, \"steps\") && is(2, \"params\") && is(4, \"default\"),\n () =>\n Option.all({ stepId: at(1), name: at(3) }).pipe(\n Option.map(\n (fields): FieldTarget => ({ kind: \"param-default\", ...fields }),\n ),\n ),\n ),\n Match.orElse(() => Option.none<FieldTarget>()),\n );\n};\n\nconst textOf = (value: Schema.Json): Option.Option<string> =>\n P.isString(value) && Str.isNonEmpty(value)\n ? Option.some(value)\n : Option.none();\n\nconst literalOf = (value: Schema.Json): Option.Option<Schema.Json> =>\n P.isString(value) || P.isNumber(value) || P.isBoolean(value)\n ? Option.some(value)\n : Option.none();\n\nconst opFor = (target: FieldTarget, value: Schema.Json): Option.Option<IrOp> =>\n Match.value(target).pipe(\n Match.discriminator(\"kind\")(\"description\", () =>\n Option.map(\n textOf(value),\n (description): IrOp => ({ op: \"set-description\", description }),\n ),\n ),\n Match.discriminator(\"kind\")(\"step-name\", (named) =>\n Option.map(\n textOf(value),\n (name): IrOp => ({ op: \"set-step-name\", stepId: named.stepId, name }),\n ),\n ),\n Match.discriminator(\"kind\")(\"param-default\", (param) =>\n Option.map(\n literalOf(value),\n (literal): IrOp => ({\n op: \"set-param\",\n stepId: param.stepId,\n name: param.name,\n value: literal,\n }),\n ),\n ),\n Match.discriminator(\"kind\")(\"pipeline-param-default\", (param) =>\n Option.map(\n literalOf(value),\n (literal): IrOp => ({\n op: \"set-pipeline-param\",\n name: param.name,\n value: literal,\n }),\n ),\n ),\n Match.exhaustive,\n );\n\n/** The exact op that writes `value` at `path`, when the watcher may write it. */\nexport const fieldOp = (\n path: string,\n value: Schema.Json,\n): Option.Option<IrOp> =>\n Option.flatMap(fieldTarget(path), (target) => opFor(target, value));\n\n/**\n * The op one side's value would write, or the typed reason it cannot.\n *\n * The same function backs the merge (which takes the chosen side) and the\n * store (which refuses a pick it cannot write), so the panel can never offer a\n * choice the engine would reject.\n */\nexport const settlement = (\n path: string,\n local: Schema.Json,\n remote: Schema.Json,\n side: ResolutionSide,\n): Result.Result<IrOp, ResolutionRefusal> => {\n const chosen = side === \"local\" ? local : remote;\n return Option.match(fieldTarget(path), {\n onNone: () =>\n Result.fail(\n new ResolutionRefusal({\n path,\n reason: \"structural\",\n detail:\n \"only a parameter default, a step name or a description can be picked here \u2014 edit the source\",\n }),\n ),\n onSome: (target) =>\n Option.match(opFor(target, chosen), {\n onNone: () =>\n Result.fail(\n new ResolutionRefusal({\n path,\n reason: \"not-a-literal\",\n detail: `the ${side} value is not a literal the watcher can write \u2014 edit the source`,\n }),\n ),\n onSome: Result.succeed,\n }),\n });\n};\n\n/** One line per refusal, for a failure message or the panel's inline reason. */\nexport const resolutionLines = (\n refusals: ReadonlyArray<ResolutionRefusal>,\n): ReadonlyArray<string> =>\n Arr.map(\n refusals,\n (refusal) => `${refusal.path}: ${refusal.reason} \u2014 ${refusal.detail}`,\n );\n", "/**\n * Reading and replacing the one source file a checkout owns.\n *\n * Both the CLI and the engine use this so a missing or unreadable source has\n * one message and one failure kind.\n */\nimport { Effect } from \"effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { SyncFailure } from \"./errors.ts\";\n\n/** Reads `<cwd>/<source>` as text. */\nexport const readSource = (cwd: string, source: string) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n return yield* fs.readFileString(path.resolve(cwd, source)).pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot read ${source}: ${cause.message}`,\n }),\n ),\n );\n });\n\n/** Atomically replaces one source file: temp sibling, then rename. */\nexport const writeSource = (cwd: string, source: string, text: string) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const target = path.resolve(cwd, source);\n const temporary = `${target}.braven-tmp`;\n yield* fs.writeFileString(temporary, text).pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot write ${source}: ${cause.message}`,\n }),\n ),\n );\n yield* fs.rename(temporary, target).pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot replace ${source}: ${cause.message}`,\n }),\n ),\n );\n });\n", "/**\n * A structural diff of two published definitions (plan 069).\n *\n * Renames are detected by the stable id plus the source span, never by name\n * alone: renaming a function changes its id and keeps its span, while an\n * unrelated new function has neither. The diff is data; the command renders it.\n */\nimport * as Arr from \"effect/Array\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Schema from \"effect/Schema\";\nimport {\n IrDefaultValue,\n IrNumber,\n IrParam,\n IrParamType,\n IrRequirements,\n IrType,\n PipelineIr,\n type IrEdge,\n type IrPort,\n type IrStep,\n} from \"@braven/pipeline-ir\";\nimport { stableText } from \"./merge.ts\";\n\nconst asJson = (value: unknown): Schema.Json =>\n Schema.decodeUnknownSync(Schema.Json)(value);\n\nconst jsonOf = <S extends Schema.ConstraintEncoder<unknown, never>>(\n schema: S,\n value: S[\"Type\"],\n): Schema.Json => asJson(Schema.encodeSync(schema)(value));\n\n/** A step's stable id and author-facing name. */\nexport class StepRef extends Schema.Class<StepRef>(\"StepRef\")({\n id: Schema.NonEmptyString,\n name: Schema.NonEmptyString,\n}) {}\n\n/** One step that changed id or name. */\nexport class RenamedStep extends Schema.Class<RenamedStep>(\"RenamedStep\")({\n from: StepRef,\n to: StepRef,\n}) {}\n\n/** One field that differs between two definitions. */\nexport class FieldChange extends Schema.Class<FieldChange>(\"FieldChange\")({\n field: Schema.String,\n from: Schema.Json,\n to: Schema.Json,\n}) {}\n\n/** A port's type or required flag changing on a step that exists on both sides. */\nexport class PortChange extends Schema.Class<PortChange>(\"PortChange\")({\n step: Schema.NonEmptyString,\n side: Schema.Literals([\"inputs\", \"outputs\"]),\n port: Schema.NonEmptyString,\n field: Schema.Literals([\"type\", \"required\"]),\n from: Schema.Json,\n to: Schema.Json,\n}) {}\n\n/** A parameter's change, addition or removal. */\nexport class ParamChange extends Schema.Class<ParamChange>(\"ParamChange\")({\n step: Schema.NonEmptyString,\n name: Schema.NonEmptyString,\n field: Schema.Literals([\n \"default\",\n \"type\",\n \"required\",\n \"editable\",\n \"added\",\n \"removed\",\n ]),\n from: Schema.Json,\n to: Schema.Json,\n}) {}\n\n/** One edge endpoint pair. */\nexport class EdgeRef extends Schema.Class<EdgeRef>(\"EdgeRef\")({\n from: Schema.String,\n to: Schema.String,\n}) {}\n\n/** The whole report, section by section. */\nexport class PipelineDiff extends Schema.Class<PipelineDiff>(\"PipelineDiff\")({\n steps: Schema.Struct({\n added: Schema.Array(StepRef),\n removed: Schema.Array(StepRef),\n renamed: Schema.Array(RenamedStep),\n }),\n ports: Schema.Array(PortChange),\n params: Schema.Array(ParamChange),\n edges: Schema.Struct({\n added: Schema.Array(EdgeRef),\n removed: Schema.Array(EdgeRef),\n }),\n runtime: Schema.Array(FieldChange),\n metadata: Schema.Array(FieldChange),\n}) {}\n\nconst stepRef = (step: IrStep) => new StepRef({ id: step.id, name: step.name });\n\nconst edgeRef = (edge: IrEdge) =>\n new EdgeRef({\n from: `${edge.from.step}.${edge.from.port}`,\n to: `${edge.to.step}.${edge.to.port}`,\n });\n\nconst edgeKey = (edge: IrEdge): string =>\n [edge.from.step, edge.from.port, edge.to.step, edge.to.port].join(\".\");\n\nconst paramKey = (param: IrParam): string => param.name;\n\nconst sameSource = (left: IrStep, right: IrStep): boolean =>\n left.source.path === right.source.path &&\n left.source.span.startLine === right.source.span.startLine &&\n left.source.span.endLine === right.source.span.endLine;\n\nconst defaultValue = (param: IrParam): Schema.Json =>\n Option.match(param.default, {\n onNone: () => null,\n onSome: (value: IrDefaultValue) =>\n value instanceof IrNumber ? value.value : value,\n });\n\nconst paramField = (\n param: IrParam,\n field: \"type\" | \"required\" | \"editable\",\n): Schema.Json =>\n field === \"type\"\n ? jsonOf(IrParamType, param.type)\n : field === \"required\"\n ? Option.getOrNull(param.required)\n : Option.getOrNull(param.editable);\n\nconst portsOf = (\n step: IrStep,\n side: \"inputs\" | \"outputs\",\n): ReadonlyArray<IrPort> => (side === \"inputs\" ? step.inputs : step.outputs);\n\nconst indexById = (steps: ReadonlyArray<IrStep>) =>\n HashMap.fromIterable(steps.map((step) => [step.id, step] as const));\n\nconst atId = (index: HashMap.HashMap<string, IrStep>, id: string) =>\n HashMap.get(index, id);\n\n/** The full section-by-section difference, `from` \u2192 `to`. */\nexport const diffIr = (from: PipelineIr, to: PipelineIr): PipelineDiff => {\n const fromSteps = indexById(from.steps);\n const toSteps = indexById(to.steps);\n\n const removedIds = from.steps\n .filter((step) => !HashMap.has(toSteps, step.id))\n .map((step) => step.id);\n const addedIds = to.steps\n .filter((step) => !HashMap.has(fromSteps, step.id))\n .map((step) => step.id);\n\n /** A removed/added pair with the same source span is one renamed step. */\n const renamePairs = Arr.flatMap(removedIds, (id) => {\n const removed = atId(fromSteps, id);\n if (Option.isNone(removed)) return [];\n const added = Arr.findFirst(addedIds, (candidateId) =>\n Option.match(atId(toSteps, candidateId), {\n onNone: () => false,\n onSome: (candidate) => sameSource(removed.value, candidate),\n }),\n );\n return Option.isNone(added)\n ? []\n : Option.match(atId(toSteps, added.value), {\n onNone: () => [],\n onSome: (step) => [\n { removed: removed.value, added: step, addedId: added.value },\n ],\n });\n });\n\n const renamedInPlace = Arr.flatMap(from.steps, (step) =>\n Option.match(atId(toSteps, step.id), {\n onNone: () => [],\n onSome: (candidate) =>\n candidate.name === step.name\n ? []\n : [new RenamedStep({ from: stepRef(step), to: stepRef(candidate) })],\n }),\n );\n\n const renamedRemoved = new Set(renamePairs.map((pair) => pair.removed.id));\n const renamedAdded = new Set(renamePairs.map((pair) => pair.addedId));\n\n const steps = {\n added: Arr.flatMap(\n addedIds.filter((id) => !renamedAdded.has(id)),\n (id) => Option.toArray(Option.map(atId(toSteps, id), stepRef)),\n ),\n removed: Arr.flatMap(\n removedIds.filter((id) => !renamedRemoved.has(id)),\n (id) => Option.toArray(Option.map(atId(fromSteps, id), stepRef)),\n ),\n renamed: [\n ...renamePairs.map(\n (pair) =>\n new RenamedStep({\n from: stepRef(pair.removed),\n to: stepRef(pair.added),\n }),\n ),\n ...renamedInPlace,\n ],\n };\n\n const commonIds = Arr.sort(\n Arr.fromIterable(HashMap.keys(fromSteps)).filter((id) =>\n HashMap.has(toSteps, id),\n ),\n Order.String,\n );\n\n const both = (id: string) =>\n Option.all({ before: atId(fromSteps, id), after: atId(toSteps, id) });\n\n const ports = Arr.flatMap(commonIds, (id) =>\n Option.match(both(id), {\n onNone: () => [],\n onSome: ({ before, after }) =>\n Arr.flatMap([\"inputs\", \"outputs\"] as const, (side) =>\n Arr.flatMap(portsOf(before, side), (port) => {\n const candidate = portsOf(after, side).find(\n (other) => other.id === port.id,\n );\n if (candidate === undefined) return [];\n const changes: Array<PortChange> = [];\n if (\n stableText(jsonOf(IrType, port.type)) !==\n stableText(jsonOf(IrType, candidate.type))\n )\n changes.push(\n new PortChange({\n step: id,\n side,\n port: port.id,\n field: \"type\",\n from: jsonOf(IrType, port.type),\n to: jsonOf(IrType, candidate.type),\n }),\n );\n if (\n Option.getOrNull(port.required) !==\n Option.getOrNull(candidate.required)\n )\n changes.push(\n new PortChange({\n step: id,\n side,\n port: port.id,\n field: \"required\",\n from: Option.getOrNull(port.required),\n to: Option.getOrNull(candidate.required),\n }),\n );\n return changes;\n }),\n ),\n }),\n );\n\n const params = Arr.flatMap(commonIds, (id) =>\n Option.match(both(id), {\n onNone: () => [],\n onSome: ({ before, after }) => {\n const added = after.params\n .filter(\n (param) =>\n !before.params.some((other) => paramKey(other) === param.name),\n )\n .map(\n (param) =>\n new ParamChange({\n step: id,\n name: param.name,\n field: \"added\",\n from: null,\n to: defaultValue(param),\n }),\n );\n const removed = before.params\n .filter(\n (param) =>\n !after.params.some((other) => paramKey(other) === param.name),\n )\n .map(\n (param) =>\n new ParamChange({\n step: id,\n name: param.name,\n field: \"removed\",\n from: defaultValue(param),\n to: null,\n }),\n );\n const changed = Arr.flatMap(before.params, (param) => {\n const candidate = after.params.find(\n (other) => other.name === param.name,\n );\n if (candidate === undefined) return [];\n const changes: Array<ParamChange> = [];\n if (defaultValue(param) !== defaultValue(candidate))\n changes.push(\n new ParamChange({\n step: id,\n name: param.name,\n field: \"default\",\n from: defaultValue(param),\n to: defaultValue(candidate),\n }),\n );\n return Arr.appendAll(\n changes,\n Arr.flatMap([\"type\", \"required\", \"editable\"] as const, (field) => {\n const left = paramField(param, field);\n const right = paramField(candidate, field);\n return stableText(left) === stableText(right)\n ? []\n : [\n new ParamChange({\n step: id,\n name: param.name,\n field,\n from: left,\n to: right,\n }),\n ];\n }),\n );\n });\n return [...added, ...removed, ...changed];\n },\n }),\n );\n\n const fromEdges = HashMap.fromIterable(\n from.edges.map((edge) => [edgeKey(edge), edge] as const),\n );\n const toEdges = HashMap.fromIterable(\n to.edges.map((edge) => [edgeKey(edge), edge] as const),\n );\n\n const edges = {\n added: to.edges\n .filter((edge) => !HashMap.has(fromEdges, edgeKey(edge)))\n .map(edgeRef),\n removed: from.edges\n .filter((edge) => !HashMap.has(toEdges, edgeKey(edge)))\n .map(edgeRef),\n };\n\n const runtime = Arr.flatMap(\n [\n [\"python\", from.runtime.python, to.runtime.python],\n [\"entry\", from.runtime.entry, to.runtime.entry],\n [\n \"requirements\",\n Option.match(from.runtime.requirements, {\n onNone: () => null,\n onSome: (value) => jsonOf(IrRequirements, value),\n }),\n Option.match(to.runtime.requirements, {\n onNone: () => null,\n onSome: (value) => jsonOf(IrRequirements, value),\n }),\n ],\n [\n \"imports\",\n jsonOf(Schema.Array(Schema.String), from.runtime.imports),\n jsonOf(Schema.Array(Schema.String), to.runtime.imports),\n ],\n ] as const,\n ([field, before, after]) =>\n stableText(before) === stableText(after)\n ? []\n : [new FieldChange({ field, from: before, to: after })],\n );\n\n const metadata = Arr.flatMap(\n [\n [\"name\", from.pipeline.name, to.pipeline.name],\n [\n \"description\",\n Option.getOrNull(from.pipeline.description),\n Option.getOrNull(to.pipeline.description),\n ],\n [\"stage\", from.pipeline.stage, to.pipeline.stage],\n ] as const,\n ([field, before, after]) =>\n before === after\n ? []\n : [new FieldChange({ field, from: before, to: after })],\n );\n\n return new PipelineDiff({ steps, ports, params, edges, runtime, metadata });\n};\n\n/** Whether a diff reports nothing: the two definitions are equivalent. */\nexport const isEmptyDiff = (diff: PipelineDiff): boolean =>\n diff.steps.added.length === 0 &&\n diff.steps.removed.length === 0 &&\n diff.steps.renamed.length === 0 &&\n diff.ports.length === 0 &&\n diff.params.length === 0 &&\n diff.edges.added.length === 0 &&\n diff.edges.removed.length === 0 &&\n diff.runtime.length === 0 &&\n diff.metadata.length === 0;\n", "/**\n * The sync engine facade (plan 075 phase 0).\n *\n * It is the one calculator of pipeline sync state: the local `.braven` base,\n * the compiled source, the head and the proposals in, one `SyncState` out. The\n * CLI's commands and the watcher's store both call this module, so neither can\n * grow a second merge, patcher or notion of \"clean\".\n *\n * Everything platform-specific is injected: the folder (`cwd`), the API origin,\n * the resolved credential (`token`) and, for a first connect, the pipeline and\n * source to record. No identity store, no CLI, no UI.\n */\nimport { Crypto, Effect, Option } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport type { HttpClient } from \"effect/http\";\nimport * as Path from \"effect/Path\";\nimport * as R from \"effect/Record\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport {\n decodePipelineIr,\n irHashOf,\n type PipelineIr,\n} from \"@braven/pipeline-ir\";\nimport { ContentHash } from \"@braven/pipeline-ir/content-hash\";\nimport { makeClient, type PipelineApi } from \"./client.ts\";\nimport {\n CompilerUnavailable,\n PipelineExit,\n PythonCompiler,\n compileIr,\n compilerFailure,\n} from \"./compiler.ts\";\nimport { diffIr, isEmptyDiff, type PipelineDiff } from \"./diff.ts\";\nimport { SyncFailure, fail } from \"./errors.ts\";\nimport { merge, pipelineContentKey, type IrConflict } from \"./merge.ts\";\nimport { applyVerified } from \"./apply.ts\";\nimport type { ApplyResult } from \"./patch.ts\";\nimport {\n type ConflictResolutions,\n fieldOp,\n type ResolutionSide,\n resolutionLines,\n} from \"./resolve.ts\";\nimport { readSource } from \"./source.ts\";\nimport {\n PipelineSyncState,\n readState,\n type PipelineStateError,\n} from \"./state.ts\";\nimport {\n type PullOutcome,\n type PushOutcome,\n apiFailure,\n pull,\n push,\n revisionIr,\n} from \"./sync.ts\";\nimport {\n RevisionRef,\n SyncState,\n emptySyncState,\n type SyncStatus as SyncStatusType,\n} from \"./snapshot.ts\";\n\n/** The services every engine action needs, provided once at the boundary. */\nexport type SyncServices =\n | Crypto.Crypto\n | FileSystem.FileSystem\n | HttpClient.HttpClient\n | Path.Path\n | PythonCompiler;\n\n/** What the engine is told; everything else is read from the folder. */\nexport interface SyncEngineOptions {\n /** The pipeline folder: `.braven/pipeline.json` and the source live here. */\n readonly cwd: string;\n /** The API origin a first connect talks to; a tracked state file wins. */\n readonly origin: string;\n /** The resolved credential for that origin; `None` is signed-out. */\n readonly token: Option.Option<string>;\n /** A first-connect source override; otherwise the state file's source. */\n readonly source: Option.Option<string>;\n /** A first-connect pipeline override; otherwise the state file's pipeline. */\n readonly pipelineId: Option.Option<string>;\n}\n\n/** The pure diff targets the panel can ask for. */\nexport const DiffTarget = Schema.Literals([\"base\", \"head\", \"local\"]);\nexport type DiffTarget = typeof DiffTarget.Type;\n\n/** Which two definitions to compare; the default is Changes (base \u2192 local). */\nexport interface DiffRequest {\n readonly from: DiffTarget;\n readonly to: DiffTarget;\n}\n\n/** What `refresh` may carry: the field resolutions the panel holds. */\nexport interface RefreshRequest {\n /** In-memory only; ignored when its `against` head is no longer the head. */\n readonly resolutions?: ConflictResolutions;\n}\n\n/** What `push` may carry; all are refinements of the state's defaults. */\nexport interface PushRequest {\n readonly base?: Option.Option<string>;\n readonly dryRun?: boolean;\n readonly summary?: string;\n /** Merged into the publish; ignored when `against` is not the head. */\n readonly resolutions?: ConflictResolutions;\n}\n\n/** What `pull` may carry: `check` computes without writing. */\nexport interface PullRequest {\n readonly check?: boolean;\n}\n\n/**\n * One remote value to write into the source, taken from a conflict the panel\n * showed. Both guards are the conflict's identity: the compile it was derived\n * from, and the head revision that value came from.\n */\nexport interface FieldRequest {\n readonly path: string;\n readonly value: Schema.Json;\n readonly localHash: ContentHash;\n readonly headRevisionId: string;\n}\n\n/** The engine both the CLI and the store program against. */\nexport interface SyncEngine {\n /** The raw `.braven` base, or `None` when this folder is untracked. */\n readonly state: () => Effect.Effect<\n Option.Option<PipelineSyncState>,\n SyncFailure,\n FileSystem.FileSystem | Path.Path\n >;\n /** Reads the folder and the head, and derives one `SyncState`. */\n readonly refresh: (\n request?: RefreshRequest,\n ) => Effect.Effect<SyncState, SyncFailure, SyncServices>;\n readonly push: (\n request?: PushRequest,\n ) => Effect.Effect<PushOutcome, SyncFailure, SyncServices>;\n readonly pull: (\n request?: PullRequest,\n ) => Effect.Effect<PullOutcome, SyncFailure, SyncServices>;\n /** Edits the source for one safe proposal; never publishes. */\n readonly apply: (\n proposalId: string,\n ) => Effect.Effect<ApplyResult, SyncFailure, SyncServices>;\n /** Edits one field to a remote value through the span-checked patcher. */\n readonly applyField: (\n request: FieldRequest,\n ) => Effect.Effect<ApplyResult, SyncFailure, SyncServices>;\n readonly reject: (\n proposalId: string,\n ) => Effect.Effect<void, SyncFailure, SyncServices>;\n /** The section-by-section diff between two targets. */\n readonly diff: (\n request?: DiffRequest,\n ) => Effect.Effect<PipelineDiff, SyncFailure, SyncServices>;\n}\n\nconst mapStateError = <A, R>(effect: Effect.Effect<A, PipelineStateError, R>) =>\n effect.pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(\n new SyncFailure({\n kind: \"usage\",\n message: `${error.path}: ${error.message}`,\n }),\n ),\n ),\n );\n\nconst hashOf = (value: string): ContentHash =>\n Schema.decodeUnknownSync(ContentHash)(value);\n\n/** Only a diff with content is a Changes or Incoming section. */\nconst sectionOf = (before: PipelineIr, after: PipelineIr) => {\n const diff = diffIr(before, after);\n return isEmptyDiff(diff) ? Option.none<PipelineDiff>() : Option.some(diff);\n};\n\n/** The engine constructed over one folder and one credential. */\nexport const createSyncEngine = (options: SyncEngineOptions): SyncEngine => {\n const read = () => readState(options.cwd).pipe(mapStateError);\n\n const requireState = Effect.gen(function* () {\n const state = yield* read();\n if (Option.isNone(state))\n return yield* fail(\n \"usage\",\n \"no .braven/pipeline.json \u2014 this checkout is not connected to a pipeline\",\n );\n return state.value;\n });\n\n const compile = (source: string) =>\n compileIr(source, { cwd: options.cwd }).pipe(\n Effect.mapError((error: CompilerUnavailable | PipelineExit) =>\n compilerFailure(source, error),\n ),\n Effect.flatMap((text) =>\n decodePipelineIr(text).pipe(\n Effect.mapError(\n (error) =>\n new SyncFailure({\n kind: \"source\",\n message: `the compiler returned an unreadable IR: ${error.message}`,\n }),\n ),\n ),\n ),\n );\n\n const client = (\n origin: string,\n pipelineId: string,\n ): Effect.Effect<PipelineApi, SyncFailure> =>\n Option.match(options.token, {\n onNone: () =>\n fail(\"network\", `not signed in to ${origin} \u2014 run \\`braven login\\``),\n onSome: (secret) =>\n Effect.succeed(makeClient({ origin, secret, pipelineId })),\n });\n\n const refresh: SyncEngine[\"refresh\"] = Effect.fn(\"PipelineSync.refresh\")(\n function* (request: RefreshRequest = {}) {\n const stateOption = yield* read();\n if (Option.isNone(stateOption)) return emptySyncState(\"untracked\");\n const stored = stateOption.value;\n const baseRevision = new RevisionRef({\n revisionId: stored.baseRevisionId,\n contentHash: stored.baseContentHash,\n });\n\n const source = stored.source;\n const compiled = yield* compile(source).pipe(Effect.result);\n const local = Result.match(compiled, {\n onSuccess: Option.some,\n onFailure: () => Option.none<PipelineIr>(),\n });\n const localHash = yield* Option.match(local, {\n onNone: () => Effect.succeed(Option.none<ContentHash>()),\n onSome: (ir) =>\n Effect.map(irHashOf(ir), (value) => Option.some(hashOf(value))).pipe(\n Effect.orDie,\n ),\n });\n const compileError = Result.match(compiled, {\n onSuccess: () => Option.none<SyncFailure>(),\n onFailure: Option.some,\n });\n\n if (Option.isNone(options.token))\n return new SyncState({\n status: \"signed-out\",\n baseRevision: Option.some(baseRevision),\n headRevision: Option.none(),\n localHash,\n changes: Option.none(),\n incoming: Option.none(),\n proposals: [],\n conflicts: [],\n lastError: compileError,\n });\n\n const api = yield* client(stored.origin, stored.pipelineId);\n const head = yield* api.head().pipe(Effect.mapError(apiFailure));\n const proposals = yield* api\n .proposals({ status: \"open\" })\n .pipe(Effect.mapError(apiFailure));\n\n const headMoved = Option.match(head, {\n onNone: () => false,\n onSome: (value) => value.revisionId !== stored.baseRevisionId,\n });\n const localDiffers = Option.match(localHash, {\n onNone: () => false,\n onSome: (value) => value !== stored.baseContentHash,\n });\n\n const baseIr: Option.Option<PipelineIr> =\n headMoved || localDiffers\n ? Option.some(yield* revisionIr(api, stored.baseRevisionId))\n : Option.none();\n const headIr = yield* Option.match(head, {\n onNone: () => Effect.succeed(Option.none<PipelineIr>()),\n onSome: (value) =>\n headMoved\n ? Effect.map(revisionIr(api, value.revisionId), Option.some)\n : Effect.succeed(Option.none<PipelineIr>()),\n });\n\n const changes = Option.flatMap(\n Option.all({ base: baseIr, local }),\n ({ base, local: next }) => sectionOf(base, next),\n );\n const incoming = Option.flatMap(\n Option.all({ base: baseIr, head: headIr }),\n ({ base, head: remote }) => sectionOf(base, remote),\n );\n\n const documents = Option.all({ base: baseIr, local, head: headIr });\n\n // A pick is only meaningful for a conflict this head still has, and only\n // for the head it was read at. Anything else is a record from a source\n // that has moved on: dropped, never applied to a revision never seen.\n const held: Option.Option<Readonly<Record<string, ResolutionSide>>> =\n Option.flatMap(Option.fromNullishOr(request.resolutions), (set) =>\n Option.exists(head, (value) => value.revisionId === set.against)\n ? Option.some(set.sides)\n : Option.none(),\n );\n const sides: Readonly<Record<string, ResolutionSide>> = Option.match(\n held,\n {\n onNone: () => ({}),\n onSome: (candidate) =>\n Option.match(documents, {\n onNone: () => ({}),\n onSome: ({ base, local: next, head: remote }) => {\n const unresolved = merge(base, next, remote);\n const open =\n unresolved.status === \"conflict\" ? unresolved.conflicts : [];\n return R.filter(candidate, (_side, path) =>\n Arr.some(open, (conflict) => conflict.path === path),\n );\n },\n }),\n },\n );\n\n const atBase = Option.contains(localHash, stored.baseContentHash);\n const atHead = Option.match(head, {\n onNone: () => false,\n onSome: (value) => Option.contains(localHash, value.contentHash),\n });\n const plan = Option.map(\n documents,\n ({ base, local: next, head: remote }) => {\n const merged = merge(base, next, remote, sides);\n const remoteKey = pipelineContentKey(remote);\n // A resolution that still refuses (the conflict became structural) is\n // dropped, not fatal: the read must report the real conflicts.\n return merged.status === \"refused\"\n ? {\n merged: merge(base, next, remote),\n remoteKey,\n refused: merged.refusals,\n }\n : { merged, remoteKey, refused: [] };\n },\n );\n\n const deriveStatus = (): SyncStatusType => {\n if (Option.isNone(local)) return \"dirty\";\n if (Option.isNone(head)) return atBase ? \"clean\" : \"dirty\";\n if (atHead || atBase) return \"clean\";\n if (Option.isNone(plan)) return \"dirty\";\n if (plan.value.merged.status !== \"clean\") return \"conflict\";\n return pipelineContentKey(plan.value.merged.ir) === plan.value.remoteKey\n ? \"clean\"\n : \"diverged\";\n };\n const conflicts: ReadonlyArray<IrConflict> = Option.match(plan, {\n onNone: () => [],\n onSome: ({ merged }) =>\n merged.status === \"conflict\" ? merged.conflicts : [],\n });\n const dropped: Option.Option<SyncFailure> = Option.flatMap(\n plan,\n ({ refused }) =>\n refused.length === 0\n ? Option.none()\n : Option.some(\n new SyncFailure({\n kind: \"conflict\",\n message: `a resolution no longer applies: ${Arr.join(resolutionLines(refused), \"; \")}`,\n }),\n ),\n );\n\n return new SyncState({\n status: deriveStatus(),\n baseRevision: Option.some(baseRevision),\n headRevision: head,\n localHash,\n changes,\n incoming,\n proposals,\n conflicts,\n lastError: Option.orElse(compileError, () => dropped),\n });\n },\n );\n\n const pushAction: SyncEngine[\"push\"] = Effect.fn(\"PipelineSync.push\")(\n function* (request: PushRequest = {}) {\n const stateOption = yield* read();\n const pipelineId = Option.match(stateOption, {\n onNone: () => options.pipelineId,\n onSome: (stored) => Option.some(stored.pipelineId),\n });\n if (Option.isNone(pipelineId))\n return yield* fail(\n \"usage\",\n \"no pipeline to push to \u2014 pass --pipeline-id for the first push, or run `braven pipeline pull`\",\n );\n const source = Option.match(stateOption, {\n onNone: () => Option.getOrElse(options.source, () => \"pipeline.py\"),\n onSome: (stored) => stored.source,\n });\n const origin = Option.match(stateOption, {\n onNone: () => options.origin,\n onSome: (stored) => stored.origin,\n });\n const api = yield* client(origin, pipelineId.value);\n const local = yield* compile(source);\n const baseRevisionId = Option.orElse(\n request.base ?? Option.none<string>(),\n () => Option.map(stateOption, (stored) => stored.baseRevisionId),\n );\n return yield* push({\n cwd: options.cwd,\n api,\n local,\n identity: { origin, pipelineId: pipelineId.value, source },\n baseRevisionId,\n resolutions: Option.fromNullishOr(request.resolutions),\n dryRun: request.dryRun ?? false,\n summary: request.summary,\n });\n },\n );\n\n const pullAction: SyncEngine[\"pull\"] = Effect.fn(\"PipelineSync.pull\")(\n function* (request: PullRequest = {}) {\n const stored = yield* requireState;\n const source = stored.source;\n const local = yield* compile(source);\n const sourceText = yield* readSource(options.cwd, source);\n const api = yield* client(stored.origin, stored.pipelineId);\n return yield* pull({\n cwd: options.cwd,\n api,\n local,\n sourceText,\n check: request.check ?? false,\n });\n },\n );\n\n const applyAction: SyncEngine[\"apply\"] = Effect.fn(\"PipelineSync.apply\")(\n function* (proposalId: string) {\n const stored = yield* requireState;\n const api = yield* client(stored.origin, stored.pipelineId);\n const proposals = yield* api\n .proposals({})\n .pipe(Effect.mapError(apiFailure));\n const proposal = Arr.findFirst(\n proposals,\n (candidate) => candidate.id === proposalId,\n );\n if (Option.isNone(proposal))\n return yield* fail(\n \"usage\",\n `no proposal ${proposalId} on this pipeline`,\n );\n if (proposal.value.status !== \"open\")\n return yield* fail(\n \"usage\",\n `proposal ${proposalId} is ${proposal.value.status}, not open`,\n );\n\n const source = stored.source;\n const local = yield* compile(source);\n const sourceText = yield* readSource(options.cwd, source);\n const base = yield* revisionIr(api, proposal.value.baseRevisionId);\n return yield* applyVerified({\n cwd: options.cwd,\n source,\n sourceText,\n local,\n base,\n ops: proposal.value.patch,\n write: true,\n });\n },\n );\n\n /**\n * Writes the remote side of one conflict into the source.\n *\n * The proposal patcher refuses an op whose construct changed since its base,\n * but a conflicted field *has* changed locally by definition \u2014 so the op's\n * reference is the local compile itself, and the equivalent guard is upstream:\n * the caller proves the source is still the compile the conflict was read\n * from (`localHash`) and the remote value still comes from the same head\n * (`headRevisionId`). The patcher's span, signature and literal checks then\n * ensure the exact text is edited.\n */\n const fieldAction: SyncEngine[\"applyField\"] = Effect.fn(\n \"PipelineSync.applyField\",\n )(function* (request: FieldRequest) {\n const stored = yield* requireState;\n const api = yield* client(stored.origin, stored.pipelineId);\n const sourceText = yield* readSource(options.cwd, stored.source);\n const local = yield* compile(stored.source);\n const localHash = yield* irHashOf(local).pipe(Effect.orDie);\n if (localHash !== request.localHash)\n return yield* fail(\n \"conflict\",\n \"the source changed since the conflict was read \u2014 refresh, then resolve again\",\n );\n const head = yield* api.head().pipe(Effect.mapError(apiFailure));\n if (\n !Option.exists(\n head,\n (value) => value.revisionId === request.headRevisionId,\n )\n )\n return yield* fail(\n \"conflict\",\n \"the head moved since the conflict was read \u2014 refresh, then resolve again\",\n );\n const op = fieldOp(request.path, request.value);\n if (Option.isNone(op))\n return yield* fail(\n \"usage\",\n `cannot apply ${request.path}: the watcher writes only a parameter default, a step name or a description`,\n );\n return yield* applyVerified({\n cwd: options.cwd,\n source: stored.source,\n sourceText,\n local,\n base: local,\n ops: [op.value],\n write: true,\n });\n });\n\n const rejectAction: SyncEngine[\"reject\"] = Effect.fn(\"PipelineSync.reject\")(\n function* (proposalId: string) {\n const stored = yield* requireState;\n const api = yield* client(stored.origin, stored.pipelineId);\n return yield* api.reject(proposalId).pipe(Effect.mapError(apiFailure));\n },\n );\n\n const diffAction: SyncEngine[\"diff\"] = Effect.fn(\"PipelineSync.diff\")(\n function* (request: DiffRequest = { from: \"base\", to: \"local\" }) {\n const stored = yield* requireState;\n const api = yield* client(stored.origin, stored.pipelineId);\n\n const load = (\n target: DiffTarget,\n ): Effect.Effect<PipelineIr, SyncFailure, SyncServices> => {\n if (target === \"local\") return compile(stored.source);\n if (target === \"base\") return revisionIr(api, stored.baseRevisionId);\n return Effect.gen(function* () {\n const head = yield* api.head().pipe(Effect.mapError(apiFailure));\n if (Option.isNone(head))\n return yield* fail(\n \"usage\",\n \"this pipeline has no published revision\",\n );\n return yield* revisionIr(api, head.value.revisionId);\n });\n };\n\n const [before, after] = yield* Effect.all(\n [load(request.from), load(request.to)],\n { concurrency: 2 },\n );\n return diffIr(before, after);\n },\n );\n\n return {\n state: read,\n refresh,\n push: pushAction,\n pull: pullAction,\n apply: applyAction,\n applyField: fieldAction,\n reject: rejectAction,\n diff: diffAction,\n };\n};\n", "/**\n * `.braven/pipeline.json` \u2014 the local working copy's sync state (plan 069).\n *\n * The file is a cache, not authority: it names the last revision this checkout\n * synced with (the merge base) and the compiler hash that revision had. It\n * holds no credential, no token and no IR \u2014 losing it costs one `pull`, never a\n * definition. A missing file means \"no base\", and `push` then refuses to guess.\n */\nimport { Effect, Schema } from \"effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Option from \"effect/Option\";\nimport * as Path from \"effect/Path\";\nimport { ContentHash } from \"@braven/pipeline-ir/content-hash\";\n\n/** The file's schema version; a future shape bumps this, not a field. */\nexport const STATE_SCHEMA = 1;\n\n/** A sync state that cannot be read or written. */\nexport class PipelineStateError extends Schema.TaggedError<PipelineStateError>()(\n \"PipelineStateError\",\n { path: Schema.String, message: Schema.String },\n) {}\n\n/** The working copy's last known base revision. */\nexport class PipelineSyncState extends Schema.Class<PipelineSyncState>(\n \"PipelineSyncState\",\n)({\n schema: Schema.Literal(STATE_SCHEMA).pipe(\n Schema.withConstructorDefault(Effect.succeed(STATE_SCHEMA)),\n ),\n origin: Schema.NonEmptyString,\n pipelineId: Schema.NonEmptyString,\n source: Schema.NonEmptyString,\n /** The revision the working copy branched from; the merge base. */\n baseRevisionId: Schema.NonEmptyString,\n /** That revision's canonical content hash, for `status` and `pull`. */\n baseContentHash: ContentHash,\n lastPulledAt: Schema.DateFromString,\n}) {}\n\nconst StateJson = Schema.fromJsonString(PipelineSyncState, { space: 2 });\n\n/** `<cwd>/.braven/pipeline.json`. */\nexport const statePath = (cwd: string) =>\n Effect.map(Path.Path, (path) => path.join(cwd, \".braven\", \"pipeline.json\"));\n\n/** Reads the state, or `None` when this checkout has never been synced. */\nexport const readState = (cwd: string) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* statePath(cwd);\n const exists = yield* fs.exists(path).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path,\n message: `cannot read the sync state: ${cause.message}`,\n }),\n ),\n );\n if (!exists) return Option.none<PipelineSyncState>();\n const text = yield* fs.readFileString(path).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path,\n message: `cannot read the sync state: ${cause.message}`,\n }),\n ),\n );\n return Option.some(\n yield* Schema.decodeUnknownEffect(StateJson)(text).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path,\n message: `the sync state is unreadable (${cause.message}); delete it and run \\`braven pipeline pull\\``,\n }),\n ),\n ),\n );\n });\n\n/**\n * Writes the state atomically: a sibling temporary file, then a rename.\n *\n * Only ids, the origin, the source path and hashes are stored \u2014 a secret has\n * nowhere to go in the schema.\n */\nexport const writeState = (cwd: string, state: PipelineSyncState) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const target = yield* statePath(cwd);\n const directory = path.dirname(target);\n const temporary = `${target}.tmp`;\n yield* fs.makeDirectory(directory, { recursive: true }).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path: directory,\n message: `cannot create ${directory}: ${cause.message}`,\n }),\n ),\n );\n yield* Schema.encodeEffect(StateJson)(state).pipe(\n Effect.flatMap((text) => fs.writeFileString(temporary, `${text}\\n`)),\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path: target,\n message: `cannot write the sync state: ${cause.message}`,\n }),\n ),\n );\n yield* fs.rename(temporary, target).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path: target,\n message: `cannot replace the sync state: ${cause.message}`,\n }),\n ),\n );\n });\n", "/**\n * The sync protocol: push, pull and their one-retry stale-head rule (plan 069).\n *\n * Pure protocol decisions live in `merge.ts` and `patch.ts`; this module owns\n * the order of operations and the local state transitions. It never calls\n * `updatePipeline` and never regenerates Python: `push` only publishes an IR,\n * `pull` only writes a source file when every touched construct is\n * round-trip-safe and every span still matches.\n */\nimport { Clock, DateTime, Effect, Option } from \"effect\";\nimport * as CryptoModule from \"effect/Crypto\";\nimport type { HttpClient } from \"effect/http\";\nimport * as Arr from \"effect/Array\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport { SyncFailure, type SyncFailureKind, fail, oneLine } from \"./errors.ts\";\nimport {\n canonicalJson,\n decodePipelineIr,\n irHashOf,\n PipelineIr,\n type PipelineIrIssue,\n} from \"@braven/pipeline-ir\";\nimport { ContentHash } from \"@braven/pipeline-ir/content-hash\";\nimport {\n type PipelineApi,\n type PipelineApiError,\n type PublishedRevision,\n type RevisionHead,\n isStaleParent,\n} from \"./client.ts\";\nimport { PythonCompiler } from \"./compiler.ts\";\nimport { merge, pipelineContentKey, type IrConflict } from \"./merge.ts\";\nimport { type PatchChange, type PatchRefusal } from \"./patch.ts\";\nimport { applyVerified } from \"./apply.ts\";\nimport {\n type ConflictResolutions,\n type ResolutionSide,\n resolutionLines,\n} from \"./resolve.ts\";\nimport {\n readState,\n writeState,\n PipelineSyncState,\n type PipelineStateError,\n} from \"./state.ts\";\n\nconst now = Effect.map(Clock.currentTimeMillis, (millis) =>\n Schema.decodeUnknownSync(Schema.DateFromString)(\n DateTime.formatIso(DateTime.makeUnsafe(millis)),\n ),\n);\n\nconst apiKind = (error: PipelineApiError): SyncFailureKind =>\n Option.match(error.status, {\n onNone: () => \"network\",\n onSome: (status) =>\n status === 404\n ? \"usage\"\n : status === 409 || status === 422\n ? \"conflict\"\n : \"network\",\n });\n\nexport const apiFailure = (error: PipelineApiError): SyncFailure =>\n new SyncFailure({\n kind: apiKind(error),\n message: `${error.procedure}: ${oneLine(error.message)}`,\n });\n\nconst stateFailure = (error: PipelineStateError): SyncFailure =>\n new SyncFailure({\n kind: \"usage\",\n message: `${error.path}: ${error.message}`,\n });\n\n/** Fails as `usage` unless this checkout has a sync state to work from. */\nconst requireState = (cwd: string) =>\n Effect.gen(function* () {\n const state = yield* readState(cwd);\n if (Option.isNone(state))\n return yield* fail(\n \"usage\",\n \"no .braven/pipeline.json \u2014 this checkout has no sync base; run `braven pipeline push` for a new pipeline to create one\",\n );\n return state.value;\n }).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(stateFailure(error)),\n ),\n );\n\nconst decodeIr = (text: string) =>\n decodePipelineIr(text).pipe(\n Effect.mapError(\n (error) =>\n new SyncFailure({\n kind: \"usage\",\n message: `the revision's IR is unreadable: ${Arr.join(\n error.issues.map(\n (issue: PipelineIrIssue) =>\n `${issue.pointer || \"/\"}: ${issue.message}`,\n ),\n \"; \",\n )}`,\n }),\n ),\n );\n\nconst hash = (text: string): ContentHash =>\n Schema.decodeUnknownSync(ContentHash)(text);\n\n/** What every state write needs, whether the file existed or is being created. */\nexport interface SyncIdentity {\n readonly origin: string;\n readonly pipelineId: string;\n readonly source: string;\n}\n\nconst record = (\n cwd: string,\n identity: SyncIdentity,\n base: { readonly revisionId: string; readonly contentHash: string },\n) =>\n Effect.gen(function* () {\n const at = yield* now;\n yield* writeState(\n cwd,\n new PipelineSyncState({\n origin: identity.origin,\n pipelineId: identity.pipelineId,\n source: identity.source,\n baseRevisionId: base.revisionId,\n baseContentHash: hash(base.contentHash),\n lastPulledAt: at,\n }),\n );\n }).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(stateFailure(error)),\n ),\n );\n\n/** Fetches and decodes one revision's IR. */\nexport const revisionIr = (api: PipelineApi, revisionId: string) =>\n Effect.gen(function* () {\n const document = yield* api\n .revision(revisionId)\n .pipe(Effect.mapError(apiFailure));\n return yield* decodeIr(document.ir);\n });\n\n/** What `push` would do for one head. */\ntype PushAction =\n | {\n readonly kind: \"publish\";\n readonly ir: PipelineIr;\n readonly merged: boolean;\n }\n | { readonly kind: \"up-to-date\"; readonly head: RevisionHead }\n | { readonly kind: \"remote-has-changes\"; readonly head: RevisionHead }\n | {\n readonly kind: \"conflict\";\n readonly conflicts: ReadonlyArray<IrConflict>;\n };\n\nexport interface PushInput {\n readonly cwd: string;\n readonly api: PipelineApi;\n readonly local: PipelineIr;\n readonly identity: SyncIdentity;\n /** The merge base: the state's base, or `--base` when it overrides it. */\n readonly baseRevisionId: Option.Option<string>;\n /** Field conflicts settled in the watcher; only valid for `against`. */\n readonly resolutions?: Option.Option<ConflictResolutions>;\n readonly dryRun: boolean;\n readonly summary?: string | undefined;\n}\n\n/** The result of a push; the command renders it and chooses the exit code. */\nexport type PushOutcome =\n | { readonly status: \"up-to-date\"; readonly head: RevisionHead }\n | {\n readonly status: \"published\";\n readonly revision: PublishedRevision;\n readonly merged: boolean;\n }\n | { readonly status: \"remote-has-changes\"; readonly head: RevisionHead }\n | {\n readonly status: \"conflict\";\n readonly conflicts: ReadonlyArray<IrConflict>;\n readonly head: Option.Option<RevisionHead>;\n }\n | {\n readonly status: \"dry-run\";\n readonly ir: PipelineIr;\n readonly merged: boolean;\n };\n\nconst planPush = (\n input: PushInput,\n head: RevisionHead,\n localHash: string,\n sides: Readonly<Record<string, ResolutionSide>>,\n): Effect.Effect<PushAction, SyncFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n if (localHash === head.contentHash) return { kind: \"up-to-date\", head };\n if (Option.isNone(input.baseRevisionId))\n return yield* fail(\n \"usage\",\n \"no base revision \u2014 pass --base or run `braven pipeline pull` first\",\n );\n const baseId = input.baseRevisionId.value;\n if (baseId === head.revisionId)\n return { kind: \"publish\", ir: input.local, merged: false };\n\n const base = yield* revisionIr(input.api, baseId);\n const remote = yield* revisionIr(input.api, head.revisionId);\n const merged = merge(base, input.local, remote, sides);\n if (merged.status === \"refused\")\n return yield* fail(\n \"conflict\",\n `the merge refused the resolution: ${Arr.join(resolutionLines(merged.refusals), \"; \")}`,\n );\n if (merged.status === \"conflict\")\n return { kind: \"conflict\", conflicts: merged.conflicts };\n if (pipelineContentKey(merged.ir) === pipelineContentKey(remote))\n return { kind: \"remote-has-changes\", head };\n return { kind: \"publish\", ir: merged.ir, merged: true };\n });\n\ntype Attempt =\n | { readonly attempted: false; readonly outcome: PushOutcome }\n | {\n readonly attempted: true;\n readonly result: PublishedRevision;\n readonly merged: boolean;\n }\n | { readonly attempted: true; readonly stale: true };\n\n/**\n * Publishes or reports, with exactly one refetch when the head moved between\n * the plan and the publish. A second stale answer is a conflict: there is no\n * blind retry loop, and nothing is published after it.\n */\nexport const push = (\n input: PushInput,\n): Effect.Effect<\n PushOutcome,\n SyncFailure,\n HttpClient.HttpClient | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const localHash = yield* irHashOf(input.local).pipe(Effect.orDie);\n\n const headAtStart = yield* input.api\n .head()\n .pipe(Effect.mapError(apiFailure));\n if (Option.isNone(headAtStart)) {\n if (input.dryRun)\n return { status: \"dry-run\", ir: input.local, merged: false };\n const revision = yield* input.api\n .publish({\n pipelineId: input.identity.pipelineId,\n irText: canonicalJson(input.local),\n irHash: localHash,\n expectedParentId: null,\n baseRevisionId: null,\n summary: input.summary,\n })\n .pipe(Effect.mapError(apiFailure));\n yield* record(input.cwd, input.identity, {\n revisionId: revision.revisionId,\n contentHash: revision.contentHash,\n });\n return { status: \"published\", revision, merged: false };\n }\n\n const runAttempt = (\n head: RevisionHead,\n ): Effect.Effect<Attempt, SyncFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n // A resolution belongs to the head it was read at. A moved head (the\n // one-retry path below) must re-merge without it and surface the\n // conflict, never apply the user's choice to a revision they never saw.\n const sides = Option.match(input.resolutions ?? Option.none(), {\n onNone: () => ({}),\n onSome: (set) => (set.against === head.revisionId ? set.sides : {}),\n });\n const action = yield* planPush(input, head, localHash, sides);\n if (action.kind === \"up-to-date\")\n return { attempted: false, outcome: { status: \"up-to-date\", head } };\n if (action.kind === \"remote-has-changes\")\n return {\n attempted: false,\n outcome: { status: \"remote-has-changes\", head },\n };\n if (action.kind === \"conflict\")\n return {\n attempted: false,\n outcome: {\n status: \"conflict\",\n conflicts: action.conflicts,\n head: Option.some(head),\n },\n };\n if (input.dryRun)\n return {\n attempted: false,\n outcome: {\n status: \"dry-run\",\n ir: action.ir,\n merged: action.merged,\n },\n };\n const contentHash = yield* irHashOf(action.ir).pipe(Effect.orDie);\n const answer = yield* input.api\n .publish({\n pipelineId: input.identity.pipelineId,\n irText: canonicalJson(action.ir),\n irHash: contentHash,\n expectedParentId: head.revisionId,\n baseRevisionId: head.revisionId,\n summary:\n input.summary ??\n (action.merged\n ? `Merged with revision ${head.number}`\n : undefined),\n })\n .pipe(Effect.result);\n if (Result.isFailure(answer)) {\n if (isStaleParent(answer.failure))\n return { attempted: true, stale: true };\n return yield* Effect.fail(apiFailure(answer.failure));\n }\n return {\n attempted: true,\n result: answer.success,\n merged: action.merged,\n };\n });\n\n const finish = (\n result: PublishedRevision,\n merged: boolean,\n parent: RevisionHead,\n ): Effect.Effect<\n PushOutcome,\n SyncFailure,\n FileSystem.FileSystem | Path.Path\n > =>\n Effect.gen(function* () {\n // A fast-forward publish means the source is exactly the revision; a\n // merged publish does not, so its base stays the parent it merged\n // against. The next push then re-merges to \"remote already contains\n // your changes\" instead of publishing the unmerged source.\n yield* record(\n input.cwd,\n input.identity,\n merged\n ? { revisionId: parent.revisionId, contentHash: parent.contentHash }\n : {\n revisionId: result.revisionId,\n contentHash: result.contentHash,\n },\n );\n return { status: \"published\", revision: result, merged };\n });\n\n const first = yield* runAttempt(headAtStart.value);\n if (!first.attempted) return first.outcome;\n if (\"result\" in first)\n return yield* finish(first.result, first.merged, headAtStart.value);\n\n // Stale: the head moved. Refetch exactly once and re-plan.\n const headAgain = yield* input.api.head().pipe(Effect.mapError(apiFailure));\n if (Option.isNone(headAgain))\n return yield* fail(\n \"conflict\",\n \"the pipeline head disappeared after the publish was rejected; nothing was published\",\n );\n const second = yield* runAttempt(headAgain.value);\n if (!second.attempted) return second.outcome;\n if (\"result\" in second)\n return yield* finish(second.result, second.merged, headAgain.value);\n return {\n status: \"conflict\",\n conflicts: [],\n head: Option.some(headAgain.value),\n };\n });\n\n/** What `pull` computed; `--check` returns the same shape without writing. */\nexport type PullOutcome =\n | { readonly status: \"up-to-date\"; readonly head: RevisionHead }\n | {\n readonly status: \"fast-forward\";\n readonly head: RevisionHead;\n readonly proposals: ReadonlyArray<string>;\n }\n | {\n readonly status: \"applied\";\n readonly head: RevisionHead;\n readonly proposals: ReadonlyArray<string>;\n readonly changes: ReadonlyArray<PatchChange>;\n }\n | { readonly status: \"local-ahead\"; readonly head: RevisionHead }\n | {\n readonly status: \"conflict\";\n readonly conflicts: ReadonlyArray<IrConflict>;\n }\n | { readonly status: \"remote-ahead\"; readonly head: RevisionHead }\n | {\n readonly status: \"refused\";\n readonly refusals: ReadonlyArray<PatchRefusal>;\n }\n | {\n readonly status: \"check\";\n readonly head: RevisionHead;\n readonly proposals: ReadonlyArray<string>;\n readonly changes: ReadonlyArray<PatchChange>;\n };\n\nexport interface PullInput {\n readonly cwd: string;\n readonly api: PipelineApi;\n readonly local: PipelineIr;\n readonly sourceText: string;\n readonly check: boolean;\n}\n\n/**\n * Advances the base pointer or applies round-trip-safe proposals.\n *\n * The source is only written when every proposal applies and the patched text\n * compiles to the values those proposals name; a refusal leaves it\n * byte-identical. A remote revision the source does not contain is reported,\n * never written: arbitrary Python is the engineer's to reconcile.\n */\nexport const pull = (\n input: PullInput,\n): Effect.Effect<\n PullOutcome,\n SyncFailure,\n | CryptoModule.Crypto\n | HttpClient.HttpClient\n | FileSystem.FileSystem\n | Path.Path\n | PythonCompiler\n> =>\n Effect.gen(function* () {\n const state = yield* requireState(input.cwd);\n const localKey = pipelineContentKey(input.local);\n\n const headOption = yield* input.api\n .head()\n .pipe(Effect.mapError(apiFailure));\n if (Option.isNone(headOption))\n return yield* fail(\n \"usage\",\n \"this pipeline has no published revision yet; run `braven pipeline push`\",\n );\n const head = headOption.value;\n\n const open = yield* input.api\n .proposals({ status: \"open\" })\n .pipe(Effect.mapError(apiFailure));\n const proposalIds = open.map((proposal) => proposal.id);\n const remote = yield* revisionIr(input.api, head.revisionId);\n const remoteKey = pipelineContentKey(remote);\n\n const advance = Effect.gen(function* () {\n if (state.baseRevisionId === head.revisionId) return;\n if (input.check) return;\n yield* record(input.cwd, state, {\n revisionId: head.revisionId,\n contentHash: head.contentHash,\n });\n });\n\n if (localKey === remoteKey && open.length === 0) {\n yield* advance;\n return { status: \"up-to-date\", head };\n }\n\n const base = yield* revisionIr(input.api, state.baseRevisionId);\n\n if (localKey !== remoteKey) {\n // A pull carries no resolutions: it only advances the base when the\n // source already contains what the head has.\n const merged = merge(base, input.local, remote);\n if (merged.status === \"conflict\")\n return { status: \"conflict\", conflicts: merged.conflicts };\n if (merged.status === \"refused\")\n // Unreachable: a pull hands the merge no resolutions.\n return yield* Effect.die(\"a pull merge cannot refuse a resolution\");\n const baseKey = pipelineContentKey(base);\n const mergedKey = pipelineContentKey(merged.ir);\n if (localKey === baseKey && remoteKey !== baseKey && open.length === 0) {\n // Fast-forward: the definition advanced, the source is untouched.\n yield* advance;\n return { status: \"fast-forward\", head, proposals: [] };\n }\n if (mergedKey !== localKey)\n // The source lacks changes the head contains; only Python can add them.\n return { status: \"remote-ahead\", head };\n }\n\n if (open.length === 0) {\n yield* advance;\n return { status: \"local-ahead\", head };\n }\n\n const applied = yield* applyVerified({\n cwd: input.cwd,\n source: state.source,\n sourceText: input.sourceText,\n local: input.local,\n base,\n ops: Arr.flatMap(open, (proposal) => proposal.patch),\n write: !input.check,\n });\n if (applied.status === \"refused\")\n return { status: \"refused\", refusals: applied.refusals };\n\n if (input.check)\n return {\n status: \"check\",\n head,\n proposals: proposalIds,\n changes: applied.changes,\n };\n\n yield* record(input.cwd, state, {\n revisionId: head.revisionId,\n contentHash: head.contentHash,\n });\n return {\n status: \"applied\",\n head,\n proposals: proposalIds,\n changes: applied.changes,\n };\n });\n", "/**\n * The one state shape the engine derives and the store publishes.\n *\n * It is a projection: the base revision lives in `.braven/pipeline.json`, the\n * source on disk, the head and proposals behind oRPC. Nothing here is written\n * back; the store replaces this value after every successful read.\n */\nimport * as Option from \"effect/Option\";\nimport * as Schema from \"effect/Schema\";\nimport { ContentHash } from \"@braven/pipeline-ir/content-hash\";\nimport { ProposalSummary, RevisionHead } from \"./client.ts\";\nimport { PipelineDiff } from \"./diff.ts\";\nimport { SyncFailure } from \"./errors.ts\";\nimport { IrConflict } from \"./merge.ts\";\n\n/** The seven states the panel can show. `offline` is an overlay on the last. */\nexport const SyncStatus = Schema.Literals([\n \"untracked\",\n \"signed-out\",\n \"clean\",\n \"dirty\",\n \"diverged\",\n \"conflict\",\n \"offline\",\n]);\nexport type SyncStatus = typeof SyncStatus.Type;\n\n/** The merge base, as the state file records it. */\nexport class RevisionRef extends Schema.Class<RevisionRef>(\"RevisionRef\")({\n revisionId: Schema.NonEmptyString,\n contentHash: Schema.NonEmptyString,\n}) {}\n\n/** Everything the panel renders, derived from the engine's read. */\nexport class SyncState extends Schema.Class<SyncState>(\"SyncState\")({\n status: SyncStatus,\n baseRevision: Schema.Option(RevisionRef),\n headRevision: Schema.Option(RevisionHead),\n localHash: Schema.Option(ContentHash),\n /** The local IR against the base revision: the Changes section. */\n changes: Schema.Option(PipelineDiff),\n /** The head IR against the base revision: the Incoming section. */\n incoming: Schema.Option(PipelineDiff),\n proposals: Schema.Array(ProposalSummary),\n conflicts: Schema.Array(IrConflict),\n lastError: Schema.Option(SyncFailure),\n}) {}\n\n/** The state before anything is read: no base, no head, no error. */\nexport const emptySyncState = (status: SyncStatus): SyncState =>\n new SyncState({\n status,\n baseRevision: Option.none(),\n headRevision: Option.none(),\n localHash: Option.none(),\n changes: Option.none(),\n incoming: Option.none(),\n proposals: [],\n conflicts: [],\n lastError: Option.none(),\n });\n", "/**\n * The headless sync store (plan 075 phase 1).\n *\n * It owns the state machine, not the UI: one snapshot, one subscriber list and\n * one serialized action at a time. Every action asks the engine, then reads the\n * derived state back; the store never derives a revision, a merge or a cleaner\n * answer of its own.\n *\n * The rules that must not live in a button:\n *\n * - push, pull and apply are refused while the last merge reported conflicts;\n * - apply is refused for a proposal the span-checked patcher rejects, and the\n * source stays byte-identical;\n * - no action reports `clean` until the head has been read back;\n * - a failed action keeps the previous snapshot's fields and records why;\n * - there is no discard: a push publishes, it never reverts source.\n *\n * A field resolution is in-memory state recorded against the head it was read\n * at. \"Use local\" keeps it for the next push (the merge takes the local side);\n * \"Use remote\" writes the remote value through the patcher now and advances the\n * base. A moved head discards the record \u2014 it is never applied to a revision\n * the experimenter did not see \u2014 and nothing about it reaches `.braven`.\n */\nimport { Effect, Match, Option, Semaphore } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as R from \"effect/Record\";\nimport * as Result from \"effect/Result\";\nimport type * as Schema from \"effect/Schema\";\nimport type { RevisionHead } from \"./client.ts\";\nimport type { PipelineDiff } from \"./diff.ts\";\nimport {\n type DiffRequest,\n type PullRequest,\n type PushRequest,\n type SyncEngine,\n type SyncServices,\n} from \"./engine.ts\";\nimport { SyncFailure } from \"./errors.ts\";\nimport type { ApplyResult, PatchChange } from \"./patch.ts\";\nimport {\n ConflictResolutions,\n ResolutionRefusal,\n type ResolutionSide,\n resolutionLines,\n settlement,\n} from \"./resolve.ts\";\nimport { emptySyncState, SyncState, type SyncStatus } from \"./snapshot.ts\";\nimport type { PullOutcome, PushOutcome } from \"./sync.ts\";\n\n/** What an action returns: a value, or the typed reason it did nothing. */\nexport type SyncActionResult<A> =\n | { readonly ok: true; readonly value: A }\n | { readonly ok: false; readonly failure: SyncFailure };\n\n/** Called with the new snapshot after every successful read. */\nexport type SyncListener = (state: SyncState) => void;\n\n/**\n * What settling a field conflict did.\n *\n * `recorded` is a local pick held for the next push; `edited` is a remote value\n * already written to the source, with nothing published.\n */\nexport type ResolutionOutcome =\n | { readonly status: \"recorded\"; readonly head: RevisionHead }\n | {\n readonly status: \"edited\";\n readonly head: RevisionHead;\n readonly changes: ReadonlyArray<PatchChange>;\n };\n\n/** The state machine the desktop wraps in a hook. */\nexport interface SyncStore {\n readonly getState: () => SyncState;\n /** Subscribing is synchronous; the returned function unsubscribes. */\n readonly subscribe: (listener: SyncListener) => () => void;\n readonly refresh: () => Effect.Effect<\n SyncActionResult<SyncState>,\n never,\n SyncServices\n >;\n readonly push: (\n request?: PushRequest,\n ) => Effect.Effect<SyncActionResult<PushOutcome>, never, SyncServices>;\n readonly pull: (\n request?: PullRequest,\n ) => Effect.Effect<SyncActionResult<PullOutcome>, never, SyncServices>;\n readonly apply: (\n proposalId: string,\n ) => Effect.Effect<SyncActionResult<ApplyResult>, never, SyncServices>;\n /**\n * Settles one field conflict: `local` records the pick for the next push,\n * `remote` writes the remote value to the source. Both refuse a structural\n * conflict, a non-literal value and a head that moved.\n */\n readonly resolve: (\n path: string,\n side: ResolutionSide,\n ) => Effect.Effect<SyncActionResult<ResolutionOutcome>, never, SyncServices>;\n readonly reject: (\n proposalId: string,\n ) => Effect.Effect<SyncActionResult<void>, never, SyncServices>;\n readonly diff: (\n request?: DiffRequest,\n ) => Effect.Effect<SyncActionResult<PipelineDiff>, never, SyncServices>;\n /** A realtime invalidation ping: one serialized refresh. */\n readonly wake: () => Effect.Effect<\n SyncActionResult<SyncState>,\n never,\n SyncServices\n >;\n}\n\nconst success = <A>(value: A): SyncActionResult<A> => ({ ok: true, value });\n\nconst some = (failure: SyncFailure) => Option.some(failure);\n\n/** One remote action's precondition, or why it cannot start. */\nconst remoteGate = (state: SyncState): Option.Option<SyncFailure> =>\n Match.value(state.status).pipe(\n Match.when(\"untracked\", () =>\n some(\n new SyncFailure({\n kind: \"usage\",\n message: \"this folder is not connected to a pipeline yet\",\n }),\n ),\n ),\n Match.when(\"signed-out\", () =>\n some(\n new SyncFailure({\n kind: \"network\",\n message: \"not signed in \u2014 sign in, then retry\",\n }),\n ),\n ),\n Match.when(\"offline\", () =>\n some(\n new SyncFailure({\n kind: \"network\",\n message: \"offline \u2014 showing the last known state\",\n }),\n ),\n ),\n Match.orElse(() => Option.none()),\n );\n\n/** A write action is also refused while the merge has open conflicts. */\nconst writeGate = (state: SyncState): Option.Option<SyncFailure> =>\n Option.orElse(remoteGate(state), () =>\n state.status === \"conflict\"\n ? some(\n new SyncFailure({\n kind: \"conflict\",\n message: `${state.conflicts.length} conflict(s) \u2014 resolve them in the source, then retry`,\n }),\n )\n : Option.none(),\n );\n\n/** A network failure becomes the offline overlay; anything else keeps status. */\nconst statusAfter = (state: SyncState, failure: SyncFailure): SyncStatus =>\n failure.kind === \"network\" &&\n state.status !== \"untracked\" &&\n state.status !== \"signed-out\"\n ? \"offline\"\n : state.status;\n\n/** The serialized store over one engine. */\nexport const createSyncStore = (\n engine: SyncEngine,\n initial: SyncState = emptySyncState(\"untracked\"),\n): SyncStore => {\n let current = initial;\n let listeners: ReadonlyArray<SyncListener> = [];\n const permits = Semaphore.makeUnsafe(1);\n /** Local picks held for the next push; absent for every other resolution. */\n let resolutions: Option.Option<ConflictResolutions> = Option.none();\n\n /**\n * Keeps the record only while it still describes this head. A moved head, a\n * conflict that reappeared, or a path that no longer settles all mean the\n * record would apply to something the experimenter did not choose.\n */\n const pruneResolutions = (state: SyncState): void => {\n Option.match(resolutions, {\n onNone: () => undefined,\n onSome: (held) => {\n const moved =\n Option.isSome(state.headRevision) &&\n !Option.exists(\n state.headRevision,\n (head) => head.revisionId === held.against,\n );\n const unsettled = Arr.some(R.keys(held.sides), (path) =>\n Arr.some(state.conflicts, (conflict) => conflict.path === path),\n );\n if (moved || unsettled) resolutions = Option.none();\n },\n });\n };\n\n const publish = (next: SyncState): void => {\n pruneResolutions(next);\n current = next;\n Arr.forEach(listeners, (listener) => listener(next));\n };\n\n /** The engine read with the resolutions the panel holds, if any. */\n const read = (): Effect.Effect<SyncState, SyncFailure, SyncServices> =>\n Option.match(resolutions, {\n onNone: () => engine.refresh(),\n onSome: (value) => engine.refresh({ resolutions: value }),\n });\n\n const report = (failure: SyncFailure): SyncActionResult<never> => {\n publish(\n new SyncState({\n ...current,\n status: statusAfter(current, failure),\n lastError: Option.some(failure),\n }),\n );\n return { ok: false, failure };\n };\n\n /**\n * Reads the state back after an action. The action's value is only success\n * once the derived state is known; otherwise the caller learns the action\n * happened but could not be verified.\n */\n const settle = <A>(\n value: A,\n ): Effect.Effect<SyncActionResult<A>, never, SyncServices> =>\n Effect.gen(function* () {\n const refreshed = yield* read().pipe(Effect.result);\n if (Result.isFailure(refreshed))\n return report(\n new SyncFailure({\n kind: refreshed.failure.kind,\n message: `${refreshed.failure.message} (the action completed, but the new state could not be read back)`,\n }),\n );\n publish(refreshed.success);\n return success(value);\n });\n\n const refresh = (): Effect.Effect<\n SyncActionResult<SyncState>,\n never,\n SyncServices\n > =>\n permits.withPermit(\n Effect.gen(function* () {\n const next = yield* read().pipe(Effect.result);\n if (Result.isFailure(next)) return report(next.failure);\n publish(next.success);\n return success(next.success);\n }),\n );\n\n const push = (\n request?: PushRequest,\n ): Effect.Effect<SyncActionResult<PushOutcome>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = writeGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const pushed = yield* engine\n .push({\n ...request,\n resolutions: Option.getOrUndefined(resolutions),\n })\n .pipe(Effect.result);\n if (Result.isFailure(pushed)) return report(pushed.failure);\n // Whatever the outcome, the merge has now seen the record: a publish\n // consumed it, and a conflict means it cannot apply. Keeping it would\n // hide a conflict the engine just reported.\n resolutions = Option.none();\n return yield* settle(pushed.success);\n }),\n );\n\n const pull = (\n request?: PullRequest,\n ): Effect.Effect<SyncActionResult<PullOutcome>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = writeGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const pulled = yield* engine.pull(request).pipe(Effect.result);\n if (Result.isFailure(pulled)) return report(pulled.failure);\n return yield* settle(pulled.success);\n }),\n );\n\n const apply = (\n proposalId: string,\n ): Effect.Effect<SyncActionResult<ApplyResult>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = writeGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const applied = yield* engine.apply(proposalId).pipe(Effect.result);\n if (Result.isFailure(applied)) return report(applied.failure);\n if (applied.success.status === \"refused\") {\n // The patcher wrote nothing; refresh anyway so a concurrent head\n // move is visible, but report the refusal as the domain outcome.\n const refreshed = yield* read().pipe(Effect.result);\n if (Result.isFailure(refreshed)) return report(refreshed.failure);\n publish(refreshed.success);\n return success(applied.success);\n }\n return yield* settle(applied.success);\n }),\n );\n\n /** A refusal the panel shows as the reason the pick did nothing. */\n const resolutionFailure = (refusal: ResolutionRefusal): SyncFailure =>\n new SyncFailure({\n kind: \"conflict\",\n message: Arr.join(resolutionLines([refusal]), \"; \"),\n });\n\n /**\n * Writes the remote value to the source, then pulls: a fast-forward advances\n * the base when the source now contains the head, and stays put when other\n * remote changes are still missing. Nothing is published.\n */\n const applyRemote = (\n path: string,\n value: Schema.Json,\n head: RevisionHead,\n ): Effect.Effect<SyncActionResult<ResolutionOutcome>, never, SyncServices> =>\n Effect.gen(function* () {\n if (Option.isNone(current.localHash))\n return report(\n new SyncFailure({\n kind: \"conflict\",\n message: \"the source does not compile \u2014 fix it before resolving\",\n }),\n );\n const applied = yield* engine\n .applyField({\n path,\n value,\n localHash: current.localHash.value,\n headRevisionId: head.revisionId,\n })\n .pipe(Effect.result);\n if (Result.isFailure(applied)) return report(applied.failure);\n if (applied.success.status === \"refused\")\n return report(\n new SyncFailure({\n kind: \"conflict\",\n message: `the patcher refused ${path}: ${Arr.join(\n Arr.map(\n applied.success.refusals,\n (refusal) => `${refusal.reason} \u2014 ${refusal.detail}`,\n ),\n \"; \",\n )}`,\n }),\n );\n const pulled = yield* engine.pull().pipe(Effect.result);\n if (Result.isFailure(pulled)) return report(pulled.failure);\n const next = yield* read().pipe(Effect.result);\n if (Result.isFailure(next)) return report(next.failure);\n publish(next.success);\n return success({\n status: \"edited\",\n head,\n changes: applied.success.changes,\n });\n });\n\n /** Records the local pick for the next push and re-derives the conflicts. */\n const recordLocal = (\n path: string,\n head: RevisionHead,\n ): Effect.Effect<SyncActionResult<ResolutionOutcome>, never, SyncServices> =>\n Effect.gen(function* () {\n const sides = Option.match(resolutions, {\n onNone: () => ({}),\n onSome: (value) =>\n value.against === head.revisionId ? value.sides : {},\n });\n const next = new ConflictResolutions({\n against: head.revisionId,\n sides: { ...sides, [path]: \"local\" },\n });\n const state = yield* engine\n .refresh({ resolutions: next })\n .pipe(Effect.result);\n if (Result.isFailure(state)) return report(state.failure);\n resolutions = Option.some(next);\n publish(state.success);\n const kept = Option.exists(\n state.success.headRevision,\n (value) => value.revisionId === head.revisionId,\n );\n const unsettled = Arr.some(\n state.success.conflicts,\n (conflict) => conflict.path === path,\n );\n if (!kept || unsettled)\n return report(\n new SyncFailure({\n kind: \"conflict\",\n message:\n \"the head moved since the conflict was read \u2014 refresh, then resolve again\",\n }),\n );\n return success({ status: \"recorded\", head });\n });\n\n const resolve = (\n path: string,\n side: ResolutionSide,\n ): Effect.Effect<SyncActionResult<ResolutionOutcome>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = remoteGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const conflict = Arr.findFirst(\n current.conflicts,\n (candidate) => candidate.path === path,\n );\n if (Option.isNone(conflict))\n return report(\n resolutionFailure(\n new ResolutionRefusal({\n path,\n reason: \"unknown-path\",\n detail: \"there is no conflict at that path \u2014 refresh first\",\n }),\n ),\n );\n const settled =\n conflict.value.kind === \"field-changed-both\"\n ? settlement(\n path,\n conflict.value.local,\n conflict.value.remote,\n side,\n )\n : Result.fail(\n new ResolutionRefusal({\n path,\n reason: \"structural\",\n detail: `${conflict.value.kind} conflicts are reconciled in the source`,\n }),\n );\n if (Result.isFailure(settled))\n return report(resolutionFailure(settled.failure));\n const head = current.headRevision;\n if (Option.isNone(head))\n return report(\n resolutionFailure(\n new ResolutionRefusal({\n path,\n reason: \"unknown-path\",\n detail: \"there is no published revision to compare against\",\n }),\n ),\n );\n if (side === \"remote\")\n return yield* applyRemote(path, conflict.value.remote, head.value);\n return yield* recordLocal(path, head.value);\n }),\n );\n\n const reject = (\n proposalId: string,\n ): Effect.Effect<SyncActionResult<void>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = remoteGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const rejected = yield* engine.reject(proposalId).pipe(Effect.result);\n if (Result.isFailure(rejected)) return report(rejected.failure);\n return yield* settle(undefined);\n }),\n );\n\n const diff = (\n request?: DiffRequest,\n ): Effect.Effect<SyncActionResult<PipelineDiff>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const computed = yield* engine.diff(request).pipe(Effect.result);\n if (Result.isFailure(computed)) return report(computed.failure);\n return success(computed.success);\n }),\n );\n\n const subscribe = (listener: SyncListener): (() => void) => {\n listeners = [...listeners, listener];\n return () => {\n listeners = Arr.filter(listeners, (candidate) => candidate !== listener);\n };\n };\n\n return {\n getState: () => current,\n subscribe,\n refresh,\n push,\n pull,\n apply,\n resolve,\n reject,\n diff,\n wake: refresh,\n };\n};\n", "import { Effect } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Option from \"effect/Option\";\nimport type { IrParam, PipelineIr } from \"@braven/pipeline-ir\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** The effective place a parameter change belongs. */\nexport type ParamTarget =\n | {\n readonly kind: \"step\";\n readonly name: string;\n readonly stepId: string;\n readonly path: string;\n }\n | {\n readonly kind: \"pipeline\";\n readonly name: string;\n readonly path: string;\n };\n\nconst targetOf = (stepId: string, param: IrParam): ParamTarget => {\n const binding = Option.getOrElse(param.binding, () => \"step\" as const);\n const pipelineName = Option.getOrElse(param.pipelineParam, () => param.name);\n return binding === \"pipeline\"\n ? {\n kind: \"pipeline\",\n name: pipelineName,\n path: `/pipeline/params/${pipelineName}/default`,\n }\n : {\n kind: \"step\",\n name: param.name,\n stepId,\n path: `/steps/${stepId}/params/${param.name}/default`,\n };\n};\n\n/**\n * Resolves the effective target of a parameter change from the IR, never from\n * a value comparison. A step literal that happens to equal a pipeline default\n * stays a step target; a bound param targets the declaration.\n */\nexport const resolveParamTarget = (\n ir: PipelineIr,\n input: { readonly param: string; readonly stepId?: string },\n): Effect.Effect<ParamTarget, AgentToolError> => {\n const matches = Arr.flatMap(ir.steps, (step) =>\n input.stepId === undefined || step.id === input.stepId\n ? Arr.map(\n Arr.filter(step.params, (param) => param.name === input.param),\n (param) => ({ stepId: step.id, param }),\n )\n : [],\n );\n\n if (matches.length > 1) {\n return Effect.fail(\n new AgentToolError({\n message: `Parameter '${input.param}' exists on more than one step; pass stepId`,\n code: \"ambiguous-param\",\n }),\n );\n }\n\n return Option.match(Arr.head(matches), {\n onNone: () =>\n Effect.fail(\n new AgentToolError({\n message: `Parameter '${input.param}' was not found`,\n code: \"param-not-found\",\n }),\n ),\n onSome: ({ stepId, param }) => Effect.succeed(targetOf(stepId, param)),\n });\n};\n", "import { Context, Effect, Layer, Option } from \"effect\";\nimport { resolveCredential } from \"@braven/identity-store\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** The non-secret identity the tool handlers may use. */\nexport interface CredentialValue {\n readonly origin: string;\n readonly secret: string;\n readonly email?: string;\n}\n\n/**\n * The credential resolved once at server start. Handlers never read the\n * environment or the keychain directly, and no handler returns the secret.\n */\nexport class Credential extends Context.Service<Credential, CredentialValue>()(\n \"braven/Credential\",\n) {}\n\n/** Resolves the credential once at server start, from env or the shared store. */\nexport const layer = Layer.effect(Credential)(\n Effect.gen(function* () {\n const resolved = yield* resolveCredential({\n origin: Option.none(),\n email: Option.none(),\n }).pipe(\n Effect.mapError(\n (error) => new AgentToolError({ message: error.message }),\n ),\n );\n if (Option.isNone(resolved)) {\n return yield* Effect.fail(\n new AgentToolError({\n message: \"not signed in \u2014 run `braven login` or set BRAVEN_API_KEY\",\n }),\n );\n }\n const value = resolved.value;\n return {\n origin: value.origin,\n secret: value.secret,\n email: Option.getOrUndefined(value.email),\n };\n }),\n);\n", "import { Effect } from \"effect\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\n\n/** The command failed: a rejected sign-in, an unreachable API, a keychain refusal. */\nexport const EXIT_FAILURE = 1;\n/** The arguments cannot work. */\nexport const EXIT_USAGE = 2;\n/** Not signed in, or no stored account for the email asked about. */\nexport const EXIT_NOT_SIGNED_IN = 3;\n\n/**\n * One expected failure, carrying the exit code the process boundary uses.\n *\n * Every command fails with this; the boundary flattens it to a single\n * `braven: \u2026` line, so no message can smuggle a newline (or a secret) out.\n */\nexport class CliFailure extends Schema.TaggedError<CliFailure>()(\"CliFailure\", {\n message: Schema.String,\n exitCode: Schema.Int,\n}) {}\n\n/** Fails with a one-line, actionable message and an exit code. */\nexport const fail = (message: string, exitCode: number = EXIT_FAILURE) =>\n Effect.fail(new CliFailure({ message, exitCode }));\n\n/** Collapses any provider text to one line, bounded so a stack dump cannot leak. */\nexport const oneLine = (value: unknown): string =>\n Str.trim(Str.replace(/\\s+/g, \" \")(String(value))).slice(0, 300);\n", "import { Entry } from \"@napi-rs/keyring\";\nimport { Context, Effect, Layer, Option, pipe } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as R from \"effect/Record\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\nimport { Environment, DEFAULT_API_ORIGIN } from \"./environment.ts\";\nimport {\n CliFailure,\n EXIT_FAILURE,\n EXIT_NOT_SIGNED_IN,\n fail,\n oneLine,\n} from \"./errors.ts\";\n\n/** The config file's schema version. */\nexport const CONFIG_VERSION = 1;\n\n/** The keychain service every Braven surface writes under. */\nexport const KEYCHAIN_SERVICE = \"braven\";\n\nconst CredentialKind = Schema.Literals([\"session\", \"apiKey\"]);\n\n/** The two credential kinds the API accepts. */\nexport type CredentialKind = typeof CredentialKind.Type;\n\n/** One signed-in identity, exactly as recorded in the config file. */\nexport class Account extends Schema.Class<Account>(\"Account\")({\n origin: Schema.String,\n email: Schema.String,\n kind: CredentialKind,\n label: Schema.OptionFromOptionalKey(Schema.String),\n}) {}\n\n/**\n * The version-1 config file: accounts, the current one, the CLI defaults and\n * the watcher's own settings. It never holds a secret.\n */\nexport class ConfigFile extends Schema.Class<ConfigFile>(\"ConfigFile\")({\n version: Schema.Int.pipe(\n Schema.withConstructorDefault(Effect.succeed(CONFIG_VERSION)),\n Schema.withDecodingDefaultKey(Effect.succeed(CONFIG_VERSION)),\n ),\n current: Schema.OptionFromNullishOr(Schema.String, {\n onNoneEncoding: null,\n }).pipe(\n Schema.withConstructorDefault(Effect.succeed(Option.none())),\n Schema.withDecodingDefaultKey(Effect.succeed(null)),\n ),\n accounts: Schema.Array(Account).pipe(\n Schema.withConstructorDefault(Effect.succeed([])),\n Schema.withDecodingDefaultKey(Effect.succeed([])),\n ),\n defaults: Schema.Record(Schema.String, Schema.Unknown).pipe(\n Schema.withConstructorDefault(Effect.succeed({})),\n Schema.withDecodingDefaultKey(Effect.succeed({})),\n ),\n watcher: Schema.Record(Schema.String, Schema.Unknown).pipe(\n Schema.withConstructorDefault(Effect.succeed({})),\n Schema.withDecodingDefaultKey(Effect.succeed({})),\n ),\n}) {}\n\n/** The prefix every API key the server mints carries (`@braven/auth` mints\n * them and cannot import this source, so its literal is the same). */\nexport const API_KEY_PREFIX = \"bvn_api_\";\n\nconst ConfigJson = Schema.fromJsonString(ConfigFile, { space: 2 });\n\n/** Where this process reads and writes the non-secret config file. */\nexport class StoreConfig extends Context.Service<\n StoreConfig,\n { readonly path: string }\n>()(\"braven/StoreConfig\") {}\n\n/** The slice of an OS keychain the store uses; tests substitute an in-memory map. */\nexport interface KeychainShape {\n readonly get: (\n account: string,\n ) => Effect.Effect<Option.Option<string>, CliFailure>;\n readonly set: (\n account: string,\n secret: string,\n ) => Effect.Effect<void, CliFailure>;\n readonly remove: (account: string) => Effect.Effect<void, CliFailure>;\n}\n\n/** The OS keychain (macOS Keychain, Windows Credential Manager, libsecret). */\nexport class Keychain extends Context.Service<Keychain, KeychainShape>()(\n \"braven/Keychain\",\n) {}\n\nconst entry = (account: string): Entry => new Entry(KEYCHAIN_SERVICE, account);\n\nconst keychainAction = <A>(action: string, run: () => A) =>\n Effect.try({\n try: run,\n catch: (cause) =>\n new CliFailure({\n message: `keychain ${action} failed: ${oneLine(cause)}`,\n exitCode: EXIT_FAILURE,\n }),\n });\n\n/**\n * The real keychain. There is no plaintext fallback: when the backend refuses,\n * the failure surfaces and nothing is written anywhere else.\n */\nexport const keychainLayer: Layer.Layer<Keychain> = Layer.succeed(Keychain)({\n get: (account) =>\n keychainAction(\"read\", () => entry(account).getPassword()).pipe(\n Effect.map(Option.fromNullishOr),\n ),\n set: (account, secret) =>\n keychainAction(\"write\", () => {\n entry(account).setPassword(secret);\n }),\n remove: (account) =>\n keychainAction(\"delete\", () => {\n entry(account).deletePassword();\n }),\n});\n\n/** The config `current` value and the keychain account name for an identity. */\nexport const accountKey = (origin: string, email: string): string =>\n `${normalizeOrigin(origin)}|${email}`;\n\nconst normalizeOrigin = (origin: string): string =>\n Str.replace(/\\/+$/, \"\")(origin);\n\nconst storageFailure =\n (action: string, path: string) =>\n (cause: { readonly message: string }): CliFailure =>\n new CliFailure({\n message: `${action} ${path}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\n/** Reads the config file; a missing file is an empty config, never an error. */\nexport const loadConfig = (): Effect.Effect<\n ConfigFile,\n CliFailure,\n StoreConfig | FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const { path } = yield* StoreConfig;\n const fs = yield* FileSystem.FileSystem;\n if (\n !(yield* fs\n .exists(path)\n .pipe(Effect.mapError(storageFailure(\"read\", path))))\n ) {\n return new ConfigFile({});\n }\n const text = yield* fs\n .readFileString(path)\n .pipe(Effect.mapError(storageFailure(\"read\", path)));\n const config = yield* Schema.decodeUnknownEffect(ConfigJson)(text).pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `${path} is not a version-${CONFIG_VERSION} config: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n if (config.version !== CONFIG_VERSION) {\n return yield* fail(\n `${path} is version ${config.version}, expected ${CONFIG_VERSION}`,\n );\n }\n return config;\n });\n\n/** Writes the config file atomically, creating its directory if needed. */\nexport const saveConfig = (\n config: ConfigFile,\n): Effect.Effect<\n void,\n CliFailure,\n StoreConfig | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const { path } = yield* StoreConfig;\n const fs = yield* FileSystem.FileSystem;\n const pathService = yield* Path.Path;\n const text = yield* Schema.encodeUnknownEffect(ConfigJson)(config).pipe(\n Effect.mapError(storageFailure(\"encode\", path)),\n );\n yield* fs\n .makeDirectory(pathService.dirname(path), { recursive: true })\n .pipe(Effect.mapError(storageFailure(\"create\", path)));\n const temporary = `${path}.tmp`;\n yield* fs\n .writeFileString(temporary, text)\n .pipe(Effect.mapError(storageFailure(\"write\", path)));\n yield* fs\n .rename(temporary, path)\n .pipe(Effect.mapError(storageFailure(\"write\", path)));\n });\n\nconst matches =\n (origin: Option.Option<string>, email: Option.Option<string>) =>\n (account: Account): boolean =>\n Option.match(origin, {\n onNone: () => true,\n onSome: (value) =>\n normalizeOrigin(account.origin) === normalizeOrigin(value),\n }) &&\n Option.match(email, {\n onNone: () => true,\n onSome: (value) => account.email === value,\n });\n\n/** The first stored account matching the given origin and/or email. */\nexport const findAccount = (\n config: ConfigFile,\n origin: Option.Option<string>,\n email: Option.Option<string>,\n): Option.Option<Account> =>\n pipe(config.accounts, Arr.findFirst(matches(origin, email)));\n\n/** The account the config points at, if any. */\nexport const currentAccount = (config: ConfigFile): Option.Option<Account> =>\n Option.flatMap(config.current, (key) =>\n pipe(\n config.accounts,\n Arr.findFirst(\n (account) => accountKey(account.origin, account.email) === key,\n ),\n ),\n );\n\n/** A secret to store, with the owner the API proved (or `--email` asserted). */\nexport interface CredentialInput {\n readonly origin: string;\n readonly email: string;\n readonly kind: CredentialKind;\n readonly secret: string;\n}\n\n/**\n * Puts a secret in the keychain, records its account, and makes it current.\n *\n * The keychain write happens first; a failing keychain aborts before the\n * config file changes, so a stored account always has its secret.\n */\nexport const storeCredential = (\n credential: CredentialInput,\n label: Option.Option<string> = Option.none(),\n): Effect.Effect<\n Account,\n CliFailure,\n StoreConfig | Keychain | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n if (credential.secret.length === 0) {\n return yield* fail(\"refusing to store an empty secret\");\n }\n if (credential.email.length === 0) {\n return yield* fail(\"storing a credential needs an email\");\n }\n const origin = normalizeOrigin(credential.origin);\n const key = accountKey(origin, credential.email);\n const keychain = yield* Keychain;\n yield* keychain.set(key, credential.secret);\n const config = yield* loadConfig();\n const account = new Account({\n origin,\n email: credential.email,\n kind: credential.kind,\n label,\n });\n yield* saveConfig(\n new ConfigFile({\n ...config,\n accounts: [\n ...config.accounts.filter(\n (stored) => accountKey(stored.origin, stored.email) !== key,\n ),\n account,\n ],\n current: Option.some(key),\n }),\n );\n return account;\n });\n\n/** Points `current` at an already-stored account. */\nexport const useAccount = (\n email: string,\n): Effect.Effect<\n Account,\n CliFailure,\n StoreConfig | Keychain | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const account = findAccount(config, Option.none(), Option.some(email));\n if (Option.isNone(account)) {\n return yield* fail(\n `no stored account for ${email} \u2014 see \\`braven config\\``,\n EXIT_NOT_SIGNED_IN,\n );\n }\n yield* saveConfig(\n new ConfigFile({\n ...config,\n current: Option.some(\n accountKey(account.value.origin, account.value.email),\n ),\n }),\n );\n return account.value;\n });\n\n/**\n * Forgets an account (default: the current one), keychain secret included.\n *\n * When the removed account was current, `current` rotates to the first\n * remaining account.\n */\nexport const removeCredential = (\n email: Option.Option<string>,\n): Effect.Effect<\n Option.Option<Account>,\n CliFailure,\n StoreConfig | Keychain | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const account = Option.isSome(email)\n ? findAccount(config, Option.none(), email)\n : currentAccount(config);\n if (Option.isNone(account)) return Option.none();\n const target = account.value;\n const key = accountKey(target.origin, target.email);\n const keychain = yield* Keychain;\n yield* keychain.remove(key);\n const accounts = config.accounts.filter(\n (stored) => accountKey(stored.origin, stored.email) !== key,\n );\n const next = Arr.head(accounts).pipe(\n Option.map((stored) => accountKey(stored.origin, stored.email)),\n );\n yield* saveConfig(\n new ConfigFile({\n ...config,\n accounts,\n current: Option.contains(config.current, key) ? next : config.current,\n }),\n );\n return Option.some(target);\n });\n\n/** Resolves the default company/project, either of which may be unset. */\nexport const resolveDefaults = (): Effect.Effect<\n {\n readonly company: Option.Option<string>;\n readonly project: Option.Option<string>;\n },\n CliFailure,\n StoreConfig | FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const defaultOf = (key: string): Option.Option<string> =>\n Option.fromNullishOr(config.defaults[key]).pipe(\n Option.filter(Predicate.isString),\n );\n return { company: defaultOf(\"company\"), project: defaultOf(\"project\") };\n });\n\n/** A stored non-secret default (\"origin\", \"company\", \"project\"). */\nexport const readDefault = (\n key: string,\n): Effect.Effect<\n Option.Option<string>,\n CliFailure,\n StoreConfig | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n return Option.fromNullishOr(config.defaults[key]).pipe(\n Option.filter(Predicate.isString),\n );\n });\n\n/** Writes (or, with `None`, removes) one non-secret default. */\nexport const setDefault = (\n name: string,\n value: Option.Option<string>,\n): Effect.Effect<\n ConfigFile,\n CliFailure,\n StoreConfig | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const updated = new ConfigFile({\n ...config,\n defaults: Option.match(value, {\n onNone: () => R.remove(config.defaults, name),\n onSome: (next) => R.set(config.defaults, name, next.trim()),\n }),\n });\n yield* saveConfig(updated);\n return updated;\n });\n\n/** A resolved secret and where it came from. Never printed. */\nexport interface Credential {\n readonly origin: string;\n readonly kind: CredentialKind;\n readonly secret: string;\n readonly email: Option.Option<string>;\n readonly label: Option.Option<string>;\n}\n\nconst envValue = (\n shape: { readonly values: Readonly<Record<string, string | undefined>> },\n name: string,\n): Option.Option<string> =>\n Option.fromNullishOr(shape.values[name]).pipe(Option.filter(Str.isNonEmpty));\n\n/** The stored account's secret, ignoring env overrides. `logout` uses this so a\n * shell's `BRAVEN_SESSION_TOKEN` can never be the credential it revokes. */\nexport const storedCredential = (options: {\n readonly origin: Option.Option<string>;\n readonly email: Option.Option<string>;\n}): Effect.Effect<\n Option.Option<Credential>,\n CliFailure,\n StoreConfig | Keychain | FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const account =\n Option.isSome(options.origin) || Option.isSome(options.email)\n ? findAccount(config, options.origin, options.email)\n : currentAccount(config);\n if (Option.isNone(account)) return Option.none();\n const stored = account.value;\n const keychain = yield* Keychain;\n const secret = yield* keychain.get(accountKey(stored.origin, stored.email));\n if (Option.isNone(secret)) return Option.none();\n return Option.some({\n origin: stored.origin,\n kind: stored.kind,\n secret: secret.value,\n email: Option.some(stored.email),\n label: stored.label,\n });\n });\n\n/**\n * Resolves the credential to authenticate with: `env var > flag > store`.\n *\n * `BRAVEN_SESSION_TOKEN` / `BRAVEN_API_KEY` (with `BRAVEN_API_URL`) win and\n * touch neither the config file nor the keychain.\n */\nexport const resolveCredential = (options: {\n readonly origin: Option.Option<string>;\n readonly email: Option.Option<string>;\n}): Effect.Effect<\n Option.Option<Credential>,\n CliFailure,\n Environment | StoreConfig | Keychain | FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const shape = yield* Environment;\n const configuredOrigin = Option.isSome(options.origin)\n ? options.origin\n : envValue(shape, \"BRAVEN_API_URL\");\n const envOrigin = Option.getOrElse(\n configuredOrigin,\n () => DEFAULT_API_ORIGIN,\n );\n const apiKey = envValue(shape, \"BRAVEN_API_KEY\");\n if (Option.isSome(apiKey)) {\n return Option.some({\n origin: normalizeOrigin(envOrigin),\n kind: \"apiKey\",\n secret: apiKey.value,\n email: Option.none(),\n label: Option.some(\"env\"),\n });\n }\n const session = envValue(shape, \"BRAVEN_SESSION_TOKEN\");\n if (Option.isSome(session)) {\n return Option.some({\n origin: normalizeOrigin(envOrigin),\n kind: \"session\",\n secret: session.value,\n email: Option.none(),\n label: Option.some(\"env\"),\n });\n }\n return yield* storedCredential(options);\n });\n", "import { Context } from \"effect\";\n\n/**\n * The signed-in email, when the local sign-in knew it. A remote request only\n * has a token, so this stays an optional service: whoami reports what it has.\n */\nexport class AgentEmail extends Context.Service<\n AgentEmail,\n { readonly email?: string }\n>()(\"braven/AgentEmail\") {}\n", "import { Effect } from \"effect\";\nimport * as Crypto from \"effect/Crypto\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { McpSchema, Toolkit } from \"effect/ai\";\nimport * as HttpClient from \"effect/http/HttpClient\";\nimport { Environment } from \"@braven/identity-store/environment\";\nimport { PythonCompiler } from \"@braven/pipeline-sync/compiler\";\nimport * as Access from \"./access.ts\";\nimport { Credential } from \"./credential.ts\";\nimport { baseHandlers } from \"./baseHandlers.ts\";\nimport { baseTools } from \"./baseTools.ts\";\nimport { confirmAction } from \"./confirmation.ts\";\nimport { pullPipeline } from \"./pull.ts\";\nimport { pushPipeline } from \"./push.ts\";\nimport { Watcher } from \"./watcher.ts\";\nimport {\n PullPipeline,\n PushPipeline,\n WatcherOpen,\n WatcherPause,\n WatcherQueue,\n WatcherRescan,\n WatcherResume,\n WatcherStatus,\n WatcherSync,\n} from \"./tools.ts\";\n\n/**\n * The tools that need this machine: a workspace checkout, or the agent running\n * here. Kept out of `baseTools` so the Worker never imports the credential,\n * filesystem, or watcher code.\n */\nconst localTools = [\n PullPipeline.addDependency(Credential)\n .addDependency(Environment)\n .addDependency(FileSystem.FileSystem)\n .addDependency(Path.Path)\n .addDependency(HttpClient.HttpClient)\n .addDependency(Crypto.Crypto)\n .addDependency(PythonCompiler)\n .addDependency(McpSchema.McpServerClient),\n PushPipeline.addDependency(Credential)\n .addDependency(Environment)\n .addDependency(FileSystem.FileSystem)\n .addDependency(Path.Path)\n .addDependency(HttpClient.HttpClient)\n .addDependency(Crypto.Crypto)\n .addDependency(PythonCompiler)\n .addDependency(McpSchema.McpServerClient),\n WatcherStatus.addDependency(Watcher).addDependency(HttpClient.HttpClient),\n WatcherQueue.addDependency(Watcher).addDependency(HttpClient.HttpClient),\n WatcherSync.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n WatcherRescan.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n WatcherPause.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n WatcherOpen.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n WatcherResume.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n] as const;\n\n/** The toolkit that every surface registers. */\nexport const AgentTools = Toolkit.make(...baseTools, ...localTools);\n\n/**\n * Handlers are thin: resolve the service, call it, return the domain shape.\n * Every handler starts with `Access.permit`, so a scope the server was not\n * granted refuses the tool before its action runs. No handler reads the\n * environment, the keychain, or the API token.\n */\nexport const handlersFor = (access: Access.AccessValue) =>\n AgentTools.of({\n ...baseHandlers(access),\n braven_pipeline_pull: (input) =>\n Access.permit(access, PullPipeline, pullPipeline(input)),\n braven_pipeline_push: (input) =>\n Access.permit(access, PushPipeline, pushPipeline(input)),\n braven_watcher_status: () =>\n Access.permit(\n access,\n WatcherStatus,\n Effect.flatMap(Watcher, (watcher) => watcher.status),\n ),\n braven_watcher_queue: () =>\n Access.permit(\n access,\n WatcherQueue,\n Effect.flatMap(Watcher, (watcher) =>\n watcher.queue.pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_watcher_sync: () =>\n Access.permit(\n access,\n WatcherSync,\n confirmAction(\n \"Upload every pending file now? This reconciles, rescans, and drains the watcher's queue.\",\n \"confirm\",\n ).pipe(\n Effect.andThen(Effect.flatMap(Watcher, (watcher) => watcher.sync)),\n ),\n ),\n braven_watcher_rescan: () =>\n Access.permit(\n access,\n WatcherRescan,\n confirmAction(\n \"Walk the watched folders now and upload files whose content changed?\",\n \"confirm\",\n ).pipe(\n Effect.andThen(Effect.flatMap(Watcher, (watcher) => watcher.rescan)),\n ),\n ),\n braven_watcher_open: ({ path }) =>\n Access.permit(\n access,\n WatcherOpen,\n confirmAction(\n `Open ${path} with its default app? It must be inside a watched folder.`,\n \"confirm\",\n \"Open it from the desktop app, or use a client that supports MCP elicitation.\",\n ).pipe(\n Effect.andThen(\n Effect.flatMap(Watcher, (watcher) => watcher.open(path)),\n ),\n ),\n ),\n braven_watcher_pause: () =>\n Access.permit(\n access,\n WatcherPause,\n confirmAction(\n \"Stop the watcher from claiming new uploads? It keeps watching and queueing.\",\n \"confirm\",\n ).pipe(\n Effect.andThen(Effect.flatMap(Watcher, (watcher) => watcher.pause)),\n ),\n ),\n braven_watcher_resume: () =>\n Access.permit(\n access,\n WatcherResume,\n confirmAction(\n \"Resume uploads and drain the queue that accumulated while paused?\",\n \"confirm\",\n ).pipe(\n Effect.andThen(Effect.flatMap(Watcher, (watcher) => watcher.resume)),\n ),\n ),\n });\n\nexport const handlers = AgentTools.toLayer(\n Effect.map(Access.Scopes, (access) => handlersFor(access)),\n);\n", "import { Effect, Option } from \"effect\";\nimport * as Access from \"./access.ts\";\nimport { BravenApi } from \"./api.ts\";\nimport { recomputeAnalysis, rerunPipeline, runPipeline } from \"./run.ts\";\nimport { AgentEmail } from \"./email.ts\";\nimport { BaseTools } from \"./baseTools.ts\";\nimport {\n CompareResults,\n CreateExperiment,\n GetExperiment,\n GetHardware,\n GetPipeline,\n GetReport,\n GetResult,\n ListExperiments,\n ListPipelines,\n ListProjects,\n ListProposals,\n ListRuns,\n PipelineStatus,\n ProposeParameter,\n Recompute,\n Rerun,\n RunPipeline,\n UpdateExperiment,\n WhoAmI,\n} from \"./tools.ts\";\n\n/**\n * The handlers every server registers. They depend only on the API service and\n * the client, so the Worker can import this module without the machine-bound\n * credential, filesystem, or watcher.\n */\nexport const baseHandlers = (access: Access.AccessValue) =>\n BaseTools.of({\n braven_whoami: () =>\n Access.permit(\n access,\n WhoAmI,\n Effect.gen(function* () {\n const api = yield* BravenApi;\n // Optional: the stdio server resolved an email; a remote request\n // only has a token, and the service is not a requirement.\n const known = yield* Effect.serviceOption(AgentEmail);\n const email = Option.flatMap(known, (value) =>\n Option.fromNullishOr(value.email),\n );\n // A real authenticated call: a revoked key or wrong origin must fail\n // here, not on the first unrelated tool call.\n const projects = yield* api.listProjects({});\n const company = Option.fromNullishOr(\n projects.find((project) => project.companyName !== undefined)\n ?.companyName,\n );\n return {\n origin: api.origin,\n ...Option.match(email, {\n onNone: () => ({}),\n onSome: (value) => ({ email: value }),\n }),\n ...Option.match(company, {\n onNone: () => ({}),\n onSome: (value) => ({ company: value }),\n }),\n };\n }),\n ),\n braven_list_projects: ({ companyId }) =>\n Access.permit(\n access,\n ListProjects,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listProjects({ companyId })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_list_experiments: ({\n projectId,\n device,\n pipeline,\n nameContains,\n stage,\n limit,\n offset,\n }) =>\n Access.permit(\n access,\n ListExperiments,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listExperiments({\n projectId,\n device,\n pipeline,\n nameContains,\n stage,\n limit,\n offset,\n })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_create_experiment: ({\n projectId,\n name,\n notes,\n deviceId,\n pipelineId,\n }) =>\n Access.permit(\n access,\n CreateExperiment,\n Effect.flatMap(BravenApi, (api) =>\n api.createExperiment({\n projectId,\n name,\n notes,\n deviceId,\n pipelineId,\n }),\n ),\n ),\n braven_update_experiment: ({ projectId, experimentId, name, notes }) =>\n Access.permit(\n access,\n UpdateExperiment,\n Effect.flatMap(BravenApi, (api) =>\n api.updateExperiment({ projectId, experimentId, name, notes }),\n ),\n ),\n braven_get_experiment: ({ experimentId }) =>\n Access.permit(\n access,\n GetExperiment,\n Effect.flatMap(BravenApi, (api) => api.getExperiment({ experimentId })),\n ),\n braven_get_hardware: ({ companyId, name, deviceId }) =>\n Access.permit(\n access,\n GetHardware,\n Effect.flatMap(BravenApi, (api) =>\n api.getHardware({ companyId, name, deviceId }),\n ),\n ),\n braven_get_report: ({ projectId, name, reportId }) =>\n Access.permit(\n access,\n GetReport,\n Effect.flatMap(BravenApi, (api) =>\n api.getReport({ projectId, name, reportId }),\n ),\n ),\n braven_list_pipelines: ({ companyId }) =>\n Access.permit(\n access,\n ListPipelines,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listPipelines({ companyId })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_get_pipeline: ({ companyId, pipelineId, includeIr }) =>\n Access.permit(\n access,\n GetPipeline,\n Effect.flatMap(BravenApi, (api) =>\n api.getPipeline({\n companyId,\n pipelineId,\n includeIr: includeIr ?? false,\n }),\n ),\n ),\n braven_pipeline_status: ({ pipelineId }) =>\n Access.permit(\n access,\n PipelineStatus,\n Effect.flatMap(BravenApi, (api) => api.pipelineStatus({ pipelineId })),\n ),\n braven_list_runs: ({ pipelineId, experimentId, status }) =>\n Access.permit(\n access,\n ListRuns,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listRuns({ pipelineId, experimentId, status })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_get_result: ({ resultId }) =>\n Access.permit(\n access,\n GetResult,\n Effect.flatMap(BravenApi, (api) => api.getResult({ resultId })),\n ),\n braven_list_proposals: ({ pipelineId, status }) =>\n Access.permit(\n access,\n ListProposals,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listProposals({ pipelineId, status })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_compare_results: ({ leftResultId, rightResultId }) =>\n Access.permit(\n access,\n CompareResults,\n Effect.flatMap(BravenApi, (api) =>\n api.compare({ leftResultId, rightResultId }),\n ),\n ),\n braven_propose_parameter: ({\n pipelineId,\n param,\n value,\n stepId,\n baseRevisionId,\n rationale,\n }) =>\n Access.permit(\n access,\n ProposeParameter,\n Effect.flatMap(BravenApi, (api) =>\n api.proposeParameter({\n pipelineId,\n param,\n value,\n stepId,\n baseRevisionId,\n rationale,\n }),\n ),\n ),\n braven_run_pipeline: (input) =>\n Access.permit(access, RunPipeline, runPipeline(input)),\n braven_rerun: (input) => Access.permit(access, Rerun, rerunPipeline(input)),\n braven_recompute: (input) =>\n Access.permit(access, Recompute, recomputeAnalysis(input)),\n });\n", "import { Effect } from \"effect\";\nimport type * as McpSchema from \"effect/ai/McpSchema\";\nimport type * as HttpClient from \"effect/http/HttpClient\";\nimport * as Option from \"effect/Option\";\nimport { BravenApi, type RunHandle } from \"./api.ts\";\nimport { AgentToolError } from \"./errors.ts\";\nimport type { ParamValue } from \"./tools.ts\";\n\nimport { confirmAction } from \"./confirmation.ts\";\n\n/** What `braven_run_pipeline` accepts, after the tool schema decoded it. */\nexport interface RunPipelineInput {\n readonly pipelineId: string;\n readonly experimentId: string;\n readonly revisionId?: string | undefined;\n readonly parameters?: Readonly<Record<string, ParamValue>> | undefined;\n readonly dryRun?: boolean | undefined;\n}\n\n/**\n * Resolve the revision, ask the user, then queue exactly one run. The tool has\n * no way to write without passing through `confirm`.\n */\nexport const runPipeline = (input: RunPipelineInput) =>\n Effect.gen(function* () {\n const api = yield* BravenApi;\n const revisionId = yield* Option.match(\n Option.fromNullishOr(input.revisionId),\n {\n onSome: (given) => Effect.succeed(Option.some(given)),\n onNone: () =>\n api\n .pipelineStatus({ pipelineId: input.pipelineId })\n .pipe(\n Effect.map((status) =>\n Option.fromNullishOr(status.head?.revisionId),\n ),\n ),\n },\n );\n if (Option.isNone(revisionId)) {\n return yield* Effect.fail(\n new AgentToolError({\n message:\n \"Pipeline has no published revision to run; publish one or name a revisionId.\",\n code: \"no-head\",\n }),\n );\n }\n const rev = revisionId.value;\n yield* confirmAction(\n `Queue a run of pipeline ${input.pipelineId} for experiment ${input.experimentId} at revision ${rev}? This writes a result. Reply confirm: \"run\" to proceed.`,\n \"run\",\n );\n return yield* api.createRun({\n pipelineId: input.pipelineId,\n experimentId: input.experimentId,\n revisionId: rev,\n parameters: input.parameters,\n dryRun: Option.getOrElse(Option.fromNullishOr(input.dryRun), () => false),\n });\n }) satisfies Effect.Effect<\n RunHandle,\n AgentToolError,\n BravenApi | HttpClient.HttpClient | McpSchema.McpServerClient\n >;\n/** What `braven_rerun` accepts. */\nexport interface RerunInput {\n readonly runId: string;\n readonly mode: \"exact\" | \"current-inputs\";\n}\n\n/** Queue a rerun of one run, exact or with the current inputs. */\nexport const rerunPipeline = (input: RerunInput) =>\n Effect.gen(function* () {\n const api = yield* BravenApi;\n yield* confirmAction(\n `Queue a ${input.mode} rerun of run ${input.runId}? This writes another run and result; it never overwrites the original. Reply confirm: \"run\" to proceed.`,\n \"run\",\n );\n return yield* api.rerun(input);\n }) satisfies Effect.Effect<\n {\n readonly runId: string;\n readonly status: string;\n readonly revisionId?: string;\n },\n AgentToolError,\n BravenApi | HttpClient.HttpClient | McpSchema.McpServerClient\n >;\n\n/** What `braven_recompute` accepts. */\nexport interface RecomputeInput {\n readonly pipelineId: string;\n readonly revisionId: string;\n readonly inputSnapshotId: string;\n readonly parameters?: Readonly<Record<string, ParamValue>>;\n}\n\n/** Reanalyse an existing snapshot; the result is new, never an overwrite. */\nexport const recomputeAnalysis = (input: RecomputeInput) =>\n Effect.gen(function* () {\n const api = yield* BravenApi;\n yield* confirmAction(\n `Recompute pipeline ${input.pipelineId} at revision ${input.revisionId} from snapshot ${input.inputSnapshotId}? This writes a new result and leaves the previous one intact. Reply confirm: \"run\" to proceed.`,\n \"run\",\n );\n return yield* api.recompute({\n pipelineId: input.pipelineId,\n revisionId: input.revisionId,\n inputSnapshotId: input.inputSnapshotId,\n parameters: input.parameters,\n });\n }) satisfies Effect.Effect<\n {\n readonly runId: string;\n readonly status: string;\n readonly inputSnapshotId: string;\n },\n AgentToolError,\n BravenApi | HttpClient.HttpClient | McpSchema.McpServerClient\n >;\n", "import * as Cause from \"effect/Cause\";\nimport { Effect } from \"effect\";\nimport { McpServer } from \"effect/ai\";\nimport * as Schema from \"effect/Schema\";\nimport { AgentToolError } from \"./errors.ts\";\n\nconst refusal = (reason: string, fallback: string) =>\n new AgentToolError({\n message: `${reason} Nothing was changed. ${fallback}`,\n code: \"confirmation-required\",\n });\n\n/** Where a person can do the same thing when this client cannot ask. */\nconst CLI_OR_DASHBOARD =\n \"Run it from the Braven CLI or the dashboard, or use a client that supports MCP elicitation.\";\n\n/**\n * Asks the connected client's user before a consequential action. A decline,\n * a cancellation, and a client that cannot elicit all fail before the caller\n * performs the action; a tool parameter can never stand in for the answer.\n */\nexport const confirmAction = <const Word extends string>(\n message: string,\n word: Word,\n fallback: string = CLI_OR_DASHBOARD,\n) =>\n McpServer.elicit({\n message,\n schema: Schema.Struct({ confirm: Schema.Literal(word) }),\n }).pipe(\n Effect.asVoid,\n Effect.catchTag(\"ElicitationDeclined\", () =>\n Effect.fail(\n refusal(\"The user declined, or this client cannot ask.\", fallback),\n ),\n ),\n Effect.catchCause((cause) =>\n Cause.hasInterruptsOnly(cause)\n ? Effect.fail(refusal(\"The user cancelled.\", fallback))\n : Effect.failCause(cause),\n ),\n );\n", "import { McpSchema, Toolkit } from \"effect/ai\";\nimport * as HttpClient from \"effect/http/HttpClient\";\nimport { BravenApi } from \"./api.ts\";\nimport {\n CompareResults,\n CreateExperiment,\n GetExperiment,\n GetHardware,\n GetPipeline,\n GetReport,\n GetResult,\n ListExperiments,\n ListPipelines,\n ListProjects,\n ListProposals,\n ListRuns,\n PipelineStatus,\n ProposeParameter,\n Recompute,\n Rerun,\n RunPipeline,\n UpdateExperiment,\n WhoAmI,\n} from \"./tools.ts\";\n\n/**\n * The tools that work anywhere: reads, a proposal, and the three confirmed\n * runs. Dependencies are declared here exactly as the stdio server declares\n * them, so the same records serve the local and remote servers.\n *\n * The local tools are absent by design: pull/push need a checkout on the\n * caller's machine, and the watcher tools need an agent there.\n */\nexport const baseTools = [\n WhoAmI.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListProjects.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListExperiments.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n GetExperiment.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n CreateExperiment.addDependency(BravenApi).addDependency(\n HttpClient.HttpClient,\n ),\n UpdateExperiment.addDependency(BravenApi).addDependency(\n HttpClient.HttpClient,\n ),\n GetHardware.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n GetReport.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListPipelines.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n GetPipeline.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n PipelineStatus.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListRuns.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n GetResult.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListProposals.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n CompareResults.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ProposeParameter.addDependency(BravenApi).addDependency(\n HttpClient.HttpClient,\n ),\n RunPipeline.addDependency(BravenApi)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n Rerun.addDependency(BravenApi)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n Recompute.addDependency(BravenApi)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n] as const;\n\nexport const BaseTools = Toolkit.make(...baseTools);\n", "import { Effect, Option } from \"effect\";\nimport type { Crypto } from \"effect/Crypto\";\nimport type { FileSystem } from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport type { Path as PathService } from \"effect/Path\";\nimport type { HttpClient as HttpClientService } from \"effect/http/HttpClient\";\nimport { decodePipelineIr } from \"@braven/pipeline-ir\";\nimport type { PythonCompiler } from \"@braven/pipeline-sync/compiler\";\nimport type * as McpSchema from \"effect/ai/McpSchema\";\nimport { Environment } from \"@braven/identity-store/environment\";\nimport {\n compileIr,\n makeClient,\n pull,\n readSource,\n readState,\n type SyncFailure,\n} from \"@braven/pipeline-sync\";\nimport { confirmAction } from \"./confirmation.ts\";\nimport { Credential } from \"./credential.ts\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** What `braven_pipeline_pull` accepts after schema decoding. */\nexport interface PullPipelineInput {\n readonly pipelineId: string;\n readonly workspacePath?: string | undefined;\n readonly apply?: boolean | undefined;\n}\n\nconst failure = (message: string, code = \"pull-failed\") =>\n new AgentToolError({ message, code });\n\n/**\n * Pull is preview-only unless `apply` is true, and applying always asks the\n * client's user. The workspace is confined to the MCP server's cwd; the source\n * is compiled and staged before `applyVerified` writes anything.\n */\nexport const pullPipeline = (input: PullPipelineInput) =>\n Effect.gen(function* () {\n const paths = yield* Path.Path;\n const environment = yield* Environment;\n const credential = yield* Credential;\n const workspace = paths.resolveWithin(\n environment.cwd,\n input.workspacePath ?? \".\",\n );\n if (Option.isNone(workspace)) {\n return yield* Effect.fail(\n failure(\n \"workspacePath must stay inside the MCP server's working directory\",\n \"workspace-outside-cwd\",\n ),\n );\n }\n const cwd = workspace.value;\n\n const state = yield* readState(cwd).pipe(\n Effect.mapError((error) => failure(error.message, \"no-sync-state\")),\n );\n if (Option.isNone(state)) {\n return yield* Effect.fail(\n failure(\n `${cwd} has no .braven/pipeline.json \u2014 run \\`braven pipeline pull\\` there first`,\n \"no-sync-state\",\n ),\n );\n }\n\n const local = yield* compileIr(state.value.source, { cwd }).pipe(\n Effect.flatMap(decodePipelineIr),\n Effect.mapError((error) =>\n failure(\n `the local source does not compile: ${error instanceof Error ? error.message : String(error)}`,\n \"compile-failed\",\n ),\n ),\n );\n const sourceText = yield* readSource(cwd, state.value.source).pipe(\n Effect.mapError((error) => failure(error.message, \"read-failed\")),\n );\n const api = makeClient({\n origin: credential.origin,\n secret: credential.secret,\n pipelineId: input.pipelineId,\n });\n\n if (input.apply === true) {\n yield* confirmAction(\n `Apply the remote proposals to ${state.value.source} in ${cwd}? The source is written only if every round-trip-safe proposal applies and recompiles.`,\n \"confirm\",\n );\n }\n\n const outcome = yield* pull({\n cwd,\n api,\n local,\n sourceText,\n check: input.apply !== true,\n }).pipe(\n Effect.mapError((error: SyncFailure) =>\n failure(error.message, `sync-${error.kind}`),\n ),\n );\n const proposals =\n \"proposals\" in outcome ? ` (${outcome.proposals.length} proposals)` : \"\";\n return {\n status: outcome.status,\n message: `pull ${outcome.status}${proposals}`,\n };\n }) satisfies Effect.Effect<\n { readonly status: string; readonly message: string },\n AgentToolError,\n | Crypto\n | FileSystem\n | PathService\n | HttpClientService\n | PythonCompiler\n | Credential\n | Environment\n | McpSchema.McpServerClient\n >;\n", "import { Effect, Option } from \"effect\";\nimport type { Crypto } from \"effect/Crypto\";\nimport type { FileSystem } from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport type { Path as PathService } from \"effect/Path\";\nimport type { HttpClient as HttpClientService } from \"effect/http/HttpClient\";\nimport { Environment } from \"@braven/identity-store/environment\";\nimport { decodePipelineIr } from \"@braven/pipeline-ir\";\nimport {\n compileIr,\n makeClient,\n push,\n readState,\n type SyncFailure,\n} from \"@braven/pipeline-sync\";\nimport type { PythonCompiler } from \"@braven/pipeline-sync/compiler\";\nimport type * as McpSchema from \"effect/ai/McpSchema\";\nimport { confirmAction } from \"./confirmation.ts\";\nimport { Credential } from \"./credential.ts\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** What `braven_pipeline_push` accepts after schema decoding. */\nexport interface PushPipelineInput {\n readonly pipelineId?: string | undefined;\n readonly workspacePath?: string | undefined;\n readonly baseRevisionId?: string | undefined;\n readonly summary?: string | undefined;\n readonly dryRun?: boolean | undefined;\n}\n\nconst failure = (message: string, code = \"push-failed\") =>\n new AgentToolError({ message, code });\n\n/**\n * Push is a dry run unless `dryRun` is false, and publishing always asks the\n * client's user. The workspace is confined to the MCP server's cwd; a stale\n * base is the sync engine's typed conflict, never a blind retry.\n */\nexport const pushPipeline = (input: PushPipelineInput) =>\n Effect.gen(function* () {\n const paths = yield* Path.Path;\n const environment = yield* Environment;\n const credential = yield* Credential;\n const workspace = paths.resolveWithin(\n environment.cwd,\n input.workspacePath ?? \".\",\n );\n if (Option.isNone(workspace)) {\n return yield* Effect.fail(\n failure(\n \"workspacePath must stay inside the MCP server's working directory\",\n \"workspace-outside-cwd\",\n ),\n );\n }\n const cwd = workspace.value;\n const state = yield* readState(cwd).pipe(\n Effect.mapError((error) => failure(error.message, \"no-sync-state\")),\n );\n if (Option.isNone(state)) {\n return yield* Effect.fail(\n failure(\n `${cwd} has no .braven/pipeline.json \u2014 run \\`braven pipeline pull\\` there first`,\n \"no-sync-state\",\n ),\n );\n }\n const pipelineId = input.pipelineId ?? state.value.pipelineId;\n const source = state.value.source;\n const dryRun = input.dryRun !== false;\n // Ask before compiling: a decline must cost the user nothing and reach no\n // part of the publish path.\n if (!dryRun) {\n yield* confirmAction(\n `Publish the local source ${source} in ${cwd} to pipeline ${pipelineId}? This creates a new immutable revision; a stale base is refused, not overwritten.`,\n \"confirm\",\n );\n }\n const local = yield* compileIr(source, { cwd }).pipe(\n Effect.flatMap(decodePipelineIr),\n Effect.mapError((error) =>\n failure(\n `the local source does not compile: ${error instanceof Error ? error.message : String(error)}`,\n \"compile-failed\",\n ),\n ),\n );\n const api = makeClient({\n origin: credential.origin,\n secret: credential.secret,\n pipelineId,\n });\n const baseRevisionId = Option.fromNullishOr(\n input.baseRevisionId ?? state.value.baseRevisionId,\n );\n const outcome = yield* push({\n cwd,\n api,\n local,\n identity: { origin: credential.origin, pipelineId, source },\n baseRevisionId,\n dryRun,\n summary: input.summary,\n }).pipe(\n Effect.mapError((error: SyncFailure) =>\n failure(error.message, `sync-${error.kind}`),\n ),\n );\n return {\n status: outcome.status,\n message: `push ${outcome.status}${outcome.status === \"published\" ? ` at revision ${outcome.revision.revisionId}` : \"\"}`,\n };\n }) satisfies Effect.Effect<\n { readonly status: string; readonly message: string },\n AgentToolError,\n | Crypto\n | FileSystem\n | PathService\n | HttpClientService\n | PythonCompiler\n | Credential\n | Environment\n | McpSchema.McpServerClient\n >;\n", "import { Context, Duration, Effect, Layer, Option, Schema } from \"effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as HttpClient from \"effect/http/HttpClient\";\nimport * as HttpClientRequest from \"effect/http/HttpClientRequest\";\nimport * as HttpClientResponse from \"effect/http/HttpClientResponse\";\nimport { configPath, Environment } from \"@braven/identity-store/environment\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** The file `braven-agent` writes for local consumers. */\nexport class WatcherDiscovery extends Schema.Class<WatcherDiscovery>(\n \"WatcherDiscovery\",\n)({\n version: Schema.String,\n pid: Schema.Int,\n port: Schema.Int,\n token: Schema.String,\n roots: Schema.Array(Schema.String),\n startedAt: Schema.String,\n}) {}\n\nexport interface WatcherStatus {\n readonly available: boolean;\n readonly version?: string;\n readonly pid?: number;\n readonly folders?: ReadonlyArray<string>;\n readonly pending?: number;\n readonly paused?: boolean;\n readonly startedAt?: string;\n}\n\nexport interface WatcherQueueItem {\n readonly id: number;\n readonly folder: string;\n readonly path: string;\n readonly size: number;\n readonly state: string;\n readonly attempts: number;\n readonly reason?: string;\n readonly updatedAt: string;\n}\n\nconst StatusResponse = Schema.Struct({\n available: Schema.Boolean,\n version: Schema.String,\n pid: Schema.Int,\n startedAt: Schema.String,\n folders: Schema.Array(Schema.String),\n pending: Schema.Int,\n paused: Schema.Boolean,\n});\n\nconst HealthResponse = Schema.Struct({\n ok: Schema.Boolean,\n name: Schema.String,\n version: Schema.String,\n pid: Schema.Int,\n});\n\nconst SyncResponse = Schema.Struct({\n reconciled: Schema.Struct({\n resumed: Schema.Int,\n stale: Schema.Int,\n missing: Schema.Int,\n superseded: Schema.Int,\n }),\n rescan: Schema.Struct({\n changed: Schema.Int,\n new: Schema.Int,\n unchanged: Schema.Int,\n skipped: Schema.Int,\n }),\n drained: Schema.Struct({\n uploaded: Schema.Int,\n failed: Schema.Int,\n repaired: Schema.Int,\n }),\n});\n\nconst RescanResponse = Schema.Struct({\n changed: Schema.Int,\n new: Schema.Int,\n unchanged: Schema.Int,\n skipped: Schema.Int,\n});\n\nconst OpenResponse = Schema.Struct({ opened: Schema.String });\n\nconst QueueResponse = Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.Int,\n folder: Schema.String,\n path: Schema.String,\n size: Schema.Int,\n state: Schema.String,\n attempts: Schema.Int,\n reason: Schema.optionalKey(Schema.String),\n updatedAt: Schema.String,\n }),\n ),\n});\n\nconst unavailable = () =>\n new AgentToolError({\n message:\n \"the Braven watcher is not running \u2014 start `braven-agent` (or `braven agent`) and try again\",\n code: \"watcher-unavailable\",\n });\n\nconst clientError = (message: string) =>\n new AgentToolError({ message, code: \"watcher-error\" });\n\nconst request = <A>(\n discovery: WatcherDiscovery,\n schema: Schema.ConstraintDecoder<A>,\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n): Effect.Effect<A, AgentToolError, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const base = `http://127.0.0.1:${discovery.port}`;\n const url = `${base}${path}`;\n const start =\n method === \"GET\"\n ? HttpClientRequest.get(url)\n : HttpClientRequest.post(url);\n const withBody =\n body === undefined\n ? start\n : HttpClientRequest.bodyJsonUnsafe(start, body);\n const built = HttpClientRequest.bearerToken(withBody, discovery.token);\n const outcome = yield* client.execute(built).pipe(\n Effect.timeoutOption(Duration.minutes(2)),\n Effect.mapError((error) =>\n clientError(`cannot reach the watcher: ${error.message}`),\n ),\n );\n if (Option.isNone(outcome)) {\n return yield* Effect.fail(\n clientError(\"the watcher did not answer within two minutes\"),\n );\n }\n const response = outcome.value;\n if (response.status < 200 || response.status >= 300) {\n return yield* Effect.fail(\n clientError(`the watcher answered ${response.status}`),\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(schema)(response).pipe(\n Effect.mapError((error) =>\n clientError(`cannot read the watcher's answer: ${error.message}`),\n ),\n );\n });\n\n/** The running agent's control client, or the absence of one. */\nexport class Watcher extends Context.Service<\n Watcher,\n {\n readonly status: Effect.Effect<\n WatcherStatus,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly queue: Effect.Effect<\n ReadonlyArray<WatcherQueueItem>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly sync: Effect.Effect<\n {\n readonly ok: boolean;\n readonly uploaded: number;\n readonly failed: number;\n readonly repaired: number;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly rescan: Effect.Effect<\n {\n readonly ok: boolean;\n readonly changed: number;\n readonly new: number;\n readonly skipped: number;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly pause: Effect.Effect<\n { readonly ok: boolean; readonly paused: boolean },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly resume: Effect.Effect<\n { readonly ok: boolean; readonly paused: boolean },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly open: (\n path: string,\n ) => Effect.Effect<\n { readonly ok: boolean; readonly opened: string },\n AgentToolError,\n HttpClient.HttpClient\n >;\n }\n>()(\"braven/Watcher\") {}\n\nconst withDiscovery = <A>(\n read: Effect.Effect<\n Option.Option<WatcherDiscovery>,\n never,\n HttpClient.HttpClient\n >,\n use: (\n discovery: WatcherDiscovery,\n ) => Effect.Effect<A, AgentToolError, HttpClient.HttpClient>,\n): Effect.Effect<A, AgentToolError, HttpClient.HttpClient> =>\n read.pipe(\n Effect.flatMap(\n Option.match({\n onNone: () => Effect.fail(unavailable()),\n onSome: use,\n }),\n ),\n );\n\nconst make = (\n read: Effect.Effect<\n Option.Option<WatcherDiscovery>,\n never,\n HttpClient.HttpClient\n >,\n): Watcher[\"Service\"] => ({\n status: read.pipe(\n Effect.flatMap(\n Option.match({\n onNone: () => Effect.succeed<WatcherStatus>({ available: false }),\n onSome: (value) =>\n request(value, StatusResponse, \"GET\", \"/status\").pipe(\n Effect.map((status) => ({\n available: true,\n version: status.version,\n pid: status.pid,\n folders: status.folders,\n pending: status.pending,\n paused: status.paused,\n startedAt: status.startedAt,\n })),\n ),\n }),\n ),\n ),\n queue: withDiscovery(read, (value) =>\n request(value, QueueResponse, \"GET\", \"/queue\").pipe(\n Effect.map((queue) =>\n queue.items.map((item) => ({\n id: item.id,\n folder: item.folder,\n path: item.path,\n size: item.size,\n state: item.state,\n attempts: item.attempts,\n reason: item.reason,\n updatedAt: item.updatedAt,\n })),\n ),\n ),\n ),\n sync: withDiscovery(read, (value) =>\n request(value, SyncResponse, \"POST\", \"/sync\").pipe(\n Effect.map((report) => ({\n ok: report.drained.failed === 0,\n uploaded: report.drained.uploaded,\n failed: report.drained.failed,\n repaired: report.drained.repaired,\n })),\n ),\n ),\n rescan: withDiscovery(read, (value) =>\n request(value, RescanResponse, \"POST\", \"/rescan\").pipe(\n Effect.map((report) => ({\n ok: true,\n changed: report.changed,\n new: report.new,\n skipped: report.skipped,\n })),\n ),\n ),\n pause: withDiscovery(read, (value) =>\n request(value, Schema.Unknown, \"POST\", \"/pause\").pipe(\n Effect.map(() => ({ ok: true, paused: true })),\n ),\n ),\n resume: withDiscovery(read, (value) =>\n request(value, Schema.Unknown, \"POST\", \"/resume\").pipe(\n Effect.map(() => ({ ok: true, paused: false })),\n ),\n ),\n open: (path) =>\n withDiscovery(read, (value) =>\n request(value, OpenResponse, \"POST\", \"/open\", { path }).pipe(\n Effect.map((answer) => ({ ok: true, opened: answer.opened })),\n ),\n ),\n});\n\nconst decodeDiscovery = Schema.decodeUnknownOption(\n Schema.fromJsonString(WatcherDiscovery),\n);\n\n/**\n * The agent's discovery file is read **per call**: starting `braven-agent`\n * after the MCP server works without a restart. A missing, malformed, or stale\n * file means \"no watcher\"; status reports absence, controls fail\n * `watcher-unavailable`.\n */\nexport const layer = Layer.effect(Watcher)(\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const environment = yield* Environment;\n const discoveryPath = path.join(\n path.dirname(configPath(environment)),\n \"runtime\",\n \"agent.json\",\n );\n const read = fs.readFileString(discoveryPath).pipe(\n Effect.map(decodeDiscovery),\n Effect.catch(() => Effect.succeed(Option.none())),\n Effect.flatMap((found) =>\n Option.match(found, {\n onNone: () => Effect.succeed(Option.none()),\n onSome: (discovery) =>\n Effect.try({\n try: () => {\n process.kill(discovery.pid, 0);\n return true;\n },\n catch: () => false,\n }).pipe(\n Effect.orElseSucceed(() => false),\n Effect.flatMap((alive) =>\n alive\n ? request(discovery, HealthResponse, \"GET\", \"/health\").pipe(\n Effect.map((health) =>\n health.name === \"braven-agent\" &&\n health.pid === discovery.pid\n ? Option.some(discovery)\n : Option.none(),\n ),\n Effect.catch(() => Effect.succeed(Option.none())),\n )\n : Effect.succeed(Option.none()),\n ),\n ),\n }),\n ),\n );\n return make(read);\n }),\n);\n", "import { Console, Duration, Effect, Option } from \"effect\";\nimport * as Bool from \"effect/Boolean\";\nimport * as Path from \"effect/Path\";\nimport {\n type Account,\n CliFailure,\n EXIT_FAILURE,\n EXIT_NOT_SIGNED_IN,\n EXIT_USAGE,\n Environment,\n StoreConfig,\n accountKey,\n fail,\n loadConfig,\n readDefault,\n removeCredential,\n resolveClientId,\n resolveCredential,\n resolveDefaults,\n resolveOrigin,\n resolveWebOrigin,\n setDefault,\n storeCredential,\n storedCredential,\n useAccount,\n} from \"@braven/identity-store\";\nimport {\n Sessions,\n rememberSession,\n signIn,\n type SignInFailure,\n} from \"@braven/identity-store/login\";\nimport { deviceLogin } from \"./auth.ts\";\nimport { ingest, resolveProject } from \"./files.ts\";\n\n/** API keys are minted by the api-key plugin with this prefix. */\nexport const API_KEY_PREFIX = \"bvn_api_\";\n\nconst dash = (value: Option.Option<string>): string =>\n Option.getOrElse(value, () => \"-\");\n\ninterface IdentityView {\n readonly origin: string;\n readonly email: Option.Option<string>;\n readonly kind: string;\n readonly label: Option.Option<string>;\n}\n\nconst identityLines = (header: string, identity: IdentityView): string =>\n [\n header,\n ` origin ${identity.origin}`,\n ` email ${dash(identity.email)}`,\n ` kind ${identity.kind}`,\n ` label ${dash(identity.label)}`,\n ].join(\"\\n\");\n\nconst printIdentity = (\n header: string,\n identity: IdentityView,\n): Effect.Effect<void> => Console.log(identityLines(header, identity));\n\nconst asIdentity = (account: Account) => ({\n ...account,\n email: Option.some(account.email),\n});\n\n/** The shared flow's typed failure, flattened to the CLI's one-line vocabulary. */\nconst asCliFailure = (failure: SignInFailure): CliFailure =>\n new CliFailure({ message: failure.message, exitCode: EXIT_FAILURE });\n\n/** Prints the identity the store just recorded; the secret never leaves it. */\nconst printSignedIn = Effect.fn(\"login.print\")(function* (account: Account) {\n yield* printIdentity(`signed in as ${account.email}`, asIdentity(account));\n});\n\n/**\n * The default sign-in: the shared `@braven/identity-store` loopback flow, then\n * the CLI's identity block. `--device` keeps its own grant below and shares\n * only the prove-and-store step.\n */\nexport const login = Effect.fn(\"login\")(function* (options: {\n readonly origin: string;\n readonly webOrigin: string;\n readonly timeout?: Duration.Input | undefined;\n}) {\n const account = yield* signIn(options).pipe(Effect.mapError(asCliFailure));\n yield* printSignedIn(account);\n});\n\n/** How the CLI takes its identity: the app's sign-in, a browser, or a key. */\nexport type LoginMethod = \"browser\" | \"watcher\" | \"api\";\n\n/**\n * The account the Braven app (and the agent it runs) already signed in for a\n * server. The app and the CLI share one store, so \"login with the watcher\" is\n * adopting that account \u2014 no second browser round-trip.\n */\nexport const watcherAccountFor = (\n accounts: ReadonlyArray<Account>,\n origin: string,\n): Option.Option<Account> =>\n Option.fromNullishOr(accounts.find((account) => account.origin === origin));\n\n/**\n * The account `--watcher` adopts: one for an explicit origin, else the store's\n * current account (the one the app is using), else the first stored one.\n */\nexport const watcherAccount = (\n store: {\n readonly current: Option.Option<string>;\n readonly accounts: ReadonlyArray<Account>;\n },\n origin: Option.Option<string>,\n): Option.Option<Account> =>\n Option.isSome(origin)\n ? watcherAccountFor(store.accounts, origin.value)\n : Option.orElse(\n Option.flatMap(store.current, (current) =>\n Option.fromNullishOr(\n store.accounts.find(\n (account) =>\n accountKey(account.origin, account.email) === current,\n ),\n ),\n ),\n () => Option.fromNullishOr(store.accounts[0]),\n );\n\n/**\n * Resolves the flag/env/default API origin for the login command and picks\n * the flow: the loopback handoff by default, better-auth's device grant with\n * `--device`, the running app's sign-in with `--watcher`, or a stored API key\n * with `--api`.\n */\nexport const loginCommand = (options: {\n readonly origin: Option.Option<string>;\n readonly webOrigin: Option.Option<string>;\n readonly device: boolean;\n readonly clientId: Option.Option<string>;\n readonly method?: LoginMethod;\n readonly apiKey?: Option.Option<string>;\n readonly email?: Option.Option<string>;\n}) =>\n Effect.gen(function* () {\n const environment = yield* Environment;\n const stored = (key: string) =>\n readDefault(key).pipe(Effect.orElseSucceed(() => Option.none<string>()));\n // Settings \u2192 Server (and the desktop) write both defaults; a CLI login on\n // the same machine must join that server, web login page included.\n const origin = resolveOrigin(\n options.origin,\n environment,\n yield* stored(\"origin\"),\n );\n const webOrigin = resolveWebOrigin(\n options.webOrigin,\n environment,\n yield* stored(\"webOrigin\"),\n );\n\n if ((options.method ?? \"browser\") === \"watcher\") {\n const config = yield* loadConfig();\n // No explicit --origin: the app's current account names the server, so\n // a dev sign-in is found even though the CLI's default is hosted.\n const account = watcherAccount(config, options.origin);\n if (Option.isNone(account))\n return yield* fail(\n `the watcher has no sign-in for ${origin} \u2014 sign in in the Braven app, or use \\`braven login --browser\\` / \\`--api\\``,\n EXIT_NOT_SIGNED_IN,\n );\n const value = account.value;\n yield* useAccount(value.email);\n yield* printIdentity(`using the watcher's sign-in for ${value.email}`, {\n origin: value.origin,\n email: Option.some(value.email),\n kind: value.kind,\n label: value.label,\n });\n return;\n }\n\n if ((options.method ?? \"browser\") === \"api\") {\n const key = Option.orElse(options.apiKey ?? Option.none(), () =>\n Option.fromNullishOr(environment.values[\"BRAVEN_API_KEY\"]),\n );\n if (Option.isNone(key))\n return yield* fail(\n \"--api needs a key: pass --key bvn_api_\u2026 or set BRAVEN_API_KEY\",\n EXIT_USAGE,\n );\n return yield* keyAdd({\n origin,\n key: key.value,\n email: options.email ?? Option.none(),\n label: Option.none(),\n });\n }\n\n yield* Bool.match(options.device, {\n onFalse: () => login({ origin, webOrigin }),\n onTrue: () =>\n Effect.flatMap(\n deviceLogin({\n origin,\n clientId: resolveClientId(options.clientId, environment),\n }),\n (token) =>\n rememberSession(origin, token).pipe(\n Effect.mapError(asCliFailure),\n Effect.flatMap(printSignedIn),\n ),\n ),\n });\n });\n\n/**\n * Pushes one local file through `files.ingest` (plan 015).\n *\n * `path` defaults to the file's basename \u2014 the name the server keys the\n * Experiment and File on; `--override` replaces that path instead of adding a\n * sibling or a duplicate. The credential never leaves the Authorization\n * header.\n */\nexport const push = Effect.fn(\"push\")(function* (options: {\n readonly file: string;\n readonly override: boolean;\n readonly path: Option.Option<string>;\n readonly projectId: Option.Option<string>;\n}) {\n const credential = yield* resolveCredential({\n origin: Option.none(),\n email: Option.none(),\n });\n if (Option.isNone(credential)) {\n return yield* fail(\n \"not signed in \u2014 run `braven login`, or set BRAVEN_API_KEY\",\n EXIT_NOT_SIGNED_IN,\n );\n }\n const value = credential.value;\n const paths = yield* Path.Path;\n const path = Option.getOrElse(options.path, () =>\n paths.basename(options.file),\n );\n const projectId = yield* resolveProject({\n origin: value.origin,\n secret: value.secret,\n flag: options.projectId,\n });\n const result = yield* ingest({\n origin: value.origin,\n secret: value.secret,\n projectId,\n path,\n override: options.override,\n file: options.file,\n });\n yield* Console.log(\n `pushed ${path} \u2014 ${result.filename} in experiment ${result.experiment_id}`,\n );\n});\n\n/** Prints the identity this machine would authenticate as \u2014 never the secret. */\nexport const whoami = Effect.fn(\"whoami\")(function* () {\n const credential = yield* resolveCredential({\n origin: Option.none(),\n email: Option.none(),\n });\n if (Option.isNone(credential)) {\n return yield* fail(\n \"not signed in \u2014 run `braven login`, or set BRAVEN_API_KEY\",\n EXIT_NOT_SIGNED_IN,\n );\n }\n const value = credential.value;\n const header = Option.match(value.email, {\n onNone: () => \"signed in from the environment\",\n onSome: (email) => `signed in as ${email}`,\n });\n yield* printIdentity(header, value);\n});\n\n/** Stores a long-lived API key, asking the API for its owner when `--email` is absent. */\nexport const keyAdd = Effect.fn(\"keyAdd\")(function* (options: {\n readonly origin: string;\n readonly key: string;\n readonly email: Option.Option<string>;\n readonly label: Option.Option<string>;\n}) {\n if (!options.key.startsWith(API_KEY_PREFIX)) {\n return yield* fail(\n `that is not an API key: keys start with ${API_KEY_PREFIX} (copy one from Settings \u2192 API keys)`,\n EXIT_USAGE,\n );\n }\n const owner = Option.isSome(options.email)\n ? options.email.value\n : yield* Effect.flatMap(Sessions, (sessions) =>\n sessions.emailFor(options.origin, options.key),\n ).pipe(\n Effect.mapError(\n (failure) =>\n new CliFailure({\n message: `cannot tell which account this key belongs to (${failure.message}) \u2014 pass --email to store it without asking`,\n exitCode: EXIT_USAGE,\n }),\n ),\n );\n const account = yield* storeCredential(\n {\n origin: options.origin,\n email: owner,\n kind: \"apiKey\",\n secret: options.key,\n },\n options.label,\n );\n yield* printIdentity(\n `stored the API key for ${account.email}`,\n asIdentity(account),\n );\n});\n\n/** Prints the stored accounts, the current one, and the resolved defaults. */\nexport const configShow = Effect.fn(\"configShow\")(function* () {\n const { path } = yield* StoreConfig;\n const config = yield* loadConfig();\n const { company, project } = yield* resolveDefaults();\n const lines = [\n `config ${path}`,\n `current ${Option.getOrElse(config.current, () => \"(none)\")}`,\n `company ${Option.getOrElse(company, () => \"(unset)\")}`,\n `project ${Option.getOrElse(project, () => \"(unset)\")}`,\n `accounts (${config.accounts.length})`,\n ...config.accounts.map(\n (account) =>\n ` ${accountKey(account.origin, account.email)} ${account.kind}` +\n Option.match(account.label, {\n onNone: () => \"\",\n onSome: (label) => ` (${label})`,\n }),\n ),\n ];\n yield* Console.log(lines.join(\"\\n\"));\n});\n\n/** Writes one default \u2014 `company` or `project`; the parser restricts `name`. */\nexport const configSet = Effect.fn(\"configSet\")(function* (options: {\n readonly name: \"company\" | \"project\";\n readonly value: string;\n}) {\n yield* setDefault(options.name, Option.some(options.value));\n yield* Console.log(`${options.name} ${options.value}`);\n});\n\n/** Points `current` at a stored account, whatever origin it lives on. */\nexport const configUse = Effect.fn(\"configUse\")(function* (email: string) {\n const account = yield* useAccount(email);\n yield* Console.log(`current ${accountKey(account.origin, account.email)}`);\n});\n\n/** Forgets an account (default: the current one), keychain secret included. */\nexport const logout = Effect.fn(\"logout\")(function* (\n email: Option.Option<string>,\n) {\n // Read the secret before forgetting it: a stored session is revoked\n // server-side, so the token cannot be replayed after `logout`. The store is\n // read directly rather than through `resolveCredential`, so an environment\n // token can never be the one this revokes.\n const stored = yield* storedCredential({ origin: Option.none(), email });\n const removed = yield* removeCredential(email);\n if (Option.isNone(removed)) {\n return yield* fail(\n Option.match(email, {\n onNone: () => \"not signed in \u2014 nothing to forget\",\n onSome: (value) => `no stored account for ${value}`,\n }),\n EXIT_NOT_SIGNED_IN,\n );\n }\n const account = removed.value;\n if (Option.isSome(stored) && stored.value.kind === \"session\") {\n const sessions = yield* Sessions;\n yield* sessions.revoke(stored.value.origin, stored.value.secret).pipe(\n // The local account is already gone; a failure to reach the API is\n // reported, not fatal, because retrying is no longer possible.\n Effect.catchTag(\"CliFailure\", (failure) =>\n Console.error(\n `warning: ${failure.message} \u2014 the session stays valid until it expires`,\n ),\n ),\n );\n }\n yield* Console.log(\n `removed ${account.email} (${account.kind}) from ${account.origin}`,\n );\n});\n", "/**\n * The loopback browser sign-in every surface shares.\n *\n * The flow is one handshake: bind `127.0.0.1:0`, open\n * `{webOrigin}/cli-login?port=<port>` in the system browser, receive the session\n * token on `GET /?token=\u2026`, prove the token against the API, and store it in\n * the keychain-backed identity store. The CLI and the watcher call the same\n * `signIn`, so a credential has exactly one way in.\n *\n * The listener is owned by `signIn`'s scope: it closes on success, on timeout,\n * on a browser failure, and on cancellation. No step logs the token.\n */\nimport open from \"open\";\nimport { createServer } from \"node:http\";\nimport { NodeHttpServer } from \"@effect/platform-node\";\nimport {\n Console,\n Context,\n Deferred,\n Duration,\n Effect,\n Layer,\n Option,\n Predicate,\n Schema,\n} from \"effect\";\nimport {\n HttpClient,\n HttpClientRequest,\n HttpClientResponse,\n HttpRouter,\n HttpServer,\n HttpServerRequest,\n HttpServerResponse,\n} from \"effect/http\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as NetAddress from \"effect/net/NetAddress\";\nimport * as Path from \"effect/Path\";\nimport * as Str from \"effect/String\";\nimport { CliFailure, EXIT_FAILURE, fail, oneLine } from \"./errors.ts\";\nimport {\n Keychain,\n StoreConfig,\n storeCredential,\n type Account,\n} from \"./identity.ts\";\n\nexport type { Account } from \"./identity.ts\";\n\n/** How long a person has to finish signing in in the browser. */\nexport const LOGIN_TIMEOUT = Duration.minutes(5);\n\n/**\n * Why a browser sign-in did not produce a credential. The CLI flattens this to\n * `CliFailure`; the watcher branches on `reason` to show its own next step.\n */\nexport const SignInReason = Schema.Literals([\n \"timeout\",\n \"listener\",\n \"browser\",\n \"rejected\",\n \"storage\",\n]);\n\nexport type SignInReason = typeof SignInReason.Type;\n\n/** A typed sign-in failure: the listener, the browser, the API or the store. */\nexport class SignInFailure extends Schema.TaggedError<SignInFailure>()(\n \"SignInFailure\",\n { reason: SignInReason, message: Schema.String },\n) {}\n\n/** Opens the system browser; injected so tests never launch a real one. */\nexport class Browser extends Context.Service<\n Browser,\n { readonly open: (url: string) => Effect.Effect<void, CliFailure> }\n>()(\"braven/Browser\") {}\n\n/** The system browser for `braven login` and the watcher's Sign in. */\nexport const browserLayer: Layer.Layer<Browser> = Layer.succeed(Browser)({\n open: (url) =>\n Effect.tryPromise({\n try: () => open(url),\n catch: (cause) =>\n new CliFailure({\n message: `cannot open a browser for ${url}: ${oneLine(cause)}`,\n exitCode: EXIT_FAILURE,\n }),\n }).pipe(Effect.asVoid),\n});\n\n/** The better-auth session lookup: token in, the API's own email out. */\nexport class Sessions extends Context.Service<\n Sessions,\n {\n readonly emailFor: (\n origin: string,\n token: string,\n ) => Effect.Effect<string, CliFailure>;\n /** Revoke a session server-side so a forgotten token cannot be replayed. */\n readonly revoke: (\n origin: string,\n token: string,\n ) => Effect.Effect<void, CliFailure>;\n }\n>()(\"braven/Sessions\") {}\n\nconst SessionUser = class SessionUser extends Schema.Class<SessionUser>(\n \"SessionUser\",\n)({ email: Schema.NonEmptyString }) {};\n\nconst SessionBody = class SessionBody extends Schema.Class<SessionBody>(\n \"SessionBody\",\n)({ user: SessionUser }) {};\n\nconst lookupFailure = (origin: string, cause: { readonly message: string }) =>\n new CliFailure({\n message: `cannot read a session from ${origin}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\n/**\n * Asks `GET /api/auth/get-session` who a bearer token belongs to.\n *\n * A non-200, a non-JSON body, or a body without `user.email` fails loudly \u2014\n * `login` stores nothing unless this proves the owner.\n */\nexport const lookupEmail = (\n origin: string,\n token: string,\n): Effect.Effect<string, CliFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const response = yield* client\n .get(`${origin}/api/auth/get-session`, {\n headers: { authorization: `Bearer ${token}` },\n })\n .pipe(Effect.mapError((cause) => lookupFailure(origin, cause)));\n if (response.status !== 200) {\n const detail = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* fail(\n `the API rejected that sign-in (${response.status})${detail ? `: ${oneLine(detail)}` : \"\"} \u2014 run \\`braven login\\` again`,\n );\n }\n const body = yield* HttpClientResponse.schemaBodyJson(SessionBody)(\n response,\n ).pipe(Effect.mapError((cause) => lookupFailure(origin, cause)));\n return body.user.email;\n });\n\n/** Revokes a session (`POST /api/auth/sign-out`). A 200 or a 401 both mean the\n * token is dead \u2014 already-gone is not a failure. */\nexport const revokeSession = (\n origin: string,\n token: string,\n): Effect.Effect<void, CliFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const response = yield* client\n .execute(\n HttpClientRequest.post(`${origin}/api/auth/sign-out`).pipe(\n HttpClientRequest.bearerToken(token),\n HttpClientRequest.bodyJsonUnsafe({}),\n ),\n )\n .pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `cannot reach ${origin} to sign out: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n if (response.status === 200 || response.status === 401) return;\n const detail = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* fail(\n `the API refused the sign-out (${response.status})${detail ? `: ${oneLine(detail)}` : \"\"}`,\n );\n });\n\n/** Live sessions over the platform HTTP client. */\nexport const sessionsLayer: Layer.Layer<\n Sessions,\n never,\n HttpClient.HttpClient\n> = Layer.effect(Sessions)(\n Effect.map(HttpClient.HttpClient, (client) => ({\n emailFor: (origin, token) =>\n lookupEmail(origin, token).pipe(\n Effect.provideService(HttpClient.HttpClient, client),\n ),\n revoke: (origin, token) =>\n revokeSession(origin, token).pipe(\n Effect.provideService(HttpClient.HttpClient, client),\n ),\n })),\n);\n\n/** A loopback token, and the port it arrived on. */\nexport interface LoopbackToken {\n readonly token: string;\n readonly port: number;\n}\n\nconst tokenOf = (\n params: Readonly<Record<string, string | ReadonlyArray<string>>>,\n): Option.Option<string> =>\n Option.fromNullishOr(params[\"token\"]).pipe(\n Option.flatMap((value) =>\n Predicate.isString(value) ? Option.some(value) : Option.none(),\n ),\n Option.filter(Str.isNonEmpty),\n );\n\nconst tokenRoute = (tokens: Deferred.Deferred<string>) =>\n HttpRouter.add(\n \"GET\",\n \"/\",\n Effect.gen(function* () {\n const params = yield* HttpServerRequest.ParsedSearchParams;\n return yield* Option.match(tokenOf(params), {\n onNone: () =>\n Effect.succeed(\n HttpServerResponse.text(\"Missing token.\", { status: 400 }),\n ),\n onSome: (token) =>\n Effect.gen(function* () {\n yield* Deferred.succeed(tokens, token);\n return HttpServerResponse.html(\n \"<h1>Authenticated. You can close this window.</h1>\",\n );\n }),\n });\n }),\n );\n\nconst listenerFailure = (message: string): SignInFailure =>\n new SignInFailure({ reason: \"listener\", message });\n\nconst portOf = (\n address: NetAddress.SocketAddress,\n): Effect.Effect<number, SignInFailure> =>\n NetAddress.isInetAddress(address)\n ? Effect.succeed(address.port)\n : Effect.fail(\n listenerFailure(\"the login listener did not bind a TCP port\"),\n );\n\n/** Where `signIn` reports the URL it opened, before it waits for the token. */\nexport type LoginUrlListener = (url: string) => Effect.Effect<void>;\n\nconst openingLines = (url: string): string =>\n `Opening ${url}\\nIf your browser did not open, visit that URL to finish signing in.`;\n\n/**\n * Binds `127.0.0.1:0`, opens `{webOrigin}/cli-login?port=<port>`, and waits for\n * the browser to hand the session token back to `GET /?token=\u2026`.\n *\n * `onLoginUrl` receives the URL once it is known; the CLI omits it and gets the\n * two printed lines, the watcher passes its own progress sink. The listener is\n * owned by the returned effect's scope: it closes on success, on the\n * five-minute timeout, on a browser failure, and on interruption.\n */\nexport const awaitToken = (options: {\n readonly webOrigin: string;\n readonly timeout?: Duration.Input | undefined;\n readonly onLoginUrl?: LoginUrlListener | undefined;\n}): Effect.Effect<LoopbackToken, SignInFailure, Browser> =>\n Effect.gen(function* () {\n const tokens = yield* Deferred.make<string>();\n const app = HttpRouter.serve(\n Layer.mergeAll(\n tokenRoute(tokens),\n HttpRouter.add(\n \"*\",\n \"*\",\n HttpServerResponse.text(\"Missing token.\", { status: 400 }),\n ),\n ),\n {\n disableLogger: true,\n disableListenLog: true,\n },\n ).pipe(\n Layer.provideMerge(\n NodeHttpServer.layer(createServer, { host: \"127.0.0.1\", port: 0 }),\n ),\n );\n return yield* Effect.gen(function* () {\n const server = yield* HttpServer.HttpServer;\n const port = yield* portOf(server.address);\n const browser = yield* Browser;\n const loginUrl = `${options.webOrigin}/cli-login?port=${port}`;\n // Print it as well as opening it: `open` can fail silently on a headless\n // machine or a locked-down desktop, and then the URL is the only way in.\n yield* Option.match(Option.fromNullishOr(options.onLoginUrl), {\n onNone: () => Console.log(openingLines(loginUrl)),\n onSome: (report) => report(loginUrl),\n });\n yield* browser.open(loginUrl).pipe(\n Effect.mapError(\n (failure) =>\n new SignInFailure({\n reason: \"browser\",\n message: failure.message,\n }),\n ),\n );\n return { token: yield* Deferred.await(tokens), port };\n }).pipe(\n Effect.timeoutOrElse({\n duration: options.timeout ?? LOGIN_TIMEOUT,\n orElse: () =>\n Effect.fail(\n new SignInFailure({\n reason: \"timeout\",\n message:\n \"timed out waiting for the browser sign-in (5 minutes) \u2014 run `braven login` again\",\n }),\n ),\n }),\n Effect.provide(app),\n Effect.catchTag(\"ServeError\", (cause) =>\n Effect.fail(\n listenerFailure(\n `cannot start the login listener: ${oneLine(cause.message)}`,\n ),\n ),\n ),\n );\n });\n\nconst asSignInFailure =\n (reason: \"rejected\" | \"storage\") =>\n (failure: { readonly message: string }): SignInFailure =>\n new SignInFailure({ reason, message: failure.message });\n\n/**\n * Proves a session token's owner and stores it, without printing anything.\n *\n * Nothing is written until `GET /api/auth/get-session` confirms the token\n * belongs to an email; a rejection or an unreachable API leaves the store\n * untouched.\n */\nexport const rememberSession = (\n origin: string,\n token: string,\n): Effect.Effect<\n Account,\n SignInFailure,\n Sessions | StoreConfig | Keychain | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const sessions = yield* Sessions;\n const email = yield* sessions\n .emailFor(origin, token)\n .pipe(Effect.mapError(asSignInFailure(\"rejected\")));\n return yield* storeCredential({\n origin,\n email,\n kind: \"session\",\n secret: token,\n }).pipe(Effect.mapError(asSignInFailure(\"storage\")));\n });\n\n/**\n * The whole browser sign-in: loopback handshake, prove the token, store it.\n *\n * Returns the stored account (never the secret). Callers own presentation:\n * the CLI prints the identity, the watcher reconnects its sync session.\n */\nexport const signIn = (options: {\n readonly origin: string;\n readonly webOrigin: string;\n readonly timeout?: Duration.Input | undefined;\n readonly onLoginUrl?: LoginUrlListener | undefined;\n}): Effect.Effect<\n Account,\n SignInFailure,\n | Browser\n | Sessions\n | StoreConfig\n | Keychain\n | FileSystem.FileSystem\n | Path.Path\n> =>\n Effect.gen(function* () {\n const { token } = yield* awaitToken(options);\n return yield* rememberSession(options.origin, token);\n });\n", "import {\n Cause,\n Console,\n Duration,\n Effect,\n Match,\n Option,\n Ref,\n Schedule,\n} from \"effect\";\nimport { HttpClient, HttpClientRequest, HttpClientResponse } from \"effect/http\";\nimport * as Schema from \"effect/Schema\";\nimport * as Tuple from \"effect/Tuple\";\nimport {\n CliFailure,\n EXIT_FAILURE,\n fail,\n oneLine,\n} from \"@braven/identity-store\";\nimport { Browser } from \"@braven/identity-store/login\";\n\n/**\n * The browser sign-in lives in `@braven/identity-store/login` so the watcher\n * shares its one implementation; this module keeps the CLI's device-grant flow\n * and re-exports the shared pieces for the CLI's existing imports.\n */\nexport {\n awaitToken,\n browserLayer,\n LOGIN_TIMEOUT,\n lookupEmail,\n rememberSession,\n Sessions,\n sessionsLayer,\n signIn,\n SignInFailure,\n SignInReason,\n type LoopbackToken,\n} from \"@braven/identity-store/login\";\nexport { Browser };\n\n/** RFC 8628's device-code grant type; better-auth rejects anything else. */\nexport const DEVICE_GRANT_TYPE = \"urn:ietf:params:oauth:grant-type:device_code\";\n\n/** The scopes a device sign-in asks for; the grant only needs a session. */\nexport const DEVICE_SCOPE = \"openid profile email\";\n\n/** RFC 8628 defaults when the server omits `expires_in` / `interval`. */\nconst DEVICE_CODE_LIFETIME = Duration.minutes(30);\nconst DEVICE_POLL_INTERVAL = Duration.seconds(5);\n\n/** RFC 8628 \u00A73.5: every `slow_down` adds five seconds to the interval. */\nconst DEVICE_SLOW_DOWN = Duration.seconds(5);\n\n/**\n * The device grant both endpoints live at, under better-auth's base path \u2014\n * the same `/api/auth` the loopback flow proves its token against.\n */\nconst deviceUrl = (origin: string, endpoint: \"code\" | \"token\"): string =>\n `${origin}/api/auth/device/${endpoint}`;\n\n/** What `POST /device/code` answers: the codes, where to type them, and when. */\nexport class DeviceCode extends Schema.Class<DeviceCode>(\"DeviceCode\")({\n device_code: Schema.NonEmptyString,\n user_code: Schema.NonEmptyString,\n verification_uri: Schema.NonEmptyString,\n verification_uri_complete: Schema.OptionFromOptionalKey(Schema.String),\n expires_in: Schema.Int.pipe(\n Schema.withConstructorDefault(\n Effect.succeed(Duration.toSeconds(DEVICE_CODE_LIFETIME)),\n ),\n Schema.withDecodingDefaultKey(\n Effect.succeed(Duration.toSeconds(DEVICE_CODE_LIFETIME)),\n ),\n ),\n interval: Schema.Int.pipe(\n Schema.withConstructorDefault(\n Effect.succeed(Duration.toSeconds(DEVICE_POLL_INTERVAL)),\n ),\n Schema.withDecodingDefaultKey(\n Effect.succeed(Duration.toSeconds(DEVICE_POLL_INTERVAL)),\n ),\n ),\n}) {}\n\n/**\n * What `POST /device/token` answers: a session token, or one RFC 8628 error.\n * better-auth returns the error fields with a 400, so both live in one shape.\n */\nexport class DeviceToken extends Schema.Class<DeviceToken>(\"DeviceToken\")({\n access_token: Schema.OptionFromOptionalKey(Schema.String),\n error: Schema.OptionFromOptionalKey(Schema.String),\n error_description: Schema.OptionFromOptionalKey(Schema.String),\n}) {}\n\n/** One poll's verdict: the session token, or why polling must continue/stop. */\ntype DevicePoll =\n | { readonly _tag: \"Granted\"; readonly token: string }\n | { readonly _tag: \"Pending\" }\n | { readonly _tag: \"SlowDown\" }\n | { readonly _tag: \"Refused\"; readonly failure: CliFailure };\n\nconst retryLine = \"run `braven login --device` again\";\n\nconst deviceExpiredFailure = (): CliFailure =>\n new CliFailure({\n message: `the device code expired before it was approved \u2014 ${retryLine}`,\n exitCode: EXIT_FAILURE,\n });\n\nconst transportFailure = (\n origin: string,\n cause: { readonly message: string },\n): CliFailure =>\n new CliFailure({\n message: `cannot reach the sign-in API at ${origin}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\nconst detailOf = (description: Option.Option<string>): string =>\n Option.match(description, {\n onNone: () => \"\",\n onSome: (value) => `: ${oneLine(value)}`,\n });\n\n/** One actionable line per RFC 8628 terminal error. Never the device code. */\nconst refusalFor = (\n error: string,\n description: Option.Option<string>,\n): CliFailure =>\n Match.value(error).pipe(\n Match.when(\"expired_token\", deviceExpiredFailure),\n Match.when(\n \"access_denied\",\n () =>\n new CliFailure({\n message: `the sign-in was denied in the browser \u2014 ${retryLine}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n Match.when(\n \"invalid_grant\",\n () =>\n new CliFailure({\n message: `the device code is no longer valid \u2014 ${retryLine}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n Match.orElse(\n (other) =>\n new CliFailure({\n message: `the device sign-in failed (${other})${detailOf(description)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n\nconst refusal = (cause: CliFailure): DevicePoll => ({\n _tag: \"Refused\",\n failure: cause,\n});\n\n/** Decodes one token answer into the next poll verdict. */\nconst verdictOf = (body: DeviceToken): Effect.Effect<DevicePoll, CliFailure> =>\n Option.match(body.access_token, {\n onSome: (token) => Effect.succeed<DevicePoll>({ _tag: \"Granted\", token }),\n onNone: () =>\n Match.value(Option.getOrElse(body.error, () => \"unknown_error\")).pipe(\n Match.when(\"authorization_pending\", () =>\n Effect.succeed<DevicePoll>({ _tag: \"Pending\" }),\n ),\n Match.when(\"slow_down\", () =>\n Effect.succeed<DevicePoll>({ _tag: \"SlowDown\" }),\n ),\n Match.orElse((error) =>\n Effect.fail(refusalFor(error, body.error_description)),\n ),\n ),\n });\n\n/**\n * `POST /device/code`: what to show the person, where they approve it, and how\n * long the code lives.\n */\nexport const requestDeviceCode = (\n origin: string,\n clientId: string,\n): Effect.Effect<DeviceCode, CliFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const request = yield* HttpClientRequest.post(\n deviceUrl(origin, \"code\"),\n ).pipe(\n HttpClientRequest.bodyJson({\n client_id: clientId,\n scope: DEVICE_SCOPE,\n }),\n Effect.mapError((cause) => transportFailure(origin, cause)),\n );\n const response = yield* client\n .execute(request)\n .pipe(Effect.mapError((cause) => transportFailure(origin, cause)));\n if (response.status !== 200) {\n const detail = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* fail(\n `the sign-in API refused a device code (${response.status})${detail ? `: ${oneLine(detail)}` : \"\"} \u2014 ${retryLine}`,\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(DeviceCode)(response).pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `cannot read a device code from ${origin}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n });\n\n/** One `POST /device/token`; every answer is a verdict, never a thrown error. */\nconst pollDeviceToken = (\n origin: string,\n clientId: string,\n deviceCode: string,\n): Effect.Effect<DevicePoll, never, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const response = yield* client\n .execute(\n HttpClientRequest.post(deviceUrl(origin, \"token\")).pipe(\n // better-auth's `/device/token` reads JSON only; a form body is 415.\n HttpClientRequest.bodyJsonUnsafe({\n grant_type: DEVICE_GRANT_TYPE,\n device_code: deviceCode,\n client_id: clientId,\n }),\n ),\n )\n .pipe(Effect.mapError((cause) => transportFailure(origin, cause)));\n const body = yield* HttpClientResponse.schemaBodyJson(DeviceToken)(\n response,\n ).pipe(\n Effect.mapError(\n () =>\n new CliFailure({\n message: `the sign-in API at ${origin} returned an unreadable device-token answer`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n return yield* verdictOf(body);\n }).pipe(\n // The poll's contract is a verdict, never a failure: a transport or decode\n // error stops the schedule as `Refused` and surfaces one line later.\n Effect.catch((cause) => Effect.succeed(refusal(cause))),\n );\n\n/**\n * The poll cadence: `interval` seconds, plus five more after every\n * `slow_down`. Grant and refusal stop the schedule; pending keeps it going.\n * Exported so the cadence is provable without a clock.\n */\nexport const devicePollSchedule = (\n start: Duration.Duration,\n): Schedule.Schedule<DevicePoll, DevicePoll> =>\n Schedule.fromStepWithMetadata(\n Effect.map(\n Ref.make(start),\n (interval) => (metadata: Schedule.InputMetadata<DevicePoll>) =>\n Match.value(metadata.input).pipe(\n Match.tag(\"Granted\", () => Cause.done(metadata.input)),\n Match.tag(\"Refused\", () => Cause.done(metadata.input)),\n Match.tag(\"Pending\", () =>\n Ref.get(interval).pipe(\n Effect.map((delay) => Tuple.make(metadata.input, delay)),\n ),\n ),\n Match.tag(\"SlowDown\", () =>\n Ref.updateAndGet(interval, (delay) =>\n Duration.millis(\n Duration.toMillis(delay) + Duration.toMillis(DEVICE_SLOW_DOWN),\n ),\n ).pipe(Effect.map((delay) => Tuple.make(metadata.input, delay))),\n ),\n Match.exhaustive,\n ),\n ),\n );\n\n/**\n * Signs in through better-auth's device authorization grant.\n *\n * Prints and opens the verification URL, polls `/device/token` on the\n * server's interval (adding five seconds per `slow_down`), and returns the\n * session token once approved. The wait is bounded by the code's `expires_in`\n * (30 minutes when the server omits it); expiry, denial and an invalid code\n * each fail with one actionable line.\n */\nexport const deviceLogin = (options: {\n readonly origin: string;\n readonly clientId: string;\n readonly timeout?: Duration.Input | undefined;\n}): Effect.Effect<string, CliFailure, Browser | HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const code = yield* requestDeviceCode(options.origin, options.clientId);\n const verification = Option.getOrElse(\n code.verification_uri_complete,\n () => code.verification_uri,\n );\n // Print as well as open: a headless machine has no browser to open with.\n yield* Console.log(\n `Sign in at ${verification}\\nand confirm the code ${code.user_code} in the browser.`,\n );\n const browser = yield* Browser;\n yield* browser.open(verification);\n const interval = Duration.seconds(code.interval);\n const poll = pollDeviceToken(\n options.origin,\n options.clientId,\n code.device_code,\n );\n // RFC 8628 \u00A73.5: wait `interval` before the first poll, then let the\n // schedule pace every later one \u2014 delaying each repetition would double it.\n const untilFirstPoll = yield* Ref.make(true);\n const outcome = yield* Effect.suspend(() =>\n Effect.flatMap(Ref.getAndSet(untilFirstPoll, false), (isFirst) =>\n isFirst ? Effect.delay(poll, interval) : poll,\n ),\n ).pipe(\n Effect.repeat(devicePollSchedule(interval)),\n Effect.timeoutOrElse({\n duration: options.timeout ?? Duration.seconds(code.expires_in),\n orElse: () => Effect.fail(deviceExpiredFailure()),\n }),\n );\n return yield* Match.value(outcome).pipe(\n Match.tag(\"Granted\", (granted) => Effect.succeed(granted.token)),\n Match.tag(\"Refused\", (refused) => Effect.fail(refused.failure)),\n Match.orElse(() => Effect.fail(deviceExpiredFailure())),\n );\n });\n", "import { Effect, Option } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport { HttpClient, HttpClientRequest, HttpClientResponse } from \"effect/http\";\nimport * as Path from \"effect/Path\";\nimport * as Schema from \"effect/Schema\";\nimport {\n CliFailure,\n EXIT_FAILURE,\n EXIT_USAGE,\n Environment,\n StoreConfig,\n fail,\n oneLine,\n resolveDefaults,\n resolveProjectFlag,\n} from \"@braven/identity-store\";\n\n/** One file pushed through `POST {origin}/rpc/files/ingest`. */\nexport interface IngestOptions {\n readonly origin: string;\n readonly secret: string;\n readonly projectId: string;\n readonly path: string;\n readonly override: boolean;\n readonly file: string;\n}\n\n/** A project row as `GET /projects` spells it. */\nclass Project extends Schema.Class<Project>(\"Project\")({\n id: Schema.NonEmptyString,\n name: Schema.String,\n company_name: Schema.String,\n}) {}\n\n/** The file a successful `files.ingest` records. */\nexport class IngestedFile extends Schema.Class<IngestedFile>(\"IngestedFile\")({\n id: Schema.NonEmptyString,\n experiment_id: Schema.NonEmptyString,\n filename: Schema.NonEmptyString,\n}) {}\n\nclass ErrorJson extends Schema.Class<ErrorJson>(\"ErrorJson\")({\n message: Schema.String,\n}) {}\n\n/** oRPC's error envelope; anything else is surfaced verbatim. */\nclass ErrorBody extends Schema.Class<ErrorBody>(\"ErrorBody\")({\n json: ErrorJson,\n}) {}\n\nconst errorMessage = Schema.decodeUnknownOption(\n Schema.fromJsonString(ErrorBody),\n);\n\nconst requestFailure =\n (action: string, target: string) =>\n (cause: { readonly message: string }): CliFailure =>\n new CliFailure({\n message: `${action} ${target}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\nconst statusDetail = (text: string): string =>\n Option.match(errorMessage(text), {\n onNone: () => text,\n onSome: (body) => body.json.message,\n });\n\nconst statusFailure = (\n action: string,\n status: number,\n body: string,\n): CliFailure =>\n new CliFailure({\n message:\n `${action} failed (${status})${body ? `: ${oneLine(statusDetail(body))}` : \"\"}` +\n (status === 401 || status === 403\n ? \" \u2014 run `braven login`, or check `--project-id`\"\n : \"\"),\n exitCode: EXIT_FAILURE,\n });\n\nconst fetchProjects = (\n origin: string,\n secret: string,\n): Effect.Effect<ReadonlyArray<Project>, CliFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const response = yield* client\n .get(`${origin}/projects`, {\n headers: { authorization: `Bearer ${secret}` },\n })\n .pipe(Effect.mapError(requestFailure(\"cannot list projects at\", origin)));\n if (response.status !== 200) {\n const body = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* Effect.fail(\n statusFailure(\"listing projects\", response.status, body),\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(Schema.Array(Project))(\n response,\n ).pipe(\n Effect.mapError(requestFailure(\"cannot read projects from\", origin)),\n );\n });\n\n/**\n * The project to ingest into, in the CLI's usual precedence: `--project-id`,\n * `$BRAVEN_PROJECT_ID`, then the stored `defaults.project` resolved to an id\n * through `GET /projects` (narrowed by `defaults.company` when both are set).\n */\nexport const resolveProject = (options: {\n readonly origin: string;\n readonly secret: string;\n readonly flag: Option.Option<string>;\n}): Effect.Effect<\n string,\n CliFailure,\n Environment | FileSystem.FileSystem | HttpClient.HttpClient | StoreConfig\n> =>\n Effect.gen(function* () {\n const environment = yield* Environment;\n const flagged = resolveProjectFlag(options.flag, environment);\n if (Option.isSome(flagged)) return flagged.value;\n const defaults = yield* resolveDefaults();\n if (Option.isNone(defaults.project)) {\n return yield* fail(\n \"no project \u2014 pass --project-id, set BRAVEN_PROJECT_ID, or run `braven config set project <name>`\",\n EXIT_USAGE,\n );\n }\n const name = defaults.project.value;\n const projects = yield* fetchProjects(options.origin, options.secret);\n const matches = Arr.filter(\n projects,\n (project) =>\n project.name === name &&\n Option.match(defaults.company, {\n onNone: () => true,\n onSome: (company) => project.company_name === company,\n }),\n );\n return yield* Arr.match(matches, {\n onEmpty: () =>\n fail(\n `no project named \"${name}\" on ${options.origin} \u2014 pass --project-id`,\n EXIT_USAGE,\n ),\n onNonEmpty: (found) =>\n found.length > 1\n ? fail(\n `more than one project is named \"${name}\" \u2014 pass --project-id`,\n EXIT_USAGE,\n )\n : Effect.succeed(found[0].id),\n });\n });\n\n/** The ingest request's multipart body: `path` and `override` as fields and the\n * bytes as `file` \u2014 the same shape `POST /files` and the Python SDK send. */\nconst multipart = (\n options: IngestOptions,\n name: string,\n bytes: Uint8Array,\n): FormData => {\n const form = new FormData();\n form.append(\"file\", new File([Uint8Array.from(bytes)], name));\n form.append(\"path\", options.path);\n form.append(\"override\", options.override ? \"true\" : \"false\");\n return form;\n};\n\n/**\n * Uploads one local file through the `files.ingest` procedure. The bytes ride\n * the request as multipart; the project rides `X-Project-Id`, the credential\n * `Authorization: Bearer` \u2014 the procedure's two headers.\n */\nexport const ingest = (\n options: IngestOptions,\n): Effect.Effect<\n IngestedFile,\n CliFailure,\n FileSystem.FileSystem | HttpClient.HttpClient | Path.Path\n> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const paths = yield* Path.Path;\n const bytes = yield* fs\n .readFile(options.file)\n .pipe(Effect.mapError(requestFailure(\"cannot read\", options.file)));\n const name = paths.basename(options.file);\n const body = multipart(options, name, bytes);\n const client = yield* HttpClient.HttpClient;\n const request = HttpClientRequest.post(\n `${options.origin}/files/ingest`,\n ).pipe(\n HttpClientRequest.bearerToken(options.secret),\n HttpClientRequest.setHeader(\"x-project-id\", options.projectId),\n HttpClientRequest.bodyFormData(body),\n );\n const response = yield* client\n .execute(request)\n .pipe(Effect.mapError(requestFailure(\"cannot reach\", options.origin)));\n if (response.status < 200 || response.status >= 300) {\n const text = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* Effect.fail(\n statusFailure(\"files.ingest\", response.status, text),\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(IngestedFile)(\n response,\n ).pipe(\n Effect.mapError(\n requestFailure(\n \"cannot read files.ingest's answer from\",\n options.origin,\n ),\n ),\n );\n });\n", "/**\n * `braven pipeline` \u2014 a thin Node boundary over the Python authoring compiler,\n * plus the sync commands (plan 069). The compiler service and the sync engine\n * live in `@braven/pipeline-sync`; this module only builds the command tree and\n * the CLI renders outcomes and exit codes.\n */\nimport { Argument, Command, Flag } from \"effect/cli\";\nimport { Effect } from \"effect\";\nimport { withSource } from \"@braven/pipeline-sync/compiler\";\nimport {\n applyCommand,\n diffCommand,\n pullCommand,\n pushCommand,\n rejectCommand,\n statusCommand,\n} from \"./pipeline/commands.ts\";\nimport { compareCommand, recomputeCommand } from \"./pipeline/results.ts\";\n\nexport * from \"@braven/pipeline-sync/compiler\";\n\nconst compileCommand = Command.make(\n \"compile\",\n {\n source: Argument.String(\"source\").pipe(\n Argument.withMetavar(\"path\"),\n Argument.withDescription(\"the Python pipeline file to compile\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"write the canonical IR to stdout\"),\n ),\n check: Flag.Boolean(\"check\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"compile without a success summary (CI)\"),\n ),\n },\n Effect.fn(function* ({ source, json, check }) {\n yield* withSource(\"compile\", source, [\n ...(json ? [\"--json\"] : []),\n ...(check ? [\"--check\"] : []),\n ]);\n }),\n).pipe(\n Command.withDescription(\n \"compile a Python pipeline to canonical IR (exit 2 on validation errors)\",\n ),\n);\n\nconst validateCommand = Command.make(\n \"validate\",\n {\n source: Argument.String(\"source\").pipe(\n Argument.withMetavar(\"file|-\"),\n Argument.withDescription(\n \"a Python pipeline, an IR JSON file, or - for stdin\",\n ),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the validity summary as JSON\"),\n ),\n check: Flag.Boolean(\"check\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"validate without printing ok\"),\n ),\n },\n Effect.fn(function* ({ source, json, check }) {\n yield* withSource(\n \"validate\",\n source,\n [...(json ? [\"--json\"] : []), ...(check ? [\"--check\"] : [])],\n source === \"-\" ? { stdin: \"inherit\" } : undefined,\n );\n }),\n).pipe(Command.withDescription(\"validate a pipeline source or an IR document\"));\n\n/** The `braven pipeline` group. */\nexport const pipelineCommand = Command.make(\"pipeline\").pipe(\n Command.withDescription(\n \"compile, validate, diff and synchronize a pipeline definition\",\n ),\n Command.withSubcommands([\n compileCommand,\n validateCommand,\n statusCommand,\n diffCommand,\n pushCommand,\n pullCommand,\n applyCommand,\n rejectCommand,\n recomputeCommand,\n compareCommand,\n ]),\n);\n", "/**\n * The `braven pipeline` commands that touch sync (plan 069).\n *\n * Each handler compiles through the one compiler boundary, calls the protocol\n * in `sync.ts` and renders the typed outcome. Exit codes follow the plan:\n * `0` success/no-op, `2` conflict or refused apply, `3` usage/config,\n * `4` network/auth. A printed report is never repeated as a `braven:` line.\n */\nimport { Argument, Command, Flag } from \"effect/cli\";\nimport { Console, Effect, Option, Schema } from \"effect\";\nimport { HttpClient } from \"effect/http\";\nimport * as Arr from \"effect/Array\";\nimport {\n CliFailure,\n Environment,\n fail,\n resolveCredential,\n} from \"@braven/identity-store\";\nimport { canonicalJson, decodePipelineIr, irHashOf } from \"@braven/pipeline-ir\";\nimport {\n IrConflict,\n PipelineDiff,\n PipelineExit,\n PipelineSyncState,\n PatchChange,\n PatchRefusal,\n applyVerified,\n compileIr,\n diffIr,\n makeClient,\n pull,\n push,\n readSource,\n readState,\n stableText,\n type PipelineApi,\n type ProposalSummary,\n type PullOutcome,\n type RevisionHead,\n} from \"@braven/pipeline-sync\";\n\n/** Plan 069's exit codes: conflict/refused, usage/config, network/auth. */\nconst EXIT_CONFLICT = 2;\nconst EXIT_USAGE = 3;\nconst EXIT_NETWORK = 4;\n\n/** Compiles the source and decodes the compiler's bytes. */\nconst compileLocal = (cwd: string, source: string) =>\n compileIr(source, { cwd }).pipe(\n Effect.flatMap(decodePipelineIr),\n Effect.mapError((error) =>\n error instanceof PipelineExit\n ? error\n : new PipelineExit({\n code: 2,\n message: `the compiler returned an unreadable IR: ${error.message}`,\n }),\n ),\n );\n\n/** The process working directory, for the sibling result commands. */\nexport const currentDirectory = Environment.pipe(\n Effect.map((shape) => shape.cwd),\n);\n\n/** Reads `.braven/pipeline.json`, or fails 3 when the checkout has no base. */\nexport const loadState = (cwd: string) =>\n Effect.gen(function* () {\n const state = yield* readState(cwd);\n if (Option.isNone(state))\n return yield* fail(\n \"no .braven/pipeline.json \u2014 this checkout has no pipeline to sync\",\n EXIT_USAGE,\n );\n return state.value;\n }).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(\n new CliFailure({\n message: `${error.path}: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n ),\n );\n\n/** The API client for the state's pipeline, using this machine's credential. */\nexport const apiFor = (state: PipelineSyncState) =>\n Effect.gen(function* () {\n const credential = yield* resolveCredential({\n origin: Option.some(state.origin),\n email: Option.none(),\n }).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({ message: error.message, exitCode: EXIT_NETWORK }),\n ),\n );\n if (Option.isNone(credential))\n return yield* fail(\n `not signed in to ${state.origin} \u2014 run \\`braven login\\``,\n EXIT_NETWORK,\n );\n return makeClient({\n origin: state.origin,\n secret: credential.value.secret,\n pipelineId: state.pipelineId,\n });\n });\n\n/** JSON output goes through the Schema codec, never `JSON.stringify`. */\nexport const printJson = (value: unknown) =>\n Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown))(value).pipe(\n Effect.orDie,\n Effect.flatMap((text) => Console.log(text)),\n );\n\n/** The wire shape of a report class; `printJson` does the final encoding. */\nconst encoded = <S extends Schema.ConstraintEncoder<unknown, never>>(\n schema: S,\n value: S[\"Type\"],\n): unknown => Schema.encodeSync(schema)(value);\n\nconst show = (value: Schema.Json): string =>\n typeof value === \"string\"\n ? value\n : typeof value === \"number\" || typeof value === \"boolean\"\n ? String(value)\n : value === null\n ? \"null\"\n : stableText(value);\n\nconst printConflicts = (\n conflicts: ReadonlyArray<IrConflict>,\n): Effect.Effect<void> =>\n Console.log(\n Arr.join(\n conflicts.map((conflict) =>\n [\n `conflict ${conflict.path} (${conflict.kind})`,\n ` base ${show(conflict.base)}`,\n ` local ${show(conflict.local)}`,\n ` remote ${show(conflict.remote)}`,\n ` ${conflict.hint}`,\n ].join(\"\\n\"),\n ),\n \"\\n\",\n ),\n );\n\nconst conflictReport = (conflicts: ReadonlyArray<IrConflict>) => ({\n status: \"conflict\",\n conflicts: conflicts.map((conflict) => encoded(IrConflict, conflict)),\n});\n\nconst headJson = (head: RevisionHead) => ({\n revisionId: head.revisionId,\n number: head.number,\n contentHash: head.contentHash,\n});\n\n/** Prints a local summary; with a state file it also names base and head. */\nexport const statusCommand = Command.make(\n \"status\",\n {\n source: Argument.String(\"source\").pipe(\n Argument.optional,\n Argument.withMetavar(\"path\"),\n Argument.withDescription(\n \"the pipeline source (default: the state's source, else ./pipeline.py)\",\n ),\n ),\n },\n Effect.fn(function* ({ source }) {\n const cwd = yield* currentDirectory;\n const state = yield* readState(cwd).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(\n new CliFailure({\n message: `${error.path}: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n ),\n );\n const resolved = Option.getOrElse(source, () =>\n Option.match(state, {\n onNone: () => \"pipeline.py\",\n onSome: (value) => value.source,\n }),\n );\n const ir = yield* compileLocal(cwd, resolved);\n const localHash = yield* irHashOf(ir).pipe(Effect.orDie);\n yield* Console.log(\n [\n `pipeline ${ir.pipeline.name}`,\n `source ${ir.runtime.entry}`,\n `steps ${ir.steps.length}`,\n `edges ${ir.edges.length}`,\n `irHash ${localHash}`,\n ].join(\"\\n\"),\n );\n\n if (Option.isNone(state)) {\n yield* Console.log(\n \"state untracked \u2014 run `braven pipeline pull` or push a new pipeline\",\n );\n return;\n }\n const current = state.value;\n const api = yield* apiFor(current);\n const head = yield* api.head().pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n const relation = Option.match(head, {\n onNone: () => \"unpublished\",\n onSome: (value) =>\n localHash === value.contentHash\n ? \"at head\"\n : current.baseRevisionId === value.revisionId\n ? localHash === current.baseContentHash\n ? \"behind\"\n : \"ahead\"\n : localHash === current.baseContentHash\n ? \"behind\"\n : \"diverged\",\n });\n yield* Console.log(\n [\n `base ${current.baseRevisionId} ${current.baseContentHash}`,\n `head ${Option.match(head, {\n onNone: () => \"none\",\n onSome: (value) => `${value.revisionId} ${value.contentHash}`,\n })}`,\n `local ${localHash === current.baseContentHash ? \"clean\" : \"dirty\"}`,\n `sync ${relation}`,\n ].join(\"\\n\"),\n );\n }),\n).pipe(\n Command.withDescription(\"print the local hash, base, head and dirty flag\"),\n);\n\nconst resolveRevision = (\n api: PipelineApi,\n revision: string,\n): Effect.Effect<string, CliFailure, HttpClient.HttpClient> =>\n revision === \"HEAD\"\n ? api.head().pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n Effect.flatMap((head) =>\n Option.isNone(head)\n ? fail(\"this pipeline has no published revision\", EXIT_USAGE)\n : Effect.succeed(head.value.revisionId),\n ),\n )\n : Effect.succeed(revision);\n\nconst renderDiff = (diff: PipelineDiff): string => {\n const lines: Array<string> = [];\n const stepLines = [\n ...diff.steps.added.map((step) => ` + ${step.id} (${step.name})`),\n ...diff.steps.removed.map((step) => ` - ${step.id} (${step.name})`),\n ...diff.steps.renamed.map(\n (step) =>\n ` ~ ${step.from.id} (${step.from.name}) -> ${step.to.id} (${step.to.name})`,\n ),\n ];\n const edgeLines = [\n ...diff.edges.added.map((edge) => ` + ${edge.from} -> ${edge.to}`),\n ...diff.edges.removed.map((edge) => ` - ${edge.from} -> ${edge.to}`),\n ];\n const portLines = diff.ports.map(\n (port) =>\n ` ${port.step}.${port.side}.${port.port} ${port.field}: ${show(port.from)} -> ${show(port.to)}`,\n );\n const paramLines = diff.params.map(\n (param) =>\n ` ${param.step}.${param.name} ${param.field}: ${show(param.from)} -> ${show(param.to)}`,\n );\n const runtimeLines = diff.runtime.map(\n (field) => ` ${field.field}: ${show(field.from)} -> ${show(field.to)}`,\n );\n const metadataLines = diff.metadata.map(\n (field) => ` ${field.field}: ${show(field.from)} -> ${show(field.to)}`,\n );\n const sections: ReadonlyArray<readonly [string, ReadonlyArray<string>]> = [\n [\"steps\", stepLines],\n [\"ports\", portLines],\n [\"params\", paramLines],\n [\"edges\", edgeLines],\n [\"runtime\", runtimeLines],\n [\"metadata\", metadataLines],\n ];\n sections.forEach(([name, section]) => {\n if (section.length > 0) lines.push(name, ...section);\n });\n return lines.length === 0 ? \"no changes\" : lines.join(\"\\n\");\n};\n\nexport const diffCommand = Command.make(\n \"diff\",\n {\n from: Flag.String(\"from\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the base revision (default: the sync state's base)\",\n ),\n ),\n to: Flag.String(\"to\").pipe(\n Flag.withDefault(\"HEAD\"),\n Flag.withDescription(\"the revision to compare against (default: HEAD)\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the report as JSON\"),\n ),\n },\n Effect.fn(function* ({ from, to, json: asJson }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const fromId = yield* Option.match(from, {\n onNone: () => Effect.succeed(state.baseRevisionId),\n onSome: (value) => resolveRevision(api, value),\n });\n const toId = yield* resolveRevision(api, to);\n if (fromId === toId) {\n yield* asJson\n ? printJson({ from: fromId, to: toId, diff: null })\n : Console.log(`no changes (${fromId})`);\n return;\n }\n const fetch = (revisionId: string) =>\n Effect.gen(function* () {\n const document = yield* api.revision(revisionId).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n return yield* decodePipelineIr(document.ir).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `revision ${revisionId} is unreadable: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n );\n });\n const [before, after] = yield* Effect.all([fetch(fromId), fetch(toId)], {\n concurrency: 2,\n });\n const diff = diffIr(before, after);\n if (asJson) {\n yield* printJson({\n from: fromId,\n to: toId,\n diff: encoded(PipelineDiff, diff),\n });\n return;\n }\n yield* Console.log(renderDiff(diff));\n }),\n).pipe(Command.withDescription(\"diff two revisions, section by section\"));\n\nconst renderPull = (outcome: PullOutcome): string => {\n if (outcome.status === \"up-to-date\")\n return `already at head ${outcome.head.revisionId} (revision ${outcome.head.number})`;\n if (outcome.status === \"fast-forward\")\n return `the definition advanced to revision ${outcome.head.number}; source is unchanged`;\n if (outcome.status === \"local-ahead\")\n return `local changes are not published; base advanced to revision ${outcome.head.number}`;\n if (outcome.status === \"applied\")\n return [\n `applied ${outcome.changes.length} edit(s) for ${outcome.proposals.length} proposal(s)`,\n ...outcome.changes.map(\n (change) => ` ${change.path}: ${change.before} -> ${change.after}`,\n ),\n ].join(\"\\n\");\n if (outcome.status === \"check\")\n return [\n outcome.changes.length === 0\n ? \"nothing to apply\"\n : `would apply ${outcome.changes.length} edit(s) for ${outcome.proposals.length} proposal(s)`,\n ...outcome.changes.map(\n (change) => ` ${change.path}: ${change.before} -> ${change.after}`,\n ),\n ].join(\"\\n\");\n if (outcome.status === \"remote-ahead\")\n return \"the published definition has changes this source does not contain; reconcile them in the source, then push\";\n if (outcome.status === \"conflict\") return \"conflict\";\n return \"refused\";\n};\n\nexport const pullCommand = Command.make(\n \"pull\",\n {\n apply: Flag.Boolean(\"apply\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"write round-trip-safe proposals to the source (the default)\",\n ),\n ),\n check: Flag.Boolean(\"check\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"compute everything, write nothing (CI)\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the report as JSON\"),\n ),\n },\n Effect.fn(function* ({ apply, check, json: asJson }) {\n if (apply && check)\n return yield* fail(\n \"--apply and --check are mutually exclusive\",\n EXIT_USAGE,\n );\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const sourceText = yield* readSource(cwd, state.source);\n const local = yield* compileLocal(cwd, state.source);\n const outcome = yield* pull({ cwd, api, local, sourceText, check });\n\n if (asJson) {\n if (outcome.status === \"conflict\")\n yield* printJson(conflictReport(outcome.conflicts));\n if (outcome.status === \"refused\")\n yield* printJson({\n status: \"refused\",\n refusals: outcome.refusals.map((refusal) =>\n encoded(PatchRefusal, refusal),\n ),\n });\n if (outcome.status === \"applied\" || outcome.status === \"check\")\n yield* printJson({\n status: outcome.status,\n head: headJson(outcome.head),\n proposals: outcome.proposals,\n changes: outcome.changes.map((change) =>\n encoded(PatchChange, change),\n ),\n });\n if (\n outcome.status === \"up-to-date\" ||\n outcome.status === \"fast-forward\" ||\n outcome.status === \"local-ahead\" ||\n outcome.status === \"remote-ahead\"\n )\n yield* printJson({\n status: outcome.status,\n head: headJson(outcome.head),\n });\n } else {\n yield* Console.log(renderPull(outcome));\n if (outcome.status === \"conflict\")\n yield* printConflicts(outcome.conflicts);\n if (outcome.status === \"refused\")\n yield* Console.log(\n outcome.refusals\n .map(\n (refusal) =>\n `refused ${refusal.op} at ${refusal.path} (${refusal.reason}): ${refusal.detail}`,\n )\n .join(\"\\n\"),\n );\n }\n\n if (\n outcome.status === \"conflict\" ||\n outcome.status === \"refused\" ||\n outcome.status === \"remote-ahead\"\n )\n return yield* fail(\"\", EXIT_CONFLICT);\n }),\n).pipe(\n Command.withDescription(\"fetch the head and apply round-trip-safe proposals\"),\n);\n\nexport const pushCommand = Command.make(\n \"push\",\n {\n base: Flag.String(\"base\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"merge from this revision instead of the state's base\",\n ),\n ),\n pipelineId: Flag.String(\"pipeline-id\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the pipeline to publish into (first push, without a state file)\",\n ),\n ),\n source: Flag.String(\"source\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the Python source (first push; default: ./pipeline.py)\",\n ),\n ),\n dryRun: Flag.Boolean(\"dry-run\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"compute the merge and print what would be published\",\n ),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the report as JSON\"),\n ),\n },\n Effect.fn(function* ({ base, pipelineId, source, dryRun, json: asJson }) {\n const cwd = yield* currentDirectory;\n const state = yield* readState(cwd).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(\n new CliFailure({\n message: `${error.path}: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n ),\n );\n const credential = yield* resolveCredential({\n origin: Option.map(state, (value) => value.origin),\n email: Option.none(),\n }).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({ message: error.message, exitCode: EXIT_NETWORK }),\n ),\n );\n if (Option.isNone(credential))\n return yield* fail(\"not signed in \u2014 run `braven login`\", EXIT_NETWORK);\n\n const resolvedPipelineId = Option.orElse(pipelineId, () =>\n Option.map(state, (value) => value.pipelineId),\n );\n if (Option.isNone(resolvedPipelineId))\n return yield* fail(\n \"no pipeline to push to \u2014 pass --pipeline-id for the first push, or run `braven pipeline pull`\",\n EXIT_USAGE,\n );\n const resolvedSource = Option.getOrElse(\n Option.orElse(source, () => Option.map(state, (value) => value.source)),\n () => \"pipeline.py\",\n );\n const origin = Option.match(state, {\n onNone: () => credential.value.origin,\n onSome: (value) => value.origin,\n });\n const api = makeClient({\n origin,\n secret: credential.value.secret,\n pipelineId: resolvedPipelineId.value,\n });\n const local = yield* compileLocal(cwd, resolvedSource);\n const baseRevisionId = Option.orElse(base, () =>\n Option.map(state, (value) => value.baseRevisionId),\n );\n const outcome = yield* push({\n cwd,\n api,\n local,\n identity: {\n origin,\n pipelineId: resolvedPipelineId.value,\n source: resolvedSource,\n },\n baseRevisionId,\n dryRun,\n });\n\n if (asJson) {\n if (outcome.status === \"published\")\n yield* printJson({\n status: outcome.status,\n merged: outcome.merged,\n revision: {\n revisionId: outcome.revision.revisionId,\n number: outcome.revision.number,\n contentHash: outcome.revision.contentHash,\n },\n });\n if (outcome.status === \"conflict\")\n yield* printJson(conflictReport(outcome.conflicts));\n if (outcome.status === \"dry-run\")\n yield* printJson({\n status: outcome.status,\n merged: outcome.merged,\n irHash: yield* irHashOf(outcome.ir).pipe(Effect.orDie),\n ir: canonicalJson(outcome.ir),\n });\n if (\n outcome.status === \"up-to-date\" ||\n outcome.status === \"remote-has-changes\"\n )\n yield* printJson({\n status: outcome.status,\n head: headJson(outcome.head),\n });\n } else {\n if (outcome.status === \"published\")\n yield* Console.log(\n outcome.merged\n ? `published revision ${outcome.revision.number} (merged, ${outcome.revision.contentHash})`\n : `published revision ${outcome.revision.number} (${outcome.revision.contentHash})`,\n );\n if (outcome.status === \"up-to-date\")\n yield* Console.log(\n `already at head ${outcome.head.revisionId} (revision ${outcome.head.number})`,\n );\n if (outcome.status === \"remote-has-changes\")\n yield* Console.log(\n `the remote definition already contains your changes (revision ${outcome.head.number}); nothing published`,\n );\n if (outcome.status === \"dry-run\")\n yield* Console.log(\n `would publish ${yield* irHashOf(outcome.ir).pipe(Effect.orDie)}${outcome.merged ? \" (merged)\" : \"\"}`,\n );\n if (outcome.status === \"conflict\") {\n yield* printConflicts(outcome.conflicts);\n if (outcome.conflicts.length === 0)\n yield* Console.log(\n \"the head moved again while publishing; nothing was published \u2014 re-run push\",\n );\n }\n }\n\n if (outcome.status === \"conflict\") return yield* fail(\"\", EXIT_CONFLICT);\n }),\n).pipe(\n Command.withDescription(\"publish the local definition, merging divergence\"),\n);\n\nconst findProposal = (api: PipelineApi, proposalId: string) =>\n Effect.gen(function* () {\n const proposals = yield* api.proposals({}).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n const found = proposals.find(\n (proposal: ProposalSummary) => proposal.id === proposalId,\n );\n if (found === undefined)\n return yield* fail(\n `no proposal ${proposalId} on this pipeline`,\n EXIT_USAGE,\n );\n return found;\n });\n\nexport const applyCommand = Command.make(\n \"apply\",\n {\n proposalId: Argument.String(\"proposal-id\").pipe(\n Argument.withMetavar(\"id\"),\n Argument.withDescription(\"the proposal to apply to the source\"),\n ),\n },\n Effect.fn(function* ({ proposalId }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const proposal = yield* findProposal(api, proposalId);\n if (proposal.status !== \"open\")\n return yield* fail(\n `proposal ${proposalId} is ${proposal.status}, not open`,\n EXIT_USAGE,\n );\n const local = yield* compileLocal(cwd, state.source);\n const sourceText = yield* readSource(cwd, state.source);\n const baseDocument = yield* api.revision(proposal.baseRevisionId).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n const base = yield* decodePipelineIr(baseDocument.ir).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `the proposal's base revision is unreadable: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n );\n const result = yield* applyVerified({\n cwd,\n source: state.source,\n sourceText,\n local,\n base,\n ops: proposal.patch,\n write: true,\n });\n if (result.status === \"refused\") {\n yield* Console.log(\n result.refusals\n .map(\n (refusal) =>\n `refused ${refusal.op} at ${refusal.path} (${refusal.reason}): ${refusal.detail}`,\n )\n .join(\"\\n\"),\n );\n return yield* fail(\"\", EXIT_CONFLICT);\n }\n yield* Console.log(\n [\n `applied proposal ${proposalId}`,\n ...result.changes.map(\n (change) => ` ${change.path}: ${change.before} -> ${change.after}`,\n ),\n \"the source is edited but not published; review it, then run `braven pipeline push`\",\n ].join(\"\\n\"),\n );\n }),\n).pipe(\n Command.withDescription(\n \"apply one proposal to the source (safe constructs only)\",\n ),\n);\n\nexport const rejectCommand = Command.make(\n \"reject\",\n {\n proposalId: Argument.String(\"proposal-id\").pipe(\n Argument.withMetavar(\"id\"),\n Argument.withDescription(\"the proposal to decline\"),\n ),\n },\n Effect.fn(function* ({ proposalId }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n yield* api.reject(proposalId).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n yield* Console.log(`rejected ${proposalId}`);\n }),\n).pipe(Command.withDescription(\"decline a proposal on the server\"));\n", "/**\n * `braven pipeline recompute` and `braven pipeline compare` (plan 072).\n *\n * The engine and the API client live in `@braven/pipeline-sync`; this module\n * only renders the typed outcome and chooses the exit code. A comparison's axis\n * is printed before any delta \u2014 a reader must never see \"the number moved\"\n * without knowing whether the evidence moved too.\n */\nimport { Argument, Command, Flag } from \"effect/cli\";\nimport { Console, Effect, Match, Option, Schema } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport { CliFailure } from \"@braven/identity-store\";\nimport type {\n AnalysisResultRef,\n Comparison,\n ComparisonAxis,\n PipelineApiError,\n} from \"@braven/pipeline-sync\";\nimport { apiFor, currentDirectory, loadState, printJson } from \"./commands.ts\";\n\n/** 0 ok, 2 refused, 3 usage/unknown id, 4 network or server fault. */\nconst exitFor = (error: PipelineApiError): number =>\n Option.match(error.status, {\n onNone: () => 4,\n onSome: (status) => (status === 409 ? 2 : status < 500 ? 3 : 4),\n });\n\nconst apiFailure = (error: PipelineApiError) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: exitFor(error),\n });\n\n/** `--param threshold=0.05` \u2192 `0.05`; `true`/`false` stay booleans, everything\n * else is a string. The server validates the kind against the revision. */\nconst scalar = (text: string): string | number | boolean =>\n Match.value(text).pipe(\n Match.when(\"true\", () => true),\n Match.when(\"false\", () => false),\n Match.orElse((value) =>\n Option.getOrElse(\n Schema.decodeUnknownOption(Schema.FiniteFromString)(value),\n () => value,\n ),\n ),\n );\n\nconst parametersOf = (\n supplied: Option.Option<Record<string, string>>,\n): Record<string, string | number | boolean> =>\n Option.match(supplied, {\n onNone: () => ({}),\n onSome: (values) =>\n Object.fromEntries(\n Object.entries(values).map(([key, value]) => [key, scalar(value)]),\n ),\n });\n\nconst axisLabel = (axis: ComparisonAxis): string =>\n Match.value(axis).pipe(\n Match.when(\n \"identical\",\n () => \"identical method, evidence and configuration\",\n ),\n Match.when(\n \"configuration\",\n () => \"same evidence \u00B7 same method \u00B7 different configuration\",\n ),\n Match.when(\"method\", () => \"same evidence \u00B7 different method\"),\n Match.when(\"evidence\", () => \"same method \u00B7 different evidence\"),\n Match.when(\"both\", () => \"different method \u00B7 different evidence\"),\n Match.exhaustive,\n );\n\n/** Hashes are long; the two-column report has one narrow field per side. */\nconst short = (hash: string | null): string =>\n hash === null ? \"\u2014\" : hash.slice(0, 14);\n\nconst at = (time: Date): string =>\n time.toISOString().slice(0, 16).replace(\"T\", \" \");\n\nconst row = (label: string, left: string, right: string): string =>\n `${label.padEnd(14)}${left.padEnd(34)}${right}`;\n\nconst renderComparison = (comparison: Comparison): string => {\n const outputLines = Arr.map(\n comparison.outputs,\n (output) =>\n ` ${output.name.padEnd(20)}${short(output.left?.content_hash ?? null)} \u2192 ${short(output.right?.content_hash ?? null)}${output.changed ? \" (changed)\" : \" (unchanged)\"}`,\n );\n const metricLines = Arr.map(\n comparison.metrics,\n (metric) =>\n ` ${metric.key.padEnd(20)}${String(metric.left)} \u2192 ${String(metric.right)}${\n metric.delta === null\n ? \"\"\n : ` (${metric.delta >= 0 ? \"+\" : \"\"}${metric.delta.toFixed(2)})`\n }`,\n );\n return [\n axisLabel(comparison.axis),\n \"\",\n row(\"\", \"left\", \"right\"),\n row(\n \"revision\",\n short(comparison.left.revision_hash),\n short(comparison.right.revision_hash),\n ),\n row(\n \"evidence\",\n short(comparison.left.input_snapshot_hash),\n short(comparison.right.input_snapshot_hash),\n ),\n row(\n \"configuration\",\n short(comparison.left.parameters_hash),\n short(comparison.right.parameters_hash),\n ),\n row(\n \"completed\",\n at(comparison.left.created_at),\n at(comparison.right.created_at),\n ),\n \"\",\n \"outputs\",\n ...(outputLines.length === 0 ? [\" (none)\"] : outputLines),\n \"\",\n \"kpis\",\n ...(metricLines.length === 0 ? [\" (no shared metrics)\"] : metricLines),\n \"\",\n \"manifests\",\n ` left run ${comparison.left.run_id}`,\n ` right run ${comparison.right.run_id}`,\n ].join(\"\\n\");\n};\n\nexport const recomputeCommand = Command.make(\n \"recompute\",\n {\n revision: Flag.String(\"revision\").pipe(\n Flag.withDescription(\"the published revision to run (the method)\"),\n ),\n snapshot: Flag.String(\"snapshot\").pipe(\n Flag.withDescription(\n \"the evidence hash a result was written on (its input_snapshot_hash)\",\n ),\n ),\n param: Flag.KeyValuePair(\"param\").pipe(\n Flag.optional,\n Flag.withDescription(\"a parameter as k=v; repeat for several\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the outcome as JSON\"),\n ),\n },\n Effect.fn(function* ({ revision, snapshot, param, json }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const outcome = yield* api\n .recompute({\n revisionId: revision,\n inputSnapshotId: snapshot,\n parameters: parametersOf(param),\n })\n .pipe(Effect.mapError(apiFailure));\n\n if (json) {\n yield* printJson({\n run_id: outcome.run.id,\n status: outcome.run.status,\n revision_id: outcome.run.revision_id,\n input_snapshot_id: outcome.input_snapshot_id,\n previous_results: Arr.map(\n outcome.previous_results,\n (result: AnalysisResultRef) => ({\n id: result.id,\n run_id: result.run_id,\n revision_id: result.revision_id,\n revision_hash: result.revision_hash,\n }),\n ),\n });\n return;\n }\n yield* Console.log(\n [\n `queued run ${outcome.run.id} on revision ${revision} (snapshot ${short(snapshot)})`,\n \"the result is written when the run succeeds; nothing here replaces an earlier result\",\n Arr.match(outcome.previous_results, {\n onEmpty: () => \"no earlier results on this evidence\",\n onNonEmpty: (results) =>\n [\n `${results.length} earlier result${results.length === 1 ? \"\" : \"s\"} on this evidence:`,\n ...results.map(\n (result) => ` ${result.id} ${short(result.revision_hash)}`,\n ),\n ].join(\"\\n\"),\n }),\n ].join(\"\\n\"),\n );\n }),\n).pipe(\n Command.withDescription(\n \"re-run a published revision on an existing input snapshot\",\n ),\n);\n\nexport const compareCommand = Command.make(\n \"compare\",\n {\n left: Argument.String(\"result-a\").pipe(\n Argument.withMetavar(\"result-a\"),\n Argument.withDescription(\"the baseline result id\"),\n ),\n right: Argument.String(\"result-b\").pipe(\n Argument.withMetavar(\"result-b\"),\n Argument.withDescription(\"the result to compare against it\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the comparison as JSON\"),\n ),\n },\n Effect.fn(function* ({ left, right, json }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const comparison = yield* api\n .compare(left, right)\n .pipe(Effect.mapError(apiFailure));\n if (json) {\n yield* printJson(comparison);\n return;\n }\n yield* Console.log(renderComparison(comparison));\n }),\n).pipe(\n Command.withDescription(\n \"compare two immutable results, naming the axis that moved\",\n ),\n);\n", "import {\n type EnvironmentShape,\n CliFailure,\n EXIT_FAILURE,\n EXIT_USAGE,\n Environment,\n fail,\n oneLine,\n} from \"@braven/identity-store\";\nimport { Console, Effect, Equal, Match, Option } from \"effect\";\nimport * as Bool from \"effect/Boolean\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as P from \"effect/Predicate\";\nimport * as R from \"effect/Record\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\nimport type { PlatformError } from \"effect/PlatformError\";\n\n/** The clients `braven mcp install --client` understands. */\nexport const CLIENTS = [\"claude\", \"cursor\", \"zed\", \"vscode\"] as const;\n\n/** One supported MCP host. */\nexport type Client = (typeof CLIENTS)[number];\n\n/** The object each client nests custom stdio servers under. */\nconst serversKey: Record<Client, string> = {\n claude: \"mcpServers\",\n cursor: \"mcpServers\",\n zed: \"context_servers\",\n vscode: \"servers\",\n};\n\nconst displayName: Record<Client, string> = {\n claude: \"Claude Desktop\",\n cursor: \"Cursor\",\n zed: \"Zed\",\n vscode: \"VS Code\",\n};\n\n/**\n * The entry a client launches: the CLI's own stdio subcommand.\n *\n * VS Code needs the explicit `stdio` transport; the others infer it. No\n * credential is passed \u2014 the server reads the identity store.\n */\nconst serverEntry = (client: Client): Record<string, unknown> =>\n client === \"vscode\"\n ? { type: \"stdio\", command: \"braven\", args: [\"mcp\"] }\n : { command: \"braven\", args: [\"mcp\"] };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n P.isObject(value);\n\nconst asRecord = (value: unknown): Option.Option<Record<string, unknown>> =>\n Option.liftPredicate(isRecord)(value);\n\nconst value = (shape: EnvironmentShape, name: string) =>\n Option.filter(Option.fromNullishOr(shape.values[name]), Str.isNonEmpty);\n\nconst join = (shape: EnvironmentShape, ...parts: ReadonlyArray<string>) =>\n parts.join(shape.platform === \"win32\" ? \"\\\\\" : \"/\");\n\n/** The platform's per-user application directory. */\nconst applications = (shape: EnvironmentShape): string =>\n Match.value(shape.platform).pipe(\n Match.when(\"darwin\", () =>\n join(shape, shape.home, \"Library/Application Support\"),\n ),\n Match.when(\"win32\", () =>\n Option.getOrElse(value(shape, \"APPDATA\"), () =>\n join(shape, shape.home, \"AppData\\\\Roaming\"),\n ),\n ),\n Match.orElse(() =>\n Option.getOrElse(value(shape, \"XDG_CONFIG_HOME\"), () =>\n join(shape, shape.home, \".config\"),\n ),\n ),\n );\n\n/**\n * The MCP config file a client reads by default.\n *\n * VS Code is workspace-scoped (`.vscode/mcp.json` under the current\n * directory); the rest are per-user files.\n */\nexport const configPathFor = (\n client: Client,\n shape: EnvironmentShape,\n): string =>\n Match.value(client).pipe(\n Match.when(\"claude\", () =>\n join(shape, applications(shape), \"Claude\", \"claude_desktop_config.json\"),\n ),\n Match.when(\"cursor\", () => join(shape, shape.home, \".cursor\", \"mcp.json\")),\n Match.when(\"zed\", () =>\n Match.value(shape.platform).pipe(\n Match.when(\"linux\", () =>\n join(shape, applications(shape), \"zed\", \"settings.json\"),\n ),\n Match.orElse(() =>\n join(shape, applications(shape), \"Zed\", \"settings.json\"),\n ),\n ),\n ),\n Match.when(\"vscode\", () => join(shape, shape.cwd, \".vscode\", \"mcp.json\")),\n Match.exhaustive,\n );\n\n/** What installing would do, decided without touching the file. */\nexport type InstallPlan =\n | { readonly kind: \"unchanged\" }\n | { readonly kind: \"conflict\"; readonly current: unknown }\n | { readonly kind: \"invalid\"; readonly reason: string }\n | { readonly kind: \"write\"; readonly config: Record<string, unknown> };\n\nconst decodeJson = Schema.decodeUnknownOption(\n Schema.fromJsonString(Schema.Unknown),\n);\n\n/**\n * Zed's documented entry carries `\"env\": {}`; an empty environment is the\n * same server, so it is not a conflict.\n */\nconst withoutEmptyEnv = (entry: unknown): unknown =>\n Option.match(asRecord(entry), {\n onNone: () => entry,\n onSome: (record) =>\n Option.match(Option.flatMap(R.get(record, \"env\"), asRecord), {\n onNone: () => record,\n onSome: (env) =>\n Match.value(R.isEmptyRecord(env)).pipe(\n Match.when(true, () => R.remove(record, \"env\")),\n Match.orElse(() => record),\n ),\n }),\n });\n\nconst withServer = (\n config: Record<string, unknown>,\n key: string,\n servers: Record<string, unknown>,\n client: Client,\n): InstallPlan => ({\n kind: \"write\",\n config: R.set(config, key, R.set(servers, \"braven\", serverEntry(client))),\n});\n\nconst invalid = (reason: string): InstallPlan => ({ kind: \"invalid\", reason });\n\nconst mergeEntry = (\n client: Client,\n config: Record<string, unknown>,\n key: string,\n servers: Record<string, unknown>,\n force: boolean,\n): InstallPlan =>\n Option.match(R.get(servers, \"braven\"), {\n onNone: () => withServer(config, key, servers, client),\n onSome: (entry) =>\n Bool.match(\n Equal.equals(\n withoutEmptyEnv(entry),\n withoutEmptyEnv(serverEntry(client)),\n ),\n {\n onTrue: () => ({ kind: \"unchanged\" as const }),\n onFalse: () =>\n Bool.match(force, {\n onTrue: () => withServer(config, key, servers, client),\n onFalse: () => ({ kind: \"conflict\" as const, current: entry }),\n }),\n },\n ),\n });\n\nconst mergeConfig = (\n client: Client,\n config: Record<string, unknown>,\n force: boolean,\n): InstallPlan => {\n const key = serversKey[client];\n return Option.match(R.get(config, key), {\n onNone: () => withServer(config, key, {}, client),\n onSome: (servers) =>\n Option.match(asRecord(servers), {\n onNone: () => invalid(`\"${key}\" is not an object`),\n onSome: (current) => mergeEntry(client, config, key, current, force),\n }),\n });\n};\n\n/**\n * Merges the client's stdio entry into an existing config without dropping\n * unrelated settings or servers. A differing `braven` entry is a conflict\n * unless forced; an unmergeable file is never overwritten.\n */\nexport const planInstall = (\n client: Client,\n existing: Option.Option<string>,\n force: boolean,\n): InstallPlan => {\n const text = Option.getOrElse(\n Option.filter(existing, (raw) => Str.trim(raw).length > 0),\n () => \"{}\",\n );\n return Option.match(decodeJson(text), {\n onNone: () => invalid(\"it is not valid JSON\"),\n onSome: (parsed) =>\n Option.match(asRecord(parsed), {\n onNone: () => invalid(\"its top level is not a JSON object\"),\n onSome: (config) => mergeConfig(client, config, force),\n }),\n });\n};\n\nconst cannot =\n (action: string, path: string) =>\n (cause: PlatformError): CliFailure =>\n new CliFailure({\n message: `cannot ${action} ${path}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\nconst encodeJson = (space?: number) =>\n Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown, { space }));\n\n/** Renders one JSON value as a single line for the summary and refusal text. */\nconst inline = (json: unknown): Effect.Effect<string, CliFailure> =>\n encodeJson()(json).pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `cannot encode the config: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n\n/** Writes the config atomically, keeping the original file's mode. */\nconst writeConfig = (\n path: string,\n text: string,\n mode: Option.Option<number>,\n): Effect.Effect<void, CliFailure, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const paths = yield* Path.Path;\n yield* fs\n .makeDirectory(paths.dirname(path), { recursive: true })\n .pipe(Effect.mapError(cannot(\"create\", path)));\n const temporary = `${path}.tmp`;\n yield* fs\n .writeFileString(\n temporary,\n text,\n Option.match(mode, {\n onNone: () => ({}),\n onSome: (value) => ({ mode: value }),\n }),\n )\n .pipe(Effect.mapError(cannot(\"write\", path)));\n yield* fs\n .rename(temporary, path)\n .pipe(Effect.mapError(cannot(\"replace\", path)));\n yield* Option.match(mode, {\n onNone: () => Effect.void,\n onSome: (value) =>\n fs.chmod(path, value).pipe(Effect.mapError(cannot(\"chmod\", path))),\n });\n });\n\nconst summary = (options: {\n readonly client: Client;\n readonly path: string;\n readonly entry: string;\n readonly backup: Option.Option<string>;\n}): string =>\n [\n `configured ${displayName[options.client]} at ${options.path}`,\n ` server ${options.entry}`,\n ` key ${serversKey[options.client]}.braven`,\n ...Option.match(options.backup, {\n onNone: () => [],\n onSome: (backup) => [` backup ${backup}`],\n }),\n ].join(\"\\n\");\n\n/** Merges the Braven stdio server into one client's MCP config. */\nexport const install = Effect.fn(\"mcp.install\")(function* (options: {\n readonly client: Client;\n readonly path: string;\n readonly force: boolean;\n}) {\n const fs = yield* FileSystem.FileSystem;\n const exists = yield* fs\n .exists(options.path)\n .pipe(Effect.mapError(cannot(\"inspect\", options.path)));\n const previous = yield* Bool.match(exists, {\n onFalse: () => Effect.succeed(Option.none<string>()),\n onTrue: () =>\n fs\n .readFileString(options.path)\n .pipe(\n Effect.map(Option.some),\n Effect.mapError(cannot(\"read\", options.path)),\n ),\n });\n\n yield* Match.value(planInstall(options.client, previous, options.force)).pipe(\n Match.when({ kind: \"unchanged\" }, () =>\n Console.log(`already configured at ${options.path} \u2014 no change`),\n ),\n Match.when({ kind: \"invalid\" }, ({ reason }) =>\n fail(\n `${options.path} cannot be merged: ${reason} \u2014 fix or remove it, then retry`,\n EXIT_FAILURE,\n ),\n ),\n Match.when({ kind: \"conflict\" }, ({ current }) =>\n Effect.flatMap(inline(current), (entry) =>\n Console.log(\n `braven is already configured differently:\\n file ${options.path}\\n current ${entry}`,\n ).pipe(\n Effect.andThen(\n fail(\n `${options.path} configures braven differently \u2014 rerun with --force to replace it (the original is copied to a sibling .bak file)`,\n EXIT_USAGE,\n ),\n ),\n ),\n ),\n ),\n Match.when({ kind: \"write\" }, ({ config }) =>\n Effect.gen(function* () {\n const backup = yield* Bool.match(exists, {\n onFalse: () => Effect.succeed(Option.none<string>()),\n onTrue: () => {\n const path = `${options.path}.bak`;\n return fs\n .copyFile(options.path, path)\n .pipe(\n Effect.mapError(cannot(\"back up\", options.path)),\n Effect.as(Option.some(path)),\n );\n },\n });\n const mode = yield* Bool.match(exists, {\n onFalse: () => Effect.succeed(Option.none<number>()),\n onTrue: () =>\n fs.stat(options.path).pipe(\n Effect.map((info) => Option.some(info.mode)),\n Effect.mapError(cannot(\"inspect\", options.path)),\n ),\n });\n const text = `${yield* encodeJson(2)(config).pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `cannot encode the config: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n )}\\n`;\n yield* writeConfig(options.path, text, mode);\n yield* Console.log(\n summary({\n client: options.client,\n path: options.path,\n entry: yield* inline(serverEntry(options.client)),\n backup,\n }),\n );\n }),\n ),\n Match.exhaustive,\n );\n});\n\n/** Resolves the flag or the client's default, then installs. */\nexport const installCommand = Effect.fn(\"mcp.installCommand\")(\n function* (options: {\n readonly client: Client;\n readonly force: boolean;\n readonly path: Option.Option<string>;\n }) {\n const environment = yield* Environment;\n const path = Option.getOrElse(options.path, () =>\n configPathFor(options.client, environment),\n );\n yield* install({ client: options.client, path, force: options.force });\n },\n);\n"],
5
- "mappings": "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",
6
- "names": ["Argument", "Command", "Flag", "Console", "Effect", "Match", "Option", "Tool", "Schema", "Schema", "Tool", "entry", "Effect", "Layer", "Context", "Effect", "Schema", "Schema", "value", "Schema", "Context", "Effect", "McpServer", "Context", "Effect", "Layer", "Option", "Schema", "Str", "Context", "Layer", "Option", "Str", "Option", "Effect", "Option", "Context", "layer", "Layer", "Context", "Effect", "Layer", "Option", "Schema", "Arr", "P", "R", "Str", "Effect", "Match", "Arr", "Option", "Schema", "Str", "Schema", "value", "Match", "filter", "Effect", "entry", "key", "field", "digest", "values", "head", "portOf", "Schema", "Effect", "Schema", "Option", "Schema", "Effect", "filter", "Crypto", "Effect", "Match", "Option", "Arr", "FileSystem", "Path", "P", "Effect", "Match", "Schema", "Arr", "Option", "Order", "Result", "Str", "Match", "Arr", "HashMap", "Option", "Order", "P", "R", "Result", "Schema", "Match", "Arr", "Option", "P", "Schema", "Str", "segments", "at", "value", "refusal", "pointerToken", "value", "Match", "record", "entry", "key", "field", "refusal", "keys", "defaultValue", "name", "values", "Schema", "Effect", "crypto", "value", "open", "head", "match", "step", "key", "Match", "failure", "ordered", "Effect", "FileSystem", "Path", "Effect", "refusal", "Match", "value", "findStep", "findPipelineParam", "Option", "textOf", "Effect", "crypto", "Crypto", "Arr", "HashMap", "Option", "Order", "Schema", "asJson", "value", "jsonOf", "edgeKey", "field", "Effect", "Option", "Arr", "R", "Result", "Schema", "Effect", "Schema", "FileSystem", "Option", "Path", "Schema", "Effect", "Effect", "Option", "Arr", "Result", "Schema", "Effect", "Option", "at", "head", "set", "open", "Option", "Schema", "Effect", "Match", "Option", "Arr", "R", "Result", "Effect", "Arr", "Option", "matches", "Effect", "Schema", "Context", "Option", "Effect", "row", "options", "key", "matches", "value", "entry", "head", "tag", "field", "Context", "Effect", "Layer", "Option", "Effect", "Schema", "Str", "fail", "oneLine", "value", "Context", "Effect", "Layer", "Option", "Arr", "R", "FileSystem", "Path", "Schema", "Str", "Effect", "Option", "Context", "Effect", "oneLine", "Layer", "Option", "fail", "value", "key", "defaultOf", "Context", "layer", "Layer", "Effect", "Option", "value", "Context", "Effect", "Crypto", "FileSystem", "Path", "McpSchema", "Toolkit", "HttpClient", "Effect", "Option", "Effect", "Option", "Effect", "Schema", "refusal", "Effect", "Effect", "HttpClient", "Effect", "Option", "value", "Effect", "Option", "Path", "failure", "Effect", "Option", "Effect", "Option", "Path", "failure", "Effect", "Option", "Context", "Effect", "Layer", "Option", "Schema", "FileSystem", "Path", "HttpClient", "HttpClientRequest", "HttpClientResponse", "Schema", "request", "Effect", "Option", "Context", "read", "make", "value", "layer", "Layer", "McpSchema", "Toolkit", "Effect", "Layer", "Effect", "layer", "McpServer", "Arr", "Console", "Effect", "Option", "Path", "Console", "Context", "Duration", "Effect", "Layer", "Option", "Predicate", "Schema", "HttpClient", "HttpClientRequest", "HttpClientResponse", "Str", "Duration", "Schema", "Context", "Layer", "Effect", "oneLine", "SessionUser", "SessionBody", "HttpClient", "fail", "HttpClientResponse", "HttpClientRequest", "Option", "value", "Predicate", "Console", "failure", "Cause", "Console", "Duration", "Effect", "Match", "Option", "HttpClient", "HttpClientRequest", "HttpClientResponse", "Schema", "Duration", "Effect", "oneLine", "Option", "value", "Match", "refusal", "HttpClient", "request", "HttpClientRequest", "fail", "HttpClientResponse", "Cause", "Console", "Effect", "Option", "Arr", "FileSystem", "HttpClient", "HttpClientRequest", "HttpClientResponse", "Path", "Schema", "ErrorBody", "oneLine", "Option", "Effect", "HttpClient", "HttpClientResponse", "fail", "matches", "request", "HttpClientRequest", "value", "Option", "Console", "failure", "Effect", "key", "fail", "push", "Argument", "Command", "Flag", "Effect", "Console", "Effect", "Option", "Schema", "Arr", "EXIT_USAGE", "Effect", "Option", "fail", "value", "Schema", "Console", "encoded", "conflict", "head", "field", "asJson", "refusal", "Argument", "Command", "Flag", "Console", "Effect", "Match", "Option", "Schema", "Arr", "Option", "apiFailure", "Match", "value", "Schema", "values", "key", "hash", "at", "Command", "Flag", "Effect", "Console", "Argument", "Command", "Argument", "Flag", "Effect", "Console", "Effect", "Match", "Option", "Bool", "FileSystem", "Path", "P", "R", "Schema", "Str", "value", "join", "decodeJson", "entry", "record", "key", "oneLine", "fail", "Flag", "login", "Command", "Effect", "key", "fail", "Argument", "pushCommand", "push", "value", "failure", "Match", "unavailable", "Option", "oneLine", "Console"]
3
+ "sources": ["../src/cli.ts", "../../agent-tools/src/catalog.ts", "../../agent-tools/src/tools.ts", "../../agent-tools/src/errors.ts", "../../agent-tools/src/server.ts", "../../pipeline-sync/src/compiler.ts", "../../pipeline-sync/src/errors.ts", "../../agent-tools/src/access.ts", "../../identity-store/src/environment.ts", "../../agent-tools/src/api.ts", "../../pipeline-ir/src/ir.ts", "../../pipeline-ir/src/content-hash.ts", "../../pipeline-ir/src/patch.ts", "../../pipeline-sync/src/client.ts", "../../pipeline-sync/src/apply.ts", "../../pipeline-sync/src/patch.ts", "../../pipeline-sync/src/merge.ts", "../../pipeline-sync/src/resolve.ts", "../../pipeline-sync/src/source.ts", "../../pipeline-sync/src/diff.ts", "../../pipeline-sync/src/engine.ts", "../../pipeline-sync/src/state.ts", "../../pipeline-sync/src/sync.ts", "../../pipeline-sync/src/snapshot.ts", "../../pipeline-sync/src/store.ts", "../../agent-tools/src/params.ts", "../../agent-tools/src/credential.ts", "../../identity-store/src/errors.ts", "../../identity-store/src/identity.ts", "../../agent-tools/src/email.ts", "../../agent-tools/src/handlers.ts", "../../agent-tools/src/baseHandlers.ts", "../../agent-tools/src/run.ts", "../../agent-tools/src/confirmation.ts", "../../agent-tools/src/baseTools.ts", "../../agent-tools/src/pull.ts", "../../agent-tools/src/push.ts", "../../agent-tools/src/watcher.ts", "../src/commands.ts", "../../identity-store/src/login.ts", "../src/auth.ts", "../src/files.ts", "../src/pipeline.ts", "../src/pipeline/commands.ts", "../src/pipeline/results.ts", "../src/mcp-install.ts", "../src/desktop.ts"],
4
+ "sourcesContent": ["import { Argument, CliError, Command, Flag } from \"effect/cli\";\nimport { Cause, Console, Effect, Match, Option } from \"effect\";\nimport type { BadArgument, PlatformError } from \"effect/PlatformError\";\nimport { AgentToolError } from \"@braven/agent-tools\";\nimport { runMcp } from \"@braven/agent-tools/server\";\nimport * as Arr from \"effect/Array\";\nimport {\n CliFailure,\n EXIT_USAGE,\n Environment,\n fail,\n oneLine,\n resolveOrigin,\n} from \"@braven/identity-store\";\nimport { SyncFailure } from \"@braven/pipeline-sync\";\nimport {\n configSet,\n configShow,\n configUse,\n keyAdd,\n loginCommand,\n logout,\n push,\n whoami,\n} from \"./commands.ts\";\nimport {\n CompilerUnavailable,\n EXIT_PIPELINE_USAGE,\n PipelineExit,\n pipelineCommand,\n} from \"./pipeline.ts\";\nimport { CLIENTS, installCommand } from \"./mcp-install.ts\";\nimport { installDesktop } from \"./desktop.ts\";\n\n/** The CLI's version, shown by `braven --version`. */\ndeclare const __BRAVEN_VERSION__: string | undefined;\n\n/** Stamped from `package.json` by `scripts/build-package.ts`; the source tests\n * run without that define. */\nexport const VERSION =\n typeof __BRAVEN_VERSION__ === \"string\" ? __BRAVEN_VERSION__ : \"0.0.0\";\n\nconst originFlag = Flag.String(\"origin\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the Braven API origin (default: $BRAVEN_API_URL, else the hosted API)\",\n ),\n);\n\nconst emailFlag = Flag.String(\"email\").pipe(\n Flag.optional,\n Flag.withDescription(\"the account's email\"),\n);\n\nconst login = Command.make(\n \"login\",\n {\n origin: originFlag,\n webOrigin: Flag.String(\"web-origin\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the web app that performs the sign-in (default: $BRAVEN_WEB_URL, else the hosted site)\",\n ),\n ),\n device: Flag.Boolean(\"device\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"poll better-auth's device authorization grant instead of the loopback handoff\",\n ),\n ),\n clientId: Flag.String(\"client-id\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the public client id for --device (default: $BRAVEN_CLIENT_ID, else braven-cli)\",\n ),\n ),\n watcher: Flag.Boolean(\"watcher\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"use the sign-in the Braven app already made on this machine (the app, its agent and the CLI share one store)\",\n ),\n ),\n api: Flag.Boolean(\"api\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"store an API key instead of opening a browser (with --key or $BRAVEN_API_KEY)\",\n ),\n ),\n key: Flag.String(\"key\").pipe(\n Flag.optional,\n Flag.withDescription(\"the API key for --api (default: $BRAVEN_API_KEY)\"),\n ),\n email: emailFlag,\n },\n Effect.fn(function* ({\n origin,\n webOrigin,\n device,\n clientId,\n watcher,\n api,\n key,\n email,\n }) {\n if (watcher && api)\n return yield* fail(\n \"--watcher and --api are alternatives: pick one sign-in\",\n EXIT_USAGE,\n );\n yield* loginCommand({\n origin,\n webOrigin,\n device,\n clientId,\n method: watcher ? \"watcher\" : api ? \"api\" : \"browser\",\n apiKey: key,\n email,\n });\n }),\n).pipe(\n Command.withDescription(\n \"sign in with the app's session (--watcher), the browser, or an API key (--api)\",\n ),\n);\n\nconst keyAddCommand = Command.make(\n \"add\",\n {\n key: Argument.String(\"key\").pipe(\n Argument.withMetavar(\"bvn_api_...\"),\n Argument.withDescription(\"the key, shown once in Settings \u2192 API keys\"),\n ),\n email: emailFlag,\n label: Flag.String(\"label\").pipe(\n Flag.optional,\n Flag.withDescription(\"a name for the key, such as `ci`\"),\n ),\n origin: originFlag,\n },\n Effect.fn(function* ({ key, email, label, origin }) {\n const environment = yield* Environment;\n yield* keyAdd({\n origin: resolveOrigin(origin, environment),\n key,\n email,\n label,\n });\n }),\n).pipe(Command.withDescription(\"store an API key as an account\"));\n\nconst key = Command.make(\"key\").pipe(\n Command.withDescription(\"manage API keys\"),\n Command.withSubcommands([keyAddCommand]),\n);\n\nconst whoamiCommand = Command.make(\"whoami\", {}, () => whoami()).pipe(\n Command.withDescription(\"print the identity you would use\"),\n);\n\nconst pushCommand = Command.make(\n \"push\",\n {\n file: Argument.File(\"file\", { mustExist: true }).pipe(\n Argument.withMetavar(\"path\"),\n Argument.withDescription(\"the local file to upload\"),\n ),\n override: Flag.Boolean(\"override\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"replace that path's Experiment and File instead of deduping or adding a sibling\",\n ),\n ),\n path: Flag.String(\"path\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the file's path relative to the watched folder (default: its basename)\",\n ),\n ),\n projectId: Flag.String(\"project-id\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the project to ingest into (default: $BRAVEN_PROJECT_ID, else the stored default)\",\n ),\n ),\n },\n Effect.fn(function* ({ file, override, path, projectId }) {\n yield* push({ file, override, path, projectId });\n }),\n).pipe(\n Command.withDescription(\n \"upload a local file through `files.ingest`, keeping one Experiment per path\",\n ),\n);\n\nconst agentCommand = Command.make(\"agent\").pipe(\n Command.withDescription(\n \"run the local watch agent (same program as `braven-agent`)\",\n ),\n);\n\nconst configSetCommand = Command.make(\n \"set\",\n {\n name: Argument.Literals(\"name\", [\"company\", \"project\"]),\n value: Argument.String(\"value\"),\n },\n Effect.fn(function* ({ name, value }) {\n yield* configSet({ name, value });\n }),\n).pipe(Command.withDescription(\"set a default\"));\n\nconst configUseCommand = Command.make(\n \"use\",\n { email: Argument.String(\"email\") },\n Effect.fn(function* ({ email }) {\n yield* configUse(email);\n }),\n).pipe(Command.withDescription(\"switch the current account\"));\n\nconst configCommand = Command.make(\"config\", {}, () => configShow()).pipe(\n Command.withDescription(\"show or change the stored defaults\"),\n Command.withSubcommands([\n Command.make(\"show\", {}, () => configShow()).pipe(\n Command.withDescription(\"show the stored accounts and defaults\"),\n ),\n configSetCommand,\n configUseCommand,\n ]),\n);\n\nconst logoutCommand = Command.make(\n \"logout\",\n { email: emailFlag },\n Effect.fn(function* ({ email }) {\n yield* logout(email);\n }),\n).pipe(\n Command.withDescription(\n \"forget an account and its secret (default: the current one)\",\n ),\n);\n\nconst mcpInstallCommand = Command.make(\n \"install\",\n {\n client: Flag.Literals(\"client\", CLIENTS).pipe(\n Flag.withDescription(\"the client whose MCP config to write\"),\n ),\n force: Flag.Boolean(\"force\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"replace a differing `braven` entry (the file is backed up first)\",\n ),\n ),\n path: Flag.String(\"path\").pipe(\n Flag.optional,\n Flag.withDescription(\"write this file instead of the client's default\"),\n ),\n },\n Effect.fn(function* ({ client, force, path }) {\n yield* installCommand({ client, force, path });\n }),\n).pipe(\n Command.withDescription(\n \"merge the Braven server into a client's MCP config (Claude, Cursor, opencode, Zed, VS Code)\",\n ),\n);\n\nconst desktopInstallCommand = Command.make(\n \"install\",\n {\n dmg: Flag.String(\"dmg\").pipe(\n Flag.optional,\n Flag.withDescription(\"a Braven DMG to install\"),\n ),\n app: Flag.String(\"app\").pipe(\n Flag.optional,\n Flag.withDescription(\"an already-built Braven.app\"),\n ),\n exe: Flag.String(\"exe\").pipe(\n Flag.optional,\n Flag.withDescription(\"a Windows Braven installer (.exe)\"),\n ),\n silent: Flag.Boolean(\"silent\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"Windows: run the installer without its wizard\"),\n ),\n system: Flag.Boolean(\"system\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"install into /Applications\"),\n ),\n destination: Flag.String(\"destination\").pipe(\n Flag.optional,\n Flag.withDescription(\"install here instead of ~/Applications\"),\n ),\n },\n Effect.fn(function* ({ dmg, app, exe, silent, system, destination }) {\n yield* installDesktop({\n dmg: Option.getOrUndefined(dmg),\n app: Option.getOrUndefined(app),\n exe: Option.getOrUndefined(exe),\n silent,\n system,\n destination: Option.getOrUndefined(destination),\n });\n }),\n).pipe(Command.withDescription(\"copy the watcher window into Applications\"));\n\nconst desktopCommand = Command.make(\"desktop\", {}).pipe(\n Command.withDescription(\"the watcher window (macOS)\"),\n Command.withSubcommands([desktopInstallCommand]),\n);\n\nconst mcpCommand = Command.make(\"mcp\", {}, () => runMcp(VERSION)).pipe(\n Command.withDescription(\n \"run the Braven MCP server over stdio (connect Claude, Cursor, or Zed here)\",\n ),\n Command.withSubcommands([mcpInstallCommand]),\n);\n\n/** The whole `braven` command tree. */\nexport const braven = Command.make(\"braven\").pipe(\n Command.withDescription(\n \"Sign in once per machine and let the CLI, the watcher and the SDK read the same identity.\",\n ),\n Command.withSubcommands([\n login,\n key,\n pipelineCommand,\n pushCommand,\n agentCommand,\n mcpCommand,\n desktopCommand,\n whoamiCommand,\n configCommand,\n logoutCommand,\n ]),\n);\n\n/** Runs one command line; `renderErrors: false` leaves error rendering to `main`. */\nexport const runCli = (args: ReadonlyArray<string>) =>\n Command.runWith(braven, { version: VERSION, renderErrors: false })(args);\n\ninterface Described {\n readonly code: number;\n readonly message: string;\n}\n\n/** Plan 069's exit codes, one per `SyncFailureKind`. */\nconst syncExit = (failure: SyncFailure): number => {\n if (failure.kind === \"usage\") return 3;\n if (failure.kind === \"conflict\") return 2;\n if (failure.kind === \"network\") return 4;\n return 2;\n};\n\nconst describe = (\n error:\n | CliError.CliError\n | CliFailure\n | CompilerUnavailable\n | PipelineExit\n | Error\n | SyncFailure\n | AgentToolError\n | BadArgument\n | PlatformError\n | Cause.IllegalArgumentError,\n): Described =>\n Match.value(error).pipe(\n Match.tag(\"PipelineExit\", (exit) => ({\n code: exit.code,\n message: exit.message,\n })),\n Match.tag(\"CompilerUnavailable\", (unavailable) => ({\n code: EXIT_PIPELINE_USAGE,\n message: unavailable.message,\n })),\n Match.tag(\"SyncFailure\", (failure) => ({\n code: syncExit(failure),\n message: failure.message,\n })),\n Match.tag(\"CliFailure\", (failure) => ({\n code: failure.exitCode,\n message: failure.message,\n })),\n Match.tag(\"ShowHelp\", (help) =>\n help.errors.length === 0\n ? { code: 0, message: \"\" }\n : {\n code: EXIT_USAGE,\n message: Option.getOrElse(\n Arr.head(help.errors).pipe(Option.map((item) => item.message)),\n () => \"invalid arguments\",\n ),\n },\n ),\n Match.tag(\"UserError\", (user) => ({\n code: EXIT_USAGE,\n message: user.userMessage ?? oneLine(user.cause),\n })),\n Match.orElse((other) => ({ code: EXIT_USAGE, message: other.message })),\n );\n\n/**\n * Runs the CLI and returns its exit code.\n *\n * Help is a success; anything else becomes exactly one `braven: \u2026` line on\n * stderr. The effect never fails, so the process boundary only has to assign\n * the code.\n */\nexport const main = Effect.fn(\"braven\")(function* (\n args: ReadonlyArray<string>,\n) {\n return yield* runCli(args).pipe(\n Effect.as(0),\n Effect.catch((error) => {\n const described = describe(error);\n if (described.code === 0) return Effect.succeed(0);\n if (described.message.length === 0) return Effect.succeed(described.code);\n return Console.error(`braven: ${oneLine(described.message)}`).pipe(\n Effect.as(described.code),\n );\n }),\n );\n});\n", "import { Tool } from \"effect/ai\";\nimport * as Context from \"effect/Context\";\nimport type { JsonSchema } from \"effect/JsonSchema\";\nimport * as Option from \"effect/Option\";\nimport * as Schema from \"effect/Schema\";\nimport { CatalogMeta, tools, webTools } from \"./tools.ts\";\nimport type { Scope, Surface } from \"./tools.ts\";\n\n/** A protocol-neutral view of one tool, safe to ship to a browser. */\nexport interface CatalogEntry {\n readonly name: string;\n readonly title: string;\n readonly description: string;\n readonly inputSchema: JsonSchema;\n readonly outputSchema: JsonSchema;\n readonly scopes: ReadonlyArray<Scope>;\n readonly surfaces: ReadonlyArray<Surface>;\n /** Needs this machine (a workspace checkout, or the running watcher). */\n readonly local: boolean;\n readonly annotations: {\n readonly readOnly: boolean;\n readonly destructive: boolean;\n readonly idempotent: boolean;\n readonly openWorld: boolean;\n readonly consequential: boolean;\n };\n}\n\nconst titleOf = (tool: Tool.Any): string =>\n Option.getOrElse(\n Context.getOption(tool.annotations, Tool.Title),\n () => tool.name,\n );\n\nconst metaOf = (tool: Tool.Any): CatalogMeta =>\n Schema.decodeUnknownSync(CatalogMeta)(\n Option.getOrElse(\n Context.getOption(tool.annotations, Tool.Meta),\n () => ({}),\n ),\n );\n\n/** The scopes a tool declares; the catalog is the one source for them. */\nexport const scopesOf = (tool: Tool.Any): ReadonlyArray<Scope> =>\n metaOf(tool).scopes;\n\nconst toEntry = (tool: Tool.Any): CatalogEntry => {\n const meta = metaOf(tool);\n return {\n name: tool.name,\n title: titleOf(tool),\n description: tool.description ?? \"\",\n inputSchema: Schema.toJsonSchemaDocument(tool.parametersSchema).schema,\n outputSchema: Schema.toJsonSchemaDocument(tool.successSchema).schema,\n scopes: meta.scopes,\n surfaces: meta.surfaces,\n local: meta.local ?? false,\n annotations: {\n readOnly: Context.get(tool.annotations, Tool.Readonly),\n destructive: Context.get(tool.annotations, Tool.Destructive),\n idempotent: Context.get(tool.annotations, Tool.Idempotent),\n openWorld: Context.get(tool.annotations, Tool.OpenWorld),\n consequential: meta.consequential ?? false,\n },\n };\n};\n\n/**\n * The one catalog. MCP, WebMCP, and any future adapter must read this, never\n * maintain a second list of names, descriptions, or schemas.\n */\nexport const catalog: ReadonlyArray<CatalogEntry> = [...tools, ...webTools].map(\n toEntry,\n);\n\n/**\n * The tools a remote endpoint can serve: everything the stdio server offers\n * except the ones that read this machine \u2014 a workspace checkout, or the agent\n * running here. Those stay local by design.\n */\nexport const remoteTools: ReadonlyArray<CatalogEntry> = catalog.filter(\n (entry) => entry.surfaces.includes(\"mcp\") && !entry.local,\n);\n", "import { Tool } from \"effect/ai\";\nimport * as Schema from \"effect/Schema\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** What a tool is allowed to do. Enforced by the server, not by the model. */\nexport const Scope = Schema.Literals([\"read\", \"write\", \"run\", \"watcher\"]);\nexport type Scope = typeof Scope.Type;\n\n/** Where a tool is exposed. A descriptor may be offered by both MCP and the page. */\nexport const Surface = Schema.Literals([\"mcp\", \"web\"]);\nexport type Surface = typeof Surface.Type;\n\n/** Catalog-only metadata carried in the tool's `Tool.Meta` annotation. */\nexport const CatalogMeta = Schema.Struct({\n scopes: Schema.NonEmptyArray(Scope),\n surfaces: Schema.NonEmptyArray(Surface),\n /** A write that changes scientific state and needs explicit confirmation. */\n consequential: Schema.optionalKey(Schema.Boolean),\n /** Needs this machine: a workspace checkout, or the running watcher. */\n local: Schema.optionalKey(Schema.Boolean),\n});\nexport type CatalogMeta = typeof CatalogMeta.Type;\n\nconst readMeta = {\n scopes: [\"read\"],\n surfaces: [\"mcp\"],\n} satisfies CatalogMeta;\n\nconst read = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, readMeta);\n\n/**\n * The catalog is the contract every surface shares. Names are stable and\n * prefixed; descriptions state intent, never a procedure the model must follow.\n */\n/** Identify the signed-in account and the origin this server uses. */\nexport const WhoAmI = read(\"braven_whoami\", {\n description:\n \"Identify the signed-in Braven account and the origin this server is using. Never returns a credential.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n email: Schema.optionalKey(Schema.String),\n origin: Schema.String,\n company: Schema.optionalKey(Schema.String),\n project: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Who am I\");\n\n/** List accessible projects, optionally scoped to one company. */\nexport const ListProjects = read(\"braven_list_projects\", {\n description:\n \"List the projects the signed-in account can access, optionally within one company. Returns ids and names, not experiment data.\",\n parameters: Schema.Struct({\n companyId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n companyId: Schema.String,\n companyName: Schema.optionalKey(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List projects\");\n\n/** Find the Experiments recorded in one project. */\nexport const ListExperiments = read(\"braven_list_experiments\", {\n description:\n \"Find the Experiments in one project by the hardware, pipeline or name they were recorded with. Names are resolved case-insensitively; an unknown name fails instead of returning an empty list. Use get_experiment for Config, Summary, notes and files.\",\n parameters: Schema.Struct({\n projectId: Schema.String,\n /** A Device's name or id. */\n device: Schema.optionalKey(Schema.String),\n /** A pipeline's name or id. */\n pipeline: Schema.optionalKey(Schema.String),\n nameContains: Schema.optionalKey(Schema.String),\n stage: Schema.optionalKey(Schema.Literals([\"simulation\", \"experiment\"])),\n limit: Schema.optionalKey(\n Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 200 })),\n ),\n offset: Schema.optionalKey(\n Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n ),\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n name: Schema.optionalKey(Schema.String),\n createdAt: Schema.String,\n isSimulation: Schema.Boolean,\n childCount: Schema.Int,\n fileCount: Schema.Int,\n deviceName: Schema.optionalKey(Schema.String),\n pipelineName: Schema.optionalKey(Schema.String),\n tags: Schema.Array(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List experiments\");\n\n/** Read one Experiment's record. */\nexport const GetExperiment = read(\"braven_get_experiment\", {\n description:\n \"Read one Experiment: its notes, the hardware and parent it belongs to, its Config and Summary values, its tags, and the names of its files. File contents are not returned.\",\n parameters: Schema.Struct({\n experimentId: Schema.String,\n }),\n success: Schema.Struct({\n id: Schema.String,\n name: Schema.optionalKey(Schema.String),\n notes: Schema.optionalKey(Schema.String),\n createdAt: Schema.String,\n parentId: Schema.optionalKey(Schema.String),\n childCount: Schema.Int,\n deviceName: Schema.optionalKey(Schema.String),\n tags: Schema.Array(Schema.String),\n config: Schema.Record(Schema.String, Schema.String),\n summary: Schema.Record(Schema.String, Schema.String),\n files: Schema.Array(Schema.String),\n }),\n}).annotate(Tool.Title, \"Get an experiment\");\n\n/** Read one Device by name or id. */\nexport const GetHardware = read(\"braven_get_hardware\", {\n description:\n \"Read one piece of hardware in a company by name or id: its type, model, aliases, field values, how many it stands for, and how many Experiments used it. Pass exactly one of name or deviceId.\",\n parameters: Schema.Struct({\n companyId: Schema.String,\n name: Schema.optionalKey(Schema.String),\n deviceId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n typeName: Schema.String,\n model: Schema.optionalKey(Schema.String),\n notes: Schema.optionalKey(Schema.String),\n tracked: Schema.Boolean,\n count: Schema.Int,\n experimentCount: Schema.Int,\n aliases: Schema.Array(Schema.String),\n fields: Schema.Array(\n Schema.Struct({\n key: Schema.String,\n value: Schema.optionalKey(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Get hardware\");\n\n/** Read one report by name or id. */\nexport const GetReport = read(\"braven_get_report\", {\n description:\n \"Read one report in a project by name or id: its segments in order, each with a bounded excerpt of its text. Pass exactly one of name or reportId.\",\n parameters: Schema.Struct({\n projectId: Schema.String,\n name: Schema.optionalKey(Schema.String),\n reportId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n createdAt: Schema.String,\n updatedAt: Schema.String,\n segments: Schema.Array(\n Schema.Struct({\n position: Schema.Int,\n type: Schema.String,\n excerpt: Schema.optionalKey(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Get a report\");\n\n/** List a company's pipelines. */\nexport const ListPipelines = read(\"braven_list_pipelines\", {\n description:\n \"List the pipelines in a company. Use pipeline_status for the head revision and get_pipeline for the definition.\",\n parameters: Schema.Struct({\n companyId: Schema.String,\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n stage: Schema.optionalKey(Schema.String),\n lastRunAt: Schema.optionalKey(Schema.String),\n experimentCount: Schema.Int,\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List pipelines\");\n\n/** Read one pipeline and its head revision. */\nexport const GetPipeline = read(\"braven_get_pipeline\", {\n description:\n \"Read a pipeline in one company: its latest revision, and with includeIr the IR text for inspection, not for editing. The company scopes the lookup.\",\n parameters: Schema.Struct({\n companyId: Schema.String,\n pipelineId: Schema.String,\n includeIr: Schema.optionalKey(Schema.Boolean),\n }),\n success: Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n headRevisionId: Schema.optionalKey(Schema.String),\n headNumber: Schema.optionalKey(Schema.Int),\n contentHash: Schema.optionalKey(Schema.String),\n irText: Schema.optionalKey(Schema.String),\n createdAt: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Get a pipeline\");\n\n/** Report the server's head revision for one pipeline. */\nexport const PipelineStatus = read(\"braven_pipeline_status\", {\n description:\n \"Report the server's head revision for a pipeline. This is the publication view, not the local workspace diff.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n }),\n success: Schema.Struct({\n pipelineId: Schema.String,\n head: Schema.NullOr(\n Schema.Struct({\n revisionId: Schema.String,\n number: Schema.Int,\n contentHash: Schema.String,\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Pipeline status\");\n\n/** List runs for a pipeline or an experiment. */\nexport const ListRuns = read(\"braven_list_runs\", {\n description:\n \"List recent runs for a pipeline or an experiment. Returns each run's identity and status; use get_result for outputs.\",\n parameters: Schema.Struct({\n pipelineId: Schema.optionalKey(Schema.String),\n experimentId: Schema.optionalKey(Schema.String),\n status: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n pipelineId: Schema.String,\n experimentId: Schema.String,\n status: Schema.String,\n createdAt: Schema.String,\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List runs\");\n\n/** Read one immutable result and its output references. */\nexport const GetResult = read(\"braven_get_result\", {\n description:\n \"Read one immutable analysis result: its summary and the references to its output files. Results are never overwritten.\",\n parameters: Schema.Struct({\n resultId: Schema.String,\n }),\n success: Schema.Struct({\n id: Schema.String,\n runId: Schema.optionalKey(Schema.String),\n summary: Schema.Record(Schema.String, Schema.Json),\n outputs: Schema.Array(\n Schema.Struct({\n name: Schema.String,\n contentHash: Schema.optionalKey(Schema.String),\n bytes: Schema.optionalKey(Schema.Int),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Get a result\");\n\n/** List a pipeline's proposals without applying them. */\nexport const ListProposals = read(\"braven_list_proposals\", {\n description:\n \"List dashboard proposals for a pipeline, including whether each is open or resolved. Reading a proposal does not apply it.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n status: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n status: Schema.String,\n rationale: Schema.optionalKey(Schema.String),\n createdAt: Schema.optionalKey(Schema.String),\n }),\n ),\n }),\n}).annotate(Tool.Title, \"List proposals\");\n\n/** Compare two immutable results with their axis. */\nexport const CompareResults = read(\"braven_compare_results\", {\n description:\n \"Compare two immutable results with the server's method \u00D7 evidence axis. A delta is never returned without saying which axis moved.\",\n parameters: Schema.Struct({\n leftResultId: Schema.String,\n rightResultId: Schema.String,\n }),\n success: Schema.Struct({\n axis: Schema.String,\n sameMethod: Schema.Boolean,\n sameEvidence: Schema.Boolean,\n sameConfiguration: Schema.Boolean,\n left: Schema.String,\n right: Schema.String,\n }),\n}).annotate(Tool.Title, \"Compare results\");\n\n/** A parameter value a proposal may set. */\nexport const ParamValue = Schema.Union([\n Schema.String,\n Schema.Number,\n Schema.Boolean,\n]);\nexport type ParamValue = typeof ParamValue.Type;\n\n/** A write that creates a proposal; it does not apply anything. */\nconst write = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, false)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"write\"],\n surfaces: [\"mcp\"],\n } satisfies CatalogMeta);\n\n/** Create one Experiment in a project. */\nexport const CreateExperiment = write(\"braven_create_experiment\", {\n description:\n \"Create an Experiment in one project. Name, notes, a Device and a pipeline can be set now and edited later. It writes a real Experiment the team sees; nothing is deleted.\",\n parameters: Schema.Struct({\n projectId: Schema.String,\n name: Schema.optionalKey(Schema.String),\n notes: Schema.optionalKey(Schema.String),\n deviceId: Schema.optionalKey(Schema.String),\n pipelineId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({ id: Schema.String }),\n}).annotate(Tool.Title, \"Create an experiment\");\n\n/** Rename or re-annotate one Experiment. */\nexport const UpdateExperiment = write(\"braven_update_experiment\", {\n description:\n \"Change one Experiment's name or notes. Omitted fields stay as they are; a Device or pipeline is not changed here.\",\n parameters: Schema.Struct({\n projectId: Schema.String,\n experimentId: Schema.String,\n name: Schema.optionalKey(Schema.String),\n notes: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({ id: Schema.String }),\n}).annotate(Tool.Title, \"Update an experiment\");\n\n/** Propose a parameter change against the current head; a human still applies it. */\nexport const ProposeParameter = write(\"braven_propose_parameter\", {\n description:\n \"Create a dashboard proposal for one parameter. The effective target is derived from the IR: a pipeline-bound parameter targets the declaration, a step literal targets the step. It never applies the change.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n param: Schema.String,\n value: ParamValue,\n stepId: Schema.optionalKey(Schema.String),\n baseRevisionId: Schema.optionalKey(Schema.String),\n rationale: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({\n proposalId: Schema.String,\n baseRevisionId: Schema.String,\n target: Schema.String,\n }),\n}).annotate(Tool.Title, \"Propose a parameter change\");\n\n/** A run executes a pipeline and writes scientific state; it is never idempotent. */\nconst runWrite = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, false)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"run\"],\n surfaces: [\"mcp\"],\n consequential: true,\n } satisfies CatalogMeta);\n\n/** Queue one run at a pinned revision. A human confirms it first. */\nexport const RunPipeline = runWrite(\"braven_run_pipeline\", {\n description:\n \"Queue a pipeline run for one experiment, pinned to a revision \u2014 the one named, or the current head. This executes the pipeline and writes a result, so the user must confirm it.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n experimentId: Schema.String,\n revisionId: Schema.optionalKey(Schema.String),\n parameters: Schema.optionalKey(Schema.Record(Schema.String, ParamValue)),\n dryRun: Schema.optionalKey(Schema.Boolean),\n }),\n success: Schema.Struct({\n runId: Schema.String,\n status: Schema.String,\n revisionId: Schema.String,\n experimentId: Schema.String,\n }),\n}).annotate(Tool.Title, \"Run a pipeline\");\n\n/** Queue a rerun of one run, exact or with the current inputs. */\nexport const Rerun = runWrite(\"braven_rerun\", {\n description:\n \"Queue another run of an existing run \u2014 exact (same pinned inputs) or current-inputs. It writes a new run/result, never overwrites the original, and requires confirmation.\",\n parameters: Schema.Struct({\n runId: Schema.String,\n mode: Schema.Literals([\"exact\", \"current-inputs\"]),\n }),\n success: Schema.Struct({\n runId: Schema.String,\n status: Schema.String,\n revisionId: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Rerun\");\n\n/** Reanalyse one snapshot at a revision; a new result is written. */\nexport const Recompute = runWrite(\"braven_recompute\", {\n description:\n \"Reanalyse a published revision against an existing input snapshot. This writes a new result and leaves the previous one intact; it requires confirmation.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n revisionId: Schema.String,\n inputSnapshotId: Schema.String,\n parameters: Schema.optionalKey(Schema.Record(Schema.String, ParamValue)),\n }),\n success: Schema.Struct({\n runId: Schema.String,\n status: Schema.String,\n inputSnapshotId: Schema.String,\n }),\n}).annotate(Tool.Title, \"Recompute\");\n\n/** Preview or apply the remote proposals into a local checkout. */\nexport const PullPipeline = write(\"braven_pipeline_pull\", {\n description:\n \"Pull a pipeline into a local checkout. By default this is a preview (check) and writes nothing; apply writes only round-trip-safe proposals, after the user confirms. The workspace must be inside the MCP server's working directory and already have .braven/pipeline.json.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n workspacePath: Schema.optionalKey(Schema.String),\n apply: Schema.optionalKey(Schema.Boolean),\n }),\n success: Schema.Struct({\n status: Schema.String,\n message: Schema.String,\n }),\n})\n .annotate(Tool.Meta, {\n scopes: [\"write\"],\n surfaces: [\"mcp\"],\n consequential: true,\n local: true,\n } satisfies CatalogMeta)\n .annotate(Tool.Title, \"Pull a pipeline\");\n\n/** Publish the local checkout as a new immutable revision. */\nexport const PushPipeline = write(\"braven_pipeline_push\", {\n description:\n \"Push a local pipeline checkout. Dry-run by default: it computes the merge and publishes nothing. Pass dryRun:false to publish after the user confirms. A stale base is refused, never overwritten.\",\n parameters: Schema.Struct({\n pipelineId: Schema.optionalKey(Schema.String),\n workspacePath: Schema.optionalKey(Schema.String),\n baseRevisionId: Schema.optionalKey(Schema.String),\n summary: Schema.optionalKey(Schema.String),\n dryRun: Schema.optionalKey(Schema.Boolean),\n }),\n success: Schema.Struct({\n status: Schema.String,\n message: Schema.String,\n }),\n})\n .annotate(Tool.Meta, {\n scopes: [\"write\"],\n surfaces: [\"mcp\"],\n consequential: true,\n local: true,\n } satisfies CatalogMeta)\n .annotate(Tool.Title, \"Push a pipeline\");\n\nconst watcherRead = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"watcher\"],\n surfaces: [\"mcp\"],\n local: true,\n } satisfies CatalogMeta);\n\nconst watcherWrite = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, false)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"watcher\"],\n surfaces: [\"mcp\"],\n consequential: true,\n local: true,\n } satisfies CatalogMeta);\n\n/** Report whether `braven-agent` is running and how much work is pending. */\nexport const WatcherStatus = watcherRead(\"braven_watcher_status\", {\n description:\n \"Report whether the Braven watcher is running, its version/folders, and how many uploads are pending. Safe when no watcher is running: returns available false.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n available: Schema.Boolean,\n version: Schema.optionalKey(Schema.String),\n pid: Schema.optionalKey(Schema.Int),\n folders: Schema.optionalKey(Schema.Array(Schema.String)),\n pending: Schema.optionalKey(Schema.Int),\n paused: Schema.optionalKey(Schema.Boolean),\n startedAt: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Watcher status\");\n\n/** Read the watcher's pending upload queue. */\nexport const WatcherQueue = watcherRead(\"braven_watcher_queue\", {\n description:\n \"Read the watcher's pending upload queue. Fails with watcher-unavailable when no watcher is running.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.Int,\n folder: Schema.String,\n path: Schema.String,\n size: Schema.Int,\n state: Schema.String,\n attempts: Schema.Int,\n reason: Schema.optionalKey(Schema.String),\n updatedAt: Schema.String,\n }),\n ),\n }),\n}).annotate(Tool.Title, \"Watcher queue\");\n\n/** Ask the watcher to reconcile, rescan, and drain now. */\nexport const WatcherSync = watcherWrite(\"braven_watcher_sync\", {\n description:\n \"Ask the running watcher to reconcile its queue, rescan the folders, and upload what changed now. This uploads files; it does not change a pipeline definition.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n ok: Schema.Boolean,\n uploaded: Schema.Int,\n failed: Schema.Int,\n repaired: Schema.Int,\n }),\n}).annotate(Tool.Title, \"Watcher sync now\");\n\n/** Ask the watcher to rescan the folders once. */\nexport const WatcherRescan = watcherWrite(\"braven_watcher_rescan\", {\n description:\n \"Ask the running watcher to walk its folders once and queue files whose content changed. This uploads files; it does not change a pipeline definition.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n ok: Schema.Boolean,\n changed: Schema.Int,\n new: Schema.Int,\n skipped: Schema.Int,\n }),\n}).annotate(Tool.Title, \"Watcher rescan\");\n\n/** Stop claiming upload jobs without stopping the watcher. */\nexport const WatcherPause = watcherWrite(\"braven_watcher_pause\", {\n description:\n \"Pause the running watcher's uploads. The folders are still watched and files are still queued; resume to drain them. Fails with watcher-unavailable when no watcher is running.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({ ok: Schema.Boolean, paused: Schema.Boolean }),\n}).annotate(Tool.Title, \"Pause the watcher\");\n\n/** Open a watched file or folder with the OS default app. */\nexport const WatcherOpen = watcherWrite(\"braven_watcher_open\", {\n description:\n \"Open one file or folder with its default application. The path must lie inside a watched folder; the agent canonicalises it and refuses anything outside. This launches a local app, so the user is asked to confirm first.\",\n parameters: Schema.Struct({ path: Schema.NonEmptyString }),\n success: Schema.Struct({ ok: Schema.Boolean, opened: Schema.String }),\n}).annotate(Tool.Title, \"Open a watched path\");\n\n/** Resume uploads and drain the backlog. */\nexport const WatcherResume = watcherWrite(\"braven_watcher_resume\", {\n description:\n \"Resume the running watcher's uploads and drain what accumulated while paused. Fails with watcher-unavailable when no watcher is running.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({ ok: Schema.Boolean, paused: Schema.Boolean }),\n}).annotate(Tool.Title, \"Resume the watcher\");\n\nconst webRead = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"read\"],\n surfaces: [\"web\"],\n } satisfies CatalogMeta);\n\nconst webWrite = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"write\"],\n surfaces: [\"web\"],\n } satisfies CatalogMeta);\n\nconst webRun = <\n const Name extends string,\n Params extends Schema.Constraint,\n Result extends Schema.Constraint,\n>(\n name: Name,\n config: {\n readonly description: string;\n readonly parameters: Params;\n readonly success: Result;\n },\n) =>\n Tool.make(name, { ...config, failure: AgentToolError })\n .annotate(Tool.Readonly, false)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, false)\n .annotate(Tool.OpenWorld, false)\n .annotate(Tool.Meta, {\n scopes: [\"run\"],\n surfaces: [\"web\"],\n consequential: true,\n } satisfies CatalogMeta);\n\n/** Queue a run from the page after the app's confirmation. */\nexport const RunFromPage = webRun(\"braven_run_pipeline_from_page\", {\n description:\n \"Queue a pipeline run for an experiment from the open page, after the user confirms. This executes the pipeline and writes a result.\",\n parameters: Schema.Struct({\n pipelineId: Schema.String,\n experimentId: Schema.String,\n }),\n success: Schema.Struct({\n runId: Schema.String,\n status: Schema.String,\n }),\n}).annotate(Tool.Title, \"Run a pipeline from the page\");\n\n/** The page the user is on, for an in-page browser agent. */\nexport const CurrentContext = webRead(\"braven_current_context\", {\n description:\n \"Return the current Braven page path and, when inside a project, its project id. Read-only context for the open page.\",\n parameters: Tool.EmptyParams,\n success: Schema.Struct({\n path: Schema.String,\n projectId: Schema.optionalKey(Schema.String),\n }),\n}).annotate(Tool.Title, \"Current Braven context\");\n\n/** Navigate the page to an experiment's detail view. */\nexport const OpenExperiment = webWrite(\"braven_open_experiment\", {\n description:\n \"Navigate the current Braven tab to an experiment's detail page. Use the page's project when projectId is omitted; a call with neither fails rather than guessing.\",\n parameters: Schema.Struct({\n experimentId: Schema.String,\n projectId: Schema.optionalKey(Schema.String),\n }),\n success: Schema.Struct({ path: Schema.String }),\n}).annotate(Tool.Title, \"Open an experiment\");\n\n/** Navigate the page to a project's overview. */\nexport const OpenProject = webWrite(\"braven_open_project\", {\n description:\n \"Navigate the current Braven tab to a project's overview. Use a project id returned by the page or the project list.\",\n parameters: Schema.Struct({ projectId: Schema.String }),\n success: Schema.Struct({ path: Schema.String }),\n}).annotate(Tool.Title, \"Open a project\");\n\n/** Every tool the MCP catalog exposes, in stable order. */\n/** WebMCP-only page tools; never registered on the MCP server. */\nexport const webTools = [\n CurrentContext,\n OpenProject,\n OpenExperiment,\n RunFromPage,\n] as const;\n\nexport const tools = [\n WhoAmI,\n ListProjects,\n ListExperiments,\n GetExperiment,\n CreateExperiment,\n UpdateExperiment,\n GetHardware,\n GetReport,\n ListPipelines,\n GetPipeline,\n PipelineStatus,\n ListRuns,\n GetResult,\n ListProposals,\n CompareResults,\n ProposeParameter,\n RunPipeline,\n Rerun,\n Recompute,\n PullPipeline,\n PushPipeline,\n WatcherStatus,\n WatcherQueue,\n WatcherSync,\n WatcherRescan,\n WatcherPause,\n WatcherOpen,\n WatcherResume,\n] as const;\n", "import * as Schema from \"effect/Schema\";\n\n/** An expected tool failure: the model gets an actionable `isError` result. */\nexport class AgentToolError extends Schema.TaggedError<AgentToolError>()(\n \"AgentToolError\",\n {\n message: Schema.String,\n code: Schema.optionalKey(Schema.String),\n },\n) {}\n", "import { NodeStdio } from \"@effect/platform-node\";\nimport { Effect, Layer, Logger } from \"effect\";\nimport { FetchHttpClient } from \"effect/http\";\nimport { layer as compilerLayer } from \"@braven/pipeline-sync/compiler\";\nimport { McpProtocol, McpServer } from \"effect/ai\";\nimport { layer as accessLayer } from \"./access.ts\";\nimport { BravenApi, make } from \"./api.ts\";\nimport { Credential, layer as credentialLayer } from \"./credential.ts\";\nimport { AgentEmail } from \"./email.ts\";\nimport { AgentTools, handlers } from \"./handlers.ts\";\nimport { layer as watcherLayer } from \"./watcher.ts\";\n\n/** The API service is built from the credential resolved at startup. */\nconst bravenApi = Layer.effect(BravenApi)(\n Effect.map(Credential, (credential) =>\n make({ origin: credential.origin, secret: credential.secret }),\n ),\n);\n\n/** The signed-in email is the local credential's; a remote request has none. */\nconst emailLayer = Layer.effect(AgentEmail)(\n Effect.map(Credential, (credential) =>\n AgentEmail.of(\n credential.email === undefined ? {} : { email: credential.email },\n ),\n ),\n);\n\nconst appLayer = Layer.mergeAll(\n credentialLayer,\n Layer.provide(emailLayer, credentialLayer),\n Layer.provide(bravenApi, credentialLayer),\n FetchHttpClient.layer,\n watcherLayer,\n compilerLayer,\n accessLayer,\n);\n\n/**\n * The stdio server. stdout is the protocol; every log goes to stderr.\n *\n * Both the stateful and stateless revisions are offered on stdio. The remote\n * Worker uses only the stateless revision; see plan 076.\n */\nexport const layer = (version: string) =>\n Layer.mergeAll(\n McpServer.toolkit(AgentTools).pipe(Layer.provideMerge(handlers)),\n ).pipe(\n Layer.provide(\n McpServer.layerStdio({\n name: \"braven\",\n version,\n instructions:\n \"Braven is an R&D experiment tracker. Reads are safe. Creating a \" +\n \"proposal is reversible. Runs and watcher controls change state and \" +\n \"ask the user to confirm before they proceed. A tool outside this \" +\n \"server's BRAVEN_MCP_SCOPES allowlist fails with `forbidden`.\",\n protocols: [McpProtocol.v2026_07_28, McpProtocol.v2025_11_25],\n }),\n ),\n Layer.provide(NodeStdio.layer),\n Layer.provide(appLayer),\n Layer.provide(Logger.layer([Logger.consolePretty()])),\n Layer.provideMerge(Layer.succeed(Logger.LogToStderr, true)),\n );\n\n/** Runs until stdin closes. stdout is the protocol; even layer failures log to stderr. */\nexport const runMcp = (version: string) =>\n Layer.launch(layer(version)).pipe(\n Effect.provide(Logger.layer([Logger.consolePretty()])),\n Effect.provide(Layer.succeed(Logger.LogToStderr, true)),\n );\n", "/**\n * The Python authoring compiler boundary.\n *\n * The compiler owns the IR, its canonical bytes and its diagnostics. The CLI\n * only resolves how to invoke it, passes stdin/stdout/stderr through unchanged\n * and mirrors its exit code (`2` validation, `3` usage/config). Sync compiles\n * through this module so it never grows a second implementation of the\n * contract.\n */\nimport { Console, Context, Effect, Layer, Schema } from \"effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { ChildProcess } from \"effect/process\";\nimport { ChildProcessSpawner } from \"effect/process/ChildProcessSpawner\";\nimport * as Stream from \"effect/Stream\";\nimport { SyncFailure } from \"./errors.ts\";\n\n/** Where the compiler ran and what it said; `code` is the process exit code. */\nexport interface CompilerResult {\n readonly code: number;\n readonly stdout: string;\n readonly stderr: string;\n}\n\n/** `validate -` hands the parent's stdin to the compiler. */\nexport interface CompilerOptions {\n readonly stdin?: \"inherit\" | undefined;\n /** The directory the source path is relative to. */\n readonly cwd?: string | undefined;\n}\n\n/** A compiler invocation that cannot start or cannot be observed. */\nexport class CompilerUnavailable extends Schema.TaggedError<CompilerUnavailable>()(\n \"CompilerUnavailable\",\n { message: Schema.String },\n) {}\n\n/** From the compiler contract: `2` is validation, `3` is usage/config. */\nexport const EXIT_PIPELINE_USAGE = 3;\n\n/** The compiler's own exit status, carried through `effect/cli` unchanged. */\nexport class PipelineExit extends Schema.TaggedError<PipelineExit>()(\n \"PipelineExit\",\n { code: Schema.Int, message: Schema.String },\n) {}\n\n/** The Python compiler boundary; a service so tests never spawn `uv`. */\nexport interface PythonCompilerService {\n readonly run: (\n args: ReadonlyArray<string>,\n options?: CompilerOptions,\n ) => Effect.Effect<CompilerResult, CompilerUnavailable>;\n}\n\nexport class PythonCompiler extends Context.Service<\n PythonCompiler,\n PythonCompilerService\n>()(\"PipelinePythonCompiler\") {}\n\nconst stripTrailingNewline = (text: string): string =>\n text.endsWith(\"\\n\") ? text.slice(0, -1) : text;\n\n/** Print what the compiler printed, then mirror its exit status. */\nconst passThrough = (result: CompilerResult) =>\n Effect.gen(function* () {\n if (result.stdout.length > 0) {\n yield* Console.log(stripTrailingNewline(result.stdout));\n }\n if (result.stderr.length > 0) {\n yield* Console.error(stripTrailingNewline(result.stderr));\n }\n if (result.code !== 0) {\n return yield* Effect.fail(\n new PipelineExit({ code: result.code, message: \"\" }),\n );\n }\n });\n\nconst invoke = (args: ReadonlyArray<string>, options?: CompilerOptions) =>\n Effect.gen(function* () {\n const compiler = yield* PythonCompiler;\n const result = yield* compiler.run(args, options);\n yield* passThrough(result);\n return result;\n });\n\nexport const withSource = (\n command: \"compile\" | \"validate\",\n source: string,\n flags: ReadonlyArray<string>,\n options?: CompilerOptions,\n) => invoke([command, source, ...flags], options);\n\n/**\n * Compiles one source to its canonical IR text without printing it.\n *\n * Diagnostics still go to stderr; a non-zero exit mirrors the compiler's own\n * code, so a validation failure stays exit 2 and a usage failure exit 3.\n */\nexport const compileIr = (source: string, options?: CompilerOptions) =>\n Effect.gen(function* () {\n const compiler = yield* PythonCompiler;\n const result = yield* compiler.run([\"compile\", source, \"--json\"], options);\n if (result.code !== 0) {\n if (result.stderr.length > 0)\n yield* Console.error(stripTrailingNewline(result.stderr));\n return yield* Effect.fail(\n new PipelineExit({ code: result.code, message: \"\" }),\n );\n }\n return result.stdout;\n });\n\n/**\n * One actionable sentence for a compiler that produced no IR.\n *\n * Shared by every compile boundary (local source, staged patch) so a rejected\n * source reads the same wherever it was observed.\n */\nexport const compilerFailure = (\n source: string,\n error: CompilerUnavailable | PipelineExit,\n): SyncFailure =>\n error instanceof CompilerUnavailable\n ? new SyncFailure({ kind: \"source\", message: error.message })\n : new SyncFailure({\n kind: \"source\",\n message:\n error.message.length > 0\n ? error.message\n : `the compiler rejected ${source} (exit ${error.code})`,\n });\n\n/**\n * Resolves the compiler from the CLI's own checkout: a monorepo build uses\n * `uv run --project packages/sdk-python`, an installed CLI uses `python3`.\n * Checking the CLI's location (not the caller's cwd) keeps it deterministic.\n */\nexport const layer = Layer.effect(\n PythonCompiler,\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const spawner = yield* ChildProcessSpawner;\n const project = yield* path.fromFileUrl(\n new URL(\"../../../packages/sdk-python\", import.meta.url),\n );\n const local = yield* fs.exists(path.join(project, \"pyproject.toml\"));\n const bin = local ? \"uv\" : \"python3\";\n const prefix = local\n ? [\"run\", \"--project\", project, \"python\", \"-m\", \"braven.pipeline\"]\n : [\"-m\", \"braven.pipeline\"];\n\n return PythonCompiler.of({\n run: (args, options) =>\n Effect.scoped(\n Effect.gen(function* () {\n const command = ChildProcess.make(\n bin,\n [...prefix, ...args],\n options === undefined\n ? undefined\n : { cwd: options.cwd, stdin: options.stdin },\n );\n const handle = yield* spawner.spawn(command).pipe(\n Effect.mapError(\n (error) =>\n new CompilerUnavailable({\n message: `cannot run ${bin}: ${error.message}`,\n }),\n ),\n );\n const [stdout, stderr, code] = yield* Effect.all(\n [\n Stream.mkString(Stream.decodeText(handle.stdout)),\n Stream.mkString(Stream.decodeText(handle.stderr)),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n ).pipe(\n Effect.mapError(\n (error) =>\n new CompilerUnavailable({\n message: `${bin} could not be observed: ${error.message}`,\n }),\n ),\n );\n return { stdout, stderr, code };\n }),\n ),\n });\n }),\n);\n", "/**\n * The engine's typed failures.\n *\n * The package never throws and never speaks CLI exit codes: every expected\n * failure is a `SyncFailure` whose `kind` says what the caller can do about it.\n * The CLI maps the kind to its exit code; the watcher maps it to a panel state.\n */\nimport { Effect } from \"effect\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\n\n/** The four recoverable failure classes, one per caller decision. */\nexport const SyncFailureKind = Schema.Literals([\n \"usage\",\n \"conflict\",\n \"network\",\n \"source\",\n]);\nexport type SyncFailureKind = typeof SyncFailureKind.Type;\n\n/** One expected failure: what happened, and which decision it forces. */\nexport class SyncFailure extends Schema.TaggedError<SyncFailure>()(\n \"SyncFailure\",\n { kind: SyncFailureKind, message: Schema.String },\n) {}\n\n/** Fails with one `SyncFailure`. */\nexport const fail = (kind: SyncFailureKind, message: string) =>\n Effect.fail(new SyncFailure({ kind, message }));\n\n/** Collapses provider text to one line, bounded so a stack dump cannot leak. */\nexport const oneLine = (value: unknown): string =>\n Str.trim(Str.replace(/\\s+/g, \" \")(String(value))).slice(0, 300);\n", "import { Context, Effect, Layer, Option } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\nimport type { Tool } from \"effect/ai\";\nimport { Environment } from \"@braven/identity-store/environment\";\nimport { scopesOf } from \"./catalog.ts\";\nimport { AgentToolError } from \"./errors.ts\";\nimport { Scope } from \"./tools.ts\";\n\n/** Every scope a server grants when the environment restricts none. */\nexport const ALL_SCOPES: ReadonlyArray<Scope> = [\n \"read\",\n \"write\",\n \"run\",\n \"watcher\",\n];\n\nconst decodeScope = Schema.decodeUnknownOption(Scope);\n\n/**\n * Parses `BRAVEN_MCP_SCOPES=read,write`. An unknown or empty allowlist is a\n * startup failure: a typo must not silently grant the default.\n */\nexport const parseScopes = (\n input: string,\n): Effect.Effect<ReadonlyArray<Scope>, AgentToolError> =>\n Effect.gen(function* () {\n const names = Arr.filter(\n Arr.map(Str.split(\",\")(input), Str.trim),\n Str.isNonEmpty,\n );\n const unknown = Arr.filter(names, (name) =>\n Option.isNone(decodeScope(name)),\n );\n if (!Arr.isReadonlyArrayEmpty(unknown)) {\n return yield* Effect.fail(\n new AgentToolError({\n message: `Unknown MCP scope(s): ${Arr.join(unknown, \", \")}. Use any of ${Arr.join(ALL_SCOPES, \", \")}.`,\n code: \"invalid-scope\",\n }),\n );\n }\n if (Arr.isReadonlyArrayEmpty(names)) {\n return yield* Effect.fail(\n new AgentToolError({\n message: `BRAVEN_MCP_SCOPES names no scope. Use any of ${Arr.join(ALL_SCOPES, \", \")}.`,\n code: \"invalid-scope\",\n }),\n );\n }\n return Arr.dedupe(\n Arr.getSomes(Arr.map(names, (name) => decodeScope(name))),\n );\n });\n\n/** The scopes this server process may use; every tool declares one. */\nexport interface AccessValue {\n readonly scopes: ReadonlyArray<Scope>;\n}\n\nexport class Scopes extends Context.Service<Scopes, AccessValue>()(\n \"braven/Access\",\n) {}\n\n/** The allowlist is the environment's, or every scope when it names none. */\nexport const layer = Layer.effect(Scopes)(\n Effect.gen(function* () {\n const environment = yield* Environment;\n const configured = Option.fromNullishOr(\n environment.values.BRAVEN_MCP_SCOPES,\n ).pipe(Option.filter(Str.isNonEmpty));\n const scopes = yield* Option.match(configured, {\n onNone: () => Effect.succeed(ALL_SCOPES),\n onSome: parseScopes,\n });\n return Scopes.of({ scopes });\n }),\n);\n\n/**\n * Refuses a tool whose declared scope this server was not granted, before the\n * action's effect runs. The catalog decides the scope; a handler never does.\n */\nexport const permit = <A, E, R>(\n access: AccessValue,\n tool: Tool.Any,\n run: Effect.Effect<A, E, R>,\n): Effect.Effect<A, E | AgentToolError, R> =>\n Arr.some(scopesOf(tool), (scope) => Arr.contains(access.scopes, scope))\n ? run\n : Effect.fail(\n new AgentToolError({\n message:\n `${tool.name} needs the ${scopesOf(tool).join(\"/\")} scope; ` +\n `this server allows ${access.scopes.join(\", \")}. Nothing was changed. ` +\n `Set BRAVEN_MCP_SCOPES to include it, or run it from the CLI or dashboard.`,\n code: \"forbidden\",\n }),\n );\n", "import { Context, Layer, Match, Option } from \"effect\";\nimport * as Str from \"effect/String\";\n\n/** The hosted API origin used when neither the flag nor the environment names one. */\nexport const DEFAULT_API_ORIGIN = \"https://api.bravenlab.com\";\n\n/** The hosted web origin that performs the browser sign-in. */\nexport const DEFAULT_WEB_ORIGIN = \"https://bravenlab.com\";\n\n/** The public client id `braven login --device` presents to better-auth. */\nexport const DEFAULT_DEVICE_CLIENT_ID = \"braven-cli\";\n\n/**\n * The process facts the identity convention depends on.\n *\n * `values` is the process environment (`process.env`) captured at the CLI's\n * boundary; everything below is a pure function of this shape, so tests point\n * the store at a temp directory and a literal environment.\n */\nexport interface EnvironmentShape {\n readonly platform: NodeJS.Platform;\n readonly home: string;\n /** The directory the command was run in; `.braven/` lives here. */\n readonly cwd: string;\n readonly values: Readonly<Record<string, string | undefined>>;\n}\n\n/** The process environment, injected so no command reads `process.env` directly. */\nexport class Environment extends Context.Service<\n Environment,\n EnvironmentShape\n>()(\"braven/Environment\") {}\n\n/** Provides a fixed environment; `bin.ts` supplies the real one. */\nexport const environmentLayer = (\n shape: EnvironmentShape,\n): Layer.Layer<Environment> => Layer.succeed(Environment)(shape);\n\nconst value = (shape: EnvironmentShape, name: string): Option.Option<string> =>\n Option.fromNullishOr(shape.values[name]).pipe(Option.filter(Str.isNonEmpty));\n\nconst stripTrailing = (path: string): string =>\n Str.replace(/[\\\\/]+$/, \"\")(path);\n\n/**\n * The non-secret config file's path \u2014 the convention in\n * `packages/identity/README.md`, mirrored exactly:\n *\n * - macOS: `~/Library/Application Support/braven/config.json` (XDG wins)\n * - Linux: `${XDG_CONFIG_HOME:-~/.config}/braven/config.json`\n * - Windows: `%APPDATA%\\braven\\config.json`\n */\nexport const configPath = (shape: EnvironmentShape): string => {\n const xdg = value(shape, \"XDG_CONFIG_HOME\");\n const base = Match.value(shape.platform).pipe(\n Match.when(\"darwin\", () =>\n Option.getOrElse(xdg, () => `${shape.home}/Library/Application Support`),\n ),\n Match.when(\"win32\", () =>\n Option.getOrElse(\n value(shape, \"APPDATA\"),\n () => `${shape.home}\\\\AppData\\\\Roaming`,\n ),\n ),\n Match.orElse(() => Option.getOrElse(xdg, () => `${shape.home}/.config`)),\n );\n const separator = shape.platform === \"win32\" ? \"\\\\\" : \"/\";\n return `${stripTrailing(base)}${separator}braven${separator}config.json`;\n};\n\n/**\n * `--origin` > `$BRAVEN_API_URL` > the stored default > the hosted API; trailing\n * slashes go. The stored default is what the shell's Settings \u2192 Backend writes,\n * so an agent launched later joins the same server without a flag.\n */\nexport const resolveOrigin = (\n flag: Option.Option<string>,\n shape: EnvironmentShape,\n stored: Option.Option<string> = Option.none(),\n): string =>\n stripTrailing(\n Option.getOrElse(flag, () =>\n Option.getOrElse(value(shape, \"BRAVEN_API_URL\"), () =>\n Option.getOrElse(stored, () => DEFAULT_API_ORIGIN),\n ),\n ),\n );\n\n/** `--web-origin` > `$BRAVEN_WEB_URL` > the stored default > the hosted web app. */\nexport const resolveWebOrigin = (\n flag: Option.Option<string>,\n shape: EnvironmentShape,\n stored: Option.Option<string> = Option.none(),\n): string =>\n stripTrailing(\n Option.getOrElse(flag, () =>\n Option.getOrElse(value(shape, \"BRAVEN_WEB_URL\"), () =>\n Option.getOrElse(stored, () => DEFAULT_WEB_ORIGIN),\n ),\n ),\n );\n\n/** `--client-id` > `$BRAVEN_CLIENT_ID` > `braven-cli`. */\nexport const resolveClientId = (\n flag: Option.Option<string>,\n shape: EnvironmentShape,\n): string =>\n Option.getOrElse(flag, () =>\n Option.getOrElse(\n value(shape, \"BRAVEN_CLIENT_ID\"),\n () => DEFAULT_DEVICE_CLIENT_ID,\n ),\n );\n\n/** `--project-id` > `$BRAVEN_PROJECT_ID`; the store's default is the fallback. */\nexport const resolveProjectFlag = (\n flag: Option.Option<string>,\n shape: EnvironmentShape,\n): Option.Option<string> =>\n Option.isSome(flag) ? flag : value(shape, \"BRAVEN_PROJECT_ID\");\n", "import { Context, Effect, Layer, Option, Schema } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as P from \"effect/Predicate\";\nimport * as R from \"effect/Record\";\nimport * as Str from \"effect/String\";\nimport type * as HttpClient from \"effect/http/HttpClient\";\nimport {\n decodePipelineIr,\n SetParamOp,\n SetPipelineParamOp,\n} from \"@braven/pipeline-ir\";\nimport {\n PipelineApiError,\n rpcRequest,\n type Router,\n} from \"@braven/pipeline-sync\";\nimport { AgentToolError } from \"./errors.ts\";\nimport { resolveParamTarget } from \"./params.ts\";\n\n/** The API rows the read tools need. Excess wire fields are ignored. */\nclass ProjectRow extends Schema.Class<ProjectRow>(\"AgentProjectRow\")({\n id: Schema.String,\n name: Schema.String,\n company_id: Schema.String,\n company_name: Schema.NullOr(Schema.String),\n}) {}\n\nclass PipelineRow extends Schema.Class<PipelineRow>(\"AgentPipelineRow\")({\n id: Schema.String,\n name: Schema.String,\n stage: Schema.NullOr(Schema.String),\n created_at: Schema.String,\n last_run_at: Schema.NullOr(Schema.String),\n experiment_count: Schema.Number,\n}) {}\n\nclass HeadRow extends Schema.Class<HeadRow>(\"AgentHeadRow\")({\n revisionId: Schema.String,\n number: Schema.Int,\n contentHash: Schema.String,\n}) {}\n\nclass RevisionRow extends Schema.Class<RevisionRow>(\"AgentRevisionRow\")({\n revision: Schema.Struct({\n id: Schema.String,\n number: Schema.Int,\n contentHash: Schema.String,\n }),\n ir: Schema.String,\n}) {}\n\nclass RunRow extends Schema.Class<RunRow>(\"AgentRunRow\")({\n id: Schema.String,\n pipeline_id: Schema.String,\n experiment_id: Schema.String,\n status: Schema.String,\n revision_id: Schema.NullOr(Schema.String),\n created_at: Schema.String,\n}) {}\n\nclass RecomputeRow extends Schema.Class<RecomputeRow>(\"AgentRecomputeRow\")({\n run: Schema.Struct({\n id: Schema.String,\n status: Schema.String,\n revision_id: Schema.NullOr(Schema.String),\n }),\n input_snapshot_id: Schema.String,\n}) {}\n\nclass ResultRow extends Schema.Class<ResultRow>(\"AgentResultRow\")({\n id: Schema.String,\n run_id: Schema.String,\n summary: Schema.Record(Schema.String, Schema.Json),\n outputs: Schema.Array(\n Schema.Struct({\n name: Schema.String,\n content_hash: Schema.NullOr(Schema.String),\n bytes: Schema.NullOr(Schema.Number),\n }),\n ),\n}) {}\n\nclass ProposalRow extends Schema.Class<ProposalRow>(\"AgentProposalRow\")({\n id: Schema.String,\n status: Schema.String,\n rationale: Schema.NullOr(Schema.String),\n createdAt: Schema.optionalKey(Schema.String),\n}) {}\n\n/** An Experiment-list row: the summary the dashboard list reads. */\nclass ExperimentRow extends Schema.Class<ExperimentRow>(\"AgentExperimentRow\")({\n id: Schema.String,\n name: Schema.NullOr(Schema.String),\n created_at: Schema.String,\n is_simulation: Schema.Boolean,\n child_count: Schema.Int,\n file_count: Schema.Int,\n device_id: Schema.NullOr(Schema.String),\n device_name: Schema.NullOr(Schema.String),\n pipeline_id: Schema.NullOr(Schema.String),\n pipeline_name: Schema.NullOr(Schema.String),\n tags: Schema.Array(Schema.Struct({ name: Schema.String })),\n}) {}\n\n/** One Experiment's own record: notes, lineage, files, and its metadata. */\nclass ExperimentDetailRow extends Schema.Class<ExperimentDetailRow>(\n \"AgentExperimentDetailRow\",\n)({\n id: Schema.String,\n name: Schema.NullOr(Schema.String),\n notes: Schema.NullOr(Schema.String),\n created_at: Schema.String,\n parent_experiment_id: Schema.NullOr(Schema.String),\n child_count: Schema.Int,\n device_name: Schema.NullOr(Schema.String),\n tags: Schema.Array(Schema.Struct({ name: Schema.String })),\n metadata: Schema.Array(\n Schema.Struct({\n key: Schema.String,\n value: Schema.NullOr(Schema.String),\n category: Schema.String,\n }),\n ),\n files: Schema.Array(Schema.Struct({ filename: Schema.String })),\n}) {}\n\n/** A company Device as the list returns it: enough to resolve a name. */\nclass DeviceRow extends Schema.Class<DeviceRow>(\"AgentDeviceRow\")({\n id: Schema.String,\n name: Schema.String,\n type_name: Schema.String,\n}) {}\n\n/** The id a create/update answers with; the rest of the row is not needed. */\nclass IdRow extends Schema.Class<IdRow>(\"AgentIdRow\")({ id: Schema.String }) {}\n\n/** One Device's full record: model, aliases, counts and field values. */\nclass HardwareRow extends Schema.Class<HardwareRow>(\"AgentHardwareRow\")({\n id: Schema.String,\n name: Schema.String,\n type_name: Schema.String,\n model: Schema.NullOr(Schema.String),\n notes: Schema.NullOr(Schema.String),\n tracked: Schema.Boolean,\n count: Schema.Int,\n experiment_count: Schema.Int,\n aliases: Schema.Array(Schema.String),\n field_values: Schema.Array(\n Schema.Struct({\n field_key: Schema.String,\n value: Schema.NullOr(Schema.String),\n }),\n ),\n}) {}\n\n/** A report's identity, for resolving one by name. */\nclass ReportSummaryRow extends Schema.Class<ReportSummaryRow>(\n \"AgentReportSummaryRow\",\n)({\n id: Schema.String,\n name: Schema.String,\n created_at: Schema.String,\n}) {}\n\n/** A report with its segments, in order. */\nclass ReportRow extends Schema.Class<ReportRow>(\"AgentReportRow\")({\n id: Schema.String,\n name: Schema.String,\n created_at: Schema.String,\n updated_at: Schema.String,\n segments: Schema.Array(\n Schema.Struct({\n position: Schema.Int,\n type: Schema.String,\n content: Schema.NullOr(Schema.String),\n }),\n ),\n}) {}\n\n/** A run `pipelineRuns.create` queued, at the revision it pinned. */\nclass CreatedRunRow extends Schema.Class<CreatedRunRow>(\"AgentCreatedRunRow\")({\n id: Schema.String,\n status: Schema.String,\n revision_id: Schema.String,\n}) {}\n\nclass ComparisonRow extends Schema.Class<ComparisonRow>(\"AgentComparisonRow\")({\n axis: Schema.String,\n same_method: Schema.Boolean,\n same_evidence: Schema.Boolean,\n same_configuration: Schema.Boolean,\n left: Schema.Struct({ id: Schema.String }),\n right: Schema.Struct({ id: Schema.String }),\n}) {}\n\n/** A project the caller can access. */\nexport interface ProjectSummary {\n readonly id: string;\n readonly name: string;\n readonly companyId: string;\n readonly companyName?: string;\n}\n\n/** A company pipeline without its definition. */\nexport interface PipelineSummary {\n readonly id: string;\n readonly name: string;\n readonly stage?: string;\n readonly lastRunAt?: string;\n readonly experimentCount: number;\n}\n\nexport interface PipelineDetail extends PipelineSummary {\n readonly headRevisionId?: string;\n readonly headNumber?: number;\n readonly contentHash?: string;\n readonly irText?: string;\n readonly createdAt?: string;\n}\n\n/** The identity of a published head revision. */\nexport interface Head {\n readonly revisionId: string;\n readonly number: number;\n readonly contentHash: string;\n}\n\n/** A run's identity and terminal state. */\nexport interface RunSummary {\n readonly id: string;\n readonly pipelineId: string;\n readonly experimentId: string;\n readonly status: string;\n readonly createdAt: string;\n}\n\n/** A run's identity and the revision it pins. */\nexport interface RunHandle {\n readonly runId: string;\n readonly status: string;\n readonly revisionId: string;\n readonly experimentId: string;\n}\n\n/** An immutable result and its output references. */\nexport interface ResultDetail {\n readonly id: string;\n readonly runId: string;\n readonly summary: Readonly<Record<string, Schema.Json>>;\n readonly outputs: ReadonlyArray<{\n readonly name: string;\n readonly contentHash?: string;\n readonly bytes?: number;\n }>;\n}\n\n/** A dashboard proposal without its patch. */\nexport interface ProposalSummary {\n readonly id: string;\n readonly status: string;\n readonly rationale?: string;\n readonly createdAt?: string;\n}\n\n/** Two result ids with the axis the server derived. */\nexport interface ComparisonDetail {\n readonly axis: string;\n readonly sameMethod: boolean;\n readonly sameEvidence: boolean;\n readonly sameConfiguration: boolean;\n readonly left: string;\n readonly right: string;\n}\n\n/** An Experiment as a list row: identity, what it was measured on, its tags. */\nexport interface ExperimentSummary {\n readonly id: string;\n readonly name?: string;\n readonly createdAt: string;\n readonly isSimulation: boolean;\n readonly childCount: number;\n readonly fileCount: number;\n readonly deviceName?: string;\n readonly pipelineName?: string;\n readonly tags: ReadonlyArray<string>;\n}\n\n/** Which Experiments to read: a names-or-ids filter, never a raw query blob. */\nexport interface ExperimentQuery {\n readonly projectId: string;\n /** A Device's name or id. */\n readonly device?: string;\n /** A pipeline's name or id. */\n readonly pipeline?: string;\n /** A case-insensitive part of the Experiment's name. */\n readonly nameContains?: string;\n readonly stage?: \"simulation\" | \"experiment\";\n readonly limit?: number;\n readonly offset?: number;\n}\n\n/** One Experiment with its notes, files and Config/Summary values. */\nexport interface ExperimentDetail {\n readonly id: string;\n readonly name?: string;\n readonly notes?: string;\n readonly createdAt: string;\n readonly parentId?: string;\n readonly childCount: number;\n readonly deviceName?: string;\n readonly tags: ReadonlyArray<string>;\n readonly config: Readonly<Record<string, string>>;\n readonly summary: Readonly<Record<string, string>>;\n readonly files: ReadonlyArray<string>;\n}\n\n/** One Device: what it is, what it is made of, and what it was measured in. */\nexport interface HardwareDetail {\n readonly id: string;\n readonly name: string;\n readonly typeName: string;\n readonly model?: string;\n readonly notes?: string;\n readonly tracked: boolean;\n readonly count: number;\n readonly experimentCount: number;\n readonly aliases: ReadonlyArray<string>;\n readonly fields: ReadonlyArray<{\n readonly key: string;\n readonly value?: string;\n }>;\n}\n\n/** A report: its segments, with a bounded excerpt of each one's text. */\nexport interface ReportDetail {\n readonly id: string;\n readonly name: string;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly segments: ReadonlyArray<{\n readonly position: number;\n readonly type: string;\n readonly excerpt?: string;\n }>;\n}\n\n/** The API surface the agent tools need, implemented over the API's oRPC wire. */\nexport class BravenApi extends Context.Service<\n BravenApi,\n {\n /** The origin every call goes to; whoami reports it. */\n readonly origin: string;\n readonly listProjects: (input: {\n readonly companyId?: string;\n }) => Effect.Effect<\n ReadonlyArray<ProjectSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly listPipelines: (input: {\n readonly companyId: string;\n }) => Effect.Effect<\n ReadonlyArray<PipelineSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly getPipeline: (input: {\n readonly companyId: string;\n readonly pipelineId: string;\n readonly includeIr?: boolean;\n }) => Effect.Effect<PipelineDetail, AgentToolError, HttpClient.HttpClient>;\n readonly pipelineStatus: (input: {\n readonly pipelineId: string;\n }) => Effect.Effect<\n { readonly pipelineId: string; readonly head: Head | null },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly listRuns: (input: {\n readonly pipelineId?: string;\n readonly experimentId?: string;\n readonly status?: string;\n }) => Effect.Effect<\n ReadonlyArray<RunSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly getResult: (input: {\n readonly resultId: string;\n }) => Effect.Effect<ResultDetail, AgentToolError, HttpClient.HttpClient>;\n readonly listProposals: (input: {\n readonly pipelineId: string;\n readonly status?: string;\n }) => Effect.Effect<\n ReadonlyArray<ProposalSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly compare: (input: {\n readonly leftResultId: string;\n readonly rightResultId: string;\n }) => Effect.Effect<\n ComparisonDetail,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly listExperiments: (\n input: ExperimentQuery,\n ) => Effect.Effect<\n ReadonlyArray<ExperimentSummary>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly createExperiment: (input: {\n readonly projectId: string;\n readonly name?: string;\n readonly notes?: string;\n readonly deviceId?: string;\n readonly pipelineId?: string;\n }) => Effect.Effect<\n { readonly id: string },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly updateExperiment: (input: {\n readonly projectId: string;\n readonly experimentId: string;\n readonly name?: string;\n readonly notes?: string;\n }) => Effect.Effect<\n { readonly id: string },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly getExperiment: (input: {\n readonly experimentId: string;\n }) => Effect.Effect<\n ExperimentDetail,\n AgentToolError,\n HttpClient.HttpClient\n >;\n /** Resolve a name or id to one Device, then read its full record. */\n readonly getHardware: (input: {\n readonly companyId: string;\n readonly deviceId?: string;\n readonly name?: string;\n }) => Effect.Effect<HardwareDetail, AgentToolError, HttpClient.HttpClient>;\n /** Resolve a name or id to one report, then read its segments. */\n readonly getReport: (input: {\n readonly projectId: string;\n readonly reportId?: string;\n readonly name?: string;\n }) => Effect.Effect<ReportDetail, AgentToolError, HttpClient.HttpClient>;\n readonly proposeParameter: (input: {\n readonly pipelineId: string;\n readonly param: string;\n readonly value: string | number | boolean;\n readonly stepId?: string;\n readonly baseRevisionId?: string;\n readonly rationale?: string;\n }) => Effect.Effect<\n {\n readonly proposalId: string;\n readonly baseRevisionId: string;\n readonly target: string;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly createRun: (input: {\n readonly pipelineId: string;\n readonly experimentId: string;\n readonly revisionId: string;\n readonly parameters?: Readonly<Record<string, string | number | boolean>>;\n readonly dryRun: boolean;\n }) => Effect.Effect<RunHandle, AgentToolError, HttpClient.HttpClient>;\n readonly rerun: (input: {\n readonly runId: string;\n readonly mode: \"exact\" | \"current-inputs\";\n }) => Effect.Effect<\n {\n readonly runId: string;\n readonly status: string;\n readonly revisionId?: string;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly recompute: (input: {\n readonly pipelineId: string;\n readonly revisionId: string;\n readonly inputSnapshotId: string;\n readonly parameters?: Readonly<Record<string, string | number | boolean>>;\n }) => Effect.Effect<\n {\n readonly runId: string;\n readonly status: string;\n readonly inputSnapshotId: string;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n }\n>()(\"braven/BravenApi\") {}\n\n/**\n * An absent wire code is an absent key, not `undefined`: `optionalKey` rejects\n * a present-but-undefined value, and constructing the error would throw.\n */\nconst toToolError = (error: PipelineApiError): AgentToolError =>\n Option.match(error.code, {\n onNone: () => new AgentToolError({ message: error.message }),\n onSome: (code) => new AgentToolError({ message: error.message, code }),\n });\n\n/** Builds the API service for one credential. The secret never leaves the header. */\nexport const make = (options: {\n readonly origin: string;\n readonly secret: string;\n}): BravenApi[\"Service\"] => {\n const call = <A>(\n router: Router,\n procedure: string,\n body: unknown,\n schema: Schema.ConstraintDecoder<A>,\n headers: Readonly<Record<string, string>> = {},\n ) =>\n rpcRequest(options, procedure, body, schema, router, headers).pipe(\n Effect.mapError(toToolError),\n );\n\n /** A project-scoped procedure reads the Project from the header. */\n const inProject = (projectId: string) => ({ \"x-project-id\": projectId });\n\n const projectCompany = (projectId: string) =>\n call<ReadonlyArray<ProjectRow>>(\n \"projects\",\n \"list\",\n {},\n Schema.Array(ProjectRow),\n ).pipe(\n Effect.flatMap((rows) =>\n Option.match(\n Arr.findFirst(rows, (row) => row.id === projectId),\n {\n onNone: () =>\n Effect.fail(\n new AgentToolError({\n message: `No accessible project ${projectId}`,\n code: \"project-not-found\",\n }),\n ),\n onSome: (row) => Effect.succeed(row.company_id),\n },\n ),\n ),\n );\n\n /** A name or id to one id. Two rows sharing a name are refused, not guessed:\n * reading the wrong Device or report as \"the\" match is worse than failing. */\n const resolveId = <A extends { readonly id: string; readonly name: string }>(\n rows: ReadonlyArray<A>,\n options: {\n readonly label: string;\n readonly scope: string;\n readonly nameOrId: string;\n readonly missing: string;\n readonly ambiguous: string;\n },\n ) => {\n const key = options.nameOrId.toLowerCase();\n const matches = Arr.filter(\n rows,\n (row) => row.id === options.nameOrId || row.name.toLowerCase() === key,\n );\n return Arr.match(matches, {\n onEmpty: () =>\n Effect.fail(\n new AgentToolError({\n message: `No ${options.label} named ${options.nameOrId} in this ${options.scope}`,\n code: options.missing,\n }),\n ),\n onNonEmpty: ([first, ...rest]) =>\n Arr.isReadonlyArrayEmpty(rest)\n ? Effect.succeed(first.id)\n : Effect.fail(\n new AgentToolError({\n message: `${matches.length} ${options.label}s are named ${options.nameOrId}; pass an id instead`,\n code: options.ambiguous,\n }),\n ),\n });\n };\n\n /** A Device by name (case-insensitive) or id; the API never resolves names. */\n const deviceIdOf = (companyId: string, nameOrId: string) =>\n call<ReadonlyArray<DeviceRow>>(\n \"devices\",\n \"listDevices\",\n { companyId },\n Schema.Array(DeviceRow),\n ).pipe(\n Effect.flatMap((rows) =>\n resolveId(rows, {\n label: \"hardware\",\n scope: \"company\",\n nameOrId,\n missing: \"hardware-not-found\",\n ambiguous: \"ambiguous-hardware\",\n }),\n ),\n );\n\n const pipelineIdOf = (companyId: string, nameOrId: string) =>\n call<ReadonlyArray<PipelineRow>>(\n \"pipelines\",\n \"list\",\n { companyId },\n Schema.Array(PipelineRow),\n ).pipe(\n Effect.flatMap((rows) =>\n resolveId(rows, {\n label: \"pipeline\",\n scope: \"company\",\n nameOrId,\n missing: \"pipeline-not-found\",\n ambiguous: \"ambiguous-pipeline\",\n }),\n ),\n );\n\n const reportIdOf = (projectId: string, name: string) =>\n call<ReadonlyArray<ReportSummaryRow>>(\n \"reports\",\n \"list\",\n {},\n Schema.Array(ReportSummaryRow),\n inProject(projectId),\n ).pipe(\n Effect.flatMap((rows) =>\n resolveId(rows, {\n label: \"report\",\n scope: \"project\",\n nameOrId: name,\n missing: \"report-not-found\",\n ambiguous: \"ambiguous-report\",\n }),\n ),\n );\n\n /** The segments of a report, each text cut to what a tool result may carry. */\n const EXCERPT = 240;\n const decodeDocument = Schema.decodeUnknownOption(\n Schema.fromJsonString(Schema.Unknown),\n );\n\n /** A rich-text document's words in reading order: TipTap keeps them in\n * `text` nodes, so the keys are not read out as content. */\n const wordsOf = (value: unknown): ReadonlyArray<string> =>\n Arr.isArray(value)\n ? Arr.flatMap(value, wordsOf)\n : P.isObject(value)\n ? Arr.flatMap(R.toEntries(value), ([key, inner]) =>\n key === \"text\" && P.isString(inner) ? [inner] : wordsOf(inner),\n )\n : [];\n\n /** A segment's text: a rich-text document's words, or the raw content. */\n const excerptOf = (content: string | null) => {\n if (content === null) return {};\n const text = Option.match(decodeDocument(content), {\n onNone: () => content,\n onSome: (document) => Str.trim(Arr.join(wordsOf(document), \" \")),\n });\n return Str.isNonEmpty(text) ? { excerpt: text.slice(0, EXCERPT) } : {};\n };\n\n /** One metadata category as a key\u2192value map; an empty value is dropped. */\n const valuesOf = (\n entries: ReadonlyArray<{\n readonly key: string;\n readonly value: string | null;\n readonly category: string;\n }>,\n category: string,\n ): Readonly<Record<string, string>> =>\n R.fromEntries(\n Arr.flatMap(entries, (entry) =>\n entry.category === category && entry.value !== null\n ? [[entry.key, entry.value] as const]\n : [],\n ),\n );\n\n return {\n origin: options.origin,\n listProjects: (input) =>\n call<ReadonlyArray<ProjectRow>>(\n \"projects\",\n \"list\",\n { companyId: input.companyId },\n Schema.Array(ProjectRow),\n ).pipe(\n Effect.map((rows) =>\n rows.map((row) => ({\n id: row.id,\n name: row.name,\n companyId: row.company_id,\n ...(row.company_name === null\n ? {}\n : { companyName: row.company_name }),\n })),\n ),\n ),\n listPipelines: (input) =>\n call<ReadonlyArray<PipelineRow>>(\n \"pipelines\",\n \"list\",\n { companyId: input.companyId },\n Schema.Array(PipelineRow),\n ).pipe(\n Effect.map((rows) =>\n rows.map((row) => ({\n id: row.id,\n name: row.name,\n experimentCount: row.experiment_count,\n ...(row.stage === null ? {} : { stage: row.stage }),\n ...(row.last_run_at === null ? {} : { lastRunAt: row.last_run_at }),\n })),\n ),\n ),\n getPipeline: ({ companyId, pipelineId, includeIr = false }) =>\n Effect.gen(function* () {\n // Company-scoped and read-only: never `pipelines.get` (auth-only) or\n // `pipelines.list` (imports legacy scripts as a side effect).\n const pipeline = yield* call<PipelineRow>(\n \"pipelines\",\n \"getInCompany\",\n { companyId, pipelineId },\n PipelineRow,\n );\n const head = yield* call<HeadRow | null>(\n \"pipelines\",\n \"head\",\n { pipelineId },\n Schema.NullOr(HeadRow),\n );\n const revision =\n includeIr && head !== null\n ? yield* call<RevisionRow>(\n \"pipelines\",\n \"revision\",\n { pipelineId, revisionId: head.revisionId },\n RevisionRow,\n )\n : undefined;\n return {\n id: pipeline.id,\n name: pipeline.name,\n createdAt: pipeline.created_at,\n experimentCount: pipeline.experiment_count,\n ...(pipeline.stage === null ? {} : { stage: pipeline.stage }),\n ...(pipeline.last_run_at === null\n ? {}\n : { lastRunAt: pipeline.last_run_at }),\n ...(head === null\n ? {}\n : {\n headRevisionId: head.revisionId,\n headNumber: head.number,\n contentHash: head.contentHash,\n }),\n ...(revision === undefined ? {} : { irText: revision.ir }),\n };\n }),\n pipelineStatus: ({ pipelineId }) =>\n call<HeadRow | null>(\n \"pipelines\",\n \"head\",\n { pipelineId },\n Schema.NullOr(HeadRow),\n ).pipe(\n Effect.map((head) => ({\n pipelineId,\n head: head === null ? null : head,\n })),\n ),\n listRuns: (input) =>\n call<ReadonlyArray<RunRow>>(\n \"pipelineRuns\",\n \"list\",\n {\n pipelineId: input.pipelineId,\n experimentId: input.experimentId,\n status: input.status,\n },\n Schema.Array(RunRow),\n ).pipe(\n Effect.map((rows) =>\n rows.map((row) => ({\n id: row.id,\n pipelineId: row.pipeline_id,\n experimentId: row.experiment_id,\n status: row.status,\n createdAt: row.created_at,\n })),\n ),\n ),\n getResult: ({ resultId }) =>\n call<ResultRow>(\"pipelineRuns\", \"result\", { resultId }, ResultRow).pipe(\n Effect.map((row) => ({\n id: row.id,\n runId: row.run_id,\n summary: row.summary,\n outputs: row.outputs.map((output) => ({\n name: output.name,\n ...(output.content_hash === null\n ? {}\n : { contentHash: output.content_hash }),\n ...(output.bytes === null ? {} : { bytes: output.bytes }),\n })),\n })),\n ),\n listProposals: ({ pipelineId, status }) =>\n call<ReadonlyArray<ProposalRow>>(\n \"pipelines\",\n \"proposals\",\n { pipelineId, status },\n Schema.Array(ProposalRow),\n ).pipe(\n Effect.map((rows) =>\n rows.map((row) => ({\n id: row.id,\n status: row.status,\n ...(row.rationale === null ? {} : { rationale: row.rationale }),\n ...(row.createdAt === undefined\n ? {}\n : { createdAt: row.createdAt }),\n })),\n ),\n ),\n compare: ({ leftResultId, rightResultId }) =>\n call<ComparisonRow>(\n \"pipelineRuns\",\n \"compare\",\n { leftResultId, rightResultId },\n ComparisonRow,\n ).pipe(\n Effect.map((row) => ({\n axis: row.axis,\n sameMethod: row.same_method,\n sameEvidence: row.same_evidence,\n sameConfiguration: row.same_configuration,\n left: row.left.id,\n right: row.right.id,\n })),\n ),\n listExperiments: (input) =>\n Effect.gen(function* () {\n const companyId = yield* projectCompany(input.projectId);\n const deviceIds =\n input.device === undefined\n ? undefined\n : [yield* deviceIdOf(companyId, input.device)];\n const pipelineIds =\n input.pipeline === undefined\n ? undefined\n : [yield* pipelineIdOf(companyId, input.pipeline)];\n const rows = yield* call<ReadonlyArray<ExperimentRow>>(\n \"experiments\",\n \"list\",\n {\n filters: {\n deviceIds,\n pipelineIds,\n nameQuery: input.nameContains,\n stage: input.stage,\n },\n limit: input.limit ?? 50,\n offset: input.offset ?? 0,\n },\n Schema.Array(ExperimentRow),\n inProject(input.projectId),\n );\n return rows.map((row) => ({\n id: row.id,\n createdAt: row.created_at,\n isSimulation: row.is_simulation,\n childCount: row.child_count,\n fileCount: row.file_count,\n tags: row.tags.map((tag) => tag.name),\n ...(row.name === null ? {} : { name: row.name }),\n ...(row.device_name === null ? {} : { deviceName: row.device_name }),\n ...(row.pipeline_name === null\n ? {}\n : { pipelineName: row.pipeline_name }),\n }));\n }),\n createExperiment: (input) =>\n call<IdRow>(\n \"experiments\",\n \"create\",\n {\n name: input.name,\n notes: input.notes,\n device_id: input.deviceId,\n pipeline_id: input.pipelineId,\n },\n IdRow,\n inProject(input.projectId),\n ).pipe(Effect.map((row) => ({ id: row.id }))),\n updateExperiment: (input) =>\n call<IdRow>(\n \"experiments\",\n \"update\",\n {\n experimentId: input.experimentId,\n name: input.name,\n notes: input.notes,\n },\n IdRow,\n inProject(input.projectId),\n ).pipe(Effect.map((row) => ({ id: row.id }))),\n getExperiment: ({ experimentId }) =>\n call<ExperimentDetailRow>(\n \"experiments\",\n \"get\",\n { experimentId },\n ExperimentDetailRow,\n ).pipe(\n Effect.map((row) => ({\n id: row.id,\n createdAt: row.created_at,\n childCount: row.child_count,\n tags: row.tags.map((tag) => tag.name),\n config: valuesOf(row.metadata, \"config\"),\n summary: valuesOf(row.metadata, \"summary\"),\n files: row.files.map((file) => file.filename),\n ...(row.name === null ? {} : { name: row.name }),\n ...(row.notes === null ? {} : { notes: row.notes }),\n ...(row.parent_experiment_id === null\n ? {}\n : { parentId: row.parent_experiment_id }),\n ...(row.device_name === null ? {} : { deviceName: row.device_name }),\n })),\n ),\n getHardware: (input) =>\n Effect.gen(function* () {\n const deviceId =\n input.deviceId ??\n (input.name === undefined\n ? undefined\n : yield* deviceIdOf(input.companyId, input.name));\n if (deviceId === undefined) {\n return yield* Effect.fail(\n new AgentToolError({\n message: \"Pass a deviceId or a name to read hardware\",\n code: \"hardware-required\",\n }),\n );\n }\n const row = yield* call<HardwareRow>(\n \"devices\",\n \"getDevice\",\n { deviceId },\n HardwareRow,\n );\n return {\n id: row.id,\n name: row.name,\n typeName: row.type_name,\n tracked: row.tracked,\n count: row.count,\n experimentCount: row.experiment_count,\n aliases: row.aliases,\n fields: row.field_values.map((field) => ({\n key: field.field_key,\n ...(field.value === null ? {} : { value: field.value }),\n })),\n ...(row.model === null ? {} : { model: row.model }),\n ...(row.notes === null ? {} : { notes: row.notes }),\n };\n }),\n getReport: (input) =>\n Effect.gen(function* () {\n const reportId =\n input.reportId ??\n (input.name === undefined\n ? undefined\n : yield* reportIdOf(input.projectId, input.name));\n if (reportId === undefined) {\n return yield* Effect.fail(\n new AgentToolError({\n message: \"Pass a reportId or a name to read a report\",\n code: \"report-required\",\n }),\n );\n }\n const row = yield* call<ReportRow>(\n \"reports\",\n \"get\",\n { reportId },\n ReportRow,\n inProject(input.projectId),\n );\n return {\n id: row.id,\n name: row.name,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n segments: row.segments.map((segment) => ({\n position: segment.position,\n type: segment.type,\n ...excerptOf(segment.content),\n })),\n };\n }),\n proposeParameter: (input) =>\n Effect.gen(function* () {\n const headRow =\n input.baseRevisionId === undefined\n ? yield* call<HeadRow | null>(\n \"pipelines\",\n \"head\",\n { pipelineId: input.pipelineId },\n Schema.NullOr(HeadRow),\n )\n : null;\n const baseRevisionId = input.baseRevisionId ?? headRow?.revisionId;\n if (baseRevisionId === undefined) {\n return yield* Effect.fail(\n new AgentToolError({\n message: \"Pipeline has no published revision to propose against\",\n code: \"no-head\",\n }),\n );\n }\n const revision = yield* call<RevisionRow>(\n \"pipelines\",\n \"revision\",\n { pipelineId: input.pipelineId, revisionId: baseRevisionId },\n RevisionRow,\n );\n const ir = yield* decodePipelineIr(revision.ir).pipe(\n Effect.mapError(\n (error) =>\n new AgentToolError({\n message: `Cannot read the pipeline IR: ${Arr.map(\n error.issues,\n (issue) => issue.message,\n ).join(\"; \")}`,\n code: \"invalid-ir\",\n }),\n ),\n );\n const target = yield* resolveParamTarget(ir, {\n param: input.param,\n stepId: input.stepId,\n });\n const op =\n target.kind === \"pipeline\"\n ? new SetPipelineParamOp({\n name: target.name,\n value: input.value,\n })\n : new SetParamOp({\n stepId: target.stepId,\n name: target.name,\n value: input.value,\n });\n const rationale =\n input.rationale === undefined || input.rationale.length === 0\n ? `Change ${input.param} to ${String(input.value)} from an agent proposal.`\n : input.rationale;\n const { proposalId } = yield* call<{ proposalId: string }>(\n \"pipelines\",\n \"propose\",\n {\n pipelineId: input.pipelineId,\n baseRevisionId,\n patch: [op],\n rationale,\n },\n Schema.Struct({ proposalId: Schema.String }),\n );\n return { proposalId, baseRevisionId, target: target.path };\n }),\n createRun: (input) =>\n call<CreatedRunRow>(\n \"pipelineRuns\",\n \"create\",\n {\n pipelineId: input.pipelineId,\n experimentId: input.experimentId,\n revisionId: input.revisionId,\n parameters: input.parameters,\n dryRun: input.dryRun,\n },\n CreatedRunRow,\n ).pipe(\n Effect.map((row) => ({\n runId: row.id,\n status: row.status,\n revisionId: row.revision_id,\n experimentId: input.experimentId,\n })),\n ),\n rerun: (input) =>\n call<RunRow>(\n \"pipelineRuns\",\n \"rerun\",\n { runId: input.runId, mode: input.mode },\n RunRow,\n ).pipe(\n Effect.map((row) => ({\n runId: row.id,\n status: row.status,\n ...(row.revision_id === null ? {} : { revisionId: row.revision_id }),\n })),\n ),\n recompute: (input) =>\n call<RecomputeRow>(\n \"pipelineRuns\",\n \"recompute\",\n {\n pipelineId: input.pipelineId,\n revisionId: input.revisionId,\n inputSnapshotId: input.inputSnapshotId,\n parameters: input.parameters ?? null,\n },\n RecomputeRow,\n ).pipe(\n Effect.map((row) => ({\n runId: row.run.id,\n status: row.run.status,\n inputSnapshotId: row.input_snapshot_id,\n })),\n ),\n };\n};\n\n/** Provides the read service for one credential. */\nexport const layer = (options: {\n readonly origin: string;\n readonly secret: string;\n}): Layer.Layer<BravenApi> => Layer.succeed(BravenApi)(make(options));\n", "/**\n * The pipeline IR: the versioned data contract between the Python authoring\n * compiler and the Effect platform.\n *\n * The IR is canonical: object keys sort lexicographically, absent optionals are\n * omitted and numbers keep the lexeme the compiler emitted. `irHashOf` hashes\n * the graph without its line numbers, so reordering independent functions\n * keeps the hash while the bytes and `sourceHash` move.\n */\nimport { Effect, Match } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Hex from \"effect/encoding/Hex\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as P from \"effect/Predicate\";\nimport * as R from \"effect/Record\";\nimport * as Schema from \"effect/Schema\";\nimport * as SchemaIssue from \"effect/SchemaIssue\";\nimport * as SchemaParser from \"effect/SchemaParser\";\nimport * as SchemaTransformation from \"effect/SchemaTransformation\";\nimport * as Str from \"effect/String\";\nimport { ContentHash } from \"./content-hash.js\";\n\nconst SupportedVersion = { major: 1, minor: 0 } as const;\n\nconst versionSupported = Schema.makeFilter(\n (value: string) => {\n const [major = Number.NaN, minor = Number.NaN] =\n Str.split(\".\")(value).map(Number);\n return major === SupportedVersion.major && minor <= SupportedVersion.minor;\n },\n {\n identifier: \"PipelineIrVersionSupported\",\n title: \"Pipeline IR version\",\n description: `A version this reader understands (${SupportedVersion.major}.x, minor <= ${SupportedVersion.minor}).`,\n message: `expected a ${SupportedVersion.major}.x IR with minor <= ${SupportedVersion.minor}`,\n },\n);\n\n/**\n * The IR's major/minor version. A reader accepts its major and any minor no\n * newer than its own; `patch` is not part of the contract.\n */\nexport const IrVersion = Schema.String.check(\n Schema.isPattern(/^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/),\n).check(versionSupported);\nexport type IrVersion = typeof IrVersion.Type;\n\n/**\n * A JSON number that remembers the exact text the compiler wrote.\n *\n * Python's `json.dumps` emits `2.0` for a float and `2` for an int; JavaScript\n * has one number type. Keeping the lexeme is what makes the hash and the bytes\n * identical on both sides of the boundary.\n */\nexport class IrNumber extends Schema.Class<IrNumber>(\"IrNumber\")({\n value: Schema.Finite,\n text: Schema.NonEmptyString,\n}) {}\n\nclass NumberLexeme extends Schema.Class<NumberLexeme>(\"NumberLexeme\")({\n value: Schema.Finite,\n text: Schema.NonEmptyString.check(\n Schema.isPattern(/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/),\n ),\n}) {}\n\nconst numberLiteral = Schema.Union([NumberLexeme, Schema.Finite]).pipe(\n Schema.decodeTo(\n IrNumber,\n SchemaTransformation.transform({\n decode: (input) =>\n typeof input === \"number\"\n ? new IrNumber({ value: input, text: String(input) })\n : new IrNumber({ value: input.value, text: input.text }),\n encode: (input) => input.value,\n }),\n ),\n);\n\n/** A step parameter's default: a JSON scalar, with numbers keeping their lexeme. */\nexport const IrDefaultValue = Schema.Union([\n Schema.String,\n Schema.Boolean,\n numberLiteral,\n]).annotate({\n title: \"IrDefaultValue\",\n description: \"A declared parameter default: string, boolean or number.\",\n});\nexport type IrDefaultValue = typeof IrDefaultValue.Type;\n\n/** The seven port kinds the compiler emits. */\nexport const IrTypeKind = Schema.Literals([\n \"dataset\",\n \"table\",\n \"figure\",\n \"file\",\n \"scalar\",\n \"model\",\n \"opaque\",\n]);\nexport type IrTypeKind = typeof IrTypeKind.Type;\n\n/** One declared column in a dataset schema. */\nexport class IrColumn extends Schema.Class<IrColumn>(\"IrColumn\")({\n name: Schema.NonEmptyString,\n type: Schema.NonEmptyString,\n unit: Schema.OptionFromOptionalKey(Schema.NonEmptyString),\n}) {}\n\n/** A dataset's advisory, validation-authoritative column schema. */\nexport class IrDatasetSchema extends Schema.Class<IrDatasetSchema>(\n \"IrDatasetSchema\",\n)({\n columns: Schema.Array(IrColumn),\n}) {}\n\n/** A port's optional semantic constraints. No constraints means \"unknown\". */\nexport class IrType extends Schema.Class<IrType>(\"IrType\")({\n kind: IrTypeKind,\n schema: Schema.OptionFromOptionalKey(IrDatasetSchema),\n units: Schema.OptionFromOptionalKey(Schema.NonEmptyString),\n cardinality: Schema.OptionFromOptionalKey(Schema.Literals([\"one\", \"many\"])),\n}) {}\n\n/** A parameter is always a scalar the dashboard can edit. */\nexport class IrParamType extends Schema.Class<IrParamType>(\"IrParamType\")({\n kind: Schema.Literals([\"string\", \"number\", \"boolean\"]),\n}) {}\n\n/** A named port on a step. `required` is absent when the port is optional. */\nexport class IrPort extends Schema.Class<IrPort>(\"IrPort\")({\n id: Schema.NonEmptyString,\n type: IrType,\n required: Schema.OptionFromOptionalKey(Schema.Boolean),\n}) {}\n\n/** A builder-visible source span. Line numbers are navigation, not meaning. */\nexport class IrSourceSpan extends Schema.Class<IrSourceSpan>(\"IrSourceSpan\")({\n startLine: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),\n endLine: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),\n}) {}\n\n/** Where a step was written. */\nexport class IrSource extends Schema.Class<IrSource>(\"IrSource\")({\n path: Schema.NonEmptyString,\n span: IrSourceSpan,\n}) {}\n\n/**\n * How a step parameter got its effective value.\n *\n * `step` is the step call's own literal or the signature default; `pipeline`\n * is a reference to a `@pipeline` parameter, which is the effective default.\n */\nexport const IrParamBinding = Schema.Literals([\"step\", \"pipeline\"]);\nexport type IrParamBinding = typeof IrParamBinding.Type;\n\n/** One knob declared on the `@pipeline` signature, addressable by a proposal. */\nexport class IrPipelineParam extends Schema.Class<IrPipelineParam>(\n \"IrPipelineParam\",\n)({\n name: Schema.NonEmptyString,\n type: IrParamType,\n default: Schema.OptionFromOptionalKey(IrDefaultValue),\n editable: Schema.OptionFromOptionalKey(Schema.Boolean),\n source: IrSource,\n}) {}\n\n/** One declared knob on a step. */\nexport class IrParam extends Schema.Class<IrParam>(\"IrParam\")({\n name: Schema.NonEmptyString,\n type: IrParamType,\n required: Schema.OptionFromOptionalKey(Schema.Boolean),\n default: Schema.OptionFromOptionalKey(IrDefaultValue),\n editable: Schema.OptionFromOptionalKey(Schema.Boolean),\n /** Absent on pre-provenance revisions; a reader treats it as `step`. */\n binding: Schema.OptionFromOptionalKey(IrParamBinding),\n /** The `@pipeline` parameter this step param is bound to, when it is. */\n pipelineParam: Schema.OptionFromOptionalKey(Schema.NonEmptyString),\n}) {}\n\n/** A Python function the compiler resolved to a module and symbol. */\nexport class IrPythonImplementation extends Schema.Class<IrPythonImplementation>(\n \"IrPythonImplementation\",\n)({\n type: Schema.Literal(\"python\"),\n module: Schema.NonEmptyString,\n function: Schema.NonEmptyString,\n}) {}\n\n/** An opaque step's honest boundary: declared ports, internals unknown. */\nexport class IrOpaqueDeclared extends Schema.Class<IrOpaqueDeclared>(\n \"IrOpaqueDeclared\",\n)({\n inputs: Schema.Array(Schema.NonEmptyString),\n outputs: Schema.Array(Schema.NonEmptyString),\n params: Schema.Array(Schema.NonEmptyString),\n}) {}\n\n/** An opaque step: the graph knows its boundary, not its body. */\nexport class IrOpaqueImplementation extends Schema.Class<IrOpaqueImplementation>(\n \"IrOpaqueImplementation\",\n)({\n type: Schema.Literal(\"opaque\"),\n sourceHash: ContentHash,\n declared: IrOpaqueDeclared,\n}) {}\n\n/** How a step is implemented: resolved Python or an opaque boundary. */\nexport const IrImplementation = Schema.Union([\n IrPythonImplementation,\n IrOpaqueImplementation,\n]);\nexport type IrImplementation = typeof IrImplementation.Type;\n\n/** One typed box in the graph. */\nexport class IrStep extends Schema.Class<IrStep>(\"IrStep\")({\n id: Schema.NonEmptyString,\n kind: Schema.Literals([\"function\", \"source\", \"sink\", \"opaque\"]),\n name: Schema.NonEmptyString,\n inputs: Schema.Array(IrPort),\n outputs: Schema.Array(IrPort),\n params: Schema.Array(IrParam),\n source: IrSource,\n implementation: IrImplementation,\n}) {}\n\n/** One end of an edge: a step id and a port id. */\nexport class IrEdgeEndpoint extends Schema.Class<IrEdgeEndpoint>(\n \"IrEdgeEndpoint\",\n)({\n step: Schema.NonEmptyString,\n port: Schema.NonEmptyString,\n}) {}\n\n/** A typed data flow. `fan` is always present, even for the trivial case. */\nexport class IrEdge extends Schema.Class<IrEdge>(\"IrEdge\")({\n from: IrEdgeEndpoint,\n to: IrEdgeEndpoint,\n fan: Schema.Literals([\"one-to-one\", \"one-to-many\", \"many-to-one\"]),\n}) {}\n\n/** The runtime the pipeline needs. Paths are relative to the project root. */\nexport class IrRequirements extends Schema.Class<IrRequirements>(\n \"IrRequirements\",\n)({\n path: Schema.NonEmptyString,\n hash: ContentHash,\n}) {}\n\nexport class IrRuntime extends Schema.Class<IrRuntime>(\"IrRuntime\")({\n python: Schema.NonEmptyString,\n entry: Schema.String,\n requirements: Schema.OptionFromOptionalKey(IrRequirements),\n imports: Schema.Array(Schema.NonEmptyString),\n}) {}\n\n/** The compiler's identity and the two hashes that anchor a revision. */\nexport class IrMetadata extends Schema.Class<IrMetadata>(\"IrMetadata\")({\n compiler: Schema.NonEmptyString,\n sourceHash: ContentHash,\n irHash: Schema.OptionFromOptionalKey(ContentHash),\n}) {}\n\n/** The pipeline's author-facing identity and lifecycle stage. */\nexport class IrPipeline extends Schema.Class<IrPipeline>(\"IrPipeline\")({\n name: Schema.NonEmptyString,\n description: Schema.OptionFromOptionalKey(Schema.String),\n stage: Schema.Literals([\"simulation\", \"experiment\"]),\n /** The `@pipeline` signature's knobs; absent when it declares none. */\n params: Schema.OptionFromOptionalKey(Schema.Array(IrPipelineParam)),\n}) {}\n\n/** The complete, compact pipeline document the Python compiler emits. */\nexport class PipelineIr extends Schema.Class<PipelineIr>(\"PipelineIr\")({\n irVersion: IrVersion,\n pipeline: IrPipeline,\n runtime: IrRuntime,\n steps: Schema.Array(IrStep),\n edges: Schema.Array(IrEdge),\n metadata: IrMetadata,\n}) {}\n\n/** One decode failure, addressed by an RFC 6901 JSON pointer. */\nexport class PipelineIrIssue extends Schema.Class<PipelineIrIssue>(\n \"PipelineIrIssue\",\n)({\n pointer: Schema.String,\n message: Schema.String,\n}) {}\n\n/** A decode failure: one or more issues, each with its JSON pointer. */\nexport class PipelineIrError extends Schema.TaggedError<PipelineIrError>()(\n \"PipelineIrError\",\n { issues: Schema.NonEmptyArray(PipelineIrIssue) },\n) {\n get message(): string {\n return Arr.join(\n this.issues.map((issue) => `${issue.pointer || \"/\"}: ${issue.message}`),\n \"; \",\n );\n }\n}\n\n/** An untrusted IR value: JSON text (lexeme-preserving) or a parsed value. */\nexport type PipelineIrInput = string | unknown;\n\nconst pointerToken = (token: PropertyKey): string =>\n Str.replaceAll(\"~\", \"~0\")(Str.replaceAll(\"/\", \"~1\")(String(token)));\n\nconst pointerOf = (path: ReadonlyArray<PropertyKey>): string =>\n path.length === 0 ? \"\" : `/${path.map(pointerToken).join(\"/\")}`;\n\nconst formatLeaf = SchemaIssue.makeFormatterDefault();\n\nconst issueAt = (\n issue: SchemaIssue.Issue,\n path: ReadonlyArray<PropertyKey>,\n): PipelineIrIssue =>\n new PipelineIrIssue({ pointer: pointerOf(path), message: formatLeaf(issue) });\n\nconst collectIssues = (\n issue: SchemaIssue.Issue,\n path: ReadonlyArray<PropertyKey> = [],\n): ReadonlyArray<PipelineIrIssue> =>\n Match.value(issue).pipe(\n Match.tag(\"Pointer\", (pointer) =>\n collectIssues(pointer.issue, Arr.appendAll(path, pointer.path)),\n ),\n Match.tag(\"Composite\", (composite) =>\n Arr.match(composite.issues, {\n onEmpty: () => [issueAt(composite, path)],\n onNonEmpty: (issues) =>\n Arr.flatMap(issues, (child) => collectIssues(child, path)),\n }),\n ),\n Match.tag(\"AnyOf\", (anyOf) =>\n Arr.match(anyOf.issues, {\n onEmpty: () => [issueAt(anyOf, path)],\n onNonEmpty: (issues) =>\n Arr.flatMap(issues, (child) => collectIssues(child, path)),\n }),\n ),\n Match.tag(\"Filter\", (filter) =>\n Match.value(filter.issue).pipe(\n Match.tag(\"InvalidValue\", () => [issueAt(filter, path)]),\n Match.orElse((inner) => collectIssues(inner, path)),\n ),\n ),\n Match.tag(\"Encoding\", (encoding) => collectIssues(encoding.issue, path)),\n Match.orElse((leaf) => [issueAt(leaf, path)]),\n );\n\nconst issueEquivalence = (self: PipelineIrIssue, that: PipelineIrIssue) =>\n self.pointer === that.pointer && self.message === that.message;\n\nconst parseText = (text: string): unknown =>\n JSON.parse(\n text,\n (_key: string, value: unknown, context?: { readonly source?: string }) =>\n typeof value === \"number\" && context?.source !== undefined\n ? /[.eE]/.test(context.source)\n ? { value, text: context.source }\n : value\n : value,\n );\n\n/**\n * Decodes an untrusted IR document.\n *\n * Pass the JSON text when it is available: the number lexemes survive, so\n * `canonicalJson` reproduces the compiler's bytes exactly. Excess properties\n * are rejected and every issue carries a JSON pointer.\n */\nexport const decodePipelineIr = Effect.fn(\"PipelineIr.decode\")(function* (\n input: PipelineIrInput,\n) {\n const value =\n typeof input === \"string\"\n ? yield* Effect.try({\n try: () => parseText(input),\n catch: (cause) =>\n new PipelineIrError({\n issues: [\n new PipelineIrIssue({\n pointer: \"\",\n message: `invalid JSON: ${String(cause)}`,\n }),\n ],\n }),\n })\n : input;\n return yield* SchemaParser.decodeUnknownEffect(PipelineIr, {\n errors: \"all\",\n onExcessProperty: \"error\",\n })(value).pipe(\n Effect.mapError((issue) => {\n const issues = Arr.dedupeWith(collectIssues(issue), issueEquivalence);\n return new PipelineIrError({\n issues: Arr.match(issues, {\n onEmpty: () => [issueAt(issue, [])],\n onNonEmpty: (nonEmpty) => nonEmpty,\n }),\n });\n }),\n );\n});\n\n/** The volatile fields: line numbers and hashes that describe, not define. */\nconst withoutVolatile = (ir: PipelineIr): unknown => {\n const { irHash: _irHash, sourceHash: _sourceHash, ...metadata } = ir.metadata;\n return {\n ...ir,\n metadata,\n pipeline: {\n ...ir.pipeline,\n params: Option.match(ir.pipeline.params, {\n onNone: () => undefined,\n onSome: (params) =>\n params.map((param) => ({\n ...param,\n source: { ...param.source, span: undefined },\n })),\n }),\n },\n steps: ir.steps.map((step) => ({\n ...step,\n source: { ...step.source, span: undefined },\n })),\n };\n};\n\n/**\n * Hand-written rather than `Schema.fromJsonString`: the encoders cannot preserve\n * a numeric lexeme (`2.0` vs `2`), and byte identity with the Python emitter is\n * the point. Object keys still sort like Python's `sort_keys=True`.\n */\nconst canonicalValue = (value: unknown): string => {\n if (value instanceof IrNumber) return value.text;\n if (Option.isOption(value)) {\n return Option.match(value, {\n onNone: () => \"null\",\n onSome: canonicalValue,\n });\n }\n if (Array.isArray(value)) {\n return `[${Arr.map(value, canonicalValue).join(\",\")}]`;\n }\n if (P.isObject(value)) {\n const entries = Arr.flatMap(\n Arr.sort(\n Object.entries(value),\n Order.mapInput(\n Order.String,\n (entry: readonly [string, unknown]) => entry[0],\n ),\n ),\n ([key, field]) => {\n if (field === undefined) return [];\n if (Option.isOption(field) && Option.isNone(field)) return [];\n return [`${JSON.stringify(key)}:${canonicalValue(field)}`];\n },\n );\n return `{${entries.join(\",\")}}`;\n }\n return JSON.stringify(value);\n};\n\n/**\n * The canonical JSON of an IR document: sorted keys, no whitespace, non-ASCII\n * unescaped and no trailing newline.\n */\nexport const canonicalJson = (ir: PipelineIr): string => canonicalValue(ir);\n\n/**\n * `sha256:` of the canonical IR without `irHash`, `sourceHash` and every\n * `source.span` \u2014 the graph's identity across line-number churn.\n */\nexport const irHashOf = Effect.fn(\"PipelineIr.hash\")(function* (\n ir: PipelineIr,\n) {\n const bytes = new TextEncoder().encode(canonicalValue(withoutVolatile(ir)));\n const digest = yield* Effect.tryPromise({\n try: () => crypto.subtle.digest(\"SHA-256\", bytes),\n catch: (cause) =>\n new PipelineIrError({\n issues: [\n new PipelineIrIssue({\n pointer: \"\",\n message: `cannot hash the IR: ${String(cause)}`,\n }),\n ],\n }),\n });\n return `sha256:${Hex.encode(new Uint8Array(digest))}`;\n});\n\n/** A structural or semantic rule the compiler and the server both enforce. */\nexport const IrValidationCode = Schema.Literals([\n \"duplicate-step-id\",\n \"duplicate-port-id\",\n \"duplicate-param-name\",\n \"unknown-edge-endpoint\",\n \"input-edge-count\",\n \"cycle\",\n \"missing-source\",\n \"missing-sink\",\n \"edge-type-mismatch\",\n \"param-default-mismatch\",\n \"opaque-ports\",\n \"empty-entry\",\n]);\nexport type IrValidationCode = typeof IrValidationCode.Type;\n\n/** One structural failure, addressed by a step id or JSON pointer. */\nexport class IrValidationIssue extends Schema.Class<IrValidationIssue>(\n \"IrValidationIssue\",\n)({\n code: IrValidationCode,\n path: Schema.String,\n message: Schema.String,\n}) {}\n\n/** The first structural failure. */\nexport class PipelineValidationError extends Schema.TaggedError<PipelineValidationError>()(\n \"PipelineValidationError\",\n {\n code: IrValidationCode,\n path: Schema.String,\n message: Schema.String,\n },\n) {}\n\nconst duplicates = (values: ReadonlyArray<string>): ReadonlyArray<string> =>\n Arr.map(\n Arr.filter(\n R.values(Arr.groupBy(values, String)),\n (group) => group.length > 1,\n ),\n (group) => group[0],\n );\n\nconst hasIncoming = (edges: ReadonlyArray<IrEdge>, step: string): boolean =>\n Arr.some(edges, (edge) => edge.to.step === step);\n\nconst hasOutgoing = (edges: ReadonlyArray<IrEdge>, step: string): boolean =>\n Arr.some(edges, (edge) => edge.from.step === step);\n\nconst edgeCount = (\n edges: ReadonlyArray<IrEdge>,\n step: string,\n port: string,\n): number =>\n Arr.countBy(edges, (edge) => edge.to.step === step && edge.to.port === port);\n\nconst portIds = (ports: ReadonlyArray<IrPort>): ReadonlyArray<string> =>\n ports.map((port) => port.id);\n\nconst sameNames = (\n left: ReadonlyArray<string>,\n right: ReadonlyArray<string>,\n): boolean =>\n Arr.length(left) === Arr.length(right) &&\n Arr.every(left, (name) => Arr.contains(right, name));\n\n/** Kahn's algorithm; a non-empty remainder means a cycle. */\nconst hasCycle = (\n steps: ReadonlyArray<IrStep>,\n edges: ReadonlyArray<IrEdge>,\n) => {\n const indegree = Arr.reduce(\n edges,\n HashMap.fromIterable<string, number>(\n steps.map((step) => [step.id, 0] as const),\n ),\n (counts, edge) =>\n HashMap.modifyAt(\n counts,\n edge.to.step,\n Option.map((n: number) => n + 1),\n ),\n );\n const ready = Arr.map(\n Arr.filter(steps, (step) =>\n Option.contains(HashMap.get(indegree, step.id), 0),\n ),\n (step) => step.id,\n );\n const walk = (\n pending: HashMap.HashMap<string, number>,\n queue: ReadonlyArray<string>,\n ): boolean =>\n Arr.match(queue, {\n onEmpty: () => !HashMap.isEmpty(pending),\n onNonEmpty: ([head, ...rest]) => {\n const [next, counts] = Arr.reduce(\n Arr.filter(edges, (edge) => edge.from.step === head),\n [rest, HashMap.remove(pending, head)] as const,\n ([remaining, current], edge) => {\n const decremented = HashMap.modifyAt(\n current,\n edge.to.step,\n Option.map((n: number) => n - 1),\n );\n return Option.contains(HashMap.get(decremented, edge.to.step), 0)\n ? ([Arr.append(remaining, edge.to.step), decremented] as const)\n : ([remaining, decremented] as const);\n },\n );\n return walk(counts, next);\n },\n });\n return walk(indegree, ready);\n};\n\n/**\n * Structural problems in an IR, in rule order.\n *\n * Pure: no I/O and no clock. The server re-runs this because a client's\n * compile is advisory. Each rule has its own code so a caller can react to it.\n */\nexport const structuralIssues = (\n ir: PipelineIr,\n): ReadonlyArray<IrValidationIssue> => {\n const stepIds = ir.steps.map((step) => step.id);\n const issue = (\n code: IrValidationCode,\n path: string,\n message: string,\n ): IrValidationIssue => new IrValidationIssue({ code, path, message });\n\n const duplicateSteps = duplicates(stepIds).map((id) =>\n issue(\"duplicate-step-id\", `/steps/${id}`, `step id \"${id}\" is used twice`),\n );\n\n const duplicatePorts = Arr.flatMap(ir.steps, (step) =>\n Arr.appendAll(\n duplicates(portIds(step.inputs)).map((id) =>\n issue(\n \"duplicate-port-id\",\n `/steps/${step.id}/inputs/${id}`,\n `input port \"${id}\" is declared twice on \"${step.id}\"`,\n ),\n ),\n duplicates(portIds(step.outputs)).map((id) =>\n issue(\n \"duplicate-port-id\",\n `/steps/${step.id}/outputs/${id}`,\n `output port \"${id}\" is declared twice on \"${step.id}\"`,\n ),\n ),\n ),\n );\n\n const duplicateParams = Arr.flatMap(ir.steps, (step) =>\n duplicates(step.params.map((param) => param.name)).map((name) =>\n issue(\n \"duplicate-param-name\",\n `/steps/${step.id}/params/${name}`,\n `parameter \"${name}\" is declared twice on \"${step.id}\"`,\n ),\n ),\n );\n\n const unknownEdges = Arr.flatMap(ir.edges, (edge, index) => {\n const from = ir.steps.find((step) => step.id === edge.from.step);\n const to = ir.steps.find((step) => step.id === edge.to.step);\n const problems: Array<IrValidationIssue> = [];\n if (\n from === undefined ||\n !Arr.contains(portIds(from.outputs), edge.from.port)\n ) {\n problems.push(\n issue(\n \"unknown-edge-endpoint\",\n `/edges/${index}/from`,\n `edge ${index} leaves \"${edge.from.step}.${edge.from.port}\", which is not an output port`,\n ),\n );\n }\n if (to === undefined || !Arr.contains(portIds(to.inputs), edge.to.port)) {\n problems.push(\n issue(\n \"unknown-edge-endpoint\",\n `/edges/${index}/to`,\n `edge ${index} enters \"${edge.to.step}.${edge.to.port}\", which is not an input port`,\n ),\n );\n }\n return problems;\n });\n\n const badInputs = Arr.flatMap(ir.steps, (step) =>\n Arr.flatMap(step.inputs, (port) => {\n const required = Option.getOrElse(port.required, () => false);\n const count = edgeCount(ir.edges, step.id, port.id);\n const valid = required ? count === 1 : count <= 1;\n return valid\n ? []\n : [\n issue(\n \"input-edge-count\",\n `/steps/${step.id}/inputs/${port.id}`,\n `input \"${step.id}.${port.id}\" has ${count} incoming edges, expected ${required ? \"exactly one\" : \"at most one\"}`,\n ),\n ];\n }),\n );\n\n const cycle = hasCycle(ir.steps, ir.edges)\n ? [\n issue(\n \"cycle\",\n \"/edges\",\n \"the graph has a cycle; a topological order does not exist\",\n ),\n ]\n : [];\n\n const missingSource = Arr.some(\n ir.steps,\n (step) => !hasIncoming(ir.edges, step.id),\n )\n ? []\n : [issue(\"missing-source\", \"/steps\", \"the pipeline has no source step\")];\n const missingSink = Arr.some(\n ir.steps,\n (step) => !hasOutgoing(ir.edges, step.id),\n )\n ? []\n : [issue(\"missing-sink\", \"/steps\", \"the pipeline has no sink step\")];\n\n const opaque = Arr.flatMap(ir.steps, (step) => {\n if (!(step.implementation instanceof IrOpaqueImplementation)) return [];\n const declared =\n sameNames(step.implementation.declared.inputs, portIds(step.inputs)) &&\n sameNames(step.implementation.declared.outputs, portIds(step.outputs));\n return declared\n ? []\n : [\n issue(\n \"opaque-ports\",\n `/steps/${step.id}/implementation/declared`,\n `opaque step \"${step.id}\" does not declare exactly its input and output ports`,\n ),\n ];\n });\n\n const emptyEntry =\n ir.runtime.entry.length === 0\n ? [\n issue(\n \"empty-entry\",\n \"/runtime/entry\",\n \"runtime.entry must be non-empty\",\n ),\n ]\n : [];\n\n return Arr.flatten([\n duplicateSteps,\n duplicatePorts,\n duplicateParams,\n unknownEdges,\n badInputs,\n cycle,\n missingSource,\n missingSink,\n opaque,\n emptyEntry,\n ]);\n};\n\nconst columnsEqual = (left: IrDatasetSchema, right: IrDatasetSchema): boolean =>\n Arr.length(left.columns) === Arr.length(right.columns) &&\n Arr.every(left.columns, (column) =>\n Arr.some(\n right.columns,\n (candidate) =>\n candidate.name === column.name &&\n candidate.type === column.type &&\n Option.getOrElse(candidate.unit, () => \"\") ===\n Option.getOrElse(column.unit, () => \"\"),\n ),\n );\n\n/** Whether a value produced as `from` satisfies a port declared as `to`.\n * An opaque side is unknown, not wrong: the platform checks what is declared. */\nexport const typesCompatible = (from: IrType, to: IrType): boolean => {\n if (from.kind === \"opaque\" || to.kind === \"opaque\") return true;\n if (from.kind !== to.kind) return false;\n if (\n Option.isSome(from.units) &&\n Option.isSome(to.units) &&\n from.units.value !== to.units.value\n )\n return false;\n if (Option.isSome(from.schema) && Option.isSome(to.schema))\n return columnsEqual(from.schema.value, to.schema.value);\n return !(\n Option.isSome(from.cardinality) &&\n Option.isSome(to.cardinality) &&\n from.cardinality.value !== to.cardinality.value\n );\n};\n\nconst defaultValueMatches = (\n value: IrDefaultValue,\n kind: IrParamType[\"kind\"],\n) =>\n Match.value(kind).pipe(\n Match.when(\"string\", () => typeof value === \"string\"),\n Match.when(\"boolean\", () => typeof value === \"boolean\"),\n Match.when(\"number\", () => value instanceof IrNumber),\n Match.exhaustive,\n );\n\n/**\n * Semantic problems in an IR, in rule order.\n *\n * Pure, like `structuralIssues`: it checks the meaning the graph declares \u2014\n * types along edges and parameter defaults \u2014 and never executes Python.\n */\nexport const semanticIssues = (\n ir: PipelineIr,\n): ReadonlyArray<IrValidationIssue> => {\n const issue = (\n code: IrValidationCode,\n path: string,\n message: string,\n ): IrValidationIssue => new IrValidationIssue({ code, path, message });\n\n const steps = ir.steps;\n const stepById = (id: string) => steps.find((step) => step.id === id);\n const portOf = (step: IrStep, id: string, side: \"inputs\" | \"outputs\") =>\n step[side].find((port) => port.id === id);\n\n const edges = Arr.flatMap(ir.edges, (edge, index) => {\n const fromStep = stepById(edge.from.step);\n const toStep = stepById(edge.to.step);\n const from = fromStep && portOf(fromStep, edge.from.port, \"outputs\");\n const to = toStep && portOf(toStep, edge.to.port, \"inputs\");\n // A missing endpoint is `unknown-edge-endpoint`'s finding, not ours.\n if (!from || !to || typesCompatible(from.type, to.type)) return [];\n return [\n issue(\n \"edge-type-mismatch\",\n `/edges/${index}`,\n `edge ${index} sends ${from.type.kind} to ${edge.to.step}.${edge.to.port}, which declares ${to.type.kind}`,\n ),\n ];\n });\n\n const params = Arr.flatMap(ir.steps, (step) =>\n Arr.flatMap(step.params, (param) =>\n Option.match(param.default, {\n onNone: () => [],\n onSome: (value) =>\n defaultValueMatches(value, param.type.kind)\n ? []\n : [\n issue(\n \"param-default-mismatch\",\n `/steps/${step.id}/params/${param.name}/default`,\n `default of \"${step.id}.${param.name}\" is not a ${param.type.kind}`,\n ),\n ],\n }),\n ),\n );\n\n return Arr.appendAll(edges, params);\n};\n\n/**\n * Fails with the first structural or semantic issue, or returns the IR\n * unchanged.\n *\n * Call after `decodePipelineIr`; the server runs the same function so a client\n * cannot publish a graph the platform could not execute.\n */\nexport const validatePipelineIr = Effect.fn(\"PipelineIr.validate\")(function* (\n ir: PipelineIr,\n) {\n const [first] = Arr.appendAll(structuralIssues(ir), semanticIssues(ir));\n if (first === undefined) return ir;\n return yield* Effect.fail(\n new PipelineValidationError({\n code: first.code,\n path: first.path,\n message: first.message,\n }),\n );\n});\n", "/**\n * The content identity shared by revisions, inputs and outputs: a SHA-256\n * digest written as `sha256:` plus 64 lowercase hex digits.\n *\n * Lives in the IR package because the compiler's canonical hash and every\n * addressable IR value are compared by it, on both sides of the wire.\n */\nimport * as Schema from \"effect/Schema\";\n\n/** A `sha256:<64 hex>` digest. */\nexport const ContentHash = Schema.NonEmptyString.check(\n Schema.isPattern(/^sha256:[0-9a-f]{64}$/),\n).pipe(\n Schema.brand(\"ContentHash\"),\n Schema.annotate({\n title: \"ContentHash\",\n description: \"A `sha256:` digest of canonical bytes.\",\n }),\n);\nexport type ContentHash = typeof ContentHash.Type;\n", "/**\n * The typed operations a dashboard proposal may carry.\n *\n * An op names an IR construct, never a line of Python. The CLI decides whether\n * a named construct is round-trip-safe before it edits source (plan 069); the\n * server stores ops so both sides share one vocabulary.\n */\nimport * as Schema from \"effect/Schema\";\n\n/** A parameter value on one step. */\nexport class SetParamOp extends Schema.Class<SetParamOp>(\"SetParamOp\")({\n op: Schema.tag(\"set-param\"),\n stepId: Schema.NonEmptyString,\n name: Schema.NonEmptyString,\n value: Schema.Json,\n}) {}\n\n/**\n * A parameter default on the `@pipeline` declaration itself.\n *\n * This is the effective default of every step param bound to it, so it is the\n * target for those knobs; a step-path op on such a param is refused.\n */\nexport class SetPipelineParamOp extends Schema.Class<SetPipelineParamOp>(\n \"SetPipelineParamOp\",\n)({\n op: Schema.tag(\"set-pipeline-param\"),\n name: Schema.NonEmptyString,\n value: Schema.Json,\n}) {}\n\n/** The author-facing name of one step. */\nexport class SetStepNameOp extends Schema.Class<SetStepNameOp>(\"SetStepNameOp\")(\n {\n op: Schema.tag(\"set-step-name\"),\n stepId: Schema.NonEmptyString,\n name: Schema.NonEmptyString,\n },\n) {}\n\n/** The pipeline's description. */\nexport class SetDescriptionOp extends Schema.Class<SetDescriptionOp>(\n \"SetDescriptionOp\",\n)({\n op: Schema.tag(\"set-description\"),\n description: Schema.NonEmptyString,\n}) {}\n\n/** The declared runtime, as an IR-shaped record until 067 types it. */\nexport class SetRuntimeOp extends Schema.Class<SetRuntimeOp>(\"SetRuntimeOp\")({\n op: Schema.tag(\"set-runtime\"),\n runtime: Schema.Record(Schema.String, Schema.Json),\n}) {}\n\n/** Connect two declared ports. */\nexport class AddEdgeOp extends Schema.Class<AddEdgeOp>(\"AddEdgeOp\")({\n op: Schema.tag(\"add-edge\"),\n fromStep: Schema.NonEmptyString,\n fromPort: Schema.NonEmptyString,\n toStep: Schema.NonEmptyString,\n toPort: Schema.NonEmptyString,\n}) {}\n\n/** Remove a connection between two declared ports. */\nexport class RemoveEdgeOp extends Schema.Class<RemoveEdgeOp>(\"RemoveEdgeOp\")({\n op: Schema.tag(\"remove-edge\"),\n fromStep: Schema.NonEmptyString,\n fromPort: Schema.NonEmptyString,\n toStep: Schema.NonEmptyString,\n toPort: Schema.NonEmptyString,\n}) {}\n\n/** The operations a proposal may carry. */\nexport const IrOp = Schema.Union([\n SetParamOp,\n SetPipelineParamOp,\n SetStepNameOp,\n SetDescriptionOp,\n SetRuntimeOp,\n AddEdgeOp,\n RemoveEdgeOp,\n])\n .pipe(Schema.toTaggedUnion(\"op\"))\n .annotate({\n title: \"IrOp\",\n description: \"One typed change to a pipeline definition.\",\n });\nexport type IrOp = typeof IrOp.Type;\n", "/**\n * The sync protocol's only network module (plan 069).\n *\n * It speaks oRPC's plain HTTP shape: `POST {origin}/rpc/pipelines/<procedure>`\n * with a bearer credential and a JSON body. Every response is decoded with a\n * schema; every failure is a typed `PipelineApiError` carrying the HTTP status\n * and the server's wire code, so `push`/`pull` can tell a stale parent (409)\n * from a bad definition (422) from an unreachable API.\n */\nimport { Effect, Schema } from \"effect\";\nimport * as Option from \"effect/Option\";\nimport { HttpClient, HttpClientRequest, HttpClientResponse } from \"effect/http\";\nimport { IrOp } from \"@braven/pipeline-ir\";\n\n/** A request that failed, with the wire's own code where it had one. */\nexport class PipelineApiError extends Schema.TaggedError<PipelineApiError>()(\n \"PipelineApiError\",\n {\n procedure: Schema.String,\n message: Schema.String,\n status: Schema.OptionFromNullishOr(Schema.Int, {\n onNoneEncoding: null,\n }),\n code: Schema.OptionFromNullishOr(Schema.String, {\n onNoneEncoding: null,\n }),\n },\n) {}\n\n/** The head revision's identity, as `pipelines.head` returns it. */\nexport class RevisionHead extends Schema.Class<RevisionHead>(\"RevisionHead\")({\n revisionId: Schema.NonEmptyString,\n number: Schema.Int,\n contentHash: Schema.NonEmptyString,\n}) {}\n\n/** The fields of a revision the sync protocol needs. */\nexport class RevisionSummary extends Schema.Class<RevisionSummary>(\n \"RevisionSummary\",\n)({\n id: Schema.NonEmptyString,\n number: Schema.Int,\n contentHash: Schema.NonEmptyString,\n}) {}\n\n/** One revision and its exact canonical IR text. */\nexport class RevisionDocument extends Schema.Class<RevisionDocument>(\n \"RevisionDocument\",\n)({\n revision: RevisionSummary,\n ir: Schema.String,\n}) {}\n\n/** What a publish returns. */\nexport class PublishedRevision extends Schema.Class<PublishedRevision>(\n \"PublishedRevision\",\n)({\n revisionId: Schema.NonEmptyString,\n number: Schema.Int,\n contentHash: Schema.NonEmptyString,\n headRevisionId: Schema.NonEmptyString,\n}) {}\n\n/** One dashboard proposal, with its typed IR operations. */\nexport class ProposalSummary extends Schema.Class<ProposalSummary>(\n \"ProposalSummary\",\n)({\n id: Schema.NonEmptyString,\n baseRevisionId: Schema.NonEmptyString,\n authorId: Schema.NonEmptyString,\n patch: Schema.Array(IrOp),\n rationale: Schema.NullOr(Schema.String),\n status: Schema.Literals([\"open\", \"applied\", \"rejected\", \"superseded\"]),\n createdAt: Schema.DateFromString,\n}) {}\n\nexport interface PublishRequest {\n readonly pipelineId: string;\n /** The compiler's JSON bytes; the server re-derives the hash from them. */\n readonly irText: string;\n readonly irHash: string;\n readonly expectedParentId: string | null;\n readonly baseRevisionId: string | null;\n readonly summary?: string | undefined;\n}\n\nexport interface ProposeRequest {\n readonly pipelineId: string;\n readonly baseRevisionId: string;\n readonly patch: ReadonlyArray<IrOp>;\n readonly rationale: string;\n}\n\nexport interface ProposalsFilter {\n readonly status?: \"open\" | \"applied\" | \"rejected\" | \"superseded\";\n readonly base?: string;\n}\n\n/** One immutable result, as `pipelineRuns.results|result|compare|recompute`\n * return it (plan 072). Only the fields the CLI renders are decoded; the wire\n * object is larger. */\nexport class AnalysisResultRef extends Schema.Class<AnalysisResultRef>(\n \"AnalysisResultRef\",\n)({\n id: Schema.NonEmptyString,\n run_id: Schema.NonEmptyString,\n revision_id: Schema.NullOr(Schema.String),\n revision_hash: Schema.String,\n input_snapshot_hash: Schema.String,\n parameters_hash: Schema.String,\n created_at: Schema.DateFromString,\n is_latest: Schema.Boolean,\n outputs: Schema.Array(\n Schema.Struct({\n name: Schema.String,\n artifact_id: Schema.NullOr(Schema.String),\n content_hash: Schema.NullOr(Schema.String),\n }),\n ),\n}) {}\n\n/** The axes a comparison can name \u2014 the server derives it; the client renders\n * it and never re-derives a friendlier one. */\nexport const ComparisonAxis = Schema.Literals([\n \"identical\",\n \"configuration\",\n \"method\",\n \"evidence\",\n \"both\",\n]);\nexport type ComparisonAxis = typeof ComparisonAxis.Type;\n\n/** Two results with the axis they moved on and the per-output/metric deltas. */\nexport class Comparison extends Schema.Class<Comparison>(\"Comparison\")({\n axis: ComparisonAxis,\n same_method: Schema.Boolean,\n same_evidence: Schema.Boolean,\n same_configuration: Schema.Boolean,\n left: AnalysisResultRef,\n right: AnalysisResultRef,\n outputs: Schema.Array(\n Schema.Struct({\n name: Schema.String,\n left: Schema.NullOr(\n Schema.Struct({\n name: Schema.String,\n content_hash: Schema.NullOr(Schema.String),\n }),\n ),\n right: Schema.NullOr(\n Schema.Struct({\n name: Schema.String,\n content_hash: Schema.NullOr(Schema.String),\n }),\n ),\n changed: Schema.Boolean,\n }),\n ),\n metrics: Schema.Array(\n Schema.Struct({\n key: Schema.String,\n left: Schema.Json,\n right: Schema.Json,\n delta: Schema.NullOr(Schema.Number),\n }),\n ),\n}) {}\n\n/** A run the recompute queued, and the results already on its evidence. */\nexport class RecomputeOutcome extends Schema.Class<RecomputeOutcome>(\n \"RecomputeOutcome\",\n)({\n run: Schema.Struct({\n id: Schema.NonEmptyString,\n status: Schema.String,\n revision_id: Schema.NullOr(Schema.String),\n input_snapshot_id: Schema.optional(Schema.String),\n }),\n input_snapshot_id: Schema.NonEmptyString,\n previous_results: Schema.Array(AnalysisResultRef),\n}) {}\n\n/** The network surface `push`, `pull`, `diff` and `apply` share. */\nexport interface PipelineApi {\n readonly head: () => Effect.Effect<\n Option.Option<RevisionHead>,\n PipelineApiError,\n HttpClient.HttpClient\n >;\n readonly revision: (\n revisionId: string,\n ) => Effect.Effect<RevisionDocument, PipelineApiError, HttpClient.HttpClient>;\n readonly publish: (\n request: PublishRequest,\n ) => Effect.Effect<\n PublishedRevision,\n PipelineApiError,\n HttpClient.HttpClient\n >;\n readonly proposals: (\n filter?: ProposalsFilter,\n ) => Effect.Effect<\n ReadonlyArray<ProposalSummary>,\n PipelineApiError,\n HttpClient.HttpClient\n >;\n readonly propose: (\n request: ProposeRequest,\n ) => Effect.Effect<\n { readonly proposalId: string },\n PipelineApiError,\n HttpClient.HttpClient\n >;\n readonly reject: (\n proposalId: string,\n ) => Effect.Effect<void, PipelineApiError, HttpClient.HttpClient>;\n /** Reanalyze historical evidence: a new run on the same input snapshot. */\n readonly recompute: (input: {\n readonly revisionId: string;\n readonly inputSnapshotId: string;\n readonly parameters?: Readonly<Record<string, string | number | boolean>>;\n }) => Effect.Effect<\n RecomputeOutcome,\n PipelineApiError,\n HttpClient.HttpClient\n >;\n /** Compare two immutable results; the server derives the axis. */\n readonly compare: (\n leftResultId: string,\n rightResultId: string,\n ) => Effect.Effect<Comparison, PipelineApiError, HttpClient.HttpClient>;\n}\n\nclass WireError extends Schema.Class<WireError>(\"WireError\")({\n message: Schema.optional(Schema.String),\n code: Schema.optional(Schema.String),\n data: Schema.optional(\n Schema.Struct({ code: Schema.optional(Schema.String) }),\n ),\n}) {}\n\n/** What the oRPC RPC transport answers on success. */\nclass RpcEnvelope extends Schema.Class<RpcEnvelope>(\"RpcEnvelope\")({\n json: Schema.Unknown,\n}) {}\n\nconst ErrorBody = Schema.Struct({\n json: Schema.optional(WireError),\n message: Schema.optional(Schema.String),\n});\n\nconst decodeJson = Schema.decodeUnknownOption(\n Schema.fromJsonString(Schema.Unknown),\n);\n\n/** oRPC puts the error under `json`; a bare `{ message }` is accepted too. */\nconst wireError = (text: string): Option.Option<WireError> =>\n Option.flatMap(decodeJson(text), (parsed) =>\n Schema.decodeUnknownOption(ErrorBody)(parsed).pipe(\n Option.flatMap((body) =>\n Option.orElse(Option.fromNullishOr(body.json), () =>\n Option.map(\n Option.fromNullishOr(body.message),\n (message) => new WireError({ message }),\n ),\n ),\n ),\n ),\n );\n\nconst statusOf = (response: HttpClientResponse.HttpClientResponse): number =>\n response.status;\n\nconst failure = (\n procedure: string,\n message: string,\n status: Option.Option<number>,\n code: Option.Option<string>,\n) =>\n new PipelineApiError({\n procedure,\n message,\n status,\n code,\n });\n\n/** The oRPC namespaces this transport answers. */\nexport type Router =\n | \"devices\"\n | \"experiments\"\n | \"pipelines\"\n | \"pipelineRuns\"\n | \"projects\"\n | \"reports\"\n | \"tags\";\n\nconst request = <A>(\n options: { readonly origin: string; readonly secret: string },\n procedure: string,\n body: unknown,\n schema: Schema.ConstraintDecoder<A>,\n router: Router = \"pipelines\",\n /** Extra headers: a project-scoped procedure reads `x-project-id`. */\n headers: Readonly<Record<string, string>> = {},\n): Effect.Effect<A, PipelineApiError, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(procedure)) {\n return yield* Effect.fail(\n failure(\n procedure,\n \"invalid procedure name\",\n Option.none(),\n Option.none(),\n ),\n );\n }\n const client = yield* HttpClient.HttpClient;\n const built = yield* HttpClientRequest.post(\n `${options.origin}/rpc/${router}/${procedure}`,\n ).pipe(\n HttpClientRequest.bearerToken(options.secret),\n HttpClientRequest.setHeaders(headers),\n // The oRPC RPC transport's envelope: `{\"json\": <input>}` in and\n // `{\"json\": <output>}` out. A bare body is rejected as \"Expected object\".\n HttpClientRequest.bodyJson({ json: body }),\n Effect.mapError((cause) =>\n failure(\n procedure,\n `cannot encode the request: ${cause.message}`,\n Option.none(),\n Option.none(),\n ),\n ),\n );\n const response = yield* client\n .execute(built)\n .pipe(\n Effect.mapError((cause) =>\n failure(\n procedure,\n `cannot reach ${options.origin}: ${cause.message}`,\n Option.none(),\n Option.none(),\n ),\n ),\n );\n if (statusOf(response) < 200 || statusOf(response) >= 300) {\n const text = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* Effect.fail(\n Option.match(wireError(text), {\n onNone: () =>\n failure(\n procedure,\n `the API answered ${statusOf(response)}`,\n Option.some(statusOf(response)),\n Option.none(),\n ),\n onSome: (error) =>\n failure(\n procedure,\n error.message ?? `the API answered ${statusOf(response)}`,\n Option.some(statusOf(response)),\n Option.orElse(Option.fromNullishOr(error.code), () =>\n Option.flatMap(Option.fromNullishOr(error.data), (data) =>\n Option.fromNullishOr(data.code),\n ),\n ),\n ),\n }),\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(RpcEnvelope)(response).pipe(\n Effect.flatMap((envelope) =>\n Schema.decodeUnknownEffect(schema)(envelope.json),\n ),\n Effect.mapError((cause) =>\n failure(\n procedure,\n `cannot read the answer: ${cause.message}`,\n Option.some(statusOf(response)),\n Option.none(),\n ),\n ),\n );\n });\n\n/** The same transport, for procedures outside a single pipeline. */\nexport const rpcRequest = request;\n\n/** A stale expected parent: the head moved between the fetch and the publish. */\nexport const isStaleParent = (error: PipelineApiError): boolean =>\n Option.contains(error.status, 409) &&\n Option.contains(error.code, \"stale-parent\");\n\n/**\n * The API client for one pipeline. The credential stays in the header; it is\n * never part of a request body, an error message or a local state file.\n */\nexport const makeClient = (options: {\n readonly origin: string;\n readonly secret: string;\n readonly pipelineId: string;\n}): PipelineApi => ({\n head: () =>\n request(\n options,\n \"head\",\n { pipelineId: options.pipelineId },\n Schema.NullOr(RevisionHead),\n ).pipe(Effect.map(Option.fromNullishOr)),\n revision: (revisionId) =>\n request(\n options,\n \"revision\",\n { pipelineId: options.pipelineId, revisionId },\n RevisionDocument,\n ),\n publish: (input) =>\n request(\n options,\n \"publishRevision\",\n {\n pipelineId: input.pipelineId,\n irText: input.irText,\n irHash: input.irHash,\n expectedParentId: input.expectedParentId,\n baseRevisionId: input.baseRevisionId,\n summary: input.summary ?? null,\n },\n PublishedRevision,\n ),\n proposals: (filter = {}) =>\n request(\n options,\n \"proposals\",\n {\n pipelineId: options.pipelineId,\n status: filter.status ?? null,\n base: filter.base ?? null,\n },\n Schema.Array(ProposalSummary),\n ),\n propose: (input) =>\n request(\n options,\n \"propose\",\n {\n pipelineId: input.pipelineId,\n baseRevisionId: input.baseRevisionId,\n patch: input.patch,\n rationale: input.rationale,\n },\n Schema.Struct({ proposalId: Schema.NonEmptyString }),\n ),\n reject: (proposalId) =>\n request(\n options,\n \"resolveProposal\",\n { proposalId, resolution: \"rejected\" },\n Schema.Struct({ ok: Schema.Boolean }),\n ).pipe(Effect.asVoid),\n recompute: (input) =>\n request(\n options,\n \"recompute\",\n {\n pipelineId: options.pipelineId,\n revisionId: input.revisionId,\n inputSnapshotId: input.inputSnapshotId,\n parameters: input.parameters ?? null,\n },\n RecomputeOutcome,\n \"pipelineRuns\",\n ),\n compare: (leftResultId, rightResultId) =>\n request(\n options,\n \"compare\",\n { leftResultId, rightResultId },\n Comparison,\n \"pipelineRuns\",\n ),\n});\n", "/**\n * Applying a proposal only counts once the compiler agrees (plan 069).\n *\n * `set-param` names a step parameter, but the IR's effective default can be\n * bound in the `@pipeline` declaration. Editing the step signature then changes\n * no IR: the patcher succeeded, the source moved, and the definition did not.\n * The patched text is compiled from an auto-removed sibling copy before the\n * checkout's source is replaced, so a refusal leaves it byte-identical and only\n * a verified patch is ever written.\n *\n * This is the apply path for the engine, `pull` and the CLI. `applyPatch` alone\n * is the pure span check, not permission to write.\n */\nimport { Crypto, Effect, Match, Option, Schema } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as P from \"effect/Predicate\";\nimport {\n decodePipelineIr,\n IrNumber,\n PipelineIr,\n type IrDefaultValue,\n type IrOp,\n} from \"@braven/pipeline-ir\";\nimport { PythonCompiler, compileIr, compilerFailure } from \"./compiler.ts\";\nimport { SyncFailure } from \"./errors.ts\";\nimport { PatchRefusal, applyPatch, type ApplyResult } from \"./patch.ts\";\nimport { writeSource } from \"./source.ts\";\n\n/** What a checked apply needs; everything is read before the patch runs. */\nexport interface VerifiedApplyInput {\n readonly cwd: string;\n readonly source: string;\n /** The checkout's exact bytes; a refusal leaves them in place. */\n readonly sourceText: string;\n /** The compile of `sourceText`; spans address it. */\n readonly local: PipelineIr;\n /** The proposal's base, or `local` for a conflict resolution. */\n readonly base: PipelineIr;\n readonly ops: ReadonlyArray<IrOp>;\n /** Write the verified text; `false` computes only (`pull --check`). */\n readonly write: boolean;\n}\n\nconst refusal = (\n op: IrOp,\n path: string,\n reason: \"shadowed-default\" | \"not-effective\" | \"not-found\",\n detail: string,\n): PatchRefusal => new PatchRefusal({ op: op.op, path, reason, detail });\n\nconst pathOf = (op: IrOp): string =>\n Match.value(op).pipe(\n Match.discriminator(\"op\")(\n \"set-param\",\n (value) => `/steps/${value.stepId}/params/${value.name}`,\n ),\n Match.discriminator(\"op\")(\n \"set-pipeline-param\",\n (value) => `/pipeline/params/${value.name}/default`,\n ),\n Match.discriminator(\"op\")(\n \"set-step-name\",\n (value) => `/steps/${value.stepId}/name`,\n ),\n Match.discriminator(\"op\")(\"set-description\", () => \"/pipeline/description\"),\n Match.orElse(() => \"/\"),\n );\n\nconst findStep = (ir: PipelineIr, id: string) =>\n Arr.findFirst(ir.steps, (step) => step.id === id);\n\nconst findPipelineParam = (ir: PipelineIr, name: string) =>\n Option.flatMap(ir.pipeline.params, (params) =>\n Arr.findFirst(params, (param) => param.name === name),\n );\n\n/** The literal's author-facing spelling, matching the IR's number lexeme. */\nconst textOf = (value: IrDefaultValue | Schema.Json): string =>\n value instanceof IrNumber\n ? value.text\n : P.isString(value)\n ? `\"${value}\"`\n : String(value);\n\n/** The compiled default the op intended, not just the literal it wrote. */\nconst sameValue = (intended: Schema.Json, actual: IrDefaultValue): boolean =>\n Match.value(intended).pipe(\n Match.when(\n P.isNumber,\n (value) => actual instanceof IrNumber && actual.value === value,\n ),\n Match.when(P.isString, (value) => P.isString(actual) && actual === value),\n Match.when(P.isBoolean, (value) => P.isBoolean(actual) && actual === value),\n Match.orElse(() => false),\n );\n\n// TODO(065/067): a `@pipeline` binding has its own target\n// (`/pipeline/params/<name>/default`); a step-path op on a bound param is\n// always dead source, so it is refused rather than retargeted silently.\nconst paramRefusal = (\n compiled: PipelineIr,\n op: Extract<IrOp, { readonly op: \"set-param\" }>,\n): Option.Option<PatchRefusal> => {\n const path = pathOf(op);\n const param = Option.flatMap(findStep(compiled, op.stepId), (step) =>\n Arr.findFirst(step.params, (candidate) => candidate.name === op.name),\n );\n if (Option.isNone(param)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled definition has no ${op.stepId}.${op.name}`,\n ),\n );\n }\n const boundTo = Option.getOrNull(param.value.pipelineParam);\n if (boundTo !== null) {\n return Option.some(\n refusal(\n op,\n path,\n \"shadowed-default\",\n `the effective default for ${op.stepId}.${op.name} is the @pipeline parameter \"${boundTo}\" of pipeline \"${compiled.pipeline.name}\"; propose /pipeline/params/${boundTo}/default instead`,\n ),\n );\n }\n if (Option.isNone(param.value.default)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled ${op.stepId}.${op.name} has no default; the patched source does not make ${textOf(op.value)} effective`,\n ),\n );\n }\n const actual = param.value.default.value;\n if (sameValue(op.value, actual)) return Option.none();\n return Option.some(\n refusal(\n op,\n path,\n \"shadowed-default\",\n `the effective default for ${op.stepId}.${op.name} comes from the @pipeline declaration (pipeline \"${compiled.pipeline.name}\", step ${op.stepId}), not the step signature: compiled ${textOf(actual)}, intended ${textOf(op.value)}; edit the @pipeline default instead`,\n ),\n );\n};\n\nconst pipelineParamRefusal = (\n compiled: PipelineIr,\n op: Extract<IrOp, { readonly op: \"set-pipeline-param\" }>,\n): Option.Option<PatchRefusal> => {\n const path = pathOf(op);\n const param = findPipelineParam(compiled, op.name);\n if (Option.isNone(param)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-found\",\n `the compiled definition has no @pipeline parameter ${op.name}`,\n ),\n );\n }\n if (Option.isNone(param.value.default)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled @pipeline parameter ${op.name} has no default; the patched source does not make ${textOf(op.value)} effective`,\n ),\n );\n }\n const actual = param.value.default.value;\n return sameValue(op.value, actual)\n ? Option.none()\n : Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled @pipeline parameter ${op.name} is ${textOf(actual)}, intended ${textOf(op.value)}; the edit did not change it`,\n ),\n );\n};\n\nconst stepNameRefusal = (\n compiled: PipelineIr,\n op: Extract<IrOp, { readonly op: \"set-step-name\" }>,\n): Option.Option<PatchRefusal> => {\n const path = pathOf(op);\n const step = findStep(compiled, op.stepId);\n if (Option.isNone(step)) {\n return Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled definition has no step ${op.stepId}`,\n ),\n );\n }\n return step.value.name === op.name\n ? Option.none()\n : Option.some(\n refusal(\n op,\n path,\n \"not-effective\",\n `the compiled definition still calls step ${op.stepId} \"${step.value.name}\"; the edit did not change it`,\n ),\n );\n};\n\nconst descriptionRefusal = (\n compiled: PipelineIr,\n op: Extract<IrOp, { readonly op: \"set-description\" }>,\n): Option.Option<PatchRefusal> =>\n Option.exists(\n compiled.pipeline.description,\n (value) => value === op.description,\n )\n ? Option.none()\n : Option.some(\n refusal(\n op,\n \"/pipeline/description\",\n \"not-effective\",\n `the compiled description is not ${textOf(op.description)}; the edit did not change it`,\n ),\n );\n\n/** Every op whose intended value the compiled source does not carry. */\nexport const verifyOps = (\n compiled: PipelineIr,\n ops: ReadonlyArray<IrOp>,\n): ReadonlyArray<PatchRefusal> =>\n Arr.flatMap(ops, (op) =>\n Option.match(\n Match.value(op).pipe(\n Match.discriminator(\"op\")(\"set-param\", (value) =>\n paramRefusal(compiled, value),\n ),\n Match.discriminator(\"op\")(\"set-pipeline-param\", (value) =>\n pipelineParamRefusal(compiled, value),\n ),\n Match.discriminator(\"op\")(\"set-step-name\", (value) =>\n stepNameRefusal(compiled, value),\n ),\n Match.discriminator(\"op\")(\"set-description\", (value) =>\n descriptionRefusal(compiled, value),\n ),\n Match.orElse(() => Option.none<PatchRefusal>()),\n ),\n { onNone: () => [], onSome: (value) => [value] },\n ),\n );\n\n/**\n * Compiles the staged text from a sibling of the source, so relative imports\n * resolve exactly as they do for the real file. The copy is removed afterwards,\n * whatever the compiler says.\n */\nconst compileStaged = (input: VerifiedApplyInput, text: string) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const crypto = yield* Crypto.Crypto;\n const directory = path.dirname(path.resolve(input.cwd, input.source));\n const nonce = yield* crypto.randomUUIDv4().pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot stage ${input.source} for verification: ${cause.message}`,\n }),\n ),\n );\n const file = path.join(directory, `.braven-verify-${nonce}.py`);\n yield* fs.writeFileString(file, text).pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot stage ${input.source} for verification: ${cause.message}`,\n }),\n ),\n );\n return yield* Effect.ensuring(\n Effect.gen(function* () {\n const compiled = yield* compileIr(file, { cwd: input.cwd }).pipe(\n Effect.mapError((error) => compilerFailure(input.source, error)),\n );\n return yield* decodePipelineIr(compiled).pipe(\n Effect.mapError(\n (error) =>\n new SyncFailure({\n kind: \"source\",\n message: `the compiler returned an unreadable IR for the patched ${input.source}: ${error.message}`,\n }),\n ),\n );\n }),\n fs.remove(file).pipe(Effect.orElseSucceed(() => undefined)),\n );\n });\n\n/**\n * Applies every op or none, proves the patch is effective, then writes.\n *\n * A refusal is returned as an `ApplyResult`, never as a partial write; a\n * staging, compiler or decode failure is a `SyncFailure` with the same\n * guarantee (the source was never replaced).\n */\nexport const applyVerified = (\n input: VerifiedApplyInput,\n): Effect.Effect<\n ApplyResult,\n SyncFailure,\n Crypto.Crypto | FileSystem.FileSystem | Path.Path | PythonCompiler\n> =>\n Effect.gen(function* () {\n const applied = yield* applyPatch({\n sourceText: input.sourceText,\n local: input.local,\n base: input.base,\n ops: input.ops,\n });\n if (applied.status === \"refused\") return applied;\n // An op can intend the value the literal already has; the compiled document\n // still decides whether that value is the effective one.\n if (input.ops.length === 0) return applied;\n\n const compiled = yield* compileStaged(input, applied.text);\n const refusals = verifyOps(compiled, input.ops);\n if (refusals.length > 0) return { status: \"refused\", refusals };\n\n if (input.write) yield* writeSource(input.cwd, input.source, applied.text);\n return applied;\n });\n", "/**\n * Round-trip-safe proposal application (plan 069).\n *\n * A proposal names an IR construct; this module turns the safe ones into an\n * exact source edit and refuses the rest. It never regenerates Python: the\n * edit replaces one literal (or inserts one decorator keyword) inside the span\n * the compiler reported, and only after the construct's canonical content still\n * matches the proposal's base revision. A mismatch is a `span-moved` refusal \u2014\n * the wrong line is never edited, and a refused plan leaves the text untouched.\n *\n * Safe in v1: `set-param` (a literal), `set-step-name` (the `@step(name=\u2026)`\n * keyword) and `set-description` (the `@pipeline(description=\u2026)` keyword).\n * Requirements, edges, types, steps and opaque code are refused with the exact\n * intent, because the engineer must write those.\n *\n * A span-checked edit can still be dead source when the effective value is\n * bound elsewhere (a `@pipeline` parameter shadowing a step default). That is\n * `apply.ts`'s post-compile check, not the patcher's; callers apply through\n * `applyVerified`, never through `applyPatch` alone.\n */\nimport { Crypto, Effect, Match, Schema } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Result from \"effect/Result\";\nimport * as Str from \"effect/String\";\nimport {\n IrDefaultValue,\n IrNumber,\n IrParam,\n IrPipeline,\n IrPipelineParam,\n IrStep,\n PipelineIr,\n type IrOp,\n} from \"@braven/pipeline-ir\";\nimport { pipelineParamContentKey, stepContentKey } from \"./merge.ts\";\n\n/** Why an op was not applied. */\nexport const RefusalReason = Schema.Literals([\n \"not-found\",\n \"span-moved\",\n \"no-default\",\n \"not-a-literal\",\n \"unsupported\",\n \"unsupported-value\",\n \"overlap\",\n /** The edited literal is not the effective default: a `@pipeline` binding wins. */\n \"shadowed-default\",\n /** The compiled document does not carry the value the op intended. */\n \"not-effective\",\n]);\nexport type RefusalReason = typeof RefusalReason.Type;\n\n/** One refused op, naming the construct and the exact intent. */\nexport class PatchRefusal extends Schema.Class<PatchRefusal>(\"PatchRefusal\")({\n op: Schema.String,\n path: Schema.String,\n reason: RefusalReason,\n detail: Schema.String,\n}) {}\n\n/** One exact source edit, for the report and for `pull --check`. */\nexport class PatchChange extends Schema.Class<PatchChange>(\"PatchChange\")({\n path: Schema.String,\n /** The text the edit replaces. */\n before: Schema.String,\n /** What replaces it. */\n after: Schema.String,\n}) {}\n\nexport interface ApplyInput {\n readonly sourceText: string;\n /** The local compile of `sourceText`; spans address this file. */\n readonly local: PipelineIr;\n /** The proposal's base revision; the construct must still match it. */\n readonly base: PipelineIr;\n readonly ops: ReadonlyArray<IrOp>;\n}\n\n/** The patched text and the IR it should compile to, or every refusal. */\nexport type ApplyResult =\n | {\n readonly status: \"applied\";\n readonly text: string;\n readonly changes: ReadonlyArray<PatchChange>;\n readonly expected: PipelineIr;\n }\n | {\n readonly status: \"refused\";\n readonly refusals: ReadonlyArray<PatchRefusal>;\n };\n\ninterface Edit {\n readonly start: number;\n readonly end: number;\n readonly replacement: string;\n readonly path: string;\n}\n\nconst refusal = (\n op: IrOp,\n path: string,\n reason: RefusalReason,\n detail: string,\n): PatchRefusal => new PatchRefusal({ op: op.op, path, reason, detail });\n\nconst hex = (bytes: Uint8Array): string =>\n Arr.join(\n Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")),\n \"\",\n );\n\nconst digest = (text: string) =>\n Effect.gen(function* () {\n const crypto = yield* Crypto.Crypto;\n const bytes = yield* crypto.digest(\n \"SHA-256\",\n new TextEncoder().encode(text),\n );\n return `sha256:${hex(bytes)}`;\n }).pipe(Effect.orDie);\n\nconst literalPattern =\n /^(?:True|False|None|[-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][-+]?\\d+)?|\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')$/;\n\nconst isLiteral = (text: string): boolean =>\n literalPattern.test(Str.trim(text));\n\n/**\n * The Python spelling of a literal. A JSON string is a valid Python string\n * literal, and a number keeps the lexeme the proposal carried.\n */\nconst renderDefault = (value: Schema.Json): Option.Option<string> =>\n typeof value === \"string\"\n ? Option.some(JSON.stringify(value))\n : typeof value === \"boolean\"\n ? Option.some(value ? \"True\" : \"False\")\n : typeof value === \"number\"\n ? Option.some(String(value))\n : Option.none();\n\n/** `[start, end)` of a 1-based, inclusive source span. */\nconst spanRange = (\n text: string,\n startLine: number,\n endLine: number,\n): { readonly start: number; readonly end: number } => {\n const lines = Str.split(\"\\n\")(text);\n const start = Arr.reduce(\n Arr.take(lines, Math.max(0, startLine - 1)),\n 0,\n (offset, line) => offset + line.length + 1,\n );\n const last = lines[endLine - 1] ?? \"\";\n return { start, end: start + last.length };\n};\n\ninterface Segment {\n readonly text: string;\n readonly start: number;\n}\n\n/** Skips a quoted Python string starting at `index`; returns its closing quote. */\nconst skipString = (text: string, index: number): number => {\n const quote = text[index];\n const step = (cursor: number): number => {\n if (cursor >= text.length) return text.length - 1;\n const char = text[cursor];\n if (char === \"\\\\\") return step(cursor + 2);\n if (char === quote) return cursor;\n return step(cursor + 1);\n };\n return step(index + 1);\n};\n\n/** The index of the `)` matching the `(` at `open`. */\nconst matchParen = (text: string, open: number): Option.Option<number> => {\n const walk = (cursor: number, depth: number): Option.Option<number> => {\n if (cursor >= text.length) return Option.none();\n const char = text[cursor];\n if (char === '\"' || char === \"'\")\n return walk(skipString(text, cursor) + 1, depth);\n if (char === \"(\") return walk(cursor + 1, depth + 1);\n if (char === \")\")\n return depth === 1 ? Option.some(cursor) : walk(cursor + 1, depth - 1);\n return walk(cursor + 1, depth);\n };\n return text[open] === \"(\" ? walk(open + 1, 1) : Option.none();\n};\n\n/** Splits `text` on top-level commas, keeping each segment's offset. */\nconst segments = (text: string, base: number): ReadonlyArray<Segment> => {\n const walk = (\n cursor: number,\n depth: number,\n start: number,\n found: ReadonlyArray<Segment>,\n ): ReadonlyArray<Segment> => {\n if (cursor >= text.length)\n return [...found, { text: text.slice(start), start: base + start }];\n const char = text[cursor];\n if (char === '\"' || char === \"'\")\n return walk(skipString(text, cursor) + 1, depth, start, found);\n if (char === \"(\" || char === \"[\" || char === \"{\")\n return walk(cursor + 1, depth + 1, start, found);\n if (char === \")\" || char === \"]\" || char === \"}\")\n return walk(cursor + 1, depth - 1, start, found);\n if (char === \",\" && depth === 0)\n return walk(cursor + 1, 0, cursor + 1, [\n ...found,\n { text: text.slice(start, cursor), start: base + start },\n ]);\n return walk(cursor + 1, depth, start, found);\n };\n return walk(0, 0, 0, []);\n};\n\nconst leadingSpace = (text: string): number =>\n text.length - Str.trimStart(text).length;\n\n/** The `name=value` keyword in a decorator body, if it has one. */\nconst keyword = (\n body: string,\n base: number,\n keywordName: string,\n): Option.Option<{ readonly start: number; readonly end: number }> =>\n Arr.head(\n Arr.flatMap(segments(body, base), (segment) => {\n const text = Str.trimStart(segment.text);\n const offset = segment.start + leadingSpace(segment.text);\n const equals = text.indexOf(\"=\");\n if (equals < 0) return [];\n if (Str.trim(text.slice(0, equals)) !== keywordName) return [];\n const raw = text.slice(equals + 1);\n const value = Str.trim(raw);\n const start = offset + equals + 1 + leadingSpace(raw);\n return [{ start, end: start + value.length }];\n }),\n );\n\nconst functionSignature = (\n text: string,\n span: { readonly start: number; readonly end: number },\n functionName: string,\n): Option.Option<{ readonly open: number; readonly close: number }> => {\n const region = text.slice(span.start, span.end);\n const needle = `def ${functionName}`;\n const first = region.indexOf(needle);\n if (first < 0 || region.indexOf(needle, first + 1) >= 0) return Option.none();\n const open = region.indexOf(\"(\", first + needle.length);\n if (open < 0) return Option.none();\n return Option.map(matchParen(region, open), (close) => ({\n open: span.start + open,\n close: span.start + close,\n }));\n};\n\nconst paramSegment = (\n signature: string,\n name: string,\n): Option.Option<Segment> =>\n Arr.findFirst(segments(signature, 0), (segment) => {\n const text = Str.trim(segment.text);\n const head = text.split(\":\")[0]?.split(\"=\")[0] ?? \"\";\n return Str.trim(head).replaceAll(\"*\", \"\") === name;\n });\n\nconst findStep = (ir: PipelineIr, id: string): Option.Option<IrStep> =>\n Arr.findFirst(ir.steps, (step) => step.id === id);\n\nconst findParam = (step: IrStep, name: string): Option.Option<IrParam> =>\n Arr.findFirst(step.params, (param) => param.name === name);\n\nconst findPipelineParam = (\n ir: PipelineIr,\n name: string,\n): Option.Option<IrPipelineParam> =>\n Option.flatMap(ir.pipeline.params, (params) =>\n Arr.findFirst(params, (param) => param.name === name),\n );\n\n/** The index of the first top-level `,`, newline or closing bracket. */\nconst endOfValue = (text: string, from: number): number => {\n const walk = (cursor: number, depth: number): number => {\n if (cursor >= text.length) return cursor;\n const char = text[cursor];\n if (char === '\"' || char === \"'\")\n return walk(skipString(text, cursor) + 1, depth);\n if (char === \"(\" || char === \"[\" || char === \"{\")\n return walk(cursor + 1, depth + 1);\n if (char === \")\" || char === \"]\" || char === \"}\")\n return depth === 0 ? cursor : walk(cursor + 1, depth - 1);\n if ((char === \",\" || char === \"\\n\") && depth === 0) return cursor;\n return walk(cursor + 1, depth);\n };\n return walk(from, 0);\n};\n\n/**\n * The `name: type = literal` argument inside a parameter's own source span.\n *\n * The compiler reports each parameter's lines, so the search is local: a name\n * that is no longer declared there is `span-moved`, never a guess.\n */\nconst parameterLiteral = (\n text: string,\n span: { readonly start: number; readonly end: number },\n name: string,\n): Option.Option<{\n readonly start: number;\n readonly end: number;\n readonly value: string;\n}> => {\n const region = text.slice(span.start, span.end);\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = new RegExp(`(?:^|[,(\\\\s])${escaped}\\\\s*:`).exec(region);\n if (match === null) return Option.none();\n const annotationEnd = endOfValue(region, match.index + match[0].length);\n const equals = region.indexOf(\"=\", match.index + match[0].length);\n // No default of its own: the next parameter's `=` is beyond the boundary.\n if (equals < 0 || equals > annotationEnd) return Option.none();\n const raw = region.slice(equals + 1, endOfValue(region, equals + 1));\n const value = Str.trim(raw);\n const start = span.start + equals + 1 + leadingSpace(raw);\n return Option.some({ start, end: start + value.length, value });\n};\n\n/** The decorator `@name` in `region`, with the body's `(`/`)` offsets. */\nconst decorator = (\n text: string,\n span: { readonly start: number; readonly end: number },\n name: string,\n): Option.Option<{\n readonly at: number;\n readonly open: number;\n readonly close: number;\n}> => {\n const region = text.slice(span.start, span.end);\n const needle = `@${name}`;\n const first = region.indexOf(needle);\n if (first < 0 || region.indexOf(needle, first + 1) >= 0) return Option.none();\n const after = first + needle.length;\n const rest = region.slice(after);\n const next = after + (rest.length - Str.trimStart(rest).length);\n if (region[next] !== \"(\")\n return Option.some({ at: span.start + first, open: -1, close: -1 });\n return Option.map(matchParen(region, next), (close) => ({\n at: span.start + first,\n open: span.start + next,\n close: span.start + close,\n }));\n};\n\nconst setParamEdit = (\n input: ApplyInput,\n op: Extract<IrOp, { readonly op: \"set-param\" }>,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> =>\n Effect.gen(function* () {\n const path = `/steps/${op.stepId}/params/${op.name}`;\n const fromBase = Option.flatMap(findStep(input.base, op.stepId), (step) =>\n Option.map(findParam(step, op.name), (param) => ({ step, param })),\n );\n const fromLocal = Option.flatMap(findStep(input.local, op.stepId), (step) =>\n Option.map(findParam(step, op.name), (param) => ({ step, param })),\n );\n if (Option.isNone(fromBase) || Option.isNone(fromLocal))\n return Result.fail(\n refusal(\n op,\n path,\n \"not-found\",\n \"the step or parameter no longer exists\",\n ),\n );\n\n const expectedHash = yield* digest(stepContentKey(fromBase.value.step));\n const actualHash = yield* digest(stepContentKey(fromLocal.value.step));\n if (expectedHash !== actualHash)\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the step changed locally (${actualHash} != ${expectedHash}); review the proposal by hand`,\n ),\n );\n if (Option.isNone(fromLocal.value.param.default))\n return Result.fail(\n refusal(op, path, \"no-default\", \"the parameter has no default literal\"),\n );\n const rendered = renderDefault(op.value);\n if (Option.isNone(rendered))\n return Result.fail(\n refusal(\n op,\n path,\n \"unsupported-value\",\n \"only string, number and boolean literals are round-trip-safe in v1\",\n ),\n );\n const replacement = rendered.value;\n\n const step = fromLocal.value.step;\n const span = spanRange(\n input.sourceText,\n step.source.span.startLine,\n step.source.span.endLine,\n );\n const signature = functionSignature(\n input.sourceText,\n span,\n step.implementation.type === \"python\"\n ? step.implementation.function\n : step.id,\n );\n if (Option.isNone(signature))\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n \"the step's function signature is no longer in its span\",\n ),\n );\n const open = signature.value.open;\n const body = input.sourceText.slice(open + 1, signature.value.close);\n const segment = paramSegment(body, op.name);\n if (Option.isNone(segment))\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the parameter is no longer declared in ${op.stepId}'s signature`,\n ),\n );\n const text = segment.value.text;\n const equals = text.indexOf(\"=\");\n if (equals < 0)\n return Result.fail(\n refusal(op, path, \"no-default\", \"the parameter has no default literal\"),\n );\n const raw = text.slice(equals + 1);\n const value = Str.trim(raw);\n if (!isLiteral(value))\n return Result.fail(\n refusal(\n op,\n path,\n \"not-a-literal\",\n `the default is not a literal: ${value}`,\n ),\n );\n const start =\n open + 1 + segment.value.start + equals + 1 + leadingSpace(raw);\n return Result.succeed({\n start,\n end: start + value.length,\n replacement,\n path,\n });\n });\n\nconst setPipelineParamEdit = (\n input: ApplyInput,\n op: Extract<IrOp, { readonly op: \"set-pipeline-param\" }>,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> =>\n Effect.gen(function* () {\n const path = `/pipeline/params/${op.name}/default`;\n const fromBase = findPipelineParam(input.base, op.name);\n const fromLocal = findPipelineParam(input.local, op.name);\n if (Option.isNone(fromBase) || Option.isNone(fromLocal))\n return Result.fail(\n refusal(\n op,\n path,\n \"not-found\",\n \"the @pipeline parameter no longer exists\",\n ),\n );\n\n const expectedHash = yield* digest(pipelineParamContentKey(fromBase.value));\n const actualHash = yield* digest(pipelineParamContentKey(fromLocal.value));\n if (expectedHash !== actualHash)\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the @pipeline parameter changed locally (${actualHash} != ${expectedHash}); review the proposal by hand`,\n ),\n );\n if (Option.isNone(fromLocal.value.default))\n return Result.fail(\n refusal(op, path, \"no-default\", \"the parameter has no default literal\"),\n );\n const rendered = renderDefault(op.value);\n if (Option.isNone(rendered))\n return Result.fail(\n refusal(\n op,\n path,\n \"unsupported-value\",\n \"only string, number and boolean literals are round-trip-safe in v1\",\n ),\n );\n\n const param = fromLocal.value;\n const found = parameterLiteral(\n input.sourceText,\n spanRange(\n input.sourceText,\n param.source.span.startLine,\n param.source.span.endLine,\n ),\n op.name,\n );\n if (Option.isNone(found))\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the parameter is no longer declared in the @pipeline signature`,\n ),\n );\n if (!isLiteral(found.value.value))\n return Result.fail(\n refusal(\n op,\n path,\n \"not-a-literal\",\n `the default is not a literal: ${found.value.value}`,\n ),\n );\n return Result.succeed({\n start: found.value.start,\n end: found.value.end,\n replacement: rendered.value,\n path,\n });\n });\n\nconst setStepNameEdit = (\n input: ApplyInput,\n op: Extract<IrOp, { readonly op: \"set-step-name\" }>,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> =>\n Effect.gen(function* () {\n const path = `/steps/${op.stepId}/name`;\n const fromBase = findStep(input.base, op.stepId);\n const fromLocal = findStep(input.local, op.stepId);\n if (Option.isNone(fromBase) || Option.isNone(fromLocal))\n return Result.fail(\n refusal(op, path, \"not-found\", \"the step no longer exists\"),\n );\n const expectedHash = yield* digest(stepContentKey(fromBase.value));\n const actualHash = yield* digest(stepContentKey(fromLocal.value));\n if (expectedHash !== actualHash)\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n `the step changed locally (${actualHash} != ${expectedHash}); review the proposal by hand`,\n ),\n );\n\n const step = fromLocal.value;\n const span = spanRange(\n input.sourceText,\n step.source.span.startLine,\n step.source.span.endLine,\n );\n const found = decorator(input.sourceText, span, \"step\");\n if (Option.isNone(found))\n return Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n \"the step's @step decorator is no longer in its span\",\n ),\n );\n const literal = JSON.stringify(op.name);\n const existing =\n found.value.open < 0\n ? Option.none()\n : keyword(\n input.sourceText.slice(found.value.open + 1, found.value.close),\n found.value.open + 1,\n \"name\",\n );\n if (Option.isSome(existing))\n return Result.succeed({\n start: existing.value.start,\n end: existing.value.end,\n replacement: literal,\n path,\n });\n if (found.value.open < 0)\n return Result.succeed({\n start: found.value.at,\n end: found.value.at + \"@step\".length,\n replacement: `@step(name=${literal})`,\n path,\n });\n const body = input.sourceText.slice(\n found.value.open + 1,\n found.value.close,\n );\n const empty = Str.trim(body).length === 0;\n return Result.succeed({\n start: found.value.open + 1,\n end: found.value.open + 1,\n replacement: empty ? `name=${literal}` : `name=${literal}, `,\n path,\n });\n });\n\nconst setDescriptionEdit = (\n input: ApplyInput,\n op: Extract<IrOp, { readonly op: \"set-description\" }>,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> => {\n const path = \"/pipeline/description\";\n const expected = input.base.pipeline.description;\n const actual = input.local.pipeline.description;\n if (Option.getOrNull(expected) !== Option.getOrNull(actual))\n return Effect.succeed(\n Result.fail(\n refusal(\n op,\n path,\n \"span-moved\",\n \"the description changed locally; review the proposal by hand\",\n ),\n ),\n );\n const found = decorator(\n input.sourceText,\n { start: 0, end: input.sourceText.length },\n \"pipeline\",\n );\n if (Option.isNone(found) || found.value.open < 0)\n return Effect.succeed(\n Result.fail(\n refusal(op, path, \"not-found\", \"no @pipeline(...) decorator found\"),\n ),\n );\n const literal = JSON.stringify(op.description);\n const existing = keyword(\n input.sourceText.slice(found.value.open + 1, found.value.close),\n found.value.open + 1,\n \"description\",\n );\n if (Option.isSome(existing))\n return Effect.succeed(\n Result.succeed({\n start: existing.value.start,\n end: existing.value.end,\n replacement: literal,\n path,\n }),\n );\n const body = input.sourceText.slice(found.value.open + 1, found.value.close);\n const empty = Str.trim(body).length === 0;\n return Effect.succeed(\n Result.succeed({\n start: found.value.open + 1,\n end: found.value.open + 1,\n replacement: empty\n ? `description=${literal}`\n : `description=${literal}, `,\n path,\n }),\n );\n};\n\nconst unsupported = (op: IrOp): PatchRefusal => {\n const details: Readonly<Record<IrOp[\"op\"], (candidate: IrOp) => string>> = {\n \"add-edge\": (candidate) =>\n candidate.op === \"add-edge\"\n ? `add the edge ${candidate.fromStep}.${candidate.fromPort} -> ${candidate.toStep}.${candidate.toPort}`\n : \"\",\n \"remove-edge\": (candidate) =>\n candidate.op === \"remove-edge\"\n ? `remove the edge ${candidate.fromStep}.${candidate.fromPort} -> ${candidate.toStep}.${candidate.toPort}`\n : \"\",\n \"set-runtime\": (candidate) =>\n candidate.op === \"set-runtime\"\n ? `set the runtime to ${Object.entries(candidate.runtime)\n .map(([key, value]) => `${key}=${String(value)}`)\n .join(\", \")}`\n : \"\",\n \"set-param\": () => \"\",\n \"set-pipeline-param\": () => \"\",\n \"set-step-name\": () => \"\",\n \"set-description\": () => \"\",\n };\n return refusal(\n op,\n op.op === \"add-edge\" || op.op === \"remove-edge\"\n ? \"/edges\"\n : op.op === \"set-runtime\"\n ? \"/runtime\"\n : \"/\",\n \"unsupported\",\n `${details[op.op](op)} \u2014 this changes control flow or a file the IR does not own; the engineer writes it`,\n );\n};\n\nconst editFor = (\n input: ApplyInput,\n op: IrOp,\n): Effect.Effect<Result.Result<Edit, PatchRefusal>, never, Crypto.Crypto> =>\n Match.value(op).pipe(\n Match.discriminator(\"op\")(\"set-param\", (value) =>\n setParamEdit(input, value),\n ),\n Match.discriminator(\"op\")(\"set-pipeline-param\", (value) =>\n setPipelineParamEdit(input, value),\n ),\n Match.discriminator(\"op\")(\"set-step-name\", (value) =>\n setStepNameEdit(input, value),\n ),\n Match.discriminator(\"op\")(\"set-description\", (value) =>\n setDescriptionEdit(input, value),\n ),\n Match.orElse((value) => Effect.succeed(Result.fail(unsupported(value)))),\n );\n\nconst defaultOf = (value: Schema.Json): Option.Option<IrDefaultValue> =>\n typeof value === \"number\"\n ? Option.some(new IrNumber({ value, text: String(value) }))\n : typeof value === \"string\" || typeof value === \"boolean\"\n ? Option.some(value)\n : Option.none();\n\n/** The IR the patched source must compile to; used to verify the edit. */\nexport const applyOpsToIr = (\n ir: PipelineIr,\n ops: ReadonlyArray<IrOp>,\n): PipelineIr =>\n Arr.reduce(ops, ir, (current, op) =>\n Match.value(op).pipe(\n Match.discriminator(\"op\")(\n \"set-param\",\n (value) =>\n new PipelineIr({\n ...current,\n steps: current.steps.map((step) =>\n step.id !== value.stepId\n ? step\n : new IrStep({\n ...step,\n params: step.params.map((param) =>\n param.name !== value.name\n ? param\n : new IrParam({\n ...param,\n default: Option.orElse(\n defaultOf(value.value),\n () => param.default,\n ),\n }),\n ),\n }),\n ),\n }),\n ),\n Match.discriminator(\"op\")(\"set-pipeline-param\", (value) =>\n Option.match(defaultOf(value.value), {\n onNone: () => current,\n onSome: (next) =>\n new PipelineIr({\n ...current,\n pipeline: new IrPipeline({\n ...current.pipeline,\n params: Option.map(current.pipeline.params, (params) =>\n params.map((param) =>\n param.name !== value.name\n ? param\n : new IrPipelineParam({\n ...param,\n default: Option.some(next),\n }),\n ),\n ),\n }),\n // A bound step param's effective default is the declaration's.\n steps: current.steps.map(\n (step) =>\n new IrStep({\n ...step,\n params: step.params.map((param) =>\n Option.contains(param.pipelineParam, value.name)\n ? new IrParam({\n ...param,\n default: Option.some(next),\n required: Option.none(),\n })\n : param,\n ),\n }),\n ),\n }),\n }),\n ),\n Match.discriminator(\"op\")(\n \"set-step-name\",\n (value) =>\n new PipelineIr({\n ...current,\n steps: current.steps.map((step) =>\n step.id === value.stepId\n ? new IrStep({ ...step, name: value.name })\n : step,\n ),\n }),\n ),\n Match.discriminator(\"op\")(\n \"set-description\",\n (value) =>\n new PipelineIr({\n ...current,\n pipeline: new IrPipeline({\n ...current.pipeline,\n description: Option.some(value.description),\n }),\n }),\n ),\n Match.orElse(() => current),\n ),\n );\n\n/**\n * Applies every op or none of them.\n *\n * Edits are collected against the original text, checked for overlap, then\n * applied from the end so offsets stay valid. A refusal anywhere returns the\n * untouched text implicitly (the caller keeps the original).\n */\nexport const applyPatch = (\n input: ApplyInput,\n): Effect.Effect<ApplyResult, never, Crypto.Crypto> =>\n Effect.gen(function* () {\n const results = yield* Effect.forEach(\n input.ops,\n (op) => editFor(input, op),\n {\n concurrency: 1,\n },\n );\n const refusals = Arr.flatMap(results, (result) =>\n Result.match(result, {\n onSuccess: () => [],\n onFailure: (failure) => [failure],\n }),\n );\n if (refusals.length > 0) return { status: \"refused\", refusals };\n\n const edits = Arr.flatMap(results, (result) =>\n Result.match(result, {\n onSuccess: (edit) => [edit],\n onFailure: () => [],\n }),\n );\n const ordered = Arr.sort(\n edits,\n Order.mapInput(Order.Number, (edit: Edit) => edit.start),\n );\n const overlaps = Arr.filter(\n Arr.zip(ordered, Arr.drop(ordered, 1)),\n ([left, right]) => right.start < left.end,\n );\n if (overlaps.length > 0)\n return {\n status: \"refused\",\n refusals: [\n new PatchRefusal({\n op: \"patch\",\n path: overlaps[0]?.[1].path ?? \"/\",\n reason: \"overlap\",\n detail: \"two operations edit the same source text\",\n }),\n ],\n };\n\n const text = Arr.reduceRight(\n ordered,\n input.sourceText,\n (current, edit) =>\n `${current.slice(0, edit.start)}${edit.replacement}${current.slice(edit.end)}`,\n );\n return {\n status: \"applied\",\n text,\n changes: ordered.map(\n (edit) =>\n new PatchChange({\n path: edit.path,\n before: input.sourceText.slice(edit.start, edit.end),\n after: edit.replacement,\n }),\n ),\n expected: applyOpsToIr(input.local, input.ops),\n };\n });\n", "/**\n * The three-way merge of pipeline definitions (plan 069).\n *\n * The merge unit is the IR, never Python text. Each addressable element \u2014 a\n * step by id, a port by `(step, id)`, a parameter by `(step, name)`, an edge by\n * its endpoints, runtime and metadata by field \u2014 is compared as `base`,\n * `local` and `remote`. A field changed on one side takes that side; a field\n * changed on both sides to different values is a conflict. There is no \"latest\n * wins\".\n *\n * Line numbers are navigation, not meaning: `source.span` never causes a\n * conflict, and a deletion is only a `delete/edit` conflict when the surviving\n * side changed the step's graph content. The merged document always drops\n * `metadata.irHash`; the publisher recomputes it from the merged bytes.\n */\nimport { Match } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as P from \"effect/Predicate\";\nimport * as R from \"effect/Record\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport {\n IrEdge,\n IrImplementation,\n IrMetadata,\n IrNumber,\n IrOpaqueImplementation,\n IrParam,\n IrParamBinding,\n IrParamType,\n IrOpaqueDeclared,\n IrPipeline,\n IrPipelineParam,\n IrPort,\n IrPythonImplementation,\n IrRequirements,\n IrRuntime,\n IrSource,\n IrSourceSpan,\n IrStep,\n IrDefaultValue,\n IrType,\n PipelineIr,\n typesCompatible,\n} from \"@braven/pipeline-ir\";\nimport {\n ResolutionRefusal,\n type ResolutionSide,\n settlement,\n} from \"./resolve.ts\";\n\n/** Why a field could not be merged. Each kind has one stable hint. */\nexport const ConflictKind = Schema.Literals([\n \"field-changed-both\",\n \"add/add\",\n \"delete/edit\",\n \"opaque-changed-both\",\n \"edge-type-conflict\",\n]);\nexport type ConflictKind = typeof ConflictKind.Type;\n\nconst hints: Readonly<Record<ConflictKind, string>> = {\n \"field-changed-both\": \"edit the source, then push\",\n \"add/add\":\n \"both sides added this element; keep one definition in the source, then push\",\n \"delete/edit\":\n \"one side removed this element while the other changed it; keep or remove it in the source, then push\",\n \"opaque-changed-both\":\n \"the code changed on both sides; reconcile the source by hand, then push\",\n \"edge-type-conflict\":\n \"the merged edge no longer type-checks; fix the port type in the source, then push\",\n};\n\n/** One field or element that both sides changed differently. */\nexport class IrConflict extends Schema.Class<IrConflict>(\"IrConflict\")({\n /** An RFC 6901 pointer into the IR: `/steps/filter/params/threshold`. */\n path: Schema.String,\n kind: ConflictKind,\n base: Schema.Json,\n local: Schema.Json,\n remote: Schema.Json,\n hint: Schema.String,\n}) {}\n\n/**\n * A clean merged definition, every conflict that prevented one, or the\n * resolutions the caller asked for that could not be honoured.\n */\nexport type MergeResult =\n | { readonly status: \"clean\"; readonly ir: PipelineIr }\n | {\n readonly status: \"conflict\";\n readonly conflicts: ReadonlyArray<IrConflict>;\n }\n | {\n readonly status: \"refused\";\n readonly refusals: ReadonlyArray<ResolutionRefusal>;\n };\n\nconst pointerToken = (token: string): string =>\n token.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n\nconst at = (path: string, ...tokens: ReadonlyArray<string>): string =>\n `${path}/${tokens.map(pointerToken).join(\"/\")}`;\n\n/**\n * Deterministic text for an encoded value: sorted keys, no whitespace.\n *\n * This is a comparison key, not a wire codec: strings are length-prefixed so\n * no value can collide with a separator, and no JSON parser is involved.\n */\nexport const stableText = (value: unknown): string =>\n Match.value(value).pipe(\n Match.when(Array.isArray, (items: ReadonlyArray<unknown>) =>\n items.map(stableText).join(\",\"),\n ),\n Match.when(P.isObject, (record: Readonly<Record<string, unknown>>) =>\n Arr.map(\n Arr.sort(\n Object.entries(record),\n Order.mapInput(\n Order.String,\n (entry: readonly [string, unknown]) => entry[0],\n ),\n ),\n ([key, field]) => `${key.length}:${key}=${stableText(field)}`,\n ).join(\";\"),\n ),\n Match.when(P.isString, (text: string) => `s${text.length}:${text}`),\n Match.when(P.isBoolean, (flag: boolean) => (flag ? \"b1\" : \"b0\")),\n Match.when(P.isNumber, (number: number) => `n${number}`),\n Match.when(P.isNull, () => \"z\"),\n Match.orElse(() => \"z\"),\n );\n\nconst encoded = <S extends Schema.ConstraintEncoder<unknown, never>>(\n schema: S,\n value: S[\"Type\"],\n): string => stableText(Schema.encodeSync(schema)(value));\n\n/** A step's canonical content, without its line numbers. */\nexport const stepContentKey = (step: IrStep): string =>\n encoded(\n IrStep,\n new IrStep({\n ...step,\n source: new IrSource({\n path: step.source.path,\n span: new IrSourceSpan({ startLine: 1, endLine: 1 }),\n }),\n }),\n );\n\nconst spanless = (param: IrPipelineParam): IrPipelineParam =>\n new IrPipelineParam({\n ...param,\n source: new IrSource({\n path: param.source.path,\n span: new IrSourceSpan({ startLine: 1, endLine: 1 }),\n }),\n });\n\n/** A `@pipeline` parameter's canonical content, without its line numbers. */\nexport const pipelineParamContentKey = (param: IrPipelineParam): string =>\n encoded(IrPipelineParam, spanless(param));\n\n/** The declaration with its parameter spans neutralised, for comparison. */\nconst stablePipeline = (pipeline: IrPipeline): IrPipeline =>\n new IrPipeline({\n ...pipeline,\n params: Option.map(pipeline.params, (params) =>\n Arr.map(params, (param) => spanless(param)),\n ),\n });\n\nconst edgeKey = (edge: IrEdge): string =>\n [edge.from.step, edge.from.port, edge.to.step, edge.to.port].join(\"\\u0000\");\n\nconst edgeJson = (edge: IrEdge): Schema.Json =>\n asJson(Schema.encodeSync(IrEdge)(edge));\n\nconst asJson = (value: unknown): Schema.Json =>\n Schema.decodeUnknownSync(Schema.Json)(value);\n\nconst jsonOf = <S extends Schema.ConstraintEncoder<unknown, never>>(\n schema: S,\n value: S[\"Type\"],\n): Schema.Json => asJson(Schema.encodeSync(schema)(value));\n\nconst optionJson = <A>(\n value: Option.Option<A>,\n render: (inner: A) => Schema.Json,\n): Schema.Json => Option.match(value, { onNone: () => null, onSome: render });\n\nconst defaultJson = (\n value: Option.Option<string | boolean | IrNumber>,\n): Schema.Json =>\n optionJson(value, (inner) =>\n inner instanceof IrNumber ? inner.value : inner,\n );\n\nconst stepJson = (step: IrStep): Schema.Json => jsonOf(IrStep, step);\n\nconst normalize = (ir: PipelineIr): PipelineIr =>\n new PipelineIr({\n ...ir,\n metadata: new IrMetadata({ ...ir.metadata, irHash: Option.none() }),\n });\n\n/** The documents' graph identity: no spans, no `irHash`. */\nexport const pipelineContentKey = (ir: PipelineIr): string =>\n stableText({\n irVersion: ir.irVersion,\n pipeline: Schema.encodeSync(IrPipeline)(stablePipeline(ir.pipeline)),\n runtime: Schema.encodeSync(IrRuntime)(ir.runtime),\n steps: ir.steps.map((step) => [\n step.id,\n stepContentKey(step),\n step.source.path,\n ]),\n edges: Schema.encodeSync(Schema.Array(IrEdge))(ir.edges),\n metadata: {\n compiler: ir.metadata.compiler,\n sourceHash: ir.metadata.sourceHash,\n },\n });\n\n/** What one merge pass accumulates; a fresh array per call keeps it pure. */\ninterface MergeState {\n readonly conflicts: Array<IrConflict>;\n /** The sides the caller asked for, by conflict path. */\n readonly resolutions: Readonly<Record<string, ResolutionSide>>;\n /** Paths a resolution settled, so a leftover is provably not a field. */\n readonly settled: Array<string>;\n readonly refusals: Array<ResolutionRefusal>;\n}\n\nconst conflict = (\n state: MergeState,\n path: string,\n kind: ConflictKind,\n base: Schema.Json,\n local: Schema.Json,\n remote: Schema.Json,\n): Option.Option<never> => {\n state.conflicts.push(\n new IrConflict({ path, kind, base, local, remote, hint: hints[kind] }),\n );\n return Option.none();\n};\n\n/**\n * Three-way pick of one field: one-side changes win, both-sides differ\n * conflicts \u2014 unless the caller settled that path, in which case the chosen\n * side wins and no conflict is reported. Settling is only ever a take: the\n * merge never edits source.\n */\nconst pick = <T>(\n state: MergeState,\n path: string,\n kind: ConflictKind,\n base: T,\n local: T,\n remote: T,\n keyOf: (value: T) => string,\n render: (value: T) => Schema.Json,\n): Option.Option<T> => {\n const b = keyOf(base);\n const l = keyOf(local);\n const r = keyOf(remote);\n if (l === r) return Option.some(local);\n if (b === l) return Option.some(remote);\n if (b === r) return Option.some(local);\n\n const side = state.resolutions[path];\n if (side !== undefined) {\n const settled =\n kind === \"field-changed-both\"\n ? settlement(path, render(local), render(remote), side)\n : Result.fail(\n new ResolutionRefusal({\n path,\n reason: \"structural\",\n detail: `${kind} conflicts are reconciled in the source`,\n }),\n );\n if (Result.isFailure(settled)) {\n state.refusals.push(settled.failure);\n return Option.none();\n }\n state.settled.push(path);\n return Option.some(side === \"local\" ? local : remote);\n }\n\n return conflict(\n state,\n path,\n kind,\n render(base),\n render(local),\n render(remote),\n );\n};\n\n/**\n * A resolution that never met its conflict is refused, never ignored: the map\n * is either stale (the path vanished with the head) or names a conflict the\n * watcher cannot write.\n */\nconst refuseLeftovers = (state: MergeState): void => {\n const leftovers = Arr.filter(\n R.keys(state.resolutions),\n (path) =>\n !Arr.contains(state.settled, path) &&\n !Arr.some(state.refusals, (refusal) => refusal.path === path),\n );\n Arr.forEach(leftovers, (path) => {\n const known = Arr.some(state.conflicts, (item) => item.path === path);\n state.refusals.push(\n new ResolutionRefusal({\n path,\n reason: known ? \"structural\" : \"unknown-path\",\n detail: known\n ? \"this conflict is not a field the watcher may write \u2014 edit the source\"\n : \"this conflict is no longer present \u2014 refresh, then resolve again\",\n }),\n );\n });\n};\n\nconst field = <T>(\n state: MergeState,\n path: string,\n base: T,\n local: T,\n remote: T,\n keyOf: (value: T) => string,\n render: (value: T) => Schema.Json,\n): Option.Option<T> =>\n pick(state, path, \"field-changed-both\", base, local, remote, keyOf, render);\n\nconst scalarKey = (value: string | boolean | number | null): string =>\n stableText(value);\n\nconst scalarJson = (value: string | boolean | number | null): Schema.Json =>\n value;\n\n/**\n * Three-way pick of an element addressed by an id.\n *\n * Absent in the base means an addition on each side (`add/add` when both add\n * the same id differently). Present in the base and absent on one side is a\n * deletion \u2014 a conflict only when the other side changed the element.\n */\nconst element = <T>(\n state: MergeState,\n path: string,\n base: Option.Option<T>,\n local: Option.Option<T>,\n remote: Option.Option<T>,\n keyOf: (value: T) => string,\n render: (value: T) => Schema.Json,\n mergeAll: (base: T, local: T, remote: T) => Option.Option<T>,\n): Option.Option<T> => {\n if (Option.isSome(base)) {\n if (Option.isSome(local) && Option.isSome(remote))\n return mergeAll(base.value, local.value, remote.value);\n const baseKey = keyOf(base.value);\n if (Option.isNone(local))\n return Option.match(remote, {\n onNone: () => Option.none(),\n onSome: (remoteValue) =>\n keyOf(remoteValue) === baseKey\n ? Option.none()\n : conflict(\n state,\n path,\n \"delete/edit\",\n render(base.value),\n null,\n render(remoteValue),\n ),\n });\n return keyOf(local.value) === baseKey\n ? Option.none()\n : conflict(\n state,\n path,\n \"delete/edit\",\n render(base.value),\n render(local.value),\n null,\n );\n }\n\n if (Option.isSome(local) && Option.isSome(remote))\n return keyOf(local.value) === keyOf(remote.value)\n ? Option.some(local.value)\n : conflict(\n state,\n path,\n \"add/add\",\n null,\n render(local.value),\n render(remote.value),\n );\n return Option.isSome(local) ? local : remote;\n};\n\nconst indexOf = <T>(\n items: ReadonlyArray<T>,\n keyOf: (item: T) => string,\n): HashMap.HashMap<string, T> =>\n HashMap.fromIterable(items.map((item) => [keyOf(item), item] as const));\n\nconst keysOf = <T>(\n items: ReadonlyArray<T>,\n keyOf: (item: T) => string,\n): ReadonlyArray<string> => Arr.dedupe(items.map(keyOf));\n\nconst ordered = <T>(\n base: ReadonlyArray<T>,\n local: ReadonlyArray<T>,\n remote: ReadonlyArray<T>,\n keyOf: (item: T) => string,\n): ReadonlyArray<string> =>\n Arr.dedupe(\n Arr.sort(\n Arr.appendAll(\n keysOf(base, keyOf),\n Arr.appendAll(keysOf(local, keyOf), keysOf(remote, keyOf)),\n ),\n Order.String,\n ),\n );\n\nconst lookup = <T>(\n index: HashMap.HashMap<string, T>,\n key: string,\n): Option.Option<T> => HashMap.get(index, key);\n\nconst mergePorts = (\n state: MergeState,\n path: string,\n base: ReadonlyArray<IrPort>,\n local: ReadonlyArray<IrPort>,\n remote: ReadonlyArray<IrPort>,\n): Option.Option<ReadonlyArray<IrPort>> => {\n const keys = ordered(base, local, remote, (port) => port.id);\n const [b, l, r] = [\n indexOf(base, (port) => port.id),\n indexOf(local, (port) => port.id),\n indexOf(remote, (port) => port.id),\n ];\n const merged = keys.map((id) =>\n element(\n state,\n at(path, id),\n lookup(b, id),\n lookup(l, id),\n lookup(r, id),\n (port) => encoded(IrPort, port),\n (port) => jsonOf(IrPort, port),\n (basePort, localPort, remotePort) => {\n const portPath = at(path, id);\n const type = field(\n state,\n at(portPath, \"type\"),\n basePort.type,\n localPort.type,\n remotePort.type,\n (value) => encoded(IrType, value),\n (value) => jsonOf(IrType, value),\n );\n const required = field(\n state,\n at(portPath, \"required\"),\n basePort.required,\n localPort.required,\n remotePort.required,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(Schema.Boolean))(value)),\n (value) => optionJson(value, (flag) => flag),\n );\n return Option.all({ type, required }).pipe(\n Option.map(\n (fields) =>\n new IrPort({\n id: id,\n type: fields.type,\n required: fields.required,\n }),\n ),\n );\n },\n ),\n );\n // `None` here means \"deleted\", a successful outcome; real failures are in\n // `state.conflicts` and the caller never reads this array then.\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, (port: IrPort) => port.id),\n ),\n );\n};\n\nconst mergeParams = (\n state: MergeState,\n path: string,\n base: ReadonlyArray<IrParam>,\n local: ReadonlyArray<IrParam>,\n remote: ReadonlyArray<IrParam>,\n): Option.Option<ReadonlyArray<IrParam>> => {\n const nameOf = (param: IrParam) => param.name;\n const keys = ordered(base, local, remote, nameOf);\n const [b, l, r] = [\n indexOf(base, nameOf),\n indexOf(local, nameOf),\n indexOf(remote, nameOf),\n ];\n const merged = keys.map((name) =>\n element(\n state,\n at(path, name),\n lookup(b, name),\n lookup(l, name),\n lookup(r, name),\n (param) => encoded(IrParam, param),\n (param) => jsonOf(IrParam, param),\n (baseParam, localParam, remoteParam) => {\n const paramPath = at(path, name);\n // A bound step param's value is the declaration's: the pipeline-param\n // merge owns it, so its derived fields never conflict on their own.\n const derived =\n Option.isSome(localParam.pipelineParam) &&\n Option.isSome(remoteParam.pipelineParam);\n const type = field(\n state,\n at(paramPath, \"type\"),\n baseParam.type,\n localParam.type,\n remoteParam.type,\n (value) => encoded(IrParamType, value),\n (value) => jsonOf(IrParamType, value),\n );\n const required = derived\n ? Option.some(localParam.required)\n : field(\n state,\n at(paramPath, \"required\"),\n baseParam.required,\n localParam.required,\n remoteParam.required,\n (value) =>\n stableText(\n Schema.encodeSync(Schema.Option(Schema.Boolean))(value),\n ),\n (value) => optionJson(value, (flag) => flag),\n );\n const defaultValue = derived\n ? Option.some(localParam.default)\n : field(\n state,\n at(paramPath, \"default\"),\n baseParam.default,\n localParam.default,\n remoteParam.default,\n (value) =>\n stableText(\n Schema.encodeSync(Schema.Option(IrDefaultValue))(value),\n ),\n defaultJson,\n );\n const editable = derived\n ? Option.some(localParam.editable)\n : field(\n state,\n at(paramPath, \"editable\"),\n baseParam.editable,\n localParam.editable,\n remoteParam.editable,\n (value) =>\n stableText(\n Schema.encodeSync(Schema.Option(Schema.Boolean))(value),\n ),\n (value) => optionJson(value, (flag) => flag),\n );\n const binding = field(\n state,\n at(paramPath, \"binding\"),\n baseParam.binding,\n localParam.binding,\n remoteParam.binding,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(IrParamBinding))(value)),\n (value) => optionJson(value, (kind) => kind),\n );\n const pipelineParam = field(\n state,\n at(paramPath, \"pipelineParam\"),\n baseParam.pipelineParam,\n localParam.pipelineParam,\n remoteParam.pipelineParam,\n (value) =>\n stableText(\n Schema.encodeSync(Schema.Option(Schema.NonEmptyString))(value),\n ),\n (value) => optionJson(value, (name) => name),\n );\n return Option.all({\n type,\n required,\n default: defaultValue,\n editable,\n binding,\n pipelineParam,\n }).pipe(\n Option.map(\n (fields) =>\n new IrParam({\n name,\n type: fields.type,\n required: fields.required,\n default: fields.default,\n editable: fields.editable,\n binding: fields.binding,\n pipelineParam: fields.pipelineParam,\n }),\n ),\n );\n },\n ),\n );\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, (param: IrParam) => param.name),\n ),\n );\n};\n\nconst mergeImplementation = (\n state: MergeState,\n path: string,\n base: IrImplementation,\n local: IrImplementation,\n remote: IrImplementation,\n): Option.Option<IrImplementation> => {\n const keyOf = (value: IrImplementation) => encoded(IrImplementation, value);\n const render = (value: IrImplementation) => jsonOf(IrImplementation, value);\n const b = keyOf(base);\n const l = keyOf(local);\n const r = keyOf(remote);\n if (l === r) return Option.some(local);\n if (b === l) return Option.some(remote);\n if (b === r) return Option.some(local);\n\n if (\n local instanceof IrPythonImplementation &&\n remote instanceof IrPythonImplementation\n ) {\n const module = field(\n state,\n at(path, \"module\"),\n base instanceof IrPythonImplementation ? base.module : local.module,\n local.module,\n remote.module,\n scalarKey,\n scalarJson,\n );\n const fn = field(\n state,\n at(path, \"function\"),\n base instanceof IrPythonImplementation ? base.function : local.function,\n local.function,\n remote.function,\n scalarKey,\n scalarJson,\n );\n return Option.all({ module, function: fn }).pipe(\n Option.map(\n (fields) =>\n new IrPythonImplementation({\n type: \"python\",\n module: fields.module,\n function: fields.function,\n }),\n ),\n );\n }\n\n if (\n local instanceof IrOpaqueImplementation &&\n remote instanceof IrOpaqueImplementation\n ) {\n // The opaque body is code the IR cannot see; both sides changing it is a\n // code conflict even when the declared boundary matches.\n const sourceHash = pick(\n state,\n at(path, \"sourceHash\"),\n \"opaque-changed-both\",\n base instanceof IrOpaqueImplementation\n ? base.sourceHash\n : local.sourceHash,\n local.sourceHash,\n remote.sourceHash,\n scalarKey,\n scalarJson,\n );\n const declared = field(\n state,\n at(path, \"declared\"),\n base instanceof IrOpaqueImplementation ? base.declared : local.declared,\n local.declared,\n remote.declared,\n (value) => encoded(IrOpaqueDeclared, value),\n (value) => jsonOf(IrOpaqueDeclared, value),\n );\n return Option.all({ sourceHash, declared }).pipe(\n Option.map(\n (fields) =>\n new IrOpaqueImplementation({\n type: \"opaque\",\n sourceHash: fields.sourceHash,\n declared: fields.declared,\n }),\n ),\n );\n }\n\n return conflict(\n state,\n path,\n \"field-changed-both\",\n render(base),\n render(local),\n render(remote),\n );\n};\n\nconst mergeStep = (\n state: MergeState,\n path: string,\n base: IrStep,\n local: IrStep,\n remote: IrStep,\n): Option.Option<IrStep> => {\n const name = field(\n state,\n at(path, \"name\"),\n base.name,\n local.name,\n remote.name,\n scalarKey,\n scalarJson,\n );\n const kind = field(\n state,\n at(path, \"kind\"),\n base.kind,\n local.kind,\n remote.kind,\n scalarKey,\n scalarJson,\n );\n const inputs = mergePorts(\n state,\n at(path, \"inputs\"),\n base.inputs,\n local.inputs,\n remote.inputs,\n );\n const outputs = mergePorts(\n state,\n at(path, \"outputs\"),\n base.outputs,\n local.outputs,\n remote.outputs,\n );\n const params = mergeParams(\n state,\n at(path, \"params\"),\n base.params,\n local.params,\n remote.params,\n );\n const implementation = mergeImplementation(\n state,\n at(path, \"implementation\"),\n base.implementation,\n local.implementation,\n remote.implementation,\n );\n const sourcePath = field(\n state,\n at(path, \"source\", \"path\"),\n base.source.path,\n local.source.path,\n remote.source.path,\n scalarKey,\n scalarJson,\n );\n // The span addresses the local file, which is what a later apply edits.\n const span = local.source.span;\n return Option.all({\n name,\n kind,\n inputs,\n outputs,\n params,\n implementation,\n sourcePath,\n }).pipe(\n Option.map(\n (fields) =>\n new IrStep({\n id: local.id,\n kind: fields.kind,\n name: fields.name,\n inputs: fields.inputs,\n outputs: fields.outputs,\n params: fields.params,\n source: new IrSource({ path: fields.sourcePath, span }),\n implementation: fields.implementation,\n }),\n ),\n );\n};\n\nconst mergeSteps = (\n state: MergeState,\n base: ReadonlyArray<IrStep>,\n local: ReadonlyArray<IrStep>,\n remote: ReadonlyArray<IrStep>,\n): Option.Option<ReadonlyArray<IrStep>> => {\n const idOf = (step: IrStep) => step.id;\n const keys = ordered(base, local, remote, idOf);\n const [b, l, r] = [\n indexOf(base, idOf),\n indexOf(local, idOf),\n indexOf(remote, idOf),\n ];\n const merged = keys.map((id) =>\n element(\n state,\n at(\"/steps\", id),\n lookup(b, id),\n lookup(l, id),\n lookup(r, id),\n stepContentKey,\n stepJson,\n (baseStep, localStep, remoteStep) =>\n mergeStep(state, at(\"/steps\", id), baseStep, localStep, remoteStep),\n ),\n );\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, idOf),\n ),\n );\n};\n\nconst mergeEdges = (\n state: MergeState,\n base: ReadonlyArray<IrEdge>,\n local: ReadonlyArray<IrEdge>,\n remote: ReadonlyArray<IrEdge>,\n): Option.Option<ReadonlyArray<IrEdge>> => {\n const keyOf = edgeKey;\n const fanOf = (edge: IrEdge) => `${edgeKey(edge)}\\u0000${edge.fan}`;\n const keys = ordered(base, local, remote, keyOf);\n const [b, l, r] = [\n indexOf(base, keyOf),\n indexOf(local, keyOf),\n indexOf(remote, keyOf),\n ];\n const merged = keys.map((key) =>\n element(\n state,\n at(\"/edges\", key.replaceAll(\"\\u0000\", \".\")),\n lookup(b, key),\n lookup(l, key),\n lookup(r, key),\n fanOf,\n edgeJson,\n (baseEdge, localEdge, remoteEdge) =>\n field(\n state,\n at(\"/edges\", key.replaceAll(\"\\u0000\", \".\"), \"fan\"),\n baseEdge.fan,\n localEdge.fan,\n remoteEdge.fan,\n scalarKey,\n scalarJson,\n ).pipe(\n Option.map(\n (fan) =>\n new IrEdge({\n from: localEdge.from,\n to: localEdge.to,\n fan,\n }),\n ),\n ),\n ),\n );\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, edgeKey),\n ),\n );\n};\n\n/**\n * Re-derives every bound step param from the merged declaration.\n *\n * A bound param's default is not its own: the declaration owns it. The field\n * merge suppresses those conflicts and this pass keeps the merged IR truthful.\n */\nconst withDerivedDefaults = (\n steps: ReadonlyArray<IrStep>,\n params: ReadonlyArray<IrPipelineParam>,\n): ReadonlyArray<IrStep> =>\n Arr.map(\n steps,\n (step) =>\n new IrStep({\n ...step,\n params: Arr.map(step.params, (param) => {\n const boundTo = Option.getOrNull(param.pipelineParam);\n const declared =\n boundTo === null\n ? undefined\n : params.find((candidate) => candidate.name === boundTo);\n return declared === undefined\n ? param\n : new IrParam({\n ...param,\n default: declared.default,\n required: declared.default.pipe(\n Option.match({\n onNone: () => Option.some(true),\n onSome: () => Option.none(),\n }),\n ),\n });\n }),\n }),\n );\n\nconst incompatibleEdges = (\n steps: ReadonlyArray<IrStep>,\n edges: ReadonlyArray<IrEdge>,\n): ReadonlyArray<IrEdge> =>\n Arr.filter(edges, (edge) => {\n const from = steps.find((step) => step.id === edge.from.step);\n const to = steps.find((step) => step.id === edge.to.step);\n const fromPort = from?.outputs.find((port) => port.id === edge.from.port);\n const toPort = to?.inputs.find((port) => port.id === edge.to.port);\n return (\n fromPort === undefined ||\n toPort === undefined ||\n !typesCompatible(fromPort.type, toPort.type)\n );\n });\n\nconst mergePipelineParams = (\n state: MergeState,\n path: string,\n base: ReadonlyArray<IrPipelineParam>,\n local: ReadonlyArray<IrPipelineParam>,\n remote: ReadonlyArray<IrPipelineParam>,\n): Option.Option<ReadonlyArray<IrPipelineParam>> => {\n const nameOf = (param: IrPipelineParam) => param.name;\n const keys = ordered(base, local, remote, nameOf);\n const [b, l, r] = [\n indexOf(base, nameOf),\n indexOf(local, nameOf),\n indexOf(remote, nameOf),\n ];\n const merged = keys.map((name) =>\n element(\n state,\n at(path, name),\n lookup(b, name),\n lookup(l, name),\n lookup(r, name),\n pipelineParamContentKey,\n (param) => jsonOf(IrPipelineParam, param),\n (baseParam, localParam, remoteParam) => {\n const paramPath = at(path, name);\n const type = field(\n state,\n at(paramPath, \"type\"),\n baseParam.type,\n localParam.type,\n remoteParam.type,\n (value) => encoded(IrParamType, value),\n (value) => jsonOf(IrParamType, value),\n );\n const defaultValue = field(\n state,\n at(paramPath, \"default\"),\n baseParam.default,\n localParam.default,\n remoteParam.default,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(IrDefaultValue))(value)),\n defaultJson,\n );\n const editable = field(\n state,\n at(paramPath, \"editable\"),\n baseParam.editable,\n localParam.editable,\n remoteParam.editable,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(Schema.Boolean))(value)),\n (value) => optionJson(value, (flag) => flag),\n );\n const sourcePath = field(\n state,\n at(paramPath, \"source\", \"path\"),\n baseParam.source.path,\n localParam.source.path,\n remoteParam.source.path,\n scalarKey,\n scalarJson,\n );\n // The span addresses the local file, which is what a later apply edits.\n const span = localParam.source.span;\n return Option.all({\n type,\n default: defaultValue,\n editable,\n sourcePath,\n }).pipe(\n Option.map(\n (fields) =>\n new IrPipelineParam({\n name,\n type: fields.type,\n default: fields.default,\n editable: fields.editable,\n source: new IrSource({ path: fields.sourcePath, span }),\n }),\n ),\n );\n },\n ),\n );\n return Option.some(\n Arr.sort(\n merged.flatMap(Option.toArray),\n Order.mapInput(Order.String, nameOf),\n ),\n );\n};\n\nconst mergePipeline = (\n state: MergeState,\n base: IrPipeline,\n local: IrPipeline,\n remote: IrPipeline,\n): Option.Option<IrPipeline> => {\n const name = field(\n state,\n \"/pipeline/name\",\n base.name,\n local.name,\n remote.name,\n scalarKey,\n scalarJson,\n );\n const description = field(\n state,\n \"/pipeline/description\",\n base.description,\n local.description,\n remote.description,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(Schema.String))(value)),\n (value) => optionJson(value, (text) => text),\n );\n const stage = field(\n state,\n \"/pipeline/stage\",\n base.stage,\n local.stage,\n remote.stage,\n scalarKey,\n scalarJson,\n );\n const params = mergePipelineParams(\n state,\n \"/pipeline/params\",\n Option.getOrElse(base.params, () => []),\n Option.getOrElse(local.params, () => []),\n Option.getOrElse(remote.params, () => []),\n );\n return Option.all({ name, description, stage, params }).pipe(\n Option.map(\n (fields) =>\n new IrPipeline({\n name: fields.name,\n description: fields.description,\n stage: fields.stage,\n params: Arr.match(fields.params, {\n onEmpty: () => Option.none(),\n onNonEmpty: (values) => Option.some(values),\n }),\n }),\n ),\n );\n};\n\nconst mergeRuntime = (\n state: MergeState,\n base: IrRuntime,\n local: IrRuntime,\n remote: IrRuntime,\n): Option.Option<IrRuntime> => {\n const python = field(\n state,\n \"/runtime/python\",\n base.python,\n local.python,\n remote.python,\n scalarKey,\n scalarJson,\n );\n const entry = field(\n state,\n \"/runtime/entry\",\n base.entry,\n local.entry,\n remote.entry,\n scalarKey,\n scalarJson,\n );\n const requirements = field(\n state,\n \"/runtime/requirements\",\n base.requirements,\n local.requirements,\n remote.requirements,\n (value) =>\n stableText(Schema.encodeSync(Schema.Option(IrRequirements))(value)),\n (value) => optionJson(value, (item) => jsonOf(IrRequirements, item)),\n );\n const imports = field(\n state,\n \"/runtime/imports\",\n base.imports,\n local.imports,\n remote.imports,\n (value) =>\n stableText(Schema.encodeSync(Schema.Array(Schema.String))(value)),\n (value) => asJson(Schema.encodeSync(Schema.Array(Schema.String))(value)),\n );\n return Option.all({ python, entry, requirements, imports }).pipe(\n Option.map(\n (fields) =>\n new IrRuntime({\n python: fields.python,\n entry: fields.entry,\n requirements: fields.requirements,\n imports: fields.imports,\n }),\n ),\n );\n};\n\nconst mergeMetadata = (\n state: MergeState,\n base: IrMetadata,\n local: IrMetadata,\n remote: IrMetadata,\n): Option.Option<IrMetadata> => {\n const compiler = field(\n state,\n \"/metadata/compiler\",\n base.compiler,\n local.compiler,\n remote.compiler,\n scalarKey,\n scalarJson,\n );\n const sourceHash = pick(\n state,\n \"/metadata/sourceHash\",\n \"opaque-changed-both\",\n base.sourceHash,\n local.sourceHash,\n remote.sourceHash,\n scalarKey,\n scalarJson,\n );\n return Option.all({ compiler, sourceHash }).pipe(\n Option.map(\n (fields) =>\n new IrMetadata({\n compiler: fields.compiler,\n sourceHash: fields.sourceHash,\n irHash: Option.none(),\n }),\n ),\n );\n};\n\n/**\n * Merges `local` and `remote` changes against their common `base`.\n *\n * Pure: no I/O, no clock, no LLM. A clean result is a complete IR whose\n * `metadata.irHash` is absent; a conflict result carries every overlapping\n * change, and the caller must publish nothing.\n *\n * `resolutions` settles named paths in favour of one side. A path the merge\n * cannot settle \u2014 an unknown one, a structural conflict, or a value that is not\n * a literal \u2014 refuses the whole merge rather than being silently dropped. A\n * document with nothing to merge (the short-circuits above) ignores the map: it\n * has no conflict left to settle.\n */\nexport const merge = (\n base: PipelineIr,\n local: PipelineIr,\n remote: PipelineIr,\n resolutions: Readonly<Record<string, ResolutionSide>> = {},\n): MergeResult => {\n const b = normalize(base);\n const l = normalize(local);\n const r = normalize(remote);\n\n const bk = pipelineContentKey(b);\n const lk = pipelineContentKey(l);\n const rk = pipelineContentKey(r);\n if (lk === rk) return { status: \"clean\", ir: l };\n if (bk === lk) return { status: \"clean\", ir: r };\n if (bk === rk) return { status: \"clean\", ir: l };\n\n const state: MergeState = {\n conflicts: [],\n resolutions,\n settled: [],\n refusals: [],\n };\n const irVersion = field(\n state,\n \"/irVersion\",\n b.irVersion,\n l.irVersion,\n r.irVersion,\n scalarKey,\n scalarJson,\n );\n const pipeline = mergePipeline(state, b.pipeline, l.pipeline, r.pipeline);\n const runtime = mergeRuntime(state, b.runtime, l.runtime, r.runtime);\n const metadata = mergeMetadata(state, b.metadata, l.metadata, r.metadata);\n const steps = mergeSteps(state, b.steps, l.steps, r.steps);\n const edges = mergeEdges(state, b.edges, l.edges, r.edges);\n\n refuseLeftovers(state);\n if (state.refusals.length > 0)\n return { status: \"refused\", refusals: state.refusals };\n if (state.conflicts.length > 0)\n return { status: \"conflict\", conflicts: state.conflicts };\n if (\n Option.isNone(irVersion) ||\n Option.isNone(pipeline) ||\n Option.isNone(runtime) ||\n Option.isNone(metadata) ||\n Option.isNone(steps) ||\n Option.isNone(edges)\n )\n return { status: \"conflict\", conflicts: state.conflicts };\n\n const mergedSteps = withDerivedDefaults(\n steps.value,\n Option.getOrElse(pipeline.value.params, () => []),\n );\n const broken = incompatibleEdges(mergedSteps, edges.value);\n if (broken.length > 0)\n return {\n status: \"conflict\",\n conflicts: broken.map(\n (edge) =>\n new IrConflict({\n path: at(\n \"/edges\",\n `${edge.from.step}.${edge.from.port}->${edge.to.step}.${edge.to.port}`,\n ),\n kind: \"edge-type-conflict\",\n base: edgeJson(edge),\n local: edgeJson(edge),\n remote: edgeJson(edge),\n hint: hints[\"edge-type-conflict\"],\n }),\n ),\n };\n\n return {\n status: \"clean\",\n ir: new PipelineIr({\n irVersion: irVersion.value,\n pipeline: pipeline.value,\n runtime: runtime.value,\n steps: mergedSteps,\n edges: edges.value,\n metadata: metadata.value,\n }),\n };\n};\n", "/**\n * Field-conflict resolution (plan 075 phase 4).\n *\n * A resolution is not a second merge: it names one IR field and the side whose\n * value the experimenter wants. `settlement` turns that choice into the exact op\n * the span-checked patcher would write, so the paths a resolution can settle are\n * the four the watcher is allowed to rewrite \u2014 a step parameter default, a\n * `@pipeline` parameter default, a step name and the pipeline description.\n * Everything else (edges, ports, types, runtime, opaque code, metadata) has no\n * settlement and is reconciled in source.\n *\n * Resolutions are in memory only, recorded against the head they were read at;\n * the store drops them when that head moves. They never reach `.braven`.\n */\nimport { Match } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Option from \"effect/Option\";\nimport * as P from \"effect/Predicate\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\nimport type { IrOp } from \"@braven/pipeline-ir\";\n\n/** Which side of a conflict the experimenter keeps. */\nexport const ResolutionSide = Schema.Literals([\"local\", \"remote\"]);\nexport type ResolutionSide = typeof ResolutionSide.Type;\n\n/** Why a conflict cannot be settled here; each reason has one sentence. */\nexport const ResolutionRefusalReason = Schema.Literals([\n \"unknown-path\",\n \"structural\",\n \"not-a-literal\",\n]);\nexport type ResolutionRefusalReason = typeof ResolutionRefusalReason.Type;\n\n/** One refused resolution, naming the path and the exact obstruction. */\nexport class ResolutionRefusal extends Schema.Class<ResolutionRefusal>(\n \"ResolutionRefusal\",\n)({\n path: Schema.String,\n reason: ResolutionRefusalReason,\n detail: Schema.String,\n}) {}\n\n/**\n * Resolutions recorded against one remote head.\n *\n * The `against` revision is the guard: a set is only ever applied to the head\n * that produced the conflicts, never to a newer one.\n */\nexport class ConflictResolutions extends Schema.Class<ConflictResolutions>(\n \"ConflictResolutions\",\n)({\n against: Schema.NonEmptyString,\n sides: Schema.Record(Schema.String, ResolutionSide),\n}) {}\n\n/** The four source edits a resolution may make. */\nexport type FieldTarget =\n | {\n readonly kind: \"param-default\";\n readonly stepId: string;\n readonly name: string;\n }\n | { readonly kind: \"pipeline-param-default\"; readonly name: string }\n | { readonly kind: \"step-name\"; readonly stepId: string }\n | { readonly kind: \"description\" };\n\nconst unescape = (token: string): string =>\n Str.replaceAll(\"~0\", \"~\")(Str.replaceAll(\"~1\", \"/\")(token));\n\n/** `/steps/a/params/b/default` \u2192 `[\"steps\", \"a\", \"params\", \"b\", \"default\"]`. */\nconst segmentsOf = (path: string): ReadonlyArray<string> =>\n Arr.map(Arr.drop(Str.split(\"/\")(path), 1), unescape);\n\n/** The source construct a conflict path addresses, if the watcher may write it. */\nexport const fieldTarget = (path: string): Option.Option<FieldTarget> => {\n const segments = segmentsOf(path);\n const at = (index: number): Option.Option<string> =>\n Option.fromNullishOr(segments[index]);\n const is = (index: number, expected: string): boolean =>\n segments[index] === expected;\n return Match.value(segments.length).pipe(\n Match.when(\n (count) => count === 2 && is(0, \"pipeline\") && is(1, \"description\"),\n () => Option.some<FieldTarget>({ kind: \"description\" }),\n ),\n Match.when(\n (count) => count === 3 && is(0, \"steps\") && is(2, \"name\"),\n () =>\n Option.map(\n at(1),\n (stepId): FieldTarget => ({ kind: \"step-name\", stepId }),\n ),\n ),\n Match.when(\n (count) =>\n count === 4 && is(0, \"pipeline\") && is(1, \"params\") && is(3, \"default\"),\n () =>\n Option.map(\n at(2),\n (name): FieldTarget => ({ kind: \"pipeline-param-default\", name }),\n ),\n ),\n Match.when(\n (count) =>\n count === 5 && is(0, \"steps\") && is(2, \"params\") && is(4, \"default\"),\n () =>\n Option.all({ stepId: at(1), name: at(3) }).pipe(\n Option.map(\n (fields): FieldTarget => ({ kind: \"param-default\", ...fields }),\n ),\n ),\n ),\n Match.orElse(() => Option.none<FieldTarget>()),\n );\n};\n\nconst textOf = (value: Schema.Json): Option.Option<string> =>\n P.isString(value) && Str.isNonEmpty(value)\n ? Option.some(value)\n : Option.none();\n\nconst literalOf = (value: Schema.Json): Option.Option<Schema.Json> =>\n P.isString(value) || P.isNumber(value) || P.isBoolean(value)\n ? Option.some(value)\n : Option.none();\n\nconst opFor = (target: FieldTarget, value: Schema.Json): Option.Option<IrOp> =>\n Match.value(target).pipe(\n Match.discriminator(\"kind\")(\"description\", () =>\n Option.map(\n textOf(value),\n (description): IrOp => ({ op: \"set-description\", description }),\n ),\n ),\n Match.discriminator(\"kind\")(\"step-name\", (named) =>\n Option.map(\n textOf(value),\n (name): IrOp => ({ op: \"set-step-name\", stepId: named.stepId, name }),\n ),\n ),\n Match.discriminator(\"kind\")(\"param-default\", (param) =>\n Option.map(\n literalOf(value),\n (literal): IrOp => ({\n op: \"set-param\",\n stepId: param.stepId,\n name: param.name,\n value: literal,\n }),\n ),\n ),\n Match.discriminator(\"kind\")(\"pipeline-param-default\", (param) =>\n Option.map(\n literalOf(value),\n (literal): IrOp => ({\n op: \"set-pipeline-param\",\n name: param.name,\n value: literal,\n }),\n ),\n ),\n Match.exhaustive,\n );\n\n/** The exact op that writes `value` at `path`, when the watcher may write it. */\nexport const fieldOp = (\n path: string,\n value: Schema.Json,\n): Option.Option<IrOp> =>\n Option.flatMap(fieldTarget(path), (target) => opFor(target, value));\n\n/**\n * The op one side's value would write, or the typed reason it cannot.\n *\n * The same function backs the merge (which takes the chosen side) and the\n * store (which refuses a pick it cannot write), so the panel can never offer a\n * choice the engine would reject.\n */\nexport const settlement = (\n path: string,\n local: Schema.Json,\n remote: Schema.Json,\n side: ResolutionSide,\n): Result.Result<IrOp, ResolutionRefusal> => {\n const chosen = side === \"local\" ? local : remote;\n return Option.match(fieldTarget(path), {\n onNone: () =>\n Result.fail(\n new ResolutionRefusal({\n path,\n reason: \"structural\",\n detail:\n \"only a parameter default, a step name or a description can be picked here \u2014 edit the source\",\n }),\n ),\n onSome: (target) =>\n Option.match(opFor(target, chosen), {\n onNone: () =>\n Result.fail(\n new ResolutionRefusal({\n path,\n reason: \"not-a-literal\",\n detail: `the ${side} value is not a literal the watcher can write \u2014 edit the source`,\n }),\n ),\n onSome: Result.succeed,\n }),\n });\n};\n\n/** One line per refusal, for a failure message or the panel's inline reason. */\nexport const resolutionLines = (\n refusals: ReadonlyArray<ResolutionRefusal>,\n): ReadonlyArray<string> =>\n Arr.map(\n refusals,\n (refusal) => `${refusal.path}: ${refusal.reason} \u2014 ${refusal.detail}`,\n );\n", "/**\n * Reading and replacing the one source file a checkout owns.\n *\n * Both the CLI and the engine use this so a missing or unreadable source has\n * one message and one failure kind.\n */\nimport { Effect } from \"effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { SyncFailure } from \"./errors.ts\";\n\n/** Reads `<cwd>/<source>` as text. */\nexport const readSource = (cwd: string, source: string) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n return yield* fs.readFileString(path.resolve(cwd, source)).pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot read ${source}: ${cause.message}`,\n }),\n ),\n );\n });\n\n/** Atomically replaces one source file: temp sibling, then rename. */\nexport const writeSource = (cwd: string, source: string, text: string) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const target = path.resolve(cwd, source);\n const temporary = `${target}.braven-tmp`;\n yield* fs.writeFileString(temporary, text).pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot write ${source}: ${cause.message}`,\n }),\n ),\n );\n yield* fs.rename(temporary, target).pipe(\n Effect.mapError(\n (cause) =>\n new SyncFailure({\n kind: \"usage\",\n message: `cannot replace ${source}: ${cause.message}`,\n }),\n ),\n );\n });\n", "/**\n * A structural diff of two published definitions (plan 069).\n *\n * Renames are detected by the stable id plus the source span, never by name\n * alone: renaming a function changes its id and keeps its span, while an\n * unrelated new function has neither. The diff is data; the command renders it.\n */\nimport * as Arr from \"effect/Array\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Schema from \"effect/Schema\";\nimport {\n IrDefaultValue,\n IrNumber,\n IrParam,\n IrParamType,\n IrRequirements,\n IrType,\n PipelineIr,\n type IrEdge,\n type IrPort,\n type IrStep,\n} from \"@braven/pipeline-ir\";\nimport { stableText } from \"./merge.ts\";\n\nconst asJson = (value: unknown): Schema.Json =>\n Schema.decodeUnknownSync(Schema.Json)(value);\n\nconst jsonOf = <S extends Schema.ConstraintEncoder<unknown, never>>(\n schema: S,\n value: S[\"Type\"],\n): Schema.Json => asJson(Schema.encodeSync(schema)(value));\n\n/** A step's stable id and author-facing name. */\nexport class StepRef extends Schema.Class<StepRef>(\"StepRef\")({\n id: Schema.NonEmptyString,\n name: Schema.NonEmptyString,\n}) {}\n\n/** One step that changed id or name. */\nexport class RenamedStep extends Schema.Class<RenamedStep>(\"RenamedStep\")({\n from: StepRef,\n to: StepRef,\n}) {}\n\n/** One field that differs between two definitions. */\nexport class FieldChange extends Schema.Class<FieldChange>(\"FieldChange\")({\n field: Schema.String,\n from: Schema.Json,\n to: Schema.Json,\n}) {}\n\n/** A port's type or required flag changing on a step that exists on both sides. */\nexport class PortChange extends Schema.Class<PortChange>(\"PortChange\")({\n step: Schema.NonEmptyString,\n side: Schema.Literals([\"inputs\", \"outputs\"]),\n port: Schema.NonEmptyString,\n field: Schema.Literals([\"type\", \"required\"]),\n from: Schema.Json,\n to: Schema.Json,\n}) {}\n\n/** A parameter's change, addition or removal. */\nexport class ParamChange extends Schema.Class<ParamChange>(\"ParamChange\")({\n step: Schema.NonEmptyString,\n name: Schema.NonEmptyString,\n field: Schema.Literals([\n \"default\",\n \"type\",\n \"required\",\n \"editable\",\n \"added\",\n \"removed\",\n ]),\n from: Schema.Json,\n to: Schema.Json,\n}) {}\n\n/** One edge endpoint pair. */\nexport class EdgeRef extends Schema.Class<EdgeRef>(\"EdgeRef\")({\n from: Schema.String,\n to: Schema.String,\n}) {}\n\n/** The whole report, section by section. */\nexport class PipelineDiff extends Schema.Class<PipelineDiff>(\"PipelineDiff\")({\n steps: Schema.Struct({\n added: Schema.Array(StepRef),\n removed: Schema.Array(StepRef),\n renamed: Schema.Array(RenamedStep),\n }),\n ports: Schema.Array(PortChange),\n params: Schema.Array(ParamChange),\n edges: Schema.Struct({\n added: Schema.Array(EdgeRef),\n removed: Schema.Array(EdgeRef),\n }),\n runtime: Schema.Array(FieldChange),\n metadata: Schema.Array(FieldChange),\n}) {}\n\nconst stepRef = (step: IrStep) => new StepRef({ id: step.id, name: step.name });\n\nconst edgeRef = (edge: IrEdge) =>\n new EdgeRef({\n from: `${edge.from.step}.${edge.from.port}`,\n to: `${edge.to.step}.${edge.to.port}`,\n });\n\nconst edgeKey = (edge: IrEdge): string =>\n [edge.from.step, edge.from.port, edge.to.step, edge.to.port].join(\".\");\n\nconst paramKey = (param: IrParam): string => param.name;\n\nconst sameSource = (left: IrStep, right: IrStep): boolean =>\n left.source.path === right.source.path &&\n left.source.span.startLine === right.source.span.startLine &&\n left.source.span.endLine === right.source.span.endLine;\n\nconst defaultValue = (param: IrParam): Schema.Json =>\n Option.match(param.default, {\n onNone: () => null,\n onSome: (value: IrDefaultValue) =>\n value instanceof IrNumber ? value.value : value,\n });\n\nconst paramField = (\n param: IrParam,\n field: \"type\" | \"required\" | \"editable\",\n): Schema.Json =>\n field === \"type\"\n ? jsonOf(IrParamType, param.type)\n : field === \"required\"\n ? Option.getOrNull(param.required)\n : Option.getOrNull(param.editable);\n\nconst portsOf = (\n step: IrStep,\n side: \"inputs\" | \"outputs\",\n): ReadonlyArray<IrPort> => (side === \"inputs\" ? step.inputs : step.outputs);\n\nconst indexById = (steps: ReadonlyArray<IrStep>) =>\n HashMap.fromIterable(steps.map((step) => [step.id, step] as const));\n\nconst atId = (index: HashMap.HashMap<string, IrStep>, id: string) =>\n HashMap.get(index, id);\n\n/** The full section-by-section difference, `from` \u2192 `to`. */\nexport const diffIr = (from: PipelineIr, to: PipelineIr): PipelineDiff => {\n const fromSteps = indexById(from.steps);\n const toSteps = indexById(to.steps);\n\n const removedIds = from.steps\n .filter((step) => !HashMap.has(toSteps, step.id))\n .map((step) => step.id);\n const addedIds = to.steps\n .filter((step) => !HashMap.has(fromSteps, step.id))\n .map((step) => step.id);\n\n /** A removed/added pair with the same source span is one renamed step. */\n const renamePairs = Arr.flatMap(removedIds, (id) => {\n const removed = atId(fromSteps, id);\n if (Option.isNone(removed)) return [];\n const added = Arr.findFirst(addedIds, (candidateId) =>\n Option.match(atId(toSteps, candidateId), {\n onNone: () => false,\n onSome: (candidate) => sameSource(removed.value, candidate),\n }),\n );\n return Option.isNone(added)\n ? []\n : Option.match(atId(toSteps, added.value), {\n onNone: () => [],\n onSome: (step) => [\n { removed: removed.value, added: step, addedId: added.value },\n ],\n });\n });\n\n const renamedInPlace = Arr.flatMap(from.steps, (step) =>\n Option.match(atId(toSteps, step.id), {\n onNone: () => [],\n onSome: (candidate) =>\n candidate.name === step.name\n ? []\n : [new RenamedStep({ from: stepRef(step), to: stepRef(candidate) })],\n }),\n );\n\n const renamedRemoved = new Set(renamePairs.map((pair) => pair.removed.id));\n const renamedAdded = new Set(renamePairs.map((pair) => pair.addedId));\n\n const steps = {\n added: Arr.flatMap(\n addedIds.filter((id) => !renamedAdded.has(id)),\n (id) => Option.toArray(Option.map(atId(toSteps, id), stepRef)),\n ),\n removed: Arr.flatMap(\n removedIds.filter((id) => !renamedRemoved.has(id)),\n (id) => Option.toArray(Option.map(atId(fromSteps, id), stepRef)),\n ),\n renamed: [\n ...renamePairs.map(\n (pair) =>\n new RenamedStep({\n from: stepRef(pair.removed),\n to: stepRef(pair.added),\n }),\n ),\n ...renamedInPlace,\n ],\n };\n\n const commonIds = Arr.sort(\n Arr.fromIterable(HashMap.keys(fromSteps)).filter((id) =>\n HashMap.has(toSteps, id),\n ),\n Order.String,\n );\n\n const both = (id: string) =>\n Option.all({ before: atId(fromSteps, id), after: atId(toSteps, id) });\n\n const ports = Arr.flatMap(commonIds, (id) =>\n Option.match(both(id), {\n onNone: () => [],\n onSome: ({ before, after }) =>\n Arr.flatMap([\"inputs\", \"outputs\"] as const, (side) =>\n Arr.flatMap(portsOf(before, side), (port) => {\n const candidate = portsOf(after, side).find(\n (other) => other.id === port.id,\n );\n if (candidate === undefined) return [];\n const changes: Array<PortChange> = [];\n if (\n stableText(jsonOf(IrType, port.type)) !==\n stableText(jsonOf(IrType, candidate.type))\n )\n changes.push(\n new PortChange({\n step: id,\n side,\n port: port.id,\n field: \"type\",\n from: jsonOf(IrType, port.type),\n to: jsonOf(IrType, candidate.type),\n }),\n );\n if (\n Option.getOrNull(port.required) !==\n Option.getOrNull(candidate.required)\n )\n changes.push(\n new PortChange({\n step: id,\n side,\n port: port.id,\n field: \"required\",\n from: Option.getOrNull(port.required),\n to: Option.getOrNull(candidate.required),\n }),\n );\n return changes;\n }),\n ),\n }),\n );\n\n const params = Arr.flatMap(commonIds, (id) =>\n Option.match(both(id), {\n onNone: () => [],\n onSome: ({ before, after }) => {\n const added = after.params\n .filter(\n (param) =>\n !before.params.some((other) => paramKey(other) === param.name),\n )\n .map(\n (param) =>\n new ParamChange({\n step: id,\n name: param.name,\n field: \"added\",\n from: null,\n to: defaultValue(param),\n }),\n );\n const removed = before.params\n .filter(\n (param) =>\n !after.params.some((other) => paramKey(other) === param.name),\n )\n .map(\n (param) =>\n new ParamChange({\n step: id,\n name: param.name,\n field: \"removed\",\n from: defaultValue(param),\n to: null,\n }),\n );\n const changed = Arr.flatMap(before.params, (param) => {\n const candidate = after.params.find(\n (other) => other.name === param.name,\n );\n if (candidate === undefined) return [];\n const changes: Array<ParamChange> = [];\n if (defaultValue(param) !== defaultValue(candidate))\n changes.push(\n new ParamChange({\n step: id,\n name: param.name,\n field: \"default\",\n from: defaultValue(param),\n to: defaultValue(candidate),\n }),\n );\n return Arr.appendAll(\n changes,\n Arr.flatMap([\"type\", \"required\", \"editable\"] as const, (field) => {\n const left = paramField(param, field);\n const right = paramField(candidate, field);\n return stableText(left) === stableText(right)\n ? []\n : [\n new ParamChange({\n step: id,\n name: param.name,\n field,\n from: left,\n to: right,\n }),\n ];\n }),\n );\n });\n return [...added, ...removed, ...changed];\n },\n }),\n );\n\n const fromEdges = HashMap.fromIterable(\n from.edges.map((edge) => [edgeKey(edge), edge] as const),\n );\n const toEdges = HashMap.fromIterable(\n to.edges.map((edge) => [edgeKey(edge), edge] as const),\n );\n\n const edges = {\n added: to.edges\n .filter((edge) => !HashMap.has(fromEdges, edgeKey(edge)))\n .map(edgeRef),\n removed: from.edges\n .filter((edge) => !HashMap.has(toEdges, edgeKey(edge)))\n .map(edgeRef),\n };\n\n const runtime = Arr.flatMap(\n [\n [\"python\", from.runtime.python, to.runtime.python],\n [\"entry\", from.runtime.entry, to.runtime.entry],\n [\n \"requirements\",\n Option.match(from.runtime.requirements, {\n onNone: () => null,\n onSome: (value) => jsonOf(IrRequirements, value),\n }),\n Option.match(to.runtime.requirements, {\n onNone: () => null,\n onSome: (value) => jsonOf(IrRequirements, value),\n }),\n ],\n [\n \"imports\",\n jsonOf(Schema.Array(Schema.String), from.runtime.imports),\n jsonOf(Schema.Array(Schema.String), to.runtime.imports),\n ],\n ] as const,\n ([field, before, after]) =>\n stableText(before) === stableText(after)\n ? []\n : [new FieldChange({ field, from: before, to: after })],\n );\n\n const metadata = Arr.flatMap(\n [\n [\"name\", from.pipeline.name, to.pipeline.name],\n [\n \"description\",\n Option.getOrNull(from.pipeline.description),\n Option.getOrNull(to.pipeline.description),\n ],\n [\"stage\", from.pipeline.stage, to.pipeline.stage],\n ] as const,\n ([field, before, after]) =>\n before === after\n ? []\n : [new FieldChange({ field, from: before, to: after })],\n );\n\n return new PipelineDiff({ steps, ports, params, edges, runtime, metadata });\n};\n\n/** Whether a diff reports nothing: the two definitions are equivalent. */\nexport const isEmptyDiff = (diff: PipelineDiff): boolean =>\n diff.steps.added.length === 0 &&\n diff.steps.removed.length === 0 &&\n diff.steps.renamed.length === 0 &&\n diff.ports.length === 0 &&\n diff.params.length === 0 &&\n diff.edges.added.length === 0 &&\n diff.edges.removed.length === 0 &&\n diff.runtime.length === 0 &&\n diff.metadata.length === 0;\n", "/**\n * The sync engine facade (plan 075 phase 0).\n *\n * It is the one calculator of pipeline sync state: the local `.braven` base,\n * the compiled source, the head and the proposals in, one `SyncState` out. The\n * CLI's commands and the watcher's store both call this module, so neither can\n * grow a second merge, patcher or notion of \"clean\".\n *\n * Everything platform-specific is injected: the folder (`cwd`), the API origin,\n * the resolved credential (`token`) and, for a first connect, the pipeline and\n * source to record. No identity store, no CLI, no UI.\n */\nimport { Crypto, Effect, Option } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport type { HttpClient } from \"effect/http\";\nimport * as Path from \"effect/Path\";\nimport * as R from \"effect/Record\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport {\n decodePipelineIr,\n irHashOf,\n type PipelineIr,\n} from \"@braven/pipeline-ir\";\nimport { ContentHash } from \"@braven/pipeline-ir/content-hash\";\nimport { makeClient, type PipelineApi } from \"./client.ts\";\nimport {\n CompilerUnavailable,\n PipelineExit,\n PythonCompiler,\n compileIr,\n compilerFailure,\n} from \"./compiler.ts\";\nimport { diffIr, isEmptyDiff, type PipelineDiff } from \"./diff.ts\";\nimport { SyncFailure, fail } from \"./errors.ts\";\nimport { merge, pipelineContentKey, type IrConflict } from \"./merge.ts\";\nimport { applyVerified } from \"./apply.ts\";\nimport type { ApplyResult } from \"./patch.ts\";\nimport {\n type ConflictResolutions,\n fieldOp,\n type ResolutionSide,\n resolutionLines,\n} from \"./resolve.ts\";\nimport { readSource } from \"./source.ts\";\nimport {\n PipelineSyncState,\n readState,\n type PipelineStateError,\n} from \"./state.ts\";\nimport {\n type PullOutcome,\n type PushOutcome,\n apiFailure,\n pull,\n push,\n revisionIr,\n} from \"./sync.ts\";\nimport {\n RevisionRef,\n SyncState,\n emptySyncState,\n type SyncStatus as SyncStatusType,\n} from \"./snapshot.ts\";\n\n/** The services every engine action needs, provided once at the boundary. */\nexport type SyncServices =\n | Crypto.Crypto\n | FileSystem.FileSystem\n | HttpClient.HttpClient\n | Path.Path\n | PythonCompiler;\n\n/** What the engine is told; everything else is read from the folder. */\nexport interface SyncEngineOptions {\n /** The pipeline folder: `.braven/pipeline.json` and the source live here. */\n readonly cwd: string;\n /** The API origin a first connect talks to; a tracked state file wins. */\n readonly origin: string;\n /** The resolved credential for that origin; `None` is signed-out. */\n readonly token: Option.Option<string>;\n /** A first-connect source override; otherwise the state file's source. */\n readonly source: Option.Option<string>;\n /** A first-connect pipeline override; otherwise the state file's pipeline. */\n readonly pipelineId: Option.Option<string>;\n}\n\n/** The pure diff targets the panel can ask for. */\nexport const DiffTarget = Schema.Literals([\"base\", \"head\", \"local\"]);\nexport type DiffTarget = typeof DiffTarget.Type;\n\n/** Which two definitions to compare; the default is Changes (base \u2192 local). */\nexport interface DiffRequest {\n readonly from: DiffTarget;\n readonly to: DiffTarget;\n}\n\n/** What `refresh` may carry: the field resolutions the panel holds. */\nexport interface RefreshRequest {\n /** In-memory only; ignored when its `against` head is no longer the head. */\n readonly resolutions?: ConflictResolutions;\n}\n\n/** What `push` may carry; all are refinements of the state's defaults. */\nexport interface PushRequest {\n readonly base?: Option.Option<string>;\n readonly dryRun?: boolean;\n readonly summary?: string;\n /** Merged into the publish; ignored when `against` is not the head. */\n readonly resolutions?: ConflictResolutions;\n}\n\n/** What `pull` may carry: `check` computes without writing. */\nexport interface PullRequest {\n readonly check?: boolean;\n}\n\n/**\n * One remote value to write into the source, taken from a conflict the panel\n * showed. Both guards are the conflict's identity: the compile it was derived\n * from, and the head revision that value came from.\n */\nexport interface FieldRequest {\n readonly path: string;\n readonly value: Schema.Json;\n readonly localHash: ContentHash;\n readonly headRevisionId: string;\n}\n\n/** The engine both the CLI and the store program against. */\nexport interface SyncEngine {\n /** The raw `.braven` base, or `None` when this folder is untracked. */\n readonly state: () => Effect.Effect<\n Option.Option<PipelineSyncState>,\n SyncFailure,\n FileSystem.FileSystem | Path.Path\n >;\n /** Reads the folder and the head, and derives one `SyncState`. */\n readonly refresh: (\n request?: RefreshRequest,\n ) => Effect.Effect<SyncState, SyncFailure, SyncServices>;\n readonly push: (\n request?: PushRequest,\n ) => Effect.Effect<PushOutcome, SyncFailure, SyncServices>;\n readonly pull: (\n request?: PullRequest,\n ) => Effect.Effect<PullOutcome, SyncFailure, SyncServices>;\n /** Edits the source for one safe proposal; never publishes. */\n readonly apply: (\n proposalId: string,\n ) => Effect.Effect<ApplyResult, SyncFailure, SyncServices>;\n /** Edits one field to a remote value through the span-checked patcher. */\n readonly applyField: (\n request: FieldRequest,\n ) => Effect.Effect<ApplyResult, SyncFailure, SyncServices>;\n readonly reject: (\n proposalId: string,\n ) => Effect.Effect<void, SyncFailure, SyncServices>;\n /** The section-by-section diff between two targets. */\n readonly diff: (\n request?: DiffRequest,\n ) => Effect.Effect<PipelineDiff, SyncFailure, SyncServices>;\n}\n\nconst mapStateError = <A, R>(effect: Effect.Effect<A, PipelineStateError, R>) =>\n effect.pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(\n new SyncFailure({\n kind: \"usage\",\n message: `${error.path}: ${error.message}`,\n }),\n ),\n ),\n );\n\nconst hashOf = (value: string): ContentHash =>\n Schema.decodeUnknownSync(ContentHash)(value);\n\n/** Only a diff with content is a Changes or Incoming section. */\nconst sectionOf = (before: PipelineIr, after: PipelineIr) => {\n const diff = diffIr(before, after);\n return isEmptyDiff(diff) ? Option.none<PipelineDiff>() : Option.some(diff);\n};\n\n/** The engine constructed over one folder and one credential. */\nexport const createSyncEngine = (options: SyncEngineOptions): SyncEngine => {\n const read = () => readState(options.cwd).pipe(mapStateError);\n\n const requireState = Effect.gen(function* () {\n const state = yield* read();\n if (Option.isNone(state))\n return yield* fail(\n \"usage\",\n \"no .braven/pipeline.json \u2014 this checkout is not connected to a pipeline\",\n );\n return state.value;\n });\n\n const compile = (source: string) =>\n compileIr(source, { cwd: options.cwd }).pipe(\n Effect.mapError((error: CompilerUnavailable | PipelineExit) =>\n compilerFailure(source, error),\n ),\n Effect.flatMap((text) =>\n decodePipelineIr(text).pipe(\n Effect.mapError(\n (error) =>\n new SyncFailure({\n kind: \"source\",\n message: `the compiler returned an unreadable IR: ${error.message}`,\n }),\n ),\n ),\n ),\n );\n\n const client = (\n origin: string,\n pipelineId: string,\n ): Effect.Effect<PipelineApi, SyncFailure> =>\n Option.match(options.token, {\n onNone: () =>\n fail(\"network\", `not signed in to ${origin} \u2014 run \\`braven login\\``),\n onSome: (secret) =>\n Effect.succeed(makeClient({ origin, secret, pipelineId })),\n });\n\n const refresh: SyncEngine[\"refresh\"] = Effect.fn(\"PipelineSync.refresh\")(\n function* (request: RefreshRequest = {}) {\n const stateOption = yield* read();\n if (Option.isNone(stateOption)) return emptySyncState(\"untracked\");\n const stored = stateOption.value;\n const baseRevision = new RevisionRef({\n revisionId: stored.baseRevisionId,\n contentHash: stored.baseContentHash,\n });\n\n const source = stored.source;\n const compiled = yield* compile(source).pipe(Effect.result);\n const local = Result.match(compiled, {\n onSuccess: Option.some,\n onFailure: () => Option.none<PipelineIr>(),\n });\n const localHash = yield* Option.match(local, {\n onNone: () => Effect.succeed(Option.none<ContentHash>()),\n onSome: (ir) =>\n Effect.map(irHashOf(ir), (value) => Option.some(hashOf(value))).pipe(\n Effect.orDie,\n ),\n });\n const compileError = Result.match(compiled, {\n onSuccess: () => Option.none<SyncFailure>(),\n onFailure: Option.some,\n });\n\n if (Option.isNone(options.token))\n return new SyncState({\n status: \"signed-out\",\n baseRevision: Option.some(baseRevision),\n headRevision: Option.none(),\n localHash,\n changes: Option.none(),\n incoming: Option.none(),\n proposals: [],\n conflicts: [],\n lastError: compileError,\n });\n\n const api = yield* client(stored.origin, stored.pipelineId);\n const head = yield* api.head().pipe(Effect.mapError(apiFailure));\n const proposals = yield* api\n .proposals({ status: \"open\" })\n .pipe(Effect.mapError(apiFailure));\n\n const headMoved = Option.match(head, {\n onNone: () => false,\n onSome: (value) => value.revisionId !== stored.baseRevisionId,\n });\n const localDiffers = Option.match(localHash, {\n onNone: () => false,\n onSome: (value) => value !== stored.baseContentHash,\n });\n\n const baseIr: Option.Option<PipelineIr> =\n headMoved || localDiffers\n ? Option.some(yield* revisionIr(api, stored.baseRevisionId))\n : Option.none();\n const headIr = yield* Option.match(head, {\n onNone: () => Effect.succeed(Option.none<PipelineIr>()),\n onSome: (value) =>\n headMoved\n ? Effect.map(revisionIr(api, value.revisionId), Option.some)\n : Effect.succeed(Option.none<PipelineIr>()),\n });\n\n const changes = Option.flatMap(\n Option.all({ base: baseIr, local }),\n ({ base, local: next }) => sectionOf(base, next),\n );\n const incoming = Option.flatMap(\n Option.all({ base: baseIr, head: headIr }),\n ({ base, head: remote }) => sectionOf(base, remote),\n );\n\n const documents = Option.all({ base: baseIr, local, head: headIr });\n\n // A pick is only meaningful for a conflict this head still has, and only\n // for the head it was read at. Anything else is a record from a source\n // that has moved on: dropped, never applied to a revision never seen.\n const held: Option.Option<Readonly<Record<string, ResolutionSide>>> =\n Option.flatMap(Option.fromNullishOr(request.resolutions), (set) =>\n Option.exists(head, (value) => value.revisionId === set.against)\n ? Option.some(set.sides)\n : Option.none(),\n );\n const sides: Readonly<Record<string, ResolutionSide>> = Option.match(\n held,\n {\n onNone: () => ({}),\n onSome: (candidate) =>\n Option.match(documents, {\n onNone: () => ({}),\n onSome: ({ base, local: next, head: remote }) => {\n const unresolved = merge(base, next, remote);\n const open =\n unresolved.status === \"conflict\" ? unresolved.conflicts : [];\n return R.filter(candidate, (_side, path) =>\n Arr.some(open, (conflict) => conflict.path === path),\n );\n },\n }),\n },\n );\n\n const atBase = Option.contains(localHash, stored.baseContentHash);\n const atHead = Option.match(head, {\n onNone: () => false,\n onSome: (value) => Option.contains(localHash, value.contentHash),\n });\n const plan = Option.map(\n documents,\n ({ base, local: next, head: remote }) => {\n const merged = merge(base, next, remote, sides);\n const remoteKey = pipelineContentKey(remote);\n // A resolution that still refuses (the conflict became structural) is\n // dropped, not fatal: the read must report the real conflicts.\n return merged.status === \"refused\"\n ? {\n merged: merge(base, next, remote),\n remoteKey,\n refused: merged.refusals,\n }\n : { merged, remoteKey, refused: [] };\n },\n );\n\n const deriveStatus = (): SyncStatusType => {\n if (Option.isNone(local)) return \"dirty\";\n if (Option.isNone(head)) return atBase ? \"clean\" : \"dirty\";\n if (atHead || atBase) return \"clean\";\n if (Option.isNone(plan)) return \"dirty\";\n if (plan.value.merged.status !== \"clean\") return \"conflict\";\n return pipelineContentKey(plan.value.merged.ir) === plan.value.remoteKey\n ? \"clean\"\n : \"diverged\";\n };\n const conflicts: ReadonlyArray<IrConflict> = Option.match(plan, {\n onNone: () => [],\n onSome: ({ merged }) =>\n merged.status === \"conflict\" ? merged.conflicts : [],\n });\n const dropped: Option.Option<SyncFailure> = Option.flatMap(\n plan,\n ({ refused }) =>\n refused.length === 0\n ? Option.none()\n : Option.some(\n new SyncFailure({\n kind: \"conflict\",\n message: `a resolution no longer applies: ${Arr.join(resolutionLines(refused), \"; \")}`,\n }),\n ),\n );\n\n return new SyncState({\n status: deriveStatus(),\n baseRevision: Option.some(baseRevision),\n headRevision: head,\n localHash,\n changes,\n incoming,\n proposals,\n conflicts,\n lastError: Option.orElse(compileError, () => dropped),\n });\n },\n );\n\n const pushAction: SyncEngine[\"push\"] = Effect.fn(\"PipelineSync.push\")(\n function* (request: PushRequest = {}) {\n const stateOption = yield* read();\n const pipelineId = Option.match(stateOption, {\n onNone: () => options.pipelineId,\n onSome: (stored) => Option.some(stored.pipelineId),\n });\n if (Option.isNone(pipelineId))\n return yield* fail(\n \"usage\",\n \"no pipeline to push to \u2014 pass --pipeline-id for the first push, or run `braven pipeline pull`\",\n );\n const source = Option.match(stateOption, {\n onNone: () => Option.getOrElse(options.source, () => \"pipeline.py\"),\n onSome: (stored) => stored.source,\n });\n const origin = Option.match(stateOption, {\n onNone: () => options.origin,\n onSome: (stored) => stored.origin,\n });\n const api = yield* client(origin, pipelineId.value);\n const local = yield* compile(source);\n const baseRevisionId = Option.orElse(\n request.base ?? Option.none<string>(),\n () => Option.map(stateOption, (stored) => stored.baseRevisionId),\n );\n return yield* push({\n cwd: options.cwd,\n api,\n local,\n identity: { origin, pipelineId: pipelineId.value, source },\n baseRevisionId,\n resolutions: Option.fromNullishOr(request.resolutions),\n dryRun: request.dryRun ?? false,\n summary: request.summary,\n });\n },\n );\n\n const pullAction: SyncEngine[\"pull\"] = Effect.fn(\"PipelineSync.pull\")(\n function* (request: PullRequest = {}) {\n const stored = yield* requireState;\n const source = stored.source;\n const local = yield* compile(source);\n const sourceText = yield* readSource(options.cwd, source);\n const api = yield* client(stored.origin, stored.pipelineId);\n return yield* pull({\n cwd: options.cwd,\n api,\n local,\n sourceText,\n check: request.check ?? false,\n });\n },\n );\n\n const applyAction: SyncEngine[\"apply\"] = Effect.fn(\"PipelineSync.apply\")(\n function* (proposalId: string) {\n const stored = yield* requireState;\n const api = yield* client(stored.origin, stored.pipelineId);\n const proposals = yield* api\n .proposals({})\n .pipe(Effect.mapError(apiFailure));\n const proposal = Arr.findFirst(\n proposals,\n (candidate) => candidate.id === proposalId,\n );\n if (Option.isNone(proposal))\n return yield* fail(\n \"usage\",\n `no proposal ${proposalId} on this pipeline`,\n );\n if (proposal.value.status !== \"open\")\n return yield* fail(\n \"usage\",\n `proposal ${proposalId} is ${proposal.value.status}, not open`,\n );\n\n const source = stored.source;\n const local = yield* compile(source);\n const sourceText = yield* readSource(options.cwd, source);\n const base = yield* revisionIr(api, proposal.value.baseRevisionId);\n return yield* applyVerified({\n cwd: options.cwd,\n source,\n sourceText,\n local,\n base,\n ops: proposal.value.patch,\n write: true,\n });\n },\n );\n\n /**\n * Writes the remote side of one conflict into the source.\n *\n * The proposal patcher refuses an op whose construct changed since its base,\n * but a conflicted field *has* changed locally by definition \u2014 so the op's\n * reference is the local compile itself, and the equivalent guard is upstream:\n * the caller proves the source is still the compile the conflict was read\n * from (`localHash`) and the remote value still comes from the same head\n * (`headRevisionId`). The patcher's span, signature and literal checks then\n * ensure the exact text is edited.\n */\n const fieldAction: SyncEngine[\"applyField\"] = Effect.fn(\n \"PipelineSync.applyField\",\n )(function* (request: FieldRequest) {\n const stored = yield* requireState;\n const api = yield* client(stored.origin, stored.pipelineId);\n const sourceText = yield* readSource(options.cwd, stored.source);\n const local = yield* compile(stored.source);\n const localHash = yield* irHashOf(local).pipe(Effect.orDie);\n if (localHash !== request.localHash)\n return yield* fail(\n \"conflict\",\n \"the source changed since the conflict was read \u2014 refresh, then resolve again\",\n );\n const head = yield* api.head().pipe(Effect.mapError(apiFailure));\n if (\n !Option.exists(\n head,\n (value) => value.revisionId === request.headRevisionId,\n )\n )\n return yield* fail(\n \"conflict\",\n \"the head moved since the conflict was read \u2014 refresh, then resolve again\",\n );\n const op = fieldOp(request.path, request.value);\n if (Option.isNone(op))\n return yield* fail(\n \"usage\",\n `cannot apply ${request.path}: the watcher writes only a parameter default, a step name or a description`,\n );\n return yield* applyVerified({\n cwd: options.cwd,\n source: stored.source,\n sourceText,\n local,\n base: local,\n ops: [op.value],\n write: true,\n });\n });\n\n const rejectAction: SyncEngine[\"reject\"] = Effect.fn(\"PipelineSync.reject\")(\n function* (proposalId: string) {\n const stored = yield* requireState;\n const api = yield* client(stored.origin, stored.pipelineId);\n return yield* api.reject(proposalId).pipe(Effect.mapError(apiFailure));\n },\n );\n\n const diffAction: SyncEngine[\"diff\"] = Effect.fn(\"PipelineSync.diff\")(\n function* (request: DiffRequest = { from: \"base\", to: \"local\" }) {\n const stored = yield* requireState;\n const api = yield* client(stored.origin, stored.pipelineId);\n\n const load = (\n target: DiffTarget,\n ): Effect.Effect<PipelineIr, SyncFailure, SyncServices> => {\n if (target === \"local\") return compile(stored.source);\n if (target === \"base\") return revisionIr(api, stored.baseRevisionId);\n return Effect.gen(function* () {\n const head = yield* api.head().pipe(Effect.mapError(apiFailure));\n if (Option.isNone(head))\n return yield* fail(\n \"usage\",\n \"this pipeline has no published revision\",\n );\n return yield* revisionIr(api, head.value.revisionId);\n });\n };\n\n const [before, after] = yield* Effect.all(\n [load(request.from), load(request.to)],\n { concurrency: 2 },\n );\n return diffIr(before, after);\n },\n );\n\n return {\n state: read,\n refresh,\n push: pushAction,\n pull: pullAction,\n apply: applyAction,\n applyField: fieldAction,\n reject: rejectAction,\n diff: diffAction,\n };\n};\n", "/**\n * `.braven/pipeline.json` \u2014 the local working copy's sync state (plan 069).\n *\n * The file is a cache, not authority: it names the last revision this checkout\n * synced with (the merge base) and the compiler hash that revision had. It\n * holds no credential, no token and no IR \u2014 losing it costs one `pull`, never a\n * definition. A missing file means \"no base\", and `push` then refuses to guess.\n */\nimport { Effect, Schema } from \"effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Option from \"effect/Option\";\nimport * as Path from \"effect/Path\";\nimport { ContentHash } from \"@braven/pipeline-ir/content-hash\";\n\n/** The file's schema version; a future shape bumps this, not a field. */\nexport const STATE_SCHEMA = 1;\n\n/** A sync state that cannot be read or written. */\nexport class PipelineStateError extends Schema.TaggedError<PipelineStateError>()(\n \"PipelineStateError\",\n { path: Schema.String, message: Schema.String },\n) {}\n\n/** The working copy's last known base revision. */\nexport class PipelineSyncState extends Schema.Class<PipelineSyncState>(\n \"PipelineSyncState\",\n)({\n schema: Schema.Literal(STATE_SCHEMA).pipe(\n Schema.withConstructorDefault(Effect.succeed(STATE_SCHEMA)),\n ),\n origin: Schema.NonEmptyString,\n pipelineId: Schema.NonEmptyString,\n source: Schema.NonEmptyString,\n /** The revision the working copy branched from; the merge base. */\n baseRevisionId: Schema.NonEmptyString,\n /** That revision's canonical content hash, for `status` and `pull`. */\n baseContentHash: ContentHash,\n lastPulledAt: Schema.DateFromString,\n}) {}\n\nconst StateJson = Schema.fromJsonString(PipelineSyncState, { space: 2 });\n\n/** `<cwd>/.braven/pipeline.json`. */\nexport const statePath = (cwd: string) =>\n Effect.map(Path.Path, (path) => path.join(cwd, \".braven\", \"pipeline.json\"));\n\n/** Reads the state, or `None` when this checkout has never been synced. */\nexport const readState = (cwd: string) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* statePath(cwd);\n const exists = yield* fs.exists(path).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path,\n message: `cannot read the sync state: ${cause.message}`,\n }),\n ),\n );\n if (!exists) return Option.none<PipelineSyncState>();\n const text = yield* fs.readFileString(path).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path,\n message: `cannot read the sync state: ${cause.message}`,\n }),\n ),\n );\n return Option.some(\n yield* Schema.decodeUnknownEffect(StateJson)(text).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path,\n message: `the sync state is unreadable (${cause.message}); delete it and run \\`braven pipeline pull\\``,\n }),\n ),\n ),\n );\n });\n\n/**\n * Writes the state atomically: a sibling temporary file, then a rename.\n *\n * Only ids, the origin, the source path and hashes are stored \u2014 a secret has\n * nowhere to go in the schema.\n */\nexport const writeState = (cwd: string, state: PipelineSyncState) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const target = yield* statePath(cwd);\n const directory = path.dirname(target);\n const temporary = `${target}.tmp`;\n yield* fs.makeDirectory(directory, { recursive: true }).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path: directory,\n message: `cannot create ${directory}: ${cause.message}`,\n }),\n ),\n );\n yield* Schema.encodeEffect(StateJson)(state).pipe(\n Effect.flatMap((text) => fs.writeFileString(temporary, `${text}\\n`)),\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path: target,\n message: `cannot write the sync state: ${cause.message}`,\n }),\n ),\n );\n yield* fs.rename(temporary, target).pipe(\n Effect.mapError(\n (cause) =>\n new PipelineStateError({\n path: target,\n message: `cannot replace the sync state: ${cause.message}`,\n }),\n ),\n );\n });\n", "/**\n * The sync protocol: push, pull and their one-retry stale-head rule (plan 069).\n *\n * Pure protocol decisions live in `merge.ts` and `patch.ts`; this module owns\n * the order of operations and the local state transitions. It never calls\n * `updatePipeline` and never regenerates Python: `push` only publishes an IR,\n * `pull` only writes a source file when every touched construct is\n * round-trip-safe and every span still matches.\n */\nimport { Clock, DateTime, Effect, Option } from \"effect\";\nimport * as CryptoModule from \"effect/Crypto\";\nimport type { HttpClient } from \"effect/http\";\nimport * as Arr from \"effect/Array\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport { SyncFailure, type SyncFailureKind, fail, oneLine } from \"./errors.ts\";\nimport {\n canonicalJson,\n decodePipelineIr,\n irHashOf,\n PipelineIr,\n type PipelineIrIssue,\n} from \"@braven/pipeline-ir\";\nimport { ContentHash } from \"@braven/pipeline-ir/content-hash\";\nimport {\n type PipelineApi,\n type PipelineApiError,\n type PublishedRevision,\n type RevisionHead,\n isStaleParent,\n} from \"./client.ts\";\nimport { PythonCompiler } from \"./compiler.ts\";\nimport { merge, pipelineContentKey, type IrConflict } from \"./merge.ts\";\nimport { type PatchChange, type PatchRefusal } from \"./patch.ts\";\nimport { applyVerified } from \"./apply.ts\";\nimport {\n type ConflictResolutions,\n type ResolutionSide,\n resolutionLines,\n} from \"./resolve.ts\";\nimport {\n readState,\n writeState,\n PipelineSyncState,\n type PipelineStateError,\n} from \"./state.ts\";\n\nconst now = Effect.map(Clock.currentTimeMillis, (millis) =>\n Schema.decodeUnknownSync(Schema.DateFromString)(\n DateTime.formatIso(DateTime.makeUnsafe(millis)),\n ),\n);\n\nconst apiKind = (error: PipelineApiError): SyncFailureKind =>\n Option.match(error.status, {\n onNone: () => \"network\",\n onSome: (status) =>\n status === 404\n ? \"usage\"\n : status === 409 || status === 422\n ? \"conflict\"\n : \"network\",\n });\n\nexport const apiFailure = (error: PipelineApiError): SyncFailure =>\n new SyncFailure({\n kind: apiKind(error),\n message: `${error.procedure}: ${oneLine(error.message)}`,\n });\n\nconst stateFailure = (error: PipelineStateError): SyncFailure =>\n new SyncFailure({\n kind: \"usage\",\n message: `${error.path}: ${error.message}`,\n });\n\n/** Fails as `usage` unless this checkout has a sync state to work from. */\nconst requireState = (cwd: string) =>\n Effect.gen(function* () {\n const state = yield* readState(cwd);\n if (Option.isNone(state))\n return yield* fail(\n \"usage\",\n \"no .braven/pipeline.json \u2014 this checkout has no sync base; run `braven pipeline push` for a new pipeline to create one\",\n );\n return state.value;\n }).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(stateFailure(error)),\n ),\n );\n\nconst decodeIr = (text: string) =>\n decodePipelineIr(text).pipe(\n Effect.mapError(\n (error) =>\n new SyncFailure({\n kind: \"usage\",\n message: `the revision's IR is unreadable: ${Arr.join(\n error.issues.map(\n (issue: PipelineIrIssue) =>\n `${issue.pointer || \"/\"}: ${issue.message}`,\n ),\n \"; \",\n )}`,\n }),\n ),\n );\n\nconst hash = (text: string): ContentHash =>\n Schema.decodeUnknownSync(ContentHash)(text);\n\n/** What every state write needs, whether the file existed or is being created. */\nexport interface SyncIdentity {\n readonly origin: string;\n readonly pipelineId: string;\n readonly source: string;\n}\n\nconst record = (\n cwd: string,\n identity: SyncIdentity,\n base: { readonly revisionId: string; readonly contentHash: string },\n) =>\n Effect.gen(function* () {\n const at = yield* now;\n yield* writeState(\n cwd,\n new PipelineSyncState({\n origin: identity.origin,\n pipelineId: identity.pipelineId,\n source: identity.source,\n baseRevisionId: base.revisionId,\n baseContentHash: hash(base.contentHash),\n lastPulledAt: at,\n }),\n );\n }).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(stateFailure(error)),\n ),\n );\n\n/** Fetches and decodes one revision's IR. */\nexport const revisionIr = (api: PipelineApi, revisionId: string) =>\n Effect.gen(function* () {\n const document = yield* api\n .revision(revisionId)\n .pipe(Effect.mapError(apiFailure));\n return yield* decodeIr(document.ir);\n });\n\n/** What `push` would do for one head. */\ntype PushAction =\n | {\n readonly kind: \"publish\";\n readonly ir: PipelineIr;\n readonly merged: boolean;\n }\n | { readonly kind: \"up-to-date\"; readonly head: RevisionHead }\n | { readonly kind: \"remote-has-changes\"; readonly head: RevisionHead }\n | {\n readonly kind: \"conflict\";\n readonly conflicts: ReadonlyArray<IrConflict>;\n };\n\nexport interface PushInput {\n readonly cwd: string;\n readonly api: PipelineApi;\n readonly local: PipelineIr;\n readonly identity: SyncIdentity;\n /** The merge base: the state's base, or `--base` when it overrides it. */\n readonly baseRevisionId: Option.Option<string>;\n /** Field conflicts settled in the watcher; only valid for `against`. */\n readonly resolutions?: Option.Option<ConflictResolutions>;\n readonly dryRun: boolean;\n readonly summary?: string | undefined;\n}\n\n/** The result of a push; the command renders it and chooses the exit code. */\nexport type PushOutcome =\n | { readonly status: \"up-to-date\"; readonly head: RevisionHead }\n | {\n readonly status: \"published\";\n readonly revision: PublishedRevision;\n readonly merged: boolean;\n }\n | { readonly status: \"remote-has-changes\"; readonly head: RevisionHead }\n | {\n readonly status: \"conflict\";\n readonly conflicts: ReadonlyArray<IrConflict>;\n readonly head: Option.Option<RevisionHead>;\n }\n | {\n readonly status: \"dry-run\";\n readonly ir: PipelineIr;\n readonly merged: boolean;\n };\n\nconst planPush = (\n input: PushInput,\n head: RevisionHead,\n localHash: string,\n sides: Readonly<Record<string, ResolutionSide>>,\n): Effect.Effect<PushAction, SyncFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n if (localHash === head.contentHash) return { kind: \"up-to-date\", head };\n if (Option.isNone(input.baseRevisionId))\n return yield* fail(\n \"usage\",\n \"no base revision \u2014 pass --base or run `braven pipeline pull` first\",\n );\n const baseId = input.baseRevisionId.value;\n if (baseId === head.revisionId)\n return { kind: \"publish\", ir: input.local, merged: false };\n\n const base = yield* revisionIr(input.api, baseId);\n const remote = yield* revisionIr(input.api, head.revisionId);\n const merged = merge(base, input.local, remote, sides);\n if (merged.status === \"refused\")\n return yield* fail(\n \"conflict\",\n `the merge refused the resolution: ${Arr.join(resolutionLines(merged.refusals), \"; \")}`,\n );\n if (merged.status === \"conflict\")\n return { kind: \"conflict\", conflicts: merged.conflicts };\n if (pipelineContentKey(merged.ir) === pipelineContentKey(remote))\n return { kind: \"remote-has-changes\", head };\n return { kind: \"publish\", ir: merged.ir, merged: true };\n });\n\ntype Attempt =\n | { readonly attempted: false; readonly outcome: PushOutcome }\n | {\n readonly attempted: true;\n readonly result: PublishedRevision;\n readonly merged: boolean;\n }\n | { readonly attempted: true; readonly stale: true };\n\n/**\n * Publishes or reports, with exactly one refetch when the head moved between\n * the plan and the publish. A second stale answer is a conflict: there is no\n * blind retry loop, and nothing is published after it.\n */\nexport const push = (\n input: PushInput,\n): Effect.Effect<\n PushOutcome,\n SyncFailure,\n HttpClient.HttpClient | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const localHash = yield* irHashOf(input.local).pipe(Effect.orDie);\n\n const headAtStart = yield* input.api\n .head()\n .pipe(Effect.mapError(apiFailure));\n if (Option.isNone(headAtStart)) {\n if (input.dryRun)\n return { status: \"dry-run\", ir: input.local, merged: false };\n const revision = yield* input.api\n .publish({\n pipelineId: input.identity.pipelineId,\n irText: canonicalJson(input.local),\n irHash: localHash,\n expectedParentId: null,\n baseRevisionId: null,\n summary: input.summary,\n })\n .pipe(Effect.mapError(apiFailure));\n yield* record(input.cwd, input.identity, {\n revisionId: revision.revisionId,\n contentHash: revision.contentHash,\n });\n return { status: \"published\", revision, merged: false };\n }\n\n const runAttempt = (\n head: RevisionHead,\n ): Effect.Effect<Attempt, SyncFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n // A resolution belongs to the head it was read at. A moved head (the\n // one-retry path below) must re-merge without it and surface the\n // conflict, never apply the user's choice to a revision they never saw.\n const sides = Option.match(input.resolutions ?? Option.none(), {\n onNone: () => ({}),\n onSome: (set) => (set.against === head.revisionId ? set.sides : {}),\n });\n const action = yield* planPush(input, head, localHash, sides);\n if (action.kind === \"up-to-date\")\n return { attempted: false, outcome: { status: \"up-to-date\", head } };\n if (action.kind === \"remote-has-changes\")\n return {\n attempted: false,\n outcome: { status: \"remote-has-changes\", head },\n };\n if (action.kind === \"conflict\")\n return {\n attempted: false,\n outcome: {\n status: \"conflict\",\n conflicts: action.conflicts,\n head: Option.some(head),\n },\n };\n if (input.dryRun)\n return {\n attempted: false,\n outcome: {\n status: \"dry-run\",\n ir: action.ir,\n merged: action.merged,\n },\n };\n const contentHash = yield* irHashOf(action.ir).pipe(Effect.orDie);\n const answer = yield* input.api\n .publish({\n pipelineId: input.identity.pipelineId,\n irText: canonicalJson(action.ir),\n irHash: contentHash,\n expectedParentId: head.revisionId,\n baseRevisionId: head.revisionId,\n summary:\n input.summary ??\n (action.merged\n ? `Merged with revision ${head.number}`\n : undefined),\n })\n .pipe(Effect.result);\n if (Result.isFailure(answer)) {\n if (isStaleParent(answer.failure))\n return { attempted: true, stale: true };\n return yield* Effect.fail(apiFailure(answer.failure));\n }\n return {\n attempted: true,\n result: answer.success,\n merged: action.merged,\n };\n });\n\n const finish = (\n result: PublishedRevision,\n merged: boolean,\n parent: RevisionHead,\n ): Effect.Effect<\n PushOutcome,\n SyncFailure,\n FileSystem.FileSystem | Path.Path\n > =>\n Effect.gen(function* () {\n // A fast-forward publish means the source is exactly the revision; a\n // merged publish does not, so its base stays the parent it merged\n // against. The next push then re-merges to \"remote already contains\n // your changes\" instead of publishing the unmerged source.\n yield* record(\n input.cwd,\n input.identity,\n merged\n ? { revisionId: parent.revisionId, contentHash: parent.contentHash }\n : {\n revisionId: result.revisionId,\n contentHash: result.contentHash,\n },\n );\n return { status: \"published\", revision: result, merged };\n });\n\n const first = yield* runAttempt(headAtStart.value);\n if (!first.attempted) return first.outcome;\n if (\"result\" in first)\n return yield* finish(first.result, first.merged, headAtStart.value);\n\n // Stale: the head moved. Refetch exactly once and re-plan.\n const headAgain = yield* input.api.head().pipe(Effect.mapError(apiFailure));\n if (Option.isNone(headAgain))\n return yield* fail(\n \"conflict\",\n \"the pipeline head disappeared after the publish was rejected; nothing was published\",\n );\n const second = yield* runAttempt(headAgain.value);\n if (!second.attempted) return second.outcome;\n if (\"result\" in second)\n return yield* finish(second.result, second.merged, headAgain.value);\n return {\n status: \"conflict\",\n conflicts: [],\n head: Option.some(headAgain.value),\n };\n });\n\n/** What `pull` computed; `--check` returns the same shape without writing. */\nexport type PullOutcome =\n | { readonly status: \"up-to-date\"; readonly head: RevisionHead }\n | {\n readonly status: \"fast-forward\";\n readonly head: RevisionHead;\n readonly proposals: ReadonlyArray<string>;\n }\n | {\n readonly status: \"applied\";\n readonly head: RevisionHead;\n readonly proposals: ReadonlyArray<string>;\n readonly changes: ReadonlyArray<PatchChange>;\n }\n | { readonly status: \"local-ahead\"; readonly head: RevisionHead }\n | {\n readonly status: \"conflict\";\n readonly conflicts: ReadonlyArray<IrConflict>;\n }\n | { readonly status: \"remote-ahead\"; readonly head: RevisionHead }\n | {\n readonly status: \"refused\";\n readonly refusals: ReadonlyArray<PatchRefusal>;\n }\n | {\n readonly status: \"check\";\n readonly head: RevisionHead;\n readonly proposals: ReadonlyArray<string>;\n readonly changes: ReadonlyArray<PatchChange>;\n };\n\nexport interface PullInput {\n readonly cwd: string;\n readonly api: PipelineApi;\n readonly local: PipelineIr;\n readonly sourceText: string;\n readonly check: boolean;\n}\n\n/**\n * Advances the base pointer or applies round-trip-safe proposals.\n *\n * The source is only written when every proposal applies and the patched text\n * compiles to the values those proposals name; a refusal leaves it\n * byte-identical. A remote revision the source does not contain is reported,\n * never written: arbitrary Python is the engineer's to reconcile.\n */\nexport const pull = (\n input: PullInput,\n): Effect.Effect<\n PullOutcome,\n SyncFailure,\n | CryptoModule.Crypto\n | HttpClient.HttpClient\n | FileSystem.FileSystem\n | Path.Path\n | PythonCompiler\n> =>\n Effect.gen(function* () {\n const state = yield* requireState(input.cwd);\n const localKey = pipelineContentKey(input.local);\n\n const headOption = yield* input.api\n .head()\n .pipe(Effect.mapError(apiFailure));\n if (Option.isNone(headOption))\n return yield* fail(\n \"usage\",\n \"this pipeline has no published revision yet; run `braven pipeline push`\",\n );\n const head = headOption.value;\n\n const open = yield* input.api\n .proposals({ status: \"open\" })\n .pipe(Effect.mapError(apiFailure));\n const proposalIds = open.map((proposal) => proposal.id);\n const remote = yield* revisionIr(input.api, head.revisionId);\n const remoteKey = pipelineContentKey(remote);\n\n const advance = Effect.gen(function* () {\n if (state.baseRevisionId === head.revisionId) return;\n if (input.check) return;\n yield* record(input.cwd, state, {\n revisionId: head.revisionId,\n contentHash: head.contentHash,\n });\n });\n\n if (localKey === remoteKey && open.length === 0) {\n yield* advance;\n return { status: \"up-to-date\", head };\n }\n\n const base = yield* revisionIr(input.api, state.baseRevisionId);\n\n if (localKey !== remoteKey) {\n // A pull carries no resolutions: it only advances the base when the\n // source already contains what the head has.\n const merged = merge(base, input.local, remote);\n if (merged.status === \"conflict\")\n return { status: \"conflict\", conflicts: merged.conflicts };\n if (merged.status === \"refused\")\n // Unreachable: a pull hands the merge no resolutions.\n return yield* Effect.die(\"a pull merge cannot refuse a resolution\");\n const baseKey = pipelineContentKey(base);\n const mergedKey = pipelineContentKey(merged.ir);\n if (localKey === baseKey && remoteKey !== baseKey && open.length === 0) {\n // Fast-forward: the definition advanced, the source is untouched.\n yield* advance;\n return { status: \"fast-forward\", head, proposals: [] };\n }\n if (mergedKey !== localKey)\n // The source lacks changes the head contains; only Python can add them.\n return { status: \"remote-ahead\", head };\n }\n\n if (open.length === 0) {\n yield* advance;\n return { status: \"local-ahead\", head };\n }\n\n const applied = yield* applyVerified({\n cwd: input.cwd,\n source: state.source,\n sourceText: input.sourceText,\n local: input.local,\n base,\n ops: Arr.flatMap(open, (proposal) => proposal.patch),\n write: !input.check,\n });\n if (applied.status === \"refused\")\n return { status: \"refused\", refusals: applied.refusals };\n\n if (input.check)\n return {\n status: \"check\",\n head,\n proposals: proposalIds,\n changes: applied.changes,\n };\n\n yield* record(input.cwd, state, {\n revisionId: head.revisionId,\n contentHash: head.contentHash,\n });\n return {\n status: \"applied\",\n head,\n proposals: proposalIds,\n changes: applied.changes,\n };\n });\n", "/**\n * The one state shape the engine derives and the store publishes.\n *\n * It is a projection: the base revision lives in `.braven/pipeline.json`, the\n * source on disk, the head and proposals behind oRPC. Nothing here is written\n * back; the store replaces this value after every successful read.\n */\nimport * as Option from \"effect/Option\";\nimport * as Schema from \"effect/Schema\";\nimport { ContentHash } from \"@braven/pipeline-ir/content-hash\";\nimport { ProposalSummary, RevisionHead } from \"./client.ts\";\nimport { PipelineDiff } from \"./diff.ts\";\nimport { SyncFailure } from \"./errors.ts\";\nimport { IrConflict } from \"./merge.ts\";\n\n/** The seven states the panel can show. `offline` is an overlay on the last. */\nexport const SyncStatus = Schema.Literals([\n \"untracked\",\n \"signed-out\",\n \"clean\",\n \"dirty\",\n \"diverged\",\n \"conflict\",\n \"offline\",\n]);\nexport type SyncStatus = typeof SyncStatus.Type;\n\n/** The merge base, as the state file records it. */\nexport class RevisionRef extends Schema.Class<RevisionRef>(\"RevisionRef\")({\n revisionId: Schema.NonEmptyString,\n contentHash: Schema.NonEmptyString,\n}) {}\n\n/** Everything the panel renders, derived from the engine's read. */\nexport class SyncState extends Schema.Class<SyncState>(\"SyncState\")({\n status: SyncStatus,\n baseRevision: Schema.Option(RevisionRef),\n headRevision: Schema.Option(RevisionHead),\n localHash: Schema.Option(ContentHash),\n /** The local IR against the base revision: the Changes section. */\n changes: Schema.Option(PipelineDiff),\n /** The head IR against the base revision: the Incoming section. */\n incoming: Schema.Option(PipelineDiff),\n proposals: Schema.Array(ProposalSummary),\n conflicts: Schema.Array(IrConflict),\n lastError: Schema.Option(SyncFailure),\n}) {}\n\n/** The state before anything is read: no base, no head, no error. */\nexport const emptySyncState = (status: SyncStatus): SyncState =>\n new SyncState({\n status,\n baseRevision: Option.none(),\n headRevision: Option.none(),\n localHash: Option.none(),\n changes: Option.none(),\n incoming: Option.none(),\n proposals: [],\n conflicts: [],\n lastError: Option.none(),\n });\n", "/**\n * The headless sync store (plan 075 phase 1).\n *\n * It owns the state machine, not the UI: one snapshot, one subscriber list and\n * one serialized action at a time. Every action asks the engine, then reads the\n * derived state back; the store never derives a revision, a merge or a cleaner\n * answer of its own.\n *\n * The rules that must not live in a button:\n *\n * - push, pull and apply are refused while the last merge reported conflicts;\n * - apply is refused for a proposal the span-checked patcher rejects, and the\n * source stays byte-identical;\n * - no action reports `clean` until the head has been read back;\n * - a failed action keeps the previous snapshot's fields and records why;\n * - there is no discard: a push publishes, it never reverts source.\n *\n * A field resolution is in-memory state recorded against the head it was read\n * at. \"Use local\" keeps it for the next push (the merge takes the local side);\n * \"Use remote\" writes the remote value through the patcher now and advances the\n * base. A moved head discards the record \u2014 it is never applied to a revision\n * the experimenter did not see \u2014 and nothing about it reaches `.braven`.\n */\nimport { Effect, Match, Option, Semaphore } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as R from \"effect/Record\";\nimport * as Result from \"effect/Result\";\nimport type * as Schema from \"effect/Schema\";\nimport type { RevisionHead } from \"./client.ts\";\nimport type { PipelineDiff } from \"./diff.ts\";\nimport {\n type DiffRequest,\n type PullRequest,\n type PushRequest,\n type SyncEngine,\n type SyncServices,\n} from \"./engine.ts\";\nimport { SyncFailure } from \"./errors.ts\";\nimport type { ApplyResult, PatchChange } from \"./patch.ts\";\nimport {\n ConflictResolutions,\n ResolutionRefusal,\n type ResolutionSide,\n resolutionLines,\n settlement,\n} from \"./resolve.ts\";\nimport { emptySyncState, SyncState, type SyncStatus } from \"./snapshot.ts\";\nimport type { PullOutcome, PushOutcome } from \"./sync.ts\";\n\n/** What an action returns: a value, or the typed reason it did nothing. */\nexport type SyncActionResult<A> =\n | { readonly ok: true; readonly value: A }\n | { readonly ok: false; readonly failure: SyncFailure };\n\n/** Called with the new snapshot after every successful read. */\nexport type SyncListener = (state: SyncState) => void;\n\n/**\n * What settling a field conflict did.\n *\n * `recorded` is a local pick held for the next push; `edited` is a remote value\n * already written to the source, with nothing published.\n */\nexport type ResolutionOutcome =\n | { readonly status: \"recorded\"; readonly head: RevisionHead }\n | {\n readonly status: \"edited\";\n readonly head: RevisionHead;\n readonly changes: ReadonlyArray<PatchChange>;\n };\n\n/** The state machine the desktop wraps in a hook. */\nexport interface SyncStore {\n readonly getState: () => SyncState;\n /** Subscribing is synchronous; the returned function unsubscribes. */\n readonly subscribe: (listener: SyncListener) => () => void;\n readonly refresh: () => Effect.Effect<\n SyncActionResult<SyncState>,\n never,\n SyncServices\n >;\n readonly push: (\n request?: PushRequest,\n ) => Effect.Effect<SyncActionResult<PushOutcome>, never, SyncServices>;\n readonly pull: (\n request?: PullRequest,\n ) => Effect.Effect<SyncActionResult<PullOutcome>, never, SyncServices>;\n readonly apply: (\n proposalId: string,\n ) => Effect.Effect<SyncActionResult<ApplyResult>, never, SyncServices>;\n /**\n * Settles one field conflict: `local` records the pick for the next push,\n * `remote` writes the remote value to the source. Both refuse a structural\n * conflict, a non-literal value and a head that moved.\n */\n readonly resolve: (\n path: string,\n side: ResolutionSide,\n ) => Effect.Effect<SyncActionResult<ResolutionOutcome>, never, SyncServices>;\n readonly reject: (\n proposalId: string,\n ) => Effect.Effect<SyncActionResult<void>, never, SyncServices>;\n readonly diff: (\n request?: DiffRequest,\n ) => Effect.Effect<SyncActionResult<PipelineDiff>, never, SyncServices>;\n /** A realtime invalidation ping: one serialized refresh. */\n readonly wake: () => Effect.Effect<\n SyncActionResult<SyncState>,\n never,\n SyncServices\n >;\n}\n\nconst success = <A>(value: A): SyncActionResult<A> => ({ ok: true, value });\n\nconst some = (failure: SyncFailure) => Option.some(failure);\n\n/** One remote action's precondition, or why it cannot start. */\nconst remoteGate = (state: SyncState): Option.Option<SyncFailure> =>\n Match.value(state.status).pipe(\n Match.when(\"untracked\", () =>\n some(\n new SyncFailure({\n kind: \"usage\",\n message: \"this folder is not connected to a pipeline yet\",\n }),\n ),\n ),\n Match.when(\"signed-out\", () =>\n some(\n new SyncFailure({\n kind: \"network\",\n message: \"not signed in \u2014 sign in, then retry\",\n }),\n ),\n ),\n Match.when(\"offline\", () =>\n some(\n new SyncFailure({\n kind: \"network\",\n message: \"offline \u2014 showing the last known state\",\n }),\n ),\n ),\n Match.orElse(() => Option.none()),\n );\n\n/** A write action is also refused while the merge has open conflicts. */\nconst writeGate = (state: SyncState): Option.Option<SyncFailure> =>\n Option.orElse(remoteGate(state), () =>\n state.status === \"conflict\"\n ? some(\n new SyncFailure({\n kind: \"conflict\",\n message: `${state.conflicts.length} conflict(s) \u2014 resolve them in the source, then retry`,\n }),\n )\n : Option.none(),\n );\n\n/** A network failure becomes the offline overlay; anything else keeps status. */\nconst statusAfter = (state: SyncState, failure: SyncFailure): SyncStatus =>\n failure.kind === \"network\" &&\n state.status !== \"untracked\" &&\n state.status !== \"signed-out\"\n ? \"offline\"\n : state.status;\n\n/** The serialized store over one engine. */\nexport const createSyncStore = (\n engine: SyncEngine,\n initial: SyncState = emptySyncState(\"untracked\"),\n): SyncStore => {\n let current = initial;\n let listeners: ReadonlyArray<SyncListener> = [];\n const permits = Semaphore.makeUnsafe(1);\n /** Local picks held for the next push; absent for every other resolution. */\n let resolutions: Option.Option<ConflictResolutions> = Option.none();\n\n /**\n * Keeps the record only while it still describes this head. A moved head, a\n * conflict that reappeared, or a path that no longer settles all mean the\n * record would apply to something the experimenter did not choose.\n */\n const pruneResolutions = (state: SyncState): void => {\n Option.match(resolutions, {\n onNone: () => undefined,\n onSome: (held) => {\n const moved =\n Option.isSome(state.headRevision) &&\n !Option.exists(\n state.headRevision,\n (head) => head.revisionId === held.against,\n );\n const unsettled = Arr.some(R.keys(held.sides), (path) =>\n Arr.some(state.conflicts, (conflict) => conflict.path === path),\n );\n if (moved || unsettled) resolutions = Option.none();\n },\n });\n };\n\n const publish = (next: SyncState): void => {\n pruneResolutions(next);\n current = next;\n Arr.forEach(listeners, (listener) => listener(next));\n };\n\n /** The engine read with the resolutions the panel holds, if any. */\n const read = (): Effect.Effect<SyncState, SyncFailure, SyncServices> =>\n Option.match(resolutions, {\n onNone: () => engine.refresh(),\n onSome: (value) => engine.refresh({ resolutions: value }),\n });\n\n const report = (failure: SyncFailure): SyncActionResult<never> => {\n publish(\n new SyncState({\n ...current,\n status: statusAfter(current, failure),\n lastError: Option.some(failure),\n }),\n );\n return { ok: false, failure };\n };\n\n /**\n * Reads the state back after an action. The action's value is only success\n * once the derived state is known; otherwise the caller learns the action\n * happened but could not be verified.\n */\n const settle = <A>(\n value: A,\n ): Effect.Effect<SyncActionResult<A>, never, SyncServices> =>\n Effect.gen(function* () {\n const refreshed = yield* read().pipe(Effect.result);\n if (Result.isFailure(refreshed))\n return report(\n new SyncFailure({\n kind: refreshed.failure.kind,\n message: `${refreshed.failure.message} (the action completed, but the new state could not be read back)`,\n }),\n );\n publish(refreshed.success);\n return success(value);\n });\n\n const refresh = (): Effect.Effect<\n SyncActionResult<SyncState>,\n never,\n SyncServices\n > =>\n permits.withPermit(\n Effect.gen(function* () {\n const next = yield* read().pipe(Effect.result);\n if (Result.isFailure(next)) return report(next.failure);\n publish(next.success);\n return success(next.success);\n }),\n );\n\n const push = (\n request?: PushRequest,\n ): Effect.Effect<SyncActionResult<PushOutcome>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = writeGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const pushed = yield* engine\n .push({\n ...request,\n resolutions: Option.getOrUndefined(resolutions),\n })\n .pipe(Effect.result);\n if (Result.isFailure(pushed)) return report(pushed.failure);\n // Whatever the outcome, the merge has now seen the record: a publish\n // consumed it, and a conflict means it cannot apply. Keeping it would\n // hide a conflict the engine just reported.\n resolutions = Option.none();\n return yield* settle(pushed.success);\n }),\n );\n\n const pull = (\n request?: PullRequest,\n ): Effect.Effect<SyncActionResult<PullOutcome>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = writeGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const pulled = yield* engine.pull(request).pipe(Effect.result);\n if (Result.isFailure(pulled)) return report(pulled.failure);\n return yield* settle(pulled.success);\n }),\n );\n\n const apply = (\n proposalId: string,\n ): Effect.Effect<SyncActionResult<ApplyResult>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = writeGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const applied = yield* engine.apply(proposalId).pipe(Effect.result);\n if (Result.isFailure(applied)) return report(applied.failure);\n if (applied.success.status === \"refused\") {\n // The patcher wrote nothing; refresh anyway so a concurrent head\n // move is visible, but report the refusal as the domain outcome.\n const refreshed = yield* read().pipe(Effect.result);\n if (Result.isFailure(refreshed)) return report(refreshed.failure);\n publish(refreshed.success);\n return success(applied.success);\n }\n return yield* settle(applied.success);\n }),\n );\n\n /** A refusal the panel shows as the reason the pick did nothing. */\n const resolutionFailure = (refusal: ResolutionRefusal): SyncFailure =>\n new SyncFailure({\n kind: \"conflict\",\n message: Arr.join(resolutionLines([refusal]), \"; \"),\n });\n\n /**\n * Writes the remote value to the source, then pulls: a fast-forward advances\n * the base when the source now contains the head, and stays put when other\n * remote changes are still missing. Nothing is published.\n */\n const applyRemote = (\n path: string,\n value: Schema.Json,\n head: RevisionHead,\n ): Effect.Effect<SyncActionResult<ResolutionOutcome>, never, SyncServices> =>\n Effect.gen(function* () {\n if (Option.isNone(current.localHash))\n return report(\n new SyncFailure({\n kind: \"conflict\",\n message: \"the source does not compile \u2014 fix it before resolving\",\n }),\n );\n const applied = yield* engine\n .applyField({\n path,\n value,\n localHash: current.localHash.value,\n headRevisionId: head.revisionId,\n })\n .pipe(Effect.result);\n if (Result.isFailure(applied)) return report(applied.failure);\n if (applied.success.status === \"refused\")\n return report(\n new SyncFailure({\n kind: \"conflict\",\n message: `the patcher refused ${path}: ${Arr.join(\n Arr.map(\n applied.success.refusals,\n (refusal) => `${refusal.reason} \u2014 ${refusal.detail}`,\n ),\n \"; \",\n )}`,\n }),\n );\n const pulled = yield* engine.pull().pipe(Effect.result);\n if (Result.isFailure(pulled)) return report(pulled.failure);\n const next = yield* read().pipe(Effect.result);\n if (Result.isFailure(next)) return report(next.failure);\n publish(next.success);\n return success({\n status: \"edited\",\n head,\n changes: applied.success.changes,\n });\n });\n\n /** Records the local pick for the next push and re-derives the conflicts. */\n const recordLocal = (\n path: string,\n head: RevisionHead,\n ): Effect.Effect<SyncActionResult<ResolutionOutcome>, never, SyncServices> =>\n Effect.gen(function* () {\n const sides = Option.match(resolutions, {\n onNone: () => ({}),\n onSome: (value) =>\n value.against === head.revisionId ? value.sides : {},\n });\n const next = new ConflictResolutions({\n against: head.revisionId,\n sides: { ...sides, [path]: \"local\" },\n });\n const state = yield* engine\n .refresh({ resolutions: next })\n .pipe(Effect.result);\n if (Result.isFailure(state)) return report(state.failure);\n resolutions = Option.some(next);\n publish(state.success);\n const kept = Option.exists(\n state.success.headRevision,\n (value) => value.revisionId === head.revisionId,\n );\n const unsettled = Arr.some(\n state.success.conflicts,\n (conflict) => conflict.path === path,\n );\n if (!kept || unsettled)\n return report(\n new SyncFailure({\n kind: \"conflict\",\n message:\n \"the head moved since the conflict was read \u2014 refresh, then resolve again\",\n }),\n );\n return success({ status: \"recorded\", head });\n });\n\n const resolve = (\n path: string,\n side: ResolutionSide,\n ): Effect.Effect<SyncActionResult<ResolutionOutcome>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = remoteGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const conflict = Arr.findFirst(\n current.conflicts,\n (candidate) => candidate.path === path,\n );\n if (Option.isNone(conflict))\n return report(\n resolutionFailure(\n new ResolutionRefusal({\n path,\n reason: \"unknown-path\",\n detail: \"there is no conflict at that path \u2014 refresh first\",\n }),\n ),\n );\n const settled =\n conflict.value.kind === \"field-changed-both\"\n ? settlement(\n path,\n conflict.value.local,\n conflict.value.remote,\n side,\n )\n : Result.fail(\n new ResolutionRefusal({\n path,\n reason: \"structural\",\n detail: `${conflict.value.kind} conflicts are reconciled in the source`,\n }),\n );\n if (Result.isFailure(settled))\n return report(resolutionFailure(settled.failure));\n const head = current.headRevision;\n if (Option.isNone(head))\n return report(\n resolutionFailure(\n new ResolutionRefusal({\n path,\n reason: \"unknown-path\",\n detail: \"there is no published revision to compare against\",\n }),\n ),\n );\n if (side === \"remote\")\n return yield* applyRemote(path, conflict.value.remote, head.value);\n return yield* recordLocal(path, head.value);\n }),\n );\n\n const reject = (\n proposalId: string,\n ): Effect.Effect<SyncActionResult<void>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const blocked = remoteGate(current);\n if (Option.isSome(blocked)) return report(blocked.value);\n const rejected = yield* engine.reject(proposalId).pipe(Effect.result);\n if (Result.isFailure(rejected)) return report(rejected.failure);\n return yield* settle(undefined);\n }),\n );\n\n const diff = (\n request?: DiffRequest,\n ): Effect.Effect<SyncActionResult<PipelineDiff>, never, SyncServices> =>\n permits.withPermit(\n Effect.gen(function* () {\n const computed = yield* engine.diff(request).pipe(Effect.result);\n if (Result.isFailure(computed)) return report(computed.failure);\n return success(computed.success);\n }),\n );\n\n const subscribe = (listener: SyncListener): (() => void) => {\n listeners = [...listeners, listener];\n return () => {\n listeners = Arr.filter(listeners, (candidate) => candidate !== listener);\n };\n };\n\n return {\n getState: () => current,\n subscribe,\n refresh,\n push,\n pull,\n apply,\n resolve,\n reject,\n diff,\n wake: refresh,\n };\n};\n", "import { Effect } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as Option from \"effect/Option\";\nimport type { IrParam, PipelineIr } from \"@braven/pipeline-ir\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** The effective place a parameter change belongs. */\nexport type ParamTarget =\n | {\n readonly kind: \"step\";\n readonly name: string;\n readonly stepId: string;\n readonly path: string;\n }\n | {\n readonly kind: \"pipeline\";\n readonly name: string;\n readonly path: string;\n };\n\nconst targetOf = (stepId: string, param: IrParam): ParamTarget => {\n const binding = Option.getOrElse(param.binding, () => \"step\" as const);\n const pipelineName = Option.getOrElse(param.pipelineParam, () => param.name);\n return binding === \"pipeline\"\n ? {\n kind: \"pipeline\",\n name: pipelineName,\n path: `/pipeline/params/${pipelineName}/default`,\n }\n : {\n kind: \"step\",\n name: param.name,\n stepId,\n path: `/steps/${stepId}/params/${param.name}/default`,\n };\n};\n\n/**\n * Resolves the effective target of a parameter change from the IR, never from\n * a value comparison. A step literal that happens to equal a pipeline default\n * stays a step target; a bound param targets the declaration.\n */\nexport const resolveParamTarget = (\n ir: PipelineIr,\n input: { readonly param: string; readonly stepId?: string },\n): Effect.Effect<ParamTarget, AgentToolError> => {\n const matches = Arr.flatMap(ir.steps, (step) =>\n input.stepId === undefined || step.id === input.stepId\n ? Arr.map(\n Arr.filter(step.params, (param) => param.name === input.param),\n (param) => ({ stepId: step.id, param }),\n )\n : [],\n );\n\n if (matches.length > 1) {\n return Effect.fail(\n new AgentToolError({\n message: `Parameter '${input.param}' exists on more than one step; pass stepId`,\n code: \"ambiguous-param\",\n }),\n );\n }\n\n return Option.match(Arr.head(matches), {\n onNone: () =>\n Effect.fail(\n new AgentToolError({\n message: `Parameter '${input.param}' was not found`,\n code: \"param-not-found\",\n }),\n ),\n onSome: ({ stepId, param }) => Effect.succeed(targetOf(stepId, param)),\n });\n};\n", "import { Context, Effect, Layer, Option } from \"effect\";\nimport { resolveCredential } from \"@braven/identity-store\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** The non-secret identity the tool handlers may use. */\nexport interface CredentialValue {\n readonly origin: string;\n readonly secret: string;\n readonly email?: string;\n}\n\n/**\n * The credential resolved once at server start. Handlers never read the\n * environment or the credentials file directly, and no handler returns the secret.\n */\nexport class Credential extends Context.Service<Credential, CredentialValue>()(\n \"braven/Credential\",\n) {}\n\n/** Resolves the credential once at server start, from env or the shared store. */\nexport const layer = Layer.effect(Credential)(\n Effect.gen(function* () {\n const resolved = yield* resolveCredential({\n origin: Option.none(),\n email: Option.none(),\n }).pipe(\n Effect.mapError(\n (error) => new AgentToolError({ message: error.message }),\n ),\n );\n if (Option.isNone(resolved)) {\n return yield* Effect.fail(\n new AgentToolError({\n message: \"not signed in \u2014 run `braven login` or set BRAVEN_API_KEY\",\n }),\n );\n }\n const value = resolved.value;\n return {\n origin: value.origin,\n secret: value.secret,\n email: Option.getOrUndefined(value.email),\n };\n }),\n);\n", "import { Effect } from \"effect\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\n\n/** The command failed: a rejected sign-in, an unreachable API, an unreadable credentials file. */\nexport const EXIT_FAILURE = 1;\n/** The arguments cannot work. */\nexport const EXIT_USAGE = 2;\n/** Not signed in, or no stored account for the email asked about. */\nexport const EXIT_NOT_SIGNED_IN = 3;\n\n/**\n * One expected failure, carrying the exit code the process boundary uses.\n *\n * Every command fails with this; the boundary flattens it to a single\n * `braven: \u2026` line, so no message can smuggle a newline (or a secret) out.\n */\nexport class CliFailure extends Schema.TaggedError<CliFailure>()(\"CliFailure\", {\n message: Schema.String,\n exitCode: Schema.Int,\n}) {}\n\n/** Fails with a one-line, actionable message and an exit code. */\nexport const fail = (message: string, exitCode: number = EXIT_FAILURE) =>\n Effect.fail(new CliFailure({ message, exitCode }));\n\n/** Collapses any provider text to one line, bounded so a stack dump cannot leak. */\nexport const oneLine = (value: unknown): string =>\n Str.trim(Str.replace(/\\s+/g, \" \")(String(value))).slice(0, 300);\n", "import { Context, Effect, Layer, Option, pipe } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as R from \"effect/Record\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\nimport { Environment, DEFAULT_API_ORIGIN } from \"./environment.ts\";\nimport {\n CliFailure,\n EXIT_FAILURE,\n EXIT_NOT_SIGNED_IN,\n fail,\n oneLine,\n} from \"./errors.ts\";\n\n/** The config file's schema version. */\nexport const CONFIG_VERSION = 1;\n\nconst CredentialKind = Schema.Literals([\"session\", \"apiKey\"]);\n\n/** The two credential kinds the API accepts. */\nexport type CredentialKind = typeof CredentialKind.Type;\n\n/** One signed-in identity, exactly as recorded in the config file. */\nexport class Account extends Schema.Class<Account>(\"Account\")({\n origin: Schema.String,\n email: Schema.String,\n kind: CredentialKind,\n label: Schema.OptionFromOptionalKey(Schema.String),\n}) {}\n\n/**\n * The version-1 config file: accounts, the current one, the CLI defaults and\n * the watcher's own settings. It never holds a secret.\n */\nexport class ConfigFile extends Schema.Class<ConfigFile>(\"ConfigFile\")({\n version: Schema.Int.pipe(\n Schema.withConstructorDefault(Effect.succeed(CONFIG_VERSION)),\n Schema.withDecodingDefaultKey(Effect.succeed(CONFIG_VERSION)),\n ),\n current: Schema.OptionFromNullishOr(Schema.String, {\n onNoneEncoding: null,\n }).pipe(\n Schema.withConstructorDefault(Effect.succeed(Option.none())),\n Schema.withDecodingDefaultKey(Effect.succeed(null)),\n ),\n accounts: Schema.Array(Account).pipe(\n Schema.withConstructorDefault(Effect.succeed([])),\n Schema.withDecodingDefaultKey(Effect.succeed([])),\n ),\n defaults: Schema.Record(Schema.String, Schema.Unknown).pipe(\n Schema.withConstructorDefault(Effect.succeed({})),\n Schema.withDecodingDefaultKey(Effect.succeed({})),\n ),\n watcher: Schema.Record(Schema.String, Schema.Unknown).pipe(\n Schema.withConstructorDefault(Effect.succeed({})),\n Schema.withDecodingDefaultKey(Effect.succeed({})),\n ),\n}) {}\n\n/** The prefix every API key the server mints carries (`@braven/auth` mints\n * them and cannot import this source, so its literal is the same). */\nexport const API_KEY_PREFIX = \"bvn_api_\";\n\nconst ConfigJson = Schema.fromJsonString(ConfigFile, { space: 2 });\n\n/** Where this process reads and writes the non-secret config file. */\nexport class StoreConfig extends Context.Service<\n StoreConfig,\n { readonly path: string }\n>()(\"braven/StoreConfig\") {}\n\n/**\n * Where secrets live: a `0600` JSON file beside the config file, keyed by the\n * same `{origin}|{email}` account string. opencode's model, deliberately \u2014 an\n * OS keychain buys encryption at rest but charges a permission prompt for\n * every new binary and a native addon in every consumer, while any process\n * running as the user can read either store.\n */\nexport const CREDENTIALS_FILE = \"credentials.json\";\n\n/** The slice of the secret store the identity code uses; tests substitute a map. */\nexport interface SecretsShape {\n readonly get: (\n account: string,\n ) => Effect.Effect<Option.Option<string>, CliFailure>;\n readonly set: (\n account: string,\n secret: string,\n ) => Effect.Effect<void, CliFailure>;\n readonly remove: (account: string) => Effect.Effect<void, CliFailure>;\n}\n\n/** The secret store. */\nexport class Secrets extends Context.Service<Secrets, SecretsShape>()(\n \"braven/Secrets\",\n) {}\n\nconst SecretsJson = Schema.fromJsonString(\n Schema.Record(Schema.String, Schema.String),\n { space: 2 },\n);\n\n/** The credentials file that sits beside a config file. */\nexport const credentialsPath = (configPath: string): string =>\n Str.replace(/config\\.json$/, CREDENTIALS_FILE)(configPath);\n\n/** The real store: the credentials file, mode `0600`, written atomically. */\nexport const secretsLayer: Layer.Layer<\n Secrets,\n never,\n StoreConfig | FileSystem.FileSystem | Path.Path\n> = Layer.effect(Secrets)(\n Effect.gen(function* () {\n const { path } = yield* StoreConfig;\n const fs = yield* FileSystem.FileSystem;\n const pathService = yield* Path.Path;\n const file = credentialsPath(path);\n\n const read = () =>\n Effect.gen(function* () {\n if (\n !(yield* fs\n .exists(file)\n .pipe(Effect.mapError(storageFailure(\"read\", file))))\n ) {\n return {} as Record<string, string>;\n }\n const text = yield* fs\n .readFileString(file)\n .pipe(Effect.mapError(storageFailure(\"read\", file)));\n return yield* Schema.decodeUnknownEffect(SecretsJson)(text).pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `${file} is not a credentials file: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n });\n\n const write = (secrets: Readonly<Record<string, string>>) =>\n Effect.gen(function* () {\n const text = yield* Schema.encodeUnknownEffect(SecretsJson)(\n secrets,\n ).pipe(Effect.mapError(storageFailure(\"encode\", file)));\n yield* fs\n .makeDirectory(pathService.dirname(file), { recursive: true })\n .pipe(Effect.mapError(storageFailure(\"create\", file)));\n const temporary = `${file}.tmp`;\n yield* fs\n .writeFileString(temporary, text, { mode: 0o600 })\n .pipe(Effect.mapError(storageFailure(\"write\", file)));\n yield* fs\n .chmod(temporary, 0o600)\n .pipe(Effect.mapError(storageFailure(\"write\", file)));\n yield* fs\n .rename(temporary, file)\n .pipe(Effect.mapError(storageFailure(\"write\", file)));\n });\n\n const update = (\n change: (secrets: Record<string, string>) => Record<string, string>,\n ) =>\n Effect.gen(function* () {\n yield* write(change(yield* read()));\n });\n\n return Secrets.of({\n get: (account) =>\n read().pipe(Effect.map((all) => Option.fromNullishOr(all[account]))),\n set: (account, secret) => update((all) => R.set(all, account, secret)),\n remove: (account) => update((all) => R.remove(all, account)),\n });\n }),\n);\n\n/** The config `current` value and the credentials key for an identity. */\nexport const accountKey = (origin: string, email: string): string =>\n `${normalizeOrigin(origin)}|${email}`;\n\nconst normalizeOrigin = (origin: string): string =>\n Str.replace(/\\/+$/, \"\")(origin);\n\nconst storageFailure =\n (action: string, path: string) =>\n (cause: { readonly message: string }): CliFailure =>\n new CliFailure({\n message: `${action} ${path}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\n/** Reads the config file; a missing file is an empty config, never an error. */\nexport const loadConfig = (): Effect.Effect<\n ConfigFile,\n CliFailure,\n StoreConfig | FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const { path } = yield* StoreConfig;\n const fs = yield* FileSystem.FileSystem;\n if (\n !(yield* fs\n .exists(path)\n .pipe(Effect.mapError(storageFailure(\"read\", path))))\n ) {\n return new ConfigFile({});\n }\n const text = yield* fs\n .readFileString(path)\n .pipe(Effect.mapError(storageFailure(\"read\", path)));\n const config = yield* Schema.decodeUnknownEffect(ConfigJson)(text).pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `${path} is not a version-${CONFIG_VERSION} config: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n if (config.version !== CONFIG_VERSION) {\n return yield* fail(\n `${path} is version ${config.version}, expected ${CONFIG_VERSION}`,\n );\n }\n return config;\n });\n\n/** Writes the config file atomically, creating its directory if needed. */\nexport const saveConfig = (\n config: ConfigFile,\n): Effect.Effect<\n void,\n CliFailure,\n StoreConfig | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const { path } = yield* StoreConfig;\n const fs = yield* FileSystem.FileSystem;\n const pathService = yield* Path.Path;\n const text = yield* Schema.encodeUnknownEffect(ConfigJson)(config).pipe(\n Effect.mapError(storageFailure(\"encode\", path)),\n );\n yield* fs\n .makeDirectory(pathService.dirname(path), { recursive: true })\n .pipe(Effect.mapError(storageFailure(\"create\", path)));\n const temporary = `${path}.tmp`;\n yield* fs\n .writeFileString(temporary, text)\n .pipe(Effect.mapError(storageFailure(\"write\", path)));\n yield* fs\n .rename(temporary, path)\n .pipe(Effect.mapError(storageFailure(\"write\", path)));\n });\n\nconst matches =\n (origin: Option.Option<string>, email: Option.Option<string>) =>\n (account: Account): boolean =>\n Option.match(origin, {\n onNone: () => true,\n onSome: (value) =>\n normalizeOrigin(account.origin) === normalizeOrigin(value),\n }) &&\n Option.match(email, {\n onNone: () => true,\n onSome: (value) => account.email === value,\n });\n\n/** The first stored account matching the given origin and/or email. */\nexport const findAccount = (\n config: ConfigFile,\n origin: Option.Option<string>,\n email: Option.Option<string>,\n): Option.Option<Account> =>\n pipe(config.accounts, Arr.findFirst(matches(origin, email)));\n\n/** The account the config points at, if any. */\nexport const currentAccount = (config: ConfigFile): Option.Option<Account> =>\n Option.flatMap(config.current, (key) =>\n pipe(\n config.accounts,\n Arr.findFirst(\n (account) => accountKey(account.origin, account.email) === key,\n ),\n ),\n );\n\n/** A secret to store, with the owner the API proved (or `--email` asserted). */\nexport interface CredentialInput {\n readonly origin: string;\n readonly email: string;\n readonly kind: CredentialKind;\n readonly secret: string;\n}\n\n/**\n * Writes a secret to the credentials file, records its account, and makes it\n * current. The secret lands first; a failing write aborts before the config\n * file changes, so a stored account always has its secret.\n */\nexport const storeCredential = (\n credential: CredentialInput,\n label: Option.Option<string> = Option.none(),\n): Effect.Effect<\n Account,\n CliFailure,\n StoreConfig | Secrets | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n if (credential.secret.length === 0) {\n return yield* fail(\"refusing to store an empty secret\");\n }\n if (credential.email.length === 0) {\n return yield* fail(\"storing a credential needs an email\");\n }\n const origin = normalizeOrigin(credential.origin);\n const key = accountKey(origin, credential.email);\n const secrets = yield* Secrets;\n yield* secrets.set(key, credential.secret);\n const config = yield* loadConfig();\n const account = new Account({\n origin,\n email: credential.email,\n kind: credential.kind,\n label,\n });\n yield* saveConfig(\n new ConfigFile({\n ...config,\n accounts: [\n ...config.accounts.filter(\n (stored) => accountKey(stored.origin, stored.email) !== key,\n ),\n account,\n ],\n current: Option.some(key),\n }),\n );\n return account;\n });\n\n/** Points `current` at an already-stored account. */\nexport const useAccount = (\n email: string,\n): Effect.Effect<\n Account,\n CliFailure,\n StoreConfig | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const account = findAccount(config, Option.none(), Option.some(email));\n if (Option.isNone(account)) {\n return yield* fail(\n `no stored account for ${email} \u2014 see \\`braven config\\``,\n EXIT_NOT_SIGNED_IN,\n );\n }\n yield* saveConfig(\n new ConfigFile({\n ...config,\n current: Option.some(\n accountKey(account.value.origin, account.value.email),\n ),\n }),\n );\n return account.value;\n });\n\n/**\n * Forgets an account (default: the current one), its secret included.\n *\n * When the removed account was current, `current` rotates to the first\n * remaining account.\n */\nexport const removeCredential = (\n email: Option.Option<string>,\n): Effect.Effect<\n Option.Option<Account>,\n CliFailure,\n StoreConfig | Secrets | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const account = Option.isSome(email)\n ? findAccount(config, Option.none(), email)\n : currentAccount(config);\n if (Option.isNone(account)) return Option.none();\n const target = account.value;\n const key = accountKey(target.origin, target.email);\n const secrets = yield* Secrets;\n yield* secrets.remove(key);\n const accounts = config.accounts.filter(\n (stored) => accountKey(stored.origin, stored.email) !== key,\n );\n const next = Arr.head(accounts).pipe(\n Option.map((stored) => accountKey(stored.origin, stored.email)),\n );\n yield* saveConfig(\n new ConfigFile({\n ...config,\n accounts,\n current: Option.contains(config.current, key) ? next : config.current,\n }),\n );\n return Option.some(target);\n });\n\n/** Resolves the default company/project, either of which may be unset. */\nexport const resolveDefaults = (): Effect.Effect<\n {\n readonly company: Option.Option<string>;\n readonly project: Option.Option<string>;\n },\n CliFailure,\n StoreConfig | FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const defaultOf = (key: string): Option.Option<string> =>\n Option.fromNullishOr(config.defaults[key]).pipe(\n Option.filter(Predicate.isString),\n );\n return { company: defaultOf(\"company\"), project: defaultOf(\"project\") };\n });\n\n/** A stored non-secret default (\"origin\", \"company\", \"project\"). */\nexport const readDefault = (\n key: string,\n): Effect.Effect<\n Option.Option<string>,\n CliFailure,\n StoreConfig | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n return Option.fromNullishOr(config.defaults[key]).pipe(\n Option.filter(Predicate.isString),\n );\n });\n\n/** Writes (or, with `None`, removes) one non-secret default. */\nexport const setDefault = (\n name: string,\n value: Option.Option<string>,\n): Effect.Effect<\n ConfigFile,\n CliFailure,\n StoreConfig | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const updated = new ConfigFile({\n ...config,\n defaults: Option.match(value, {\n onNone: () => R.remove(config.defaults, name),\n onSome: (next) => R.set(config.defaults, name, next.trim()),\n }),\n });\n yield* saveConfig(updated);\n return updated;\n });\n\n/** A resolved secret and where it came from. Never printed. */\nexport interface Credential {\n readonly origin: string;\n readonly kind: CredentialKind;\n readonly secret: string;\n readonly email: Option.Option<string>;\n readonly label: Option.Option<string>;\n}\n\nconst envValue = (\n shape: { readonly values: Readonly<Record<string, string | undefined>> },\n name: string,\n): Option.Option<string> =>\n Option.fromNullishOr(shape.values[name]).pipe(Option.filter(Str.isNonEmpty));\n\n/** The stored account's secret, ignoring env overrides. `logout` uses this so a\n * shell's `BRAVEN_SESSION_TOKEN` can never be the credential it revokes. */\nexport const storedCredential = (options: {\n readonly origin: Option.Option<string>;\n readonly email: Option.Option<string>;\n}): Effect.Effect<\n Option.Option<Credential>,\n CliFailure,\n StoreConfig | Secrets | FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const config = yield* loadConfig();\n const account =\n Option.isSome(options.origin) || Option.isSome(options.email)\n ? findAccount(config, options.origin, options.email)\n : currentAccount(config);\n if (Option.isNone(account)) return Option.none();\n const stored = account.value;\n const secrets = yield* Secrets;\n const secret = yield* secrets.get(accountKey(stored.origin, stored.email));\n if (Option.isNone(secret)) return Option.none();\n return Option.some({\n origin: stored.origin,\n kind: stored.kind,\n secret: secret.value,\n email: Option.some(stored.email),\n label: stored.label,\n });\n });\n\n/**\n * Resolves the credential to authenticate with: `env var > flag > store`.\n *\n * `BRAVEN_SESSION_TOKEN` / `BRAVEN_API_KEY` (with `BRAVEN_API_URL`) win and\n * touch neither the config file nor the credentials file.\n */\nexport const resolveCredential = (options: {\n readonly origin: Option.Option<string>;\n readonly email: Option.Option<string>;\n}): Effect.Effect<\n Option.Option<Credential>,\n CliFailure,\n Environment | StoreConfig | Secrets | FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const shape = yield* Environment;\n const configuredOrigin = Option.isSome(options.origin)\n ? options.origin\n : envValue(shape, \"BRAVEN_API_URL\");\n const envOrigin = Option.getOrElse(\n configuredOrigin,\n () => DEFAULT_API_ORIGIN,\n );\n const apiKey = envValue(shape, \"BRAVEN_API_KEY\");\n if (Option.isSome(apiKey)) {\n return Option.some({\n origin: normalizeOrigin(envOrigin),\n kind: \"apiKey\",\n secret: apiKey.value,\n email: Option.none(),\n label: Option.some(\"env\"),\n });\n }\n const session = envValue(shape, \"BRAVEN_SESSION_TOKEN\");\n if (Option.isSome(session)) {\n return Option.some({\n origin: normalizeOrigin(envOrigin),\n kind: \"session\",\n secret: session.value,\n email: Option.none(),\n label: Option.some(\"env\"),\n });\n }\n return yield* storedCredential(options);\n });\n", "import { Context } from \"effect\";\n\n/**\n * The signed-in email, when the local sign-in knew it. A remote request only\n * has a token, so this stays an optional service: whoami reports what it has.\n */\nexport class AgentEmail extends Context.Service<\n AgentEmail,\n { readonly email?: string }\n>()(\"braven/AgentEmail\") {}\n", "import { Effect } from \"effect\";\nimport * as Crypto from \"effect/Crypto\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { McpSchema, Toolkit } from \"effect/ai\";\nimport * as HttpClient from \"effect/http/HttpClient\";\nimport { Environment } from \"@braven/identity-store/environment\";\nimport { PythonCompiler } from \"@braven/pipeline-sync/compiler\";\nimport * as Access from \"./access.ts\";\nimport { Credential } from \"./credential.ts\";\nimport { baseHandlers } from \"./baseHandlers.ts\";\nimport { baseTools } from \"./baseTools.ts\";\nimport { confirmAction } from \"./confirmation.ts\";\nimport { pullPipeline } from \"./pull.ts\";\nimport { pushPipeline } from \"./push.ts\";\nimport { Watcher } from \"./watcher.ts\";\nimport {\n PullPipeline,\n PushPipeline,\n WatcherOpen,\n WatcherPause,\n WatcherQueue,\n WatcherRescan,\n WatcherResume,\n WatcherStatus,\n WatcherSync,\n} from \"./tools.ts\";\n\n/**\n * The tools that need this machine: a workspace checkout, or the agent running\n * here. Kept out of `baseTools` so the Worker never imports the credential,\n * filesystem, or watcher code.\n */\nconst localTools = [\n PullPipeline.addDependency(Credential)\n .addDependency(Environment)\n .addDependency(FileSystem.FileSystem)\n .addDependency(Path.Path)\n .addDependency(HttpClient.HttpClient)\n .addDependency(Crypto.Crypto)\n .addDependency(PythonCompiler)\n .addDependency(McpSchema.McpServerClient),\n PushPipeline.addDependency(Credential)\n .addDependency(Environment)\n .addDependency(FileSystem.FileSystem)\n .addDependency(Path.Path)\n .addDependency(HttpClient.HttpClient)\n .addDependency(Crypto.Crypto)\n .addDependency(PythonCompiler)\n .addDependency(McpSchema.McpServerClient),\n WatcherStatus.addDependency(Watcher).addDependency(HttpClient.HttpClient),\n WatcherQueue.addDependency(Watcher).addDependency(HttpClient.HttpClient),\n WatcherSync.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n WatcherRescan.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n WatcherPause.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n WatcherOpen.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n WatcherResume.addDependency(Watcher)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n] as const;\n\n/** The toolkit that every surface registers. */\nexport const AgentTools = Toolkit.make(...baseTools, ...localTools);\n\n/**\n * Handlers are thin: resolve the service, call it, return the domain shape.\n * Every handler starts with `Access.permit`, so a scope the server was not\n * granted refuses the tool before its action runs. No handler reads the\n * environment, the credentials file, or the API token.\n */\nexport const handlersFor = (access: Access.AccessValue) =>\n AgentTools.of({\n ...baseHandlers(access),\n braven_pipeline_pull: (input) =>\n Access.permit(access, PullPipeline, pullPipeline(input)),\n braven_pipeline_push: (input) =>\n Access.permit(access, PushPipeline, pushPipeline(input)),\n braven_watcher_status: () =>\n Access.permit(\n access,\n WatcherStatus,\n Effect.flatMap(Watcher, (watcher) => watcher.status),\n ),\n braven_watcher_queue: () =>\n Access.permit(\n access,\n WatcherQueue,\n Effect.flatMap(Watcher, (watcher) =>\n watcher.queue.pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_watcher_sync: () =>\n Access.permit(\n access,\n WatcherSync,\n confirmAction(\n \"Upload every pending file now? This reconciles, rescans, and drains the watcher's queue.\",\n \"confirm\",\n ).pipe(\n Effect.andThen(Effect.flatMap(Watcher, (watcher) => watcher.sync)),\n ),\n ),\n braven_watcher_rescan: () =>\n Access.permit(\n access,\n WatcherRescan,\n confirmAction(\n \"Walk the watched folders now and upload files whose content changed?\",\n \"confirm\",\n ).pipe(\n Effect.andThen(Effect.flatMap(Watcher, (watcher) => watcher.rescan)),\n ),\n ),\n braven_watcher_open: ({ path }) =>\n Access.permit(\n access,\n WatcherOpen,\n confirmAction(\n `Open ${path} with its default app? It must be inside a watched folder.`,\n \"confirm\",\n \"Open it from the desktop app, or use a client that supports MCP elicitation.\",\n ).pipe(\n Effect.andThen(\n Effect.flatMap(Watcher, (watcher) => watcher.open(path)),\n ),\n ),\n ),\n braven_watcher_pause: () =>\n Access.permit(\n access,\n WatcherPause,\n confirmAction(\n \"Stop the watcher from claiming new uploads? It keeps watching and queueing.\",\n \"confirm\",\n ).pipe(\n Effect.andThen(Effect.flatMap(Watcher, (watcher) => watcher.pause)),\n ),\n ),\n braven_watcher_resume: () =>\n Access.permit(\n access,\n WatcherResume,\n confirmAction(\n \"Resume uploads and drain the queue that accumulated while paused?\",\n \"confirm\",\n ).pipe(\n Effect.andThen(Effect.flatMap(Watcher, (watcher) => watcher.resume)),\n ),\n ),\n });\n\nexport const handlers = AgentTools.toLayer(\n Effect.map(Access.Scopes, (access) => handlersFor(access)),\n);\n", "import { Effect, Option } from \"effect\";\nimport * as Access from \"./access.ts\";\nimport { BravenApi } from \"./api.ts\";\nimport { recomputeAnalysis, rerunPipeline, runPipeline } from \"./run.ts\";\nimport { AgentEmail } from \"./email.ts\";\nimport { BaseTools } from \"./baseTools.ts\";\nimport {\n CompareResults,\n CreateExperiment,\n GetExperiment,\n GetHardware,\n GetPipeline,\n GetReport,\n GetResult,\n ListExperiments,\n ListPipelines,\n ListProjects,\n ListProposals,\n ListRuns,\n PipelineStatus,\n ProposeParameter,\n Recompute,\n Rerun,\n RunPipeline,\n UpdateExperiment,\n WhoAmI,\n} from \"./tools.ts\";\n\n/**\n * The handlers every server registers. They depend only on the API service and\n * the client, so the Worker can import this module without the machine-bound\n * credential, filesystem, or watcher.\n */\nexport const baseHandlers = (access: Access.AccessValue) =>\n BaseTools.of({\n braven_whoami: () =>\n Access.permit(\n access,\n WhoAmI,\n Effect.gen(function* () {\n const api = yield* BravenApi;\n // Optional: the stdio server resolved an email; a remote request\n // only has a token, and the service is not a requirement.\n const known = yield* Effect.serviceOption(AgentEmail);\n const email = Option.flatMap(known, (value) =>\n Option.fromNullishOr(value.email),\n );\n // A real authenticated call: a revoked key or wrong origin must fail\n // here, not on the first unrelated tool call.\n const projects = yield* api.listProjects({});\n const company = Option.fromNullishOr(\n projects.find((project) => project.companyName !== undefined)\n ?.companyName,\n );\n return {\n origin: api.origin,\n ...Option.match(email, {\n onNone: () => ({}),\n onSome: (value) => ({ email: value }),\n }),\n ...Option.match(company, {\n onNone: () => ({}),\n onSome: (value) => ({ company: value }),\n }),\n };\n }),\n ),\n braven_list_projects: ({ companyId }) =>\n Access.permit(\n access,\n ListProjects,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listProjects({ companyId })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_list_experiments: ({\n projectId,\n device,\n pipeline,\n nameContains,\n stage,\n limit,\n offset,\n }) =>\n Access.permit(\n access,\n ListExperiments,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listExperiments({\n projectId,\n device,\n pipeline,\n nameContains,\n stage,\n limit,\n offset,\n })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_create_experiment: ({\n projectId,\n name,\n notes,\n deviceId,\n pipelineId,\n }) =>\n Access.permit(\n access,\n CreateExperiment,\n Effect.flatMap(BravenApi, (api) =>\n api.createExperiment({\n projectId,\n name,\n notes,\n deviceId,\n pipelineId,\n }),\n ),\n ),\n braven_update_experiment: ({ projectId, experimentId, name, notes }) =>\n Access.permit(\n access,\n UpdateExperiment,\n Effect.flatMap(BravenApi, (api) =>\n api.updateExperiment({ projectId, experimentId, name, notes }),\n ),\n ),\n braven_get_experiment: ({ experimentId }) =>\n Access.permit(\n access,\n GetExperiment,\n Effect.flatMap(BravenApi, (api) => api.getExperiment({ experimentId })),\n ),\n braven_get_hardware: ({ companyId, name, deviceId }) =>\n Access.permit(\n access,\n GetHardware,\n Effect.flatMap(BravenApi, (api) =>\n api.getHardware({ companyId, name, deviceId }),\n ),\n ),\n braven_get_report: ({ projectId, name, reportId }) =>\n Access.permit(\n access,\n GetReport,\n Effect.flatMap(BravenApi, (api) =>\n api.getReport({ projectId, name, reportId }),\n ),\n ),\n braven_list_pipelines: ({ companyId }) =>\n Access.permit(\n access,\n ListPipelines,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listPipelines({ companyId })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_get_pipeline: ({ companyId, pipelineId, includeIr }) =>\n Access.permit(\n access,\n GetPipeline,\n Effect.flatMap(BravenApi, (api) =>\n api.getPipeline({\n companyId,\n pipelineId,\n includeIr: includeIr ?? false,\n }),\n ),\n ),\n braven_pipeline_status: ({ pipelineId }) =>\n Access.permit(\n access,\n PipelineStatus,\n Effect.flatMap(BravenApi, (api) => api.pipelineStatus({ pipelineId })),\n ),\n braven_list_runs: ({ pipelineId, experimentId, status }) =>\n Access.permit(\n access,\n ListRuns,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listRuns({ pipelineId, experimentId, status })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_get_result: ({ resultId }) =>\n Access.permit(\n access,\n GetResult,\n Effect.flatMap(BravenApi, (api) => api.getResult({ resultId })),\n ),\n braven_list_proposals: ({ pipelineId, status }) =>\n Access.permit(\n access,\n ListProposals,\n Effect.flatMap(BravenApi, (api) =>\n api\n .listProposals({ pipelineId, status })\n .pipe(Effect.map((items) => ({ items }))),\n ),\n ),\n braven_compare_results: ({ leftResultId, rightResultId }) =>\n Access.permit(\n access,\n CompareResults,\n Effect.flatMap(BravenApi, (api) =>\n api.compare({ leftResultId, rightResultId }),\n ),\n ),\n braven_propose_parameter: ({\n pipelineId,\n param,\n value,\n stepId,\n baseRevisionId,\n rationale,\n }) =>\n Access.permit(\n access,\n ProposeParameter,\n Effect.flatMap(BravenApi, (api) =>\n api.proposeParameter({\n pipelineId,\n param,\n value,\n stepId,\n baseRevisionId,\n rationale,\n }),\n ),\n ),\n braven_run_pipeline: (input) =>\n Access.permit(access, RunPipeline, runPipeline(input)),\n braven_rerun: (input) => Access.permit(access, Rerun, rerunPipeline(input)),\n braven_recompute: (input) =>\n Access.permit(access, Recompute, recomputeAnalysis(input)),\n });\n", "import { Effect } from \"effect\";\nimport type * as McpSchema from \"effect/ai/McpSchema\";\nimport type * as HttpClient from \"effect/http/HttpClient\";\nimport * as Option from \"effect/Option\";\nimport { BravenApi, type RunHandle } from \"./api.ts\";\nimport { AgentToolError } from \"./errors.ts\";\nimport type { ParamValue } from \"./tools.ts\";\n\nimport { confirmAction } from \"./confirmation.ts\";\n\n/** What `braven_run_pipeline` accepts, after the tool schema decoded it. */\nexport interface RunPipelineInput {\n readonly pipelineId: string;\n readonly experimentId: string;\n readonly revisionId?: string | undefined;\n readonly parameters?: Readonly<Record<string, ParamValue>> | undefined;\n readonly dryRun?: boolean | undefined;\n}\n\n/**\n * Resolve the revision, ask the user, then queue exactly one run. The tool has\n * no way to write without passing through `confirm`.\n */\nexport const runPipeline = (input: RunPipelineInput) =>\n Effect.gen(function* () {\n const api = yield* BravenApi;\n const revisionId = yield* Option.match(\n Option.fromNullishOr(input.revisionId),\n {\n onSome: (given) => Effect.succeed(Option.some(given)),\n onNone: () =>\n api\n .pipelineStatus({ pipelineId: input.pipelineId })\n .pipe(\n Effect.map((status) =>\n Option.fromNullishOr(status.head?.revisionId),\n ),\n ),\n },\n );\n if (Option.isNone(revisionId)) {\n return yield* Effect.fail(\n new AgentToolError({\n message:\n \"Pipeline has no published revision to run; publish one or name a revisionId.\",\n code: \"no-head\",\n }),\n );\n }\n const rev = revisionId.value;\n yield* confirmAction(\n `Queue a run of pipeline ${input.pipelineId} for experiment ${input.experimentId} at revision ${rev}? This writes a result. Reply confirm: \"run\" to proceed.`,\n \"run\",\n );\n return yield* api.createRun({\n pipelineId: input.pipelineId,\n experimentId: input.experimentId,\n revisionId: rev,\n parameters: input.parameters,\n dryRun: Option.getOrElse(Option.fromNullishOr(input.dryRun), () => false),\n });\n }) satisfies Effect.Effect<\n RunHandle,\n AgentToolError,\n BravenApi | HttpClient.HttpClient | McpSchema.McpServerClient\n >;\n/** What `braven_rerun` accepts. */\nexport interface RerunInput {\n readonly runId: string;\n readonly mode: \"exact\" | \"current-inputs\";\n}\n\n/** Queue a rerun of one run, exact or with the current inputs. */\nexport const rerunPipeline = (input: RerunInput) =>\n Effect.gen(function* () {\n const api = yield* BravenApi;\n yield* confirmAction(\n `Queue a ${input.mode} rerun of run ${input.runId}? This writes another run and result; it never overwrites the original. Reply confirm: \"run\" to proceed.`,\n \"run\",\n );\n return yield* api.rerun(input);\n }) satisfies Effect.Effect<\n {\n readonly runId: string;\n readonly status: string;\n readonly revisionId?: string;\n },\n AgentToolError,\n BravenApi | HttpClient.HttpClient | McpSchema.McpServerClient\n >;\n\n/** What `braven_recompute` accepts. */\nexport interface RecomputeInput {\n readonly pipelineId: string;\n readonly revisionId: string;\n readonly inputSnapshotId: string;\n readonly parameters?: Readonly<Record<string, ParamValue>>;\n}\n\n/** Reanalyse an existing snapshot; the result is new, never an overwrite. */\nexport const recomputeAnalysis = (input: RecomputeInput) =>\n Effect.gen(function* () {\n const api = yield* BravenApi;\n yield* confirmAction(\n `Recompute pipeline ${input.pipelineId} at revision ${input.revisionId} from snapshot ${input.inputSnapshotId}? This writes a new result and leaves the previous one intact. Reply confirm: \"run\" to proceed.`,\n \"run\",\n );\n return yield* api.recompute({\n pipelineId: input.pipelineId,\n revisionId: input.revisionId,\n inputSnapshotId: input.inputSnapshotId,\n parameters: input.parameters,\n });\n }) satisfies Effect.Effect<\n {\n readonly runId: string;\n readonly status: string;\n readonly inputSnapshotId: string;\n },\n AgentToolError,\n BravenApi | HttpClient.HttpClient | McpSchema.McpServerClient\n >;\n", "import * as Cause from \"effect/Cause\";\nimport { Effect } from \"effect\";\nimport { McpServer } from \"effect/ai\";\nimport * as Schema from \"effect/Schema\";\nimport { AgentToolError } from \"./errors.ts\";\n\nconst refusal = (reason: string, fallback: string) =>\n new AgentToolError({\n message: `${reason} Nothing was changed. ${fallback}`,\n code: \"confirmation-required\",\n });\n\n/** Where a person can do the same thing when this client cannot ask. */\nconst CLI_OR_DASHBOARD =\n \"Run it from the Braven CLI or the dashboard, or use a client that supports MCP elicitation.\";\n\n/**\n * Asks the connected client's user before a consequential action. A decline,\n * a cancellation, and a client that cannot elicit all fail before the caller\n * performs the action; a tool parameter can never stand in for the answer.\n */\nexport const confirmAction = <const Word extends string>(\n message: string,\n word: Word,\n fallback: string = CLI_OR_DASHBOARD,\n) =>\n McpServer.elicit({\n message,\n schema: Schema.Struct({ confirm: Schema.Literal(word) }),\n }).pipe(\n Effect.asVoid,\n Effect.catchTag(\"ElicitationDeclined\", () =>\n Effect.fail(\n refusal(\"The user declined, or this client cannot ask.\", fallback),\n ),\n ),\n Effect.catchCause((cause) =>\n Cause.hasInterruptsOnly(cause)\n ? Effect.fail(refusal(\"The user cancelled.\", fallback))\n : Effect.failCause(cause),\n ),\n );\n", "import { McpSchema, Toolkit } from \"effect/ai\";\nimport * as HttpClient from \"effect/http/HttpClient\";\nimport { BravenApi } from \"./api.ts\";\nimport {\n CompareResults,\n CreateExperiment,\n GetExperiment,\n GetHardware,\n GetPipeline,\n GetReport,\n GetResult,\n ListExperiments,\n ListPipelines,\n ListProjects,\n ListProposals,\n ListRuns,\n PipelineStatus,\n ProposeParameter,\n Recompute,\n Rerun,\n RunPipeline,\n UpdateExperiment,\n WhoAmI,\n} from \"./tools.ts\";\n\n/**\n * The tools that work anywhere: reads, a proposal, and the three confirmed\n * runs. Dependencies are declared here exactly as the stdio server declares\n * them, so the same records serve the local and remote servers.\n *\n * The local tools are absent by design: pull/push need a checkout on the\n * caller's machine, and the watcher tools need an agent there.\n */\nexport const baseTools = [\n WhoAmI.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListProjects.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListExperiments.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n GetExperiment.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n CreateExperiment.addDependency(BravenApi).addDependency(\n HttpClient.HttpClient,\n ),\n UpdateExperiment.addDependency(BravenApi).addDependency(\n HttpClient.HttpClient,\n ),\n GetHardware.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n GetReport.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListPipelines.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n GetPipeline.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n PipelineStatus.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListRuns.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n GetResult.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ListProposals.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n CompareResults.addDependency(BravenApi).addDependency(HttpClient.HttpClient),\n ProposeParameter.addDependency(BravenApi).addDependency(\n HttpClient.HttpClient,\n ),\n RunPipeline.addDependency(BravenApi)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n Rerun.addDependency(BravenApi)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n Recompute.addDependency(BravenApi)\n .addDependency(HttpClient.HttpClient)\n .addDependency(McpSchema.McpServerClient),\n] as const;\n\nexport const BaseTools = Toolkit.make(...baseTools);\n", "import { Effect, Option } from \"effect\";\nimport type { Crypto } from \"effect/Crypto\";\nimport type { FileSystem } from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport type { Path as PathService } from \"effect/Path\";\nimport type { HttpClient as HttpClientService } from \"effect/http/HttpClient\";\nimport { decodePipelineIr } from \"@braven/pipeline-ir\";\nimport type { PythonCompiler } from \"@braven/pipeline-sync/compiler\";\nimport type * as McpSchema from \"effect/ai/McpSchema\";\nimport { Environment } from \"@braven/identity-store/environment\";\nimport {\n compileIr,\n makeClient,\n pull,\n readSource,\n readState,\n type SyncFailure,\n} from \"@braven/pipeline-sync\";\nimport { confirmAction } from \"./confirmation.ts\";\nimport { Credential } from \"./credential.ts\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** What `braven_pipeline_pull` accepts after schema decoding. */\nexport interface PullPipelineInput {\n readonly pipelineId: string;\n readonly workspacePath?: string | undefined;\n readonly apply?: boolean | undefined;\n}\n\nconst failure = (message: string, code = \"pull-failed\") =>\n new AgentToolError({ message, code });\n\n/**\n * Pull is preview-only unless `apply` is true, and applying always asks the\n * client's user. The workspace is confined to the MCP server's cwd; the source\n * is compiled and staged before `applyVerified` writes anything.\n */\nexport const pullPipeline = (input: PullPipelineInput) =>\n Effect.gen(function* () {\n const paths = yield* Path.Path;\n const environment = yield* Environment;\n const credential = yield* Credential;\n const workspace = paths.resolveWithin(\n environment.cwd,\n input.workspacePath ?? \".\",\n );\n if (Option.isNone(workspace)) {\n return yield* Effect.fail(\n failure(\n \"workspacePath must stay inside the MCP server's working directory\",\n \"workspace-outside-cwd\",\n ),\n );\n }\n const cwd = workspace.value;\n\n const state = yield* readState(cwd).pipe(\n Effect.mapError((error) => failure(error.message, \"no-sync-state\")),\n );\n if (Option.isNone(state)) {\n return yield* Effect.fail(\n failure(\n `${cwd} has no .braven/pipeline.json \u2014 run \\`braven pipeline pull\\` there first`,\n \"no-sync-state\",\n ),\n );\n }\n\n const local = yield* compileIr(state.value.source, { cwd }).pipe(\n Effect.flatMap(decodePipelineIr),\n Effect.mapError((error) =>\n failure(\n `the local source does not compile: ${error instanceof Error ? error.message : String(error)}`,\n \"compile-failed\",\n ),\n ),\n );\n const sourceText = yield* readSource(cwd, state.value.source).pipe(\n Effect.mapError((error) => failure(error.message, \"read-failed\")),\n );\n const api = makeClient({\n origin: credential.origin,\n secret: credential.secret,\n pipelineId: input.pipelineId,\n });\n\n if (input.apply === true) {\n yield* confirmAction(\n `Apply the remote proposals to ${state.value.source} in ${cwd}? The source is written only if every round-trip-safe proposal applies and recompiles.`,\n \"confirm\",\n );\n }\n\n const outcome = yield* pull({\n cwd,\n api,\n local,\n sourceText,\n check: input.apply !== true,\n }).pipe(\n Effect.mapError((error: SyncFailure) =>\n failure(error.message, `sync-${error.kind}`),\n ),\n );\n const proposals =\n \"proposals\" in outcome ? ` (${outcome.proposals.length} proposals)` : \"\";\n return {\n status: outcome.status,\n message: `pull ${outcome.status}${proposals}`,\n };\n }) satisfies Effect.Effect<\n { readonly status: string; readonly message: string },\n AgentToolError,\n | Crypto\n | FileSystem\n | PathService\n | HttpClientService\n | PythonCompiler\n | Credential\n | Environment\n | McpSchema.McpServerClient\n >;\n", "import { Effect, Option } from \"effect\";\nimport type { Crypto } from \"effect/Crypto\";\nimport type { FileSystem } from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport type { Path as PathService } from \"effect/Path\";\nimport type { HttpClient as HttpClientService } from \"effect/http/HttpClient\";\nimport { Environment } from \"@braven/identity-store/environment\";\nimport { decodePipelineIr } from \"@braven/pipeline-ir\";\nimport {\n compileIr,\n makeClient,\n push,\n readState,\n type SyncFailure,\n} from \"@braven/pipeline-sync\";\nimport type { PythonCompiler } from \"@braven/pipeline-sync/compiler\";\nimport type * as McpSchema from \"effect/ai/McpSchema\";\nimport { confirmAction } from \"./confirmation.ts\";\nimport { Credential } from \"./credential.ts\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** What `braven_pipeline_push` accepts after schema decoding. */\nexport interface PushPipelineInput {\n readonly pipelineId?: string | undefined;\n readonly workspacePath?: string | undefined;\n readonly baseRevisionId?: string | undefined;\n readonly summary?: string | undefined;\n readonly dryRun?: boolean | undefined;\n}\n\nconst failure = (message: string, code = \"push-failed\") =>\n new AgentToolError({ message, code });\n\n/**\n * Push is a dry run unless `dryRun` is false, and publishing always asks the\n * client's user. The workspace is confined to the MCP server's cwd; a stale\n * base is the sync engine's typed conflict, never a blind retry.\n */\nexport const pushPipeline = (input: PushPipelineInput) =>\n Effect.gen(function* () {\n const paths = yield* Path.Path;\n const environment = yield* Environment;\n const credential = yield* Credential;\n const workspace = paths.resolveWithin(\n environment.cwd,\n input.workspacePath ?? \".\",\n );\n if (Option.isNone(workspace)) {\n return yield* Effect.fail(\n failure(\n \"workspacePath must stay inside the MCP server's working directory\",\n \"workspace-outside-cwd\",\n ),\n );\n }\n const cwd = workspace.value;\n const state = yield* readState(cwd).pipe(\n Effect.mapError((error) => failure(error.message, \"no-sync-state\")),\n );\n if (Option.isNone(state)) {\n return yield* Effect.fail(\n failure(\n `${cwd} has no .braven/pipeline.json \u2014 run \\`braven pipeline pull\\` there first`,\n \"no-sync-state\",\n ),\n );\n }\n const pipelineId = input.pipelineId ?? state.value.pipelineId;\n const source = state.value.source;\n const dryRun = input.dryRun !== false;\n // Ask before compiling: a decline must cost the user nothing and reach no\n // part of the publish path.\n if (!dryRun) {\n yield* confirmAction(\n `Publish the local source ${source} in ${cwd} to pipeline ${pipelineId}? This creates a new immutable revision; a stale base is refused, not overwritten.`,\n \"confirm\",\n );\n }\n const local = yield* compileIr(source, { cwd }).pipe(\n Effect.flatMap(decodePipelineIr),\n Effect.mapError((error) =>\n failure(\n `the local source does not compile: ${error instanceof Error ? error.message : String(error)}`,\n \"compile-failed\",\n ),\n ),\n );\n const api = makeClient({\n origin: credential.origin,\n secret: credential.secret,\n pipelineId,\n });\n const baseRevisionId = Option.fromNullishOr(\n input.baseRevisionId ?? state.value.baseRevisionId,\n );\n const outcome = yield* push({\n cwd,\n api,\n local,\n identity: { origin: credential.origin, pipelineId, source },\n baseRevisionId,\n dryRun,\n summary: input.summary,\n }).pipe(\n Effect.mapError((error: SyncFailure) =>\n failure(error.message, `sync-${error.kind}`),\n ),\n );\n return {\n status: outcome.status,\n message: `push ${outcome.status}${outcome.status === \"published\" ? ` at revision ${outcome.revision.revisionId}` : \"\"}`,\n };\n }) satisfies Effect.Effect<\n { readonly status: string; readonly message: string },\n AgentToolError,\n | Crypto\n | FileSystem\n | PathService\n | HttpClientService\n | PythonCompiler\n | Credential\n | Environment\n | McpSchema.McpServerClient\n >;\n", "import { Context, Duration, Effect, Layer, Option, Schema } from \"effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as HttpClient from \"effect/http/HttpClient\";\nimport * as HttpClientRequest from \"effect/http/HttpClientRequest\";\nimport * as HttpClientResponse from \"effect/http/HttpClientResponse\";\nimport { configPath, Environment } from \"@braven/identity-store/environment\";\nimport { AgentToolError } from \"./errors.ts\";\n\n/** The file `braven-agent` writes for local consumers. */\nexport class WatcherDiscovery extends Schema.Class<WatcherDiscovery>(\n \"WatcherDiscovery\",\n)({\n version: Schema.String,\n pid: Schema.Int,\n port: Schema.Int,\n token: Schema.String,\n roots: Schema.Array(Schema.String),\n startedAt: Schema.String,\n}) {}\n\nexport interface WatcherStatus {\n readonly available: boolean;\n readonly version?: string;\n readonly pid?: number;\n readonly folders?: ReadonlyArray<string>;\n readonly pending?: number;\n readonly paused?: boolean;\n readonly startedAt?: string;\n}\n\nexport interface WatcherQueueItem {\n readonly id: number;\n readonly folder: string;\n readonly path: string;\n readonly size: number;\n readonly state: string;\n readonly attempts: number;\n readonly reason?: string;\n readonly updatedAt: string;\n}\n\nconst StatusResponse = Schema.Struct({\n available: Schema.Boolean,\n version: Schema.String,\n pid: Schema.Int,\n startedAt: Schema.String,\n folders: Schema.Array(Schema.String),\n pending: Schema.Int,\n paused: Schema.Boolean,\n});\n\nconst HealthResponse = Schema.Struct({\n ok: Schema.Boolean,\n name: Schema.String,\n version: Schema.String,\n pid: Schema.Int,\n});\n\nconst SyncResponse = Schema.Struct({\n reconciled: Schema.Struct({\n resumed: Schema.Int,\n stale: Schema.Int,\n missing: Schema.Int,\n superseded: Schema.Int,\n }),\n rescan: Schema.Struct({\n changed: Schema.Int,\n new: Schema.Int,\n unchanged: Schema.Int,\n skipped: Schema.Int,\n }),\n drained: Schema.Struct({\n uploaded: Schema.Int,\n failed: Schema.Int,\n repaired: Schema.Int,\n }),\n});\n\nconst RescanResponse = Schema.Struct({\n changed: Schema.Int,\n new: Schema.Int,\n unchanged: Schema.Int,\n skipped: Schema.Int,\n});\n\nconst OpenResponse = Schema.Struct({ opened: Schema.String });\n\nconst QueueResponse = Schema.Struct({\n items: Schema.Array(\n Schema.Struct({\n id: Schema.Int,\n folder: Schema.String,\n path: Schema.String,\n size: Schema.Int,\n state: Schema.String,\n attempts: Schema.Int,\n reason: Schema.optionalKey(Schema.String),\n updatedAt: Schema.String,\n }),\n ),\n});\n\nconst unavailable = () =>\n new AgentToolError({\n message:\n \"the Braven watcher is not running \u2014 start `braven-agent` (or `braven agent`) and try again\",\n code: \"watcher-unavailable\",\n });\n\nconst clientError = (message: string) =>\n new AgentToolError({ message, code: \"watcher-error\" });\n\nconst request = <A>(\n discovery: WatcherDiscovery,\n schema: Schema.ConstraintDecoder<A>,\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n): Effect.Effect<A, AgentToolError, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const base = `http://127.0.0.1:${discovery.port}`;\n const url = `${base}${path}`;\n const start =\n method === \"GET\"\n ? HttpClientRequest.get(url)\n : HttpClientRequest.post(url);\n const withBody =\n body === undefined\n ? start\n : HttpClientRequest.bodyJsonUnsafe(start, body);\n const built = HttpClientRequest.bearerToken(withBody, discovery.token);\n const outcome = yield* client.execute(built).pipe(\n Effect.timeoutOption(Duration.minutes(2)),\n Effect.mapError((error) =>\n clientError(`cannot reach the watcher: ${error.message}`),\n ),\n );\n if (Option.isNone(outcome)) {\n return yield* Effect.fail(\n clientError(\"the watcher did not answer within two minutes\"),\n );\n }\n const response = outcome.value;\n if (response.status < 200 || response.status >= 300) {\n return yield* Effect.fail(\n clientError(`the watcher answered ${response.status}`),\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(schema)(response).pipe(\n Effect.mapError((error) =>\n clientError(`cannot read the watcher's answer: ${error.message}`),\n ),\n );\n });\n\n/** The running agent's control client, or the absence of one. */\nexport class Watcher extends Context.Service<\n Watcher,\n {\n readonly status: Effect.Effect<\n WatcherStatus,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly queue: Effect.Effect<\n ReadonlyArray<WatcherQueueItem>,\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly sync: Effect.Effect<\n {\n readonly ok: boolean;\n readonly uploaded: number;\n readonly failed: number;\n readonly repaired: number;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly rescan: Effect.Effect<\n {\n readonly ok: boolean;\n readonly changed: number;\n readonly new: number;\n readonly skipped: number;\n },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly pause: Effect.Effect<\n { readonly ok: boolean; readonly paused: boolean },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly resume: Effect.Effect<\n { readonly ok: boolean; readonly paused: boolean },\n AgentToolError,\n HttpClient.HttpClient\n >;\n readonly open: (\n path: string,\n ) => Effect.Effect<\n { readonly ok: boolean; readonly opened: string },\n AgentToolError,\n HttpClient.HttpClient\n >;\n }\n>()(\"braven/Watcher\") {}\n\nconst withDiscovery = <A>(\n read: Effect.Effect<\n Option.Option<WatcherDiscovery>,\n never,\n HttpClient.HttpClient\n >,\n use: (\n discovery: WatcherDiscovery,\n ) => Effect.Effect<A, AgentToolError, HttpClient.HttpClient>,\n): Effect.Effect<A, AgentToolError, HttpClient.HttpClient> =>\n read.pipe(\n Effect.flatMap(\n Option.match({\n onNone: () => Effect.fail(unavailable()),\n onSome: use,\n }),\n ),\n );\n\nconst make = (\n read: Effect.Effect<\n Option.Option<WatcherDiscovery>,\n never,\n HttpClient.HttpClient\n >,\n): Watcher[\"Service\"] => ({\n status: read.pipe(\n Effect.flatMap(\n Option.match({\n onNone: () => Effect.succeed<WatcherStatus>({ available: false }),\n onSome: (value) =>\n request(value, StatusResponse, \"GET\", \"/status\").pipe(\n Effect.map((status) => ({\n available: true,\n version: status.version,\n pid: status.pid,\n folders: status.folders,\n pending: status.pending,\n paused: status.paused,\n startedAt: status.startedAt,\n })),\n ),\n }),\n ),\n ),\n queue: withDiscovery(read, (value) =>\n request(value, QueueResponse, \"GET\", \"/queue\").pipe(\n Effect.map((queue) =>\n queue.items.map((item) => ({\n id: item.id,\n folder: item.folder,\n path: item.path,\n size: item.size,\n state: item.state,\n attempts: item.attempts,\n reason: item.reason,\n updatedAt: item.updatedAt,\n })),\n ),\n ),\n ),\n sync: withDiscovery(read, (value) =>\n request(value, SyncResponse, \"POST\", \"/sync\").pipe(\n Effect.map((report) => ({\n ok: report.drained.failed === 0,\n uploaded: report.drained.uploaded,\n failed: report.drained.failed,\n repaired: report.drained.repaired,\n })),\n ),\n ),\n rescan: withDiscovery(read, (value) =>\n request(value, RescanResponse, \"POST\", \"/rescan\").pipe(\n Effect.map((report) => ({\n ok: true,\n changed: report.changed,\n new: report.new,\n skipped: report.skipped,\n })),\n ),\n ),\n pause: withDiscovery(read, (value) =>\n request(value, Schema.Unknown, \"POST\", \"/pause\").pipe(\n Effect.map(() => ({ ok: true, paused: true })),\n ),\n ),\n resume: withDiscovery(read, (value) =>\n request(value, Schema.Unknown, \"POST\", \"/resume\").pipe(\n Effect.map(() => ({ ok: true, paused: false })),\n ),\n ),\n open: (path) =>\n withDiscovery(read, (value) =>\n request(value, OpenResponse, \"POST\", \"/open\", { path }).pipe(\n Effect.map((answer) => ({ ok: true, opened: answer.opened })),\n ),\n ),\n});\n\nconst decodeDiscovery = Schema.decodeUnknownOption(\n Schema.fromJsonString(WatcherDiscovery),\n);\n\n/**\n * The agent's discovery file is read **per call**: starting `braven-agent`\n * after the MCP server works without a restart. A missing, malformed, or stale\n * file means \"no watcher\"; status reports absence, controls fail\n * `watcher-unavailable`.\n */\nexport const layer = Layer.effect(Watcher)(\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const environment = yield* Environment;\n const discoveryPath = path.join(\n path.dirname(configPath(environment)),\n \"runtime\",\n \"agent.json\",\n );\n const read = fs.readFileString(discoveryPath).pipe(\n Effect.map(decodeDiscovery),\n Effect.catch(() => Effect.succeed(Option.none())),\n Effect.flatMap((found) =>\n Option.match(found, {\n onNone: () => Effect.succeed(Option.none()),\n onSome: (discovery) =>\n Effect.try({\n try: () => {\n process.kill(discovery.pid, 0);\n return true;\n },\n catch: () => false,\n }).pipe(\n Effect.orElseSucceed(() => false),\n Effect.flatMap((alive) =>\n alive\n ? request(discovery, HealthResponse, \"GET\", \"/health\").pipe(\n Effect.map((health) =>\n health.name === \"braven-agent\" &&\n health.pid === discovery.pid\n ? Option.some(discovery)\n : Option.none(),\n ),\n Effect.catch(() => Effect.succeed(Option.none())),\n )\n : Effect.succeed(Option.none()),\n ),\n ),\n }),\n ),\n );\n return make(read);\n }),\n);\n", "import { Console, Duration, Effect, Option } from \"effect\";\nimport * as Bool from \"effect/Boolean\";\nimport * as Path from \"effect/Path\";\nimport {\n type Account,\n CliFailure,\n EXIT_FAILURE,\n EXIT_NOT_SIGNED_IN,\n EXIT_USAGE,\n Environment,\n StoreConfig,\n accountKey,\n fail,\n loadConfig,\n readDefault,\n removeCredential,\n resolveClientId,\n resolveCredential,\n resolveDefaults,\n resolveOrigin,\n resolveWebOrigin,\n setDefault,\n storeCredential,\n storedCredential,\n useAccount,\n} from \"@braven/identity-store\";\nimport {\n Sessions,\n rememberSession,\n signIn,\n type SignInFailure,\n} from \"@braven/identity-store/login\";\nimport { deviceLogin } from \"./auth.ts\";\nimport { ingest, resolveProject } from \"./files.ts\";\n\n/** API keys are minted by the api-key plugin with this prefix. */\nexport const API_KEY_PREFIX = \"bvn_api_\";\n\nconst dash = (value: Option.Option<string>): string =>\n Option.getOrElse(value, () => \"-\");\n\ninterface IdentityView {\n readonly origin: string;\n readonly email: Option.Option<string>;\n readonly kind: string;\n readonly label: Option.Option<string>;\n}\n\nconst identityLines = (header: string, identity: IdentityView): string =>\n [\n header,\n ` origin ${identity.origin}`,\n ` email ${dash(identity.email)}`,\n ` kind ${identity.kind}`,\n ` label ${dash(identity.label)}`,\n ].join(\"\\n\");\n\nconst printIdentity = (\n header: string,\n identity: IdentityView,\n): Effect.Effect<void> => Console.log(identityLines(header, identity));\n\nconst asIdentity = (account: Account) => ({\n ...account,\n email: Option.some(account.email),\n});\n\n/** The shared flow's typed failure, flattened to the CLI's one-line vocabulary. */\nconst asCliFailure = (failure: SignInFailure): CliFailure =>\n new CliFailure({ message: failure.message, exitCode: EXIT_FAILURE });\n\n/** Prints the identity the store just recorded; the secret never leaves it. */\nconst printSignedIn = Effect.fn(\"login.print\")(function* (account: Account) {\n yield* printIdentity(`signed in as ${account.email}`, asIdentity(account));\n});\n\n/**\n * The default sign-in: the shared `@braven/identity-store` loopback flow, then\n * the CLI's identity block. `--device` keeps its own grant below and shares\n * only the prove-and-store step.\n */\nexport const login = Effect.fn(\"login\")(function* (options: {\n readonly origin: string;\n readonly webOrigin: string;\n readonly timeout?: Duration.Input | undefined;\n}) {\n const account = yield* signIn(options).pipe(Effect.mapError(asCliFailure));\n yield* printSignedIn(account);\n});\n\n/** How the CLI takes its identity: the app's sign-in, a browser, or a key. */\nexport type LoginMethod = \"browser\" | \"watcher\" | \"api\";\n\n/**\n * The account the Braven app (and the agent it runs) already signed in for a\n * server. The app and the CLI share one store, so \"login with the watcher\" is\n * adopting that account \u2014 no second browser round-trip.\n */\nexport const watcherAccountFor = (\n accounts: ReadonlyArray<Account>,\n origin: string,\n): Option.Option<Account> =>\n Option.fromNullishOr(accounts.find((account) => account.origin === origin));\n\n/**\n * The account `--watcher` adopts: one for an explicit origin, else the store's\n * current account (the one the app is using), else the first stored one.\n */\nexport const watcherAccount = (\n store: {\n readonly current: Option.Option<string>;\n readonly accounts: ReadonlyArray<Account>;\n },\n origin: Option.Option<string>,\n): Option.Option<Account> =>\n Option.isSome(origin)\n ? watcherAccountFor(store.accounts, origin.value)\n : Option.orElse(\n Option.flatMap(store.current, (current) =>\n Option.fromNullishOr(\n store.accounts.find(\n (account) =>\n accountKey(account.origin, account.email) === current,\n ),\n ),\n ),\n () => Option.fromNullishOr(store.accounts[0]),\n );\n\n/**\n * Resolves the flag/env/default API origin for the login command and picks\n * the flow: the loopback handoff by default, better-auth's device grant with\n * `--device`, the running app's sign-in with `--watcher`, or a stored API key\n * with `--api`.\n */\nexport const loginCommand = (options: {\n readonly origin: Option.Option<string>;\n readonly webOrigin: Option.Option<string>;\n readonly device: boolean;\n readonly clientId: Option.Option<string>;\n readonly method?: LoginMethod;\n readonly apiKey?: Option.Option<string>;\n readonly email?: Option.Option<string>;\n}) =>\n Effect.gen(function* () {\n const environment = yield* Environment;\n const stored = (key: string) =>\n readDefault(key).pipe(Effect.orElseSucceed(() => Option.none<string>()));\n // Settings \u2192 Server (and the desktop) write both defaults; a CLI login on\n // the same machine must join that server, web login page included.\n const origin = resolveOrigin(\n options.origin,\n environment,\n yield* stored(\"origin\"),\n );\n const webOrigin = resolveWebOrigin(\n options.webOrigin,\n environment,\n yield* stored(\"webOrigin\"),\n );\n\n if ((options.method ?? \"browser\") === \"watcher\") {\n const config = yield* loadConfig();\n // No explicit --origin: the app's current account names the server, so\n // a dev sign-in is found even though the CLI's default is hosted.\n const account = watcherAccount(config, options.origin);\n if (Option.isNone(account))\n return yield* fail(\n `the watcher has no sign-in for ${origin} \u2014 sign in in the Braven app, or use \\`braven login --browser\\` / \\`--api\\``,\n EXIT_NOT_SIGNED_IN,\n );\n const value = account.value;\n yield* useAccount(value.email);\n yield* printIdentity(`using the watcher's sign-in for ${value.email}`, {\n origin: value.origin,\n email: Option.some(value.email),\n kind: value.kind,\n label: value.label,\n });\n return;\n }\n\n if ((options.method ?? \"browser\") === \"api\") {\n const key = Option.orElse(options.apiKey ?? Option.none(), () =>\n Option.fromNullishOr(environment.values[\"BRAVEN_API_KEY\"]),\n );\n if (Option.isNone(key))\n return yield* fail(\n \"--api needs a key: pass --key bvn_api_\u2026 or set BRAVEN_API_KEY\",\n EXIT_USAGE,\n );\n return yield* keyAdd({\n origin,\n key: key.value,\n email: options.email ?? Option.none(),\n label: Option.none(),\n });\n }\n\n yield* Bool.match(options.device, {\n onFalse: () => login({ origin, webOrigin }),\n onTrue: () =>\n Effect.flatMap(\n deviceLogin({\n origin,\n clientId: resolveClientId(options.clientId, environment),\n }),\n (token) =>\n rememberSession(origin, token).pipe(\n Effect.mapError(asCliFailure),\n Effect.flatMap(printSignedIn),\n ),\n ),\n });\n });\n\n/**\n * Pushes one local file through `files.ingest` (plan 015).\n *\n * `path` defaults to the file's basename \u2014 the name the server keys the\n * Experiment and File on; `--override` replaces that path instead of adding a\n * sibling or a duplicate. The credential never leaves the Authorization\n * header.\n */\nexport const push = Effect.fn(\"push\")(function* (options: {\n readonly file: string;\n readonly override: boolean;\n readonly path: Option.Option<string>;\n readonly projectId: Option.Option<string>;\n}) {\n const credential = yield* resolveCredential({\n origin: Option.none(),\n email: Option.none(),\n });\n if (Option.isNone(credential)) {\n return yield* fail(\n \"not signed in \u2014 run `braven login`, or set BRAVEN_API_KEY\",\n EXIT_NOT_SIGNED_IN,\n );\n }\n const value = credential.value;\n const paths = yield* Path.Path;\n const path = Option.getOrElse(options.path, () =>\n paths.basename(options.file),\n );\n const projectId = yield* resolveProject({\n origin: value.origin,\n secret: value.secret,\n flag: options.projectId,\n });\n const result = yield* ingest({\n origin: value.origin,\n secret: value.secret,\n projectId,\n path,\n override: options.override,\n file: options.file,\n });\n yield* Console.log(\n `pushed ${path} \u2014 ${result.filename} in experiment ${result.experiment_id}`,\n );\n});\n\n/** Prints the identity this machine would authenticate as \u2014 never the secret. */\nexport const whoami = Effect.fn(\"whoami\")(function* () {\n const credential = yield* resolveCredential({\n origin: Option.none(),\n email: Option.none(),\n });\n if (Option.isNone(credential)) {\n return yield* fail(\n \"not signed in \u2014 run `braven login`, or set BRAVEN_API_KEY\",\n EXIT_NOT_SIGNED_IN,\n );\n }\n const value = credential.value;\n const header = Option.match(value.email, {\n onNone: () => \"signed in from the environment\",\n onSome: (email) => `signed in as ${email}`,\n });\n yield* printIdentity(header, value);\n});\n\n/** Stores a long-lived API key, asking the API for its owner when `--email` is absent. */\nexport const keyAdd = Effect.fn(\"keyAdd\")(function* (options: {\n readonly origin: string;\n readonly key: string;\n readonly email: Option.Option<string>;\n readonly label: Option.Option<string>;\n}) {\n if (!options.key.startsWith(API_KEY_PREFIX)) {\n return yield* fail(\n `that is not an API key: keys start with ${API_KEY_PREFIX} (copy one from Settings \u2192 API keys)`,\n EXIT_USAGE,\n );\n }\n const owner = Option.isSome(options.email)\n ? options.email.value\n : yield* Effect.flatMap(Sessions, (sessions) =>\n sessions.emailFor(options.origin, options.key),\n ).pipe(\n Effect.mapError(\n (failure) =>\n new CliFailure({\n message: `cannot tell which account this key belongs to (${failure.message}) \u2014 pass --email to store it without asking`,\n exitCode: EXIT_USAGE,\n }),\n ),\n );\n const account = yield* storeCredential(\n {\n origin: options.origin,\n email: owner,\n kind: \"apiKey\",\n secret: options.key,\n },\n options.label,\n );\n yield* printIdentity(\n `stored the API key for ${account.email}`,\n asIdentity(account),\n );\n});\n\n/** Prints the stored accounts, the current one, and the resolved defaults. */\nexport const configShow = Effect.fn(\"configShow\")(function* () {\n const { path } = yield* StoreConfig;\n const config = yield* loadConfig();\n const { company, project } = yield* resolveDefaults();\n const lines = [\n `config ${path}`,\n `current ${Option.getOrElse(config.current, () => \"(none)\")}`,\n `company ${Option.getOrElse(company, () => \"(unset)\")}`,\n `project ${Option.getOrElse(project, () => \"(unset)\")}`,\n `accounts (${config.accounts.length})`,\n ...config.accounts.map(\n (account) =>\n ` ${accountKey(account.origin, account.email)} ${account.kind}` +\n Option.match(account.label, {\n onNone: () => \"\",\n onSome: (label) => ` (${label})`,\n }),\n ),\n ];\n yield* Console.log(lines.join(\"\\n\"));\n});\n\n/** Writes one default \u2014 `company` or `project`; the parser restricts `name`. */\nexport const configSet = Effect.fn(\"configSet\")(function* (options: {\n readonly name: \"company\" | \"project\";\n readonly value: string;\n}) {\n yield* setDefault(options.name, Option.some(options.value));\n yield* Console.log(`${options.name} ${options.value}`);\n});\n\n/** Points `current` at a stored account, whatever origin it lives on. */\nexport const configUse = Effect.fn(\"configUse\")(function* (email: string) {\n const account = yield* useAccount(email);\n yield* Console.log(`current ${accountKey(account.origin, account.email)}`);\n});\n\n/** Forgets an account (default: the current one), stored secret included. */\nexport const logout = Effect.fn(\"logout\")(function* (\n email: Option.Option<string>,\n) {\n // Read the secret before forgetting it: a stored session is revoked\n // server-side, so the token cannot be replayed after `logout`. The store is\n // read directly rather than through `resolveCredential`, so an environment\n // token can never be the one this revokes.\n const stored = yield* storedCredential({ origin: Option.none(), email });\n const removed = yield* removeCredential(email);\n if (Option.isNone(removed)) {\n return yield* fail(\n Option.match(email, {\n onNone: () => \"not signed in \u2014 nothing to forget\",\n onSome: (value) => `no stored account for ${value}`,\n }),\n EXIT_NOT_SIGNED_IN,\n );\n }\n const account = removed.value;\n if (Option.isSome(stored) && stored.value.kind === \"session\") {\n const sessions = yield* Sessions;\n yield* sessions.revoke(stored.value.origin, stored.value.secret).pipe(\n // The local account is already gone; a failure to reach the API is\n // reported, not fatal, because retrying is no longer possible.\n Effect.catchTag(\"CliFailure\", (failure) =>\n Console.error(\n `warning: ${failure.message} \u2014 the session stays valid until it expires`,\n ),\n ),\n );\n }\n yield* Console.log(\n `removed ${account.email} (${account.kind}) from ${account.origin}`,\n );\n});\n", "/**\n * The loopback browser sign-in every surface shares.\n *\n * The flow is one handshake: bind `127.0.0.1:0`, open\n * `{webOrigin}/cli-login?port=<port>` in the system browser, receive the session\n * token on `GET /?token=\u2026`, prove the token against the API, and store it in\n * the file-backed identity store. The CLI and the watcher call the same\n * `signIn`, so a credential has exactly one way in.\n *\n * The listener is owned by `signIn`'s scope: it closes on success, on timeout,\n * on a browser failure, and on cancellation. No step logs the token.\n */\nimport open from \"open\";\nimport { createServer } from \"node:http\";\nimport { NodeHttpServer } from \"@effect/platform-node\";\nimport {\n Console,\n Context,\n Deferred,\n Duration,\n Effect,\n Layer,\n Option,\n Predicate,\n Schema,\n} from \"effect\";\nimport {\n HttpClient,\n HttpClientRequest,\n HttpClientResponse,\n HttpRouter,\n HttpServer,\n HttpServerRequest,\n HttpServerResponse,\n} from \"effect/http\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as NetAddress from \"effect/net/NetAddress\";\nimport * as Path from \"effect/Path\";\nimport * as Str from \"effect/String\";\nimport { CliFailure, EXIT_FAILURE, fail, oneLine } from \"./errors.ts\";\nimport {\n Secrets,\n StoreConfig,\n storeCredential,\n type Account,\n} from \"./identity.ts\";\n\nexport type { Account } from \"./identity.ts\";\n\n/** How long a person has to finish signing in in the browser. */\nexport const LOGIN_TIMEOUT = Duration.minutes(5);\n\n/**\n * Why a browser sign-in did not produce a credential. The CLI flattens this to\n * `CliFailure`; the watcher branches on `reason` to show its own next step.\n */\nexport const SignInReason = Schema.Literals([\n \"timeout\",\n \"listener\",\n \"browser\",\n \"rejected\",\n \"storage\",\n]);\n\nexport type SignInReason = typeof SignInReason.Type;\n\n/** A typed sign-in failure: the listener, the browser, the API or the store. */\nexport class SignInFailure extends Schema.TaggedError<SignInFailure>()(\n \"SignInFailure\",\n { reason: SignInReason, message: Schema.String },\n) {}\n\n/** Opens the system browser; injected so tests never launch a real one. */\nexport class Browser extends Context.Service<\n Browser,\n { readonly open: (url: string) => Effect.Effect<void, CliFailure> }\n>()(\"braven/Browser\") {}\n\n/** The system browser for `braven login` and the watcher's Sign in. */\nexport const browserLayer: Layer.Layer<Browser> = Layer.succeed(Browser)({\n open: (url) =>\n Effect.tryPromise({\n try: () => open(url),\n catch: (cause) =>\n new CliFailure({\n message: `cannot open a browser for ${url}: ${oneLine(cause)}`,\n exitCode: EXIT_FAILURE,\n }),\n }).pipe(Effect.asVoid),\n});\n\n/** The better-auth session lookup: token in, the API's own email out. */\nexport class Sessions extends Context.Service<\n Sessions,\n {\n readonly emailFor: (\n origin: string,\n token: string,\n ) => Effect.Effect<string, CliFailure>;\n /** Revoke a session server-side so a forgotten token cannot be replayed. */\n readonly revoke: (\n origin: string,\n token: string,\n ) => Effect.Effect<void, CliFailure>;\n }\n>()(\"braven/Sessions\") {}\n\nconst SessionUser = class SessionUser extends Schema.Class<SessionUser>(\n \"SessionUser\",\n)({ email: Schema.NonEmptyString }) {};\n\nconst SessionBody = class SessionBody extends Schema.Class<SessionBody>(\n \"SessionBody\",\n)({ user: SessionUser }) {};\n\nconst lookupFailure = (origin: string, cause: { readonly message: string }) =>\n new CliFailure({\n message: `cannot read a session from ${origin}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\n/**\n * Asks `GET /api/auth/get-session` who a bearer token belongs to.\n *\n * A non-200, a non-JSON body, or a body without `user.email` fails loudly \u2014\n * `login` stores nothing unless this proves the owner.\n */\nexport const lookupEmail = (\n origin: string,\n token: string,\n): Effect.Effect<string, CliFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const response = yield* client\n .get(`${origin}/api/auth/get-session`, {\n headers: { authorization: `Bearer ${token}` },\n })\n .pipe(Effect.mapError((cause) => lookupFailure(origin, cause)));\n if (response.status !== 200) {\n const detail = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* fail(\n `the API rejected that sign-in (${response.status})${detail ? `: ${oneLine(detail)}` : \"\"} \u2014 run \\`braven login\\` again`,\n );\n }\n const body = yield* HttpClientResponse.schemaBodyJson(SessionBody)(\n response,\n ).pipe(Effect.mapError((cause) => lookupFailure(origin, cause)));\n return body.user.email;\n });\n\n/** Revokes a session (`POST /api/auth/sign-out`). A 200 or a 401 both mean the\n * token is dead \u2014 already-gone is not a failure. */\nexport const revokeSession = (\n origin: string,\n token: string,\n): Effect.Effect<void, CliFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const response = yield* client\n .execute(\n HttpClientRequest.post(`${origin}/api/auth/sign-out`).pipe(\n HttpClientRequest.bearerToken(token),\n HttpClientRequest.bodyJsonUnsafe({}),\n ),\n )\n .pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `cannot reach ${origin} to sign out: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n if (response.status === 200 || response.status === 401) return;\n const detail = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* fail(\n `the API refused the sign-out (${response.status})${detail ? `: ${oneLine(detail)}` : \"\"}`,\n );\n });\n\n/** Live sessions over the platform HTTP client. */\nexport const sessionsLayer: Layer.Layer<\n Sessions,\n never,\n HttpClient.HttpClient\n> = Layer.effect(Sessions)(\n Effect.map(HttpClient.HttpClient, (client) => ({\n emailFor: (origin, token) =>\n lookupEmail(origin, token).pipe(\n Effect.provideService(HttpClient.HttpClient, client),\n ),\n revoke: (origin, token) =>\n revokeSession(origin, token).pipe(\n Effect.provideService(HttpClient.HttpClient, client),\n ),\n })),\n);\n\n/** A loopback token, and the port it arrived on. */\nexport interface LoopbackToken {\n readonly token: string;\n readonly port: number;\n}\n\nconst tokenOf = (\n params: Readonly<Record<string, string | ReadonlyArray<string>>>,\n): Option.Option<string> =>\n Option.fromNullishOr(params[\"token\"]).pipe(\n Option.flatMap((value) =>\n Predicate.isString(value) ? Option.some(value) : Option.none(),\n ),\n Option.filter(Str.isNonEmpty),\n );\n\nconst tokenRoute = (tokens: Deferred.Deferred<string>) =>\n HttpRouter.add(\n \"GET\",\n \"/\",\n Effect.gen(function* () {\n const params = yield* HttpServerRequest.ParsedSearchParams;\n return yield* Option.match(tokenOf(params), {\n onNone: () =>\n Effect.succeed(\n HttpServerResponse.text(\"Missing token.\", { status: 400 }),\n ),\n onSome: (token) =>\n Effect.gen(function* () {\n yield* Deferred.succeed(tokens, token);\n return HttpServerResponse.html(\n \"<h1>Authenticated. You can close this window.</h1>\",\n );\n }),\n });\n }),\n );\n\nconst listenerFailure = (message: string): SignInFailure =>\n new SignInFailure({ reason: \"listener\", message });\n\nconst portOf = (\n address: NetAddress.SocketAddress,\n): Effect.Effect<number, SignInFailure> =>\n NetAddress.isInetAddress(address)\n ? Effect.succeed(address.port)\n : Effect.fail(\n listenerFailure(\"the login listener did not bind a TCP port\"),\n );\n\n/** Where `signIn` reports the URL it opened, before it waits for the token. */\nexport type LoginUrlListener = (url: string) => Effect.Effect<void>;\n\nconst openingLines = (url: string): string =>\n `Opening ${url}\\nIf your browser did not open, visit that URL to finish signing in.`;\n\n/**\n * Binds `127.0.0.1:0`, opens `{webOrigin}/cli-login?port=<port>`, and waits for\n * the browser to hand the session token back to `GET /?token=\u2026`.\n *\n * `onLoginUrl` receives the URL once it is known; the CLI omits it and gets the\n * two printed lines, the watcher passes its own progress sink. The listener is\n * owned by the returned effect's scope: it closes on success, on the\n * five-minute timeout, on a browser failure, and on interruption.\n */\nexport const awaitToken = (options: {\n readonly webOrigin: string;\n readonly timeout?: Duration.Input | undefined;\n readonly onLoginUrl?: LoginUrlListener | undefined;\n}): Effect.Effect<LoopbackToken, SignInFailure, Browser> =>\n Effect.gen(function* () {\n const tokens = yield* Deferred.make<string>();\n const app = HttpRouter.serve(\n Layer.mergeAll(\n tokenRoute(tokens),\n HttpRouter.add(\n \"*\",\n \"*\",\n HttpServerResponse.text(\"Missing token.\", { status: 400 }),\n ),\n ),\n {\n disableLogger: true,\n disableListenLog: true,\n },\n ).pipe(\n Layer.provideMerge(\n NodeHttpServer.layer(createServer, { host: \"127.0.0.1\", port: 0 }),\n ),\n );\n return yield* Effect.gen(function* () {\n const server = yield* HttpServer.HttpServer;\n const port = yield* portOf(server.address);\n const browser = yield* Browser;\n const loginUrl = `${options.webOrigin}/cli-login?port=${port}`;\n // Print it as well as opening it: `open` can fail silently on a headless\n // machine or a locked-down desktop, and then the URL is the only way in.\n yield* Option.match(Option.fromNullishOr(options.onLoginUrl), {\n onNone: () => Console.log(openingLines(loginUrl)),\n onSome: (report) => report(loginUrl),\n });\n yield* browser.open(loginUrl).pipe(\n Effect.mapError(\n (failure) =>\n new SignInFailure({\n reason: \"browser\",\n message: failure.message,\n }),\n ),\n );\n return { token: yield* Deferred.await(tokens), port };\n }).pipe(\n Effect.timeoutOrElse({\n duration: options.timeout ?? LOGIN_TIMEOUT,\n orElse: () =>\n Effect.fail(\n new SignInFailure({\n reason: \"timeout\",\n message:\n \"timed out waiting for the browser sign-in (5 minutes) \u2014 run `braven login` again\",\n }),\n ),\n }),\n Effect.provide(app),\n Effect.catchTag(\"ServeError\", (cause) =>\n Effect.fail(\n listenerFailure(\n `cannot start the login listener: ${oneLine(cause.message)}`,\n ),\n ),\n ),\n );\n });\n\nconst asSignInFailure =\n (reason: \"rejected\" | \"storage\") =>\n (failure: { readonly message: string }): SignInFailure =>\n new SignInFailure({ reason, message: failure.message });\n\n/**\n * Proves a session token's owner and stores it, without printing anything.\n *\n * Nothing is written until `GET /api/auth/get-session` confirms the token\n * belongs to an email; a rejection or an unreachable API leaves the store\n * untouched.\n */\nexport const rememberSession = (\n origin: string,\n token: string,\n): Effect.Effect<\n Account,\n SignInFailure,\n Sessions | StoreConfig | Secrets | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const sessions = yield* Sessions;\n const email = yield* sessions\n .emailFor(origin, token)\n .pipe(Effect.mapError(asSignInFailure(\"rejected\")));\n return yield* storeCredential({\n origin,\n email,\n kind: \"session\",\n secret: token,\n }).pipe(Effect.mapError(asSignInFailure(\"storage\")));\n });\n\n/**\n * The whole browser sign-in: loopback handshake, prove the token, store it.\n *\n * Returns the stored account (never the secret). Callers own presentation:\n * the CLI prints the identity, the watcher reconnects its sync session.\n */\nexport const signIn = (options: {\n readonly origin: string;\n readonly webOrigin: string;\n readonly timeout?: Duration.Input | undefined;\n readonly onLoginUrl?: LoginUrlListener | undefined;\n}): Effect.Effect<\n Account,\n SignInFailure,\n Browser | Sessions | StoreConfig | Secrets | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function* () {\n const { token } = yield* awaitToken(options);\n return yield* rememberSession(options.origin, token);\n });\n", "import {\n Cause,\n Console,\n Duration,\n Effect,\n Match,\n Option,\n Ref,\n Schedule,\n} from \"effect\";\nimport { HttpClient, HttpClientRequest, HttpClientResponse } from \"effect/http\";\nimport * as Schema from \"effect/Schema\";\nimport * as Tuple from \"effect/Tuple\";\nimport {\n CliFailure,\n EXIT_FAILURE,\n fail,\n oneLine,\n} from \"@braven/identity-store\";\nimport { Browser } from \"@braven/identity-store/login\";\n\n/**\n * The browser sign-in lives in `@braven/identity-store/login` so the watcher\n * shares its one implementation; this module keeps the CLI's device-grant flow\n * and re-exports the shared pieces for the CLI's existing imports.\n */\nexport {\n awaitToken,\n browserLayer,\n LOGIN_TIMEOUT,\n lookupEmail,\n rememberSession,\n Sessions,\n sessionsLayer,\n signIn,\n SignInFailure,\n SignInReason,\n type LoopbackToken,\n} from \"@braven/identity-store/login\";\nexport { Browser };\n\n/** RFC 8628's device-code grant type; better-auth rejects anything else. */\nexport const DEVICE_GRANT_TYPE = \"urn:ietf:params:oauth:grant-type:device_code\";\n\n/** The scopes a device sign-in asks for; the grant only needs a session. */\nexport const DEVICE_SCOPE = \"openid profile email\";\n\n/** RFC 8628 defaults when the server omits `expires_in` / `interval`. */\nconst DEVICE_CODE_LIFETIME = Duration.minutes(30);\nconst DEVICE_POLL_INTERVAL = Duration.seconds(5);\n\n/** RFC 8628 \u00A73.5: every `slow_down` adds five seconds to the interval. */\nconst DEVICE_SLOW_DOWN = Duration.seconds(5);\n\n/**\n * The device grant both endpoints live at, under better-auth's base path \u2014\n * the same `/api/auth` the loopback flow proves its token against.\n */\nconst deviceUrl = (origin: string, endpoint: \"code\" | \"token\"): string =>\n `${origin}/api/auth/device/${endpoint}`;\n\n/** What `POST /device/code` answers: the codes, where to type them, and when. */\nexport class DeviceCode extends Schema.Class<DeviceCode>(\"DeviceCode\")({\n device_code: Schema.NonEmptyString,\n user_code: Schema.NonEmptyString,\n verification_uri: Schema.NonEmptyString,\n verification_uri_complete: Schema.OptionFromOptionalKey(Schema.String),\n expires_in: Schema.Int.pipe(\n Schema.withConstructorDefault(\n Effect.succeed(Duration.toSeconds(DEVICE_CODE_LIFETIME)),\n ),\n Schema.withDecodingDefaultKey(\n Effect.succeed(Duration.toSeconds(DEVICE_CODE_LIFETIME)),\n ),\n ),\n interval: Schema.Int.pipe(\n Schema.withConstructorDefault(\n Effect.succeed(Duration.toSeconds(DEVICE_POLL_INTERVAL)),\n ),\n Schema.withDecodingDefaultKey(\n Effect.succeed(Duration.toSeconds(DEVICE_POLL_INTERVAL)),\n ),\n ),\n}) {}\n\n/**\n * What `POST /device/token` answers: a session token, or one RFC 8628 error.\n * better-auth returns the error fields with a 400, so both live in one shape.\n */\nexport class DeviceToken extends Schema.Class<DeviceToken>(\"DeviceToken\")({\n access_token: Schema.OptionFromOptionalKey(Schema.String),\n error: Schema.OptionFromOptionalKey(Schema.String),\n error_description: Schema.OptionFromOptionalKey(Schema.String),\n}) {}\n\n/** One poll's verdict: the session token, or why polling must continue/stop. */\ntype DevicePoll =\n | { readonly _tag: \"Granted\"; readonly token: string }\n | { readonly _tag: \"Pending\" }\n | { readonly _tag: \"SlowDown\" }\n | { readonly _tag: \"Refused\"; readonly failure: CliFailure };\n\nconst retryLine = \"run `braven login --device` again\";\n\nconst deviceExpiredFailure = (): CliFailure =>\n new CliFailure({\n message: `the device code expired before it was approved \u2014 ${retryLine}`,\n exitCode: EXIT_FAILURE,\n });\n\nconst transportFailure = (\n origin: string,\n cause: { readonly message: string },\n): CliFailure =>\n new CliFailure({\n message: `cannot reach the sign-in API at ${origin}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\nconst detailOf = (description: Option.Option<string>): string =>\n Option.match(description, {\n onNone: () => \"\",\n onSome: (value) => `: ${oneLine(value)}`,\n });\n\n/** One actionable line per RFC 8628 terminal error. Never the device code. */\nconst refusalFor = (\n error: string,\n description: Option.Option<string>,\n): CliFailure =>\n Match.value(error).pipe(\n Match.when(\"expired_token\", deviceExpiredFailure),\n Match.when(\n \"access_denied\",\n () =>\n new CliFailure({\n message: `the sign-in was denied in the browser \u2014 ${retryLine}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n Match.when(\n \"invalid_grant\",\n () =>\n new CliFailure({\n message: `the device code is no longer valid \u2014 ${retryLine}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n Match.orElse(\n (other) =>\n new CliFailure({\n message: `the device sign-in failed (${other})${detailOf(description)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n\nconst refusal = (cause: CliFailure): DevicePoll => ({\n _tag: \"Refused\",\n failure: cause,\n});\n\n/** Decodes one token answer into the next poll verdict. */\nconst verdictOf = (body: DeviceToken): Effect.Effect<DevicePoll, CliFailure> =>\n Option.match(body.access_token, {\n onSome: (token) => Effect.succeed<DevicePoll>({ _tag: \"Granted\", token }),\n onNone: () =>\n Match.value(Option.getOrElse(body.error, () => \"unknown_error\")).pipe(\n Match.when(\"authorization_pending\", () =>\n Effect.succeed<DevicePoll>({ _tag: \"Pending\" }),\n ),\n Match.when(\"slow_down\", () =>\n Effect.succeed<DevicePoll>({ _tag: \"SlowDown\" }),\n ),\n Match.orElse((error) =>\n Effect.fail(refusalFor(error, body.error_description)),\n ),\n ),\n });\n\n/**\n * `POST /device/code`: what to show the person, where they approve it, and how\n * long the code lives.\n */\nexport const requestDeviceCode = (\n origin: string,\n clientId: string,\n): Effect.Effect<DeviceCode, CliFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const request = yield* HttpClientRequest.post(\n deviceUrl(origin, \"code\"),\n ).pipe(\n HttpClientRequest.bodyJson({\n client_id: clientId,\n scope: DEVICE_SCOPE,\n }),\n Effect.mapError((cause) => transportFailure(origin, cause)),\n );\n const response = yield* client\n .execute(request)\n .pipe(Effect.mapError((cause) => transportFailure(origin, cause)));\n if (response.status !== 200) {\n const detail = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* fail(\n `the sign-in API refused a device code (${response.status})${detail ? `: ${oneLine(detail)}` : \"\"} \u2014 ${retryLine}`,\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(DeviceCode)(response).pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `cannot read a device code from ${origin}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n });\n\n/** One `POST /device/token`; every answer is a verdict, never a thrown error. */\nconst pollDeviceToken = (\n origin: string,\n clientId: string,\n deviceCode: string,\n): Effect.Effect<DevicePoll, never, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const response = yield* client\n .execute(\n HttpClientRequest.post(deviceUrl(origin, \"token\")).pipe(\n // better-auth's `/device/token` reads JSON only; a form body is 415.\n HttpClientRequest.bodyJsonUnsafe({\n grant_type: DEVICE_GRANT_TYPE,\n device_code: deviceCode,\n client_id: clientId,\n }),\n ),\n )\n .pipe(Effect.mapError((cause) => transportFailure(origin, cause)));\n const body = yield* HttpClientResponse.schemaBodyJson(DeviceToken)(\n response,\n ).pipe(\n Effect.mapError(\n () =>\n new CliFailure({\n message: `the sign-in API at ${origin} returned an unreadable device-token answer`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n return yield* verdictOf(body);\n }).pipe(\n // The poll's contract is a verdict, never a failure: a transport or decode\n // error stops the schedule as `Refused` and surfaces one line later.\n Effect.catch((cause) => Effect.succeed(refusal(cause))),\n );\n\n/**\n * The poll cadence: `interval` seconds, plus five more after every\n * `slow_down`. Grant and refusal stop the schedule; pending keeps it going.\n * Exported so the cadence is provable without a clock.\n */\nexport const devicePollSchedule = (\n start: Duration.Duration,\n): Schedule.Schedule<DevicePoll, DevicePoll> =>\n Schedule.fromStepWithMetadata(\n Effect.map(\n Ref.make(start),\n (interval) => (metadata: Schedule.InputMetadata<DevicePoll>) =>\n Match.value(metadata.input).pipe(\n Match.tag(\"Granted\", () => Cause.done(metadata.input)),\n Match.tag(\"Refused\", () => Cause.done(metadata.input)),\n Match.tag(\"Pending\", () =>\n Ref.get(interval).pipe(\n Effect.map((delay) => Tuple.make(metadata.input, delay)),\n ),\n ),\n Match.tag(\"SlowDown\", () =>\n Ref.updateAndGet(interval, (delay) =>\n Duration.millis(\n Duration.toMillis(delay) + Duration.toMillis(DEVICE_SLOW_DOWN),\n ),\n ).pipe(Effect.map((delay) => Tuple.make(metadata.input, delay))),\n ),\n Match.exhaustive,\n ),\n ),\n );\n\n/**\n * Signs in through better-auth's device authorization grant.\n *\n * Prints and opens the verification URL, polls `/device/token` on the\n * server's interval (adding five seconds per `slow_down`), and returns the\n * session token once approved. The wait is bounded by the code's `expires_in`\n * (30 minutes when the server omits it); expiry, denial and an invalid code\n * each fail with one actionable line.\n */\nexport const deviceLogin = (options: {\n readonly origin: string;\n readonly clientId: string;\n readonly timeout?: Duration.Input | undefined;\n}): Effect.Effect<string, CliFailure, Browser | HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const code = yield* requestDeviceCode(options.origin, options.clientId);\n const verification = Option.getOrElse(\n code.verification_uri_complete,\n () => code.verification_uri,\n );\n // Print as well as open: a headless machine has no browser to open with.\n yield* Console.log(\n `Sign in at ${verification}\\nand confirm the code ${code.user_code} in the browser.`,\n );\n const browser = yield* Browser;\n yield* browser.open(verification);\n const interval = Duration.seconds(code.interval);\n const poll = pollDeviceToken(\n options.origin,\n options.clientId,\n code.device_code,\n );\n // RFC 8628 \u00A73.5: wait `interval` before the first poll, then let the\n // schedule pace every later one \u2014 delaying each repetition would double it.\n const untilFirstPoll = yield* Ref.make(true);\n const outcome = yield* Effect.suspend(() =>\n Effect.flatMap(Ref.getAndSet(untilFirstPoll, false), (isFirst) =>\n isFirst ? Effect.delay(poll, interval) : poll,\n ),\n ).pipe(\n Effect.repeat(devicePollSchedule(interval)),\n Effect.timeoutOrElse({\n duration: options.timeout ?? Duration.seconds(code.expires_in),\n orElse: () => Effect.fail(deviceExpiredFailure()),\n }),\n );\n return yield* Match.value(outcome).pipe(\n Match.tag(\"Granted\", (granted) => Effect.succeed(granted.token)),\n Match.tag(\"Refused\", (refused) => Effect.fail(refused.failure)),\n Match.orElse(() => Effect.fail(deviceExpiredFailure())),\n );\n });\n", "import { Effect, Option } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport { HttpClient, HttpClientRequest, HttpClientResponse } from \"effect/http\";\nimport * as Path from \"effect/Path\";\nimport * as Schema from \"effect/Schema\";\nimport {\n CliFailure,\n EXIT_FAILURE,\n EXIT_USAGE,\n Environment,\n StoreConfig,\n fail,\n oneLine,\n resolveDefaults,\n resolveProjectFlag,\n} from \"@braven/identity-store\";\n\n/** One file pushed through `POST {origin}/rpc/files/ingest`. */\nexport interface IngestOptions {\n readonly origin: string;\n readonly secret: string;\n readonly projectId: string;\n readonly path: string;\n readonly override: boolean;\n readonly file: string;\n}\n\n/** A project row as `GET /projects` spells it. */\nclass Project extends Schema.Class<Project>(\"Project\")({\n id: Schema.NonEmptyString,\n name: Schema.String,\n company_name: Schema.String,\n}) {}\n\n/** The file a successful `files.ingest` records. */\nexport class IngestedFile extends Schema.Class<IngestedFile>(\"IngestedFile\")({\n id: Schema.NonEmptyString,\n experiment_id: Schema.NonEmptyString,\n filename: Schema.NonEmptyString,\n}) {}\n\nclass ErrorJson extends Schema.Class<ErrorJson>(\"ErrorJson\")({\n message: Schema.String,\n}) {}\n\n/** oRPC's error envelope; anything else is surfaced verbatim. */\nclass ErrorBody extends Schema.Class<ErrorBody>(\"ErrorBody\")({\n json: ErrorJson,\n}) {}\n\nconst errorMessage = Schema.decodeUnknownOption(\n Schema.fromJsonString(ErrorBody),\n);\n\nconst requestFailure =\n (action: string, target: string) =>\n (cause: { readonly message: string }): CliFailure =>\n new CliFailure({\n message: `${action} ${target}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\nconst statusDetail = (text: string): string =>\n Option.match(errorMessage(text), {\n onNone: () => text,\n onSome: (body) => body.json.message,\n });\n\nconst statusFailure = (\n action: string,\n status: number,\n body: string,\n): CliFailure =>\n new CliFailure({\n message:\n `${action} failed (${status})${body ? `: ${oneLine(statusDetail(body))}` : \"\"}` +\n (status === 401 || status === 403\n ? \" \u2014 run `braven login`, or check `--project-id`\"\n : \"\"),\n exitCode: EXIT_FAILURE,\n });\n\nconst fetchProjects = (\n origin: string,\n secret: string,\n): Effect.Effect<ReadonlyArray<Project>, CliFailure, HttpClient.HttpClient> =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const response = yield* client\n .get(`${origin}/projects`, {\n headers: { authorization: `Bearer ${secret}` },\n })\n .pipe(Effect.mapError(requestFailure(\"cannot list projects at\", origin)));\n if (response.status !== 200) {\n const body = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* Effect.fail(\n statusFailure(\"listing projects\", response.status, body),\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(Schema.Array(Project))(\n response,\n ).pipe(\n Effect.mapError(requestFailure(\"cannot read projects from\", origin)),\n );\n });\n\n/**\n * The project to ingest into, in the CLI's usual precedence: `--project-id`,\n * `$BRAVEN_PROJECT_ID`, then the stored `defaults.project` resolved to an id\n * through `GET /projects` (narrowed by `defaults.company` when both are set).\n */\nexport const resolveProject = (options: {\n readonly origin: string;\n readonly secret: string;\n readonly flag: Option.Option<string>;\n}): Effect.Effect<\n string,\n CliFailure,\n Environment | FileSystem.FileSystem | HttpClient.HttpClient | StoreConfig\n> =>\n Effect.gen(function* () {\n const environment = yield* Environment;\n const flagged = resolveProjectFlag(options.flag, environment);\n if (Option.isSome(flagged)) return flagged.value;\n const defaults = yield* resolveDefaults();\n if (Option.isNone(defaults.project)) {\n return yield* fail(\n \"no project \u2014 pass --project-id, set BRAVEN_PROJECT_ID, or run `braven config set project <name>`\",\n EXIT_USAGE,\n );\n }\n const name = defaults.project.value;\n const projects = yield* fetchProjects(options.origin, options.secret);\n const matches = Arr.filter(\n projects,\n (project) =>\n project.name === name &&\n Option.match(defaults.company, {\n onNone: () => true,\n onSome: (company) => project.company_name === company,\n }),\n );\n return yield* Arr.match(matches, {\n onEmpty: () =>\n fail(\n `no project named \"${name}\" on ${options.origin} \u2014 pass --project-id`,\n EXIT_USAGE,\n ),\n onNonEmpty: (found) =>\n found.length > 1\n ? fail(\n `more than one project is named \"${name}\" \u2014 pass --project-id`,\n EXIT_USAGE,\n )\n : Effect.succeed(found[0].id),\n });\n });\n\n/** The ingest request's multipart body: `path` and `override` as fields and the\n * bytes as `file` \u2014 the same shape `POST /files` and the Python SDK send. */\nconst multipart = (\n options: IngestOptions,\n name: string,\n bytes: Uint8Array,\n): FormData => {\n const form = new FormData();\n form.append(\"file\", new File([Uint8Array.from(bytes)], name));\n form.append(\"path\", options.path);\n form.append(\"override\", options.override ? \"true\" : \"false\");\n return form;\n};\n\n/**\n * Uploads one local file through the `files.ingest` procedure. The bytes ride\n * the request as multipart; the project rides `X-Project-Id`, the credential\n * `Authorization: Bearer` \u2014 the procedure's two headers.\n */\nexport const ingest = (\n options: IngestOptions,\n): Effect.Effect<\n IngestedFile,\n CliFailure,\n FileSystem.FileSystem | HttpClient.HttpClient | Path.Path\n> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const paths = yield* Path.Path;\n const bytes = yield* fs\n .readFile(options.file)\n .pipe(Effect.mapError(requestFailure(\"cannot read\", options.file)));\n const name = paths.basename(options.file);\n const body = multipart(options, name, bytes);\n const client = yield* HttpClient.HttpClient;\n const request = HttpClientRequest.post(\n `${options.origin}/files/ingest`,\n ).pipe(\n HttpClientRequest.bearerToken(options.secret),\n HttpClientRequest.setHeader(\"x-project-id\", options.projectId),\n HttpClientRequest.bodyFormData(body),\n );\n const response = yield* client\n .execute(request)\n .pipe(Effect.mapError(requestFailure(\"cannot reach\", options.origin)));\n if (response.status < 200 || response.status >= 300) {\n const text = yield* response.text.pipe(Effect.orElseSucceed(() => \"\"));\n return yield* Effect.fail(\n statusFailure(\"files.ingest\", response.status, text),\n );\n }\n return yield* HttpClientResponse.schemaBodyJson(IngestedFile)(\n response,\n ).pipe(\n Effect.mapError(\n requestFailure(\n \"cannot read files.ingest's answer from\",\n options.origin,\n ),\n ),\n );\n });\n", "/**\n * `braven pipeline` \u2014 a thin Node boundary over the Python authoring compiler,\n * plus the sync commands (plan 069). The compiler service and the sync engine\n * live in `@braven/pipeline-sync`; this module only builds the command tree and\n * the CLI renders outcomes and exit codes.\n */\nimport { Argument, Command, Flag } from \"effect/cli\";\nimport { Effect } from \"effect\";\nimport { withSource } from \"@braven/pipeline-sync/compiler\";\nimport {\n applyCommand,\n diffCommand,\n pullCommand,\n pushCommand,\n rejectCommand,\n statusCommand,\n} from \"./pipeline/commands.ts\";\nimport { compareCommand, recomputeCommand } from \"./pipeline/results.ts\";\n\nexport * from \"@braven/pipeline-sync/compiler\";\n\nconst compileCommand = Command.make(\n \"compile\",\n {\n source: Argument.String(\"source\").pipe(\n Argument.withMetavar(\"path\"),\n Argument.withDescription(\"the Python pipeline file to compile\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"write the canonical IR to stdout\"),\n ),\n check: Flag.Boolean(\"check\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"compile without a success summary (CI)\"),\n ),\n },\n Effect.fn(function* ({ source, json, check }) {\n yield* withSource(\"compile\", source, [\n ...(json ? [\"--json\"] : []),\n ...(check ? [\"--check\"] : []),\n ]);\n }),\n).pipe(\n Command.withDescription(\n \"compile a Python pipeline to canonical IR (exit 2 on validation errors)\",\n ),\n);\n\nconst validateCommand = Command.make(\n \"validate\",\n {\n source: Argument.String(\"source\").pipe(\n Argument.withMetavar(\"file|-\"),\n Argument.withDescription(\n \"a Python pipeline, an IR JSON file, or - for stdin\",\n ),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the validity summary as JSON\"),\n ),\n check: Flag.Boolean(\"check\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"validate without printing ok\"),\n ),\n },\n Effect.fn(function* ({ source, json, check }) {\n yield* withSource(\n \"validate\",\n source,\n [...(json ? [\"--json\"] : []), ...(check ? [\"--check\"] : [])],\n source === \"-\" ? { stdin: \"inherit\" } : undefined,\n );\n }),\n).pipe(Command.withDescription(\"validate a pipeline source or an IR document\"));\n\n/** The `braven pipeline` group. */\nexport const pipelineCommand = Command.make(\"pipeline\").pipe(\n Command.withDescription(\n \"compile, validate, diff and synchronize a pipeline definition\",\n ),\n Command.withSubcommands([\n compileCommand,\n validateCommand,\n statusCommand,\n diffCommand,\n pushCommand,\n pullCommand,\n applyCommand,\n rejectCommand,\n recomputeCommand,\n compareCommand,\n ]),\n);\n", "/**\n * The `braven pipeline` commands that touch sync (plan 069).\n *\n * Each handler compiles through the one compiler boundary, calls the protocol\n * in `sync.ts` and renders the typed outcome. Exit codes follow the plan:\n * `0` success/no-op, `2` conflict or refused apply, `3` usage/config,\n * `4` network/auth. A printed report is never repeated as a `braven:` line.\n */\nimport { Argument, Command, Flag } from \"effect/cli\";\nimport { Console, Effect, Option, Schema } from \"effect\";\nimport { HttpClient } from \"effect/http\";\nimport * as Arr from \"effect/Array\";\nimport {\n CliFailure,\n Environment,\n fail,\n resolveCredential,\n} from \"@braven/identity-store\";\nimport { canonicalJson, decodePipelineIr, irHashOf } from \"@braven/pipeline-ir\";\nimport {\n IrConflict,\n PipelineDiff,\n PipelineExit,\n PipelineSyncState,\n PatchChange,\n PatchRefusal,\n applyVerified,\n compileIr,\n diffIr,\n makeClient,\n pull,\n push,\n readSource,\n readState,\n stableText,\n type PipelineApi,\n type ProposalSummary,\n type PullOutcome,\n type RevisionHead,\n} from \"@braven/pipeline-sync\";\n\n/** Plan 069's exit codes: conflict/refused, usage/config, network/auth. */\nconst EXIT_CONFLICT = 2;\nconst EXIT_USAGE = 3;\nconst EXIT_NETWORK = 4;\n\n/** Compiles the source and decodes the compiler's bytes. */\nconst compileLocal = (cwd: string, source: string) =>\n compileIr(source, { cwd }).pipe(\n Effect.flatMap(decodePipelineIr),\n Effect.mapError((error) =>\n error instanceof PipelineExit\n ? error\n : new PipelineExit({\n code: 2,\n message: `the compiler returned an unreadable IR: ${error.message}`,\n }),\n ),\n );\n\n/** The process working directory, for the sibling result commands. */\nexport const currentDirectory = Environment.pipe(\n Effect.map((shape) => shape.cwd),\n);\n\n/** Reads `.braven/pipeline.json`, or fails 3 when the checkout has no base. */\nexport const loadState = (cwd: string) =>\n Effect.gen(function* () {\n const state = yield* readState(cwd);\n if (Option.isNone(state))\n return yield* fail(\n \"no .braven/pipeline.json \u2014 this checkout has no pipeline to sync\",\n EXIT_USAGE,\n );\n return state.value;\n }).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(\n new CliFailure({\n message: `${error.path}: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n ),\n );\n\n/** The API client for the state's pipeline, using this machine's credential. */\nexport const apiFor = (state: PipelineSyncState) =>\n Effect.gen(function* () {\n const credential = yield* resolveCredential({\n origin: Option.some(state.origin),\n email: Option.none(),\n }).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({ message: error.message, exitCode: EXIT_NETWORK }),\n ),\n );\n if (Option.isNone(credential))\n return yield* fail(\n `not signed in to ${state.origin} \u2014 run \\`braven login\\``,\n EXIT_NETWORK,\n );\n return makeClient({\n origin: state.origin,\n secret: credential.value.secret,\n pipelineId: state.pipelineId,\n });\n });\n\n/** JSON output goes through the Schema codec, never `JSON.stringify`. */\nexport const printJson = (value: unknown) =>\n Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown))(value).pipe(\n Effect.orDie,\n Effect.flatMap((text) => Console.log(text)),\n );\n\n/** The wire shape of a report class; `printJson` does the final encoding. */\nconst encoded = <S extends Schema.ConstraintEncoder<unknown, never>>(\n schema: S,\n value: S[\"Type\"],\n): unknown => Schema.encodeSync(schema)(value);\n\nconst show = (value: Schema.Json): string =>\n typeof value === \"string\"\n ? value\n : typeof value === \"number\" || typeof value === \"boolean\"\n ? String(value)\n : value === null\n ? \"null\"\n : stableText(value);\n\nconst printConflicts = (\n conflicts: ReadonlyArray<IrConflict>,\n): Effect.Effect<void> =>\n Console.log(\n Arr.join(\n conflicts.map((conflict) =>\n [\n `conflict ${conflict.path} (${conflict.kind})`,\n ` base ${show(conflict.base)}`,\n ` local ${show(conflict.local)}`,\n ` remote ${show(conflict.remote)}`,\n ` ${conflict.hint}`,\n ].join(\"\\n\"),\n ),\n \"\\n\",\n ),\n );\n\nconst conflictReport = (conflicts: ReadonlyArray<IrConflict>) => ({\n status: \"conflict\",\n conflicts: conflicts.map((conflict) => encoded(IrConflict, conflict)),\n});\n\nconst headJson = (head: RevisionHead) => ({\n revisionId: head.revisionId,\n number: head.number,\n contentHash: head.contentHash,\n});\n\n/** Prints a local summary; with a state file it also names base and head. */\nexport const statusCommand = Command.make(\n \"status\",\n {\n source: Argument.String(\"source\").pipe(\n Argument.optional,\n Argument.withMetavar(\"path\"),\n Argument.withDescription(\n \"the pipeline source (default: the state's source, else ./pipeline.py)\",\n ),\n ),\n },\n Effect.fn(function* ({ source }) {\n const cwd = yield* currentDirectory;\n const state = yield* readState(cwd).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(\n new CliFailure({\n message: `${error.path}: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n ),\n );\n const resolved = Option.getOrElse(source, () =>\n Option.match(state, {\n onNone: () => \"pipeline.py\",\n onSome: (value) => value.source,\n }),\n );\n const ir = yield* compileLocal(cwd, resolved);\n const localHash = yield* irHashOf(ir).pipe(Effect.orDie);\n yield* Console.log(\n [\n `pipeline ${ir.pipeline.name}`,\n `source ${ir.runtime.entry}`,\n `steps ${ir.steps.length}`,\n `edges ${ir.edges.length}`,\n `irHash ${localHash}`,\n ].join(\"\\n\"),\n );\n\n if (Option.isNone(state)) {\n yield* Console.log(\n \"state untracked \u2014 run `braven pipeline pull` or push a new pipeline\",\n );\n return;\n }\n const current = state.value;\n const api = yield* apiFor(current);\n const head = yield* api.head().pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n const relation = Option.match(head, {\n onNone: () => \"unpublished\",\n onSome: (value) =>\n localHash === value.contentHash\n ? \"at head\"\n : current.baseRevisionId === value.revisionId\n ? localHash === current.baseContentHash\n ? \"behind\"\n : \"ahead\"\n : localHash === current.baseContentHash\n ? \"behind\"\n : \"diverged\",\n });\n yield* Console.log(\n [\n `base ${current.baseRevisionId} ${current.baseContentHash}`,\n `head ${Option.match(head, {\n onNone: () => \"none\",\n onSome: (value) => `${value.revisionId} ${value.contentHash}`,\n })}`,\n `local ${localHash === current.baseContentHash ? \"clean\" : \"dirty\"}`,\n `sync ${relation}`,\n ].join(\"\\n\"),\n );\n }),\n).pipe(\n Command.withDescription(\"print the local hash, base, head and dirty flag\"),\n);\n\nconst resolveRevision = (\n api: PipelineApi,\n revision: string,\n): Effect.Effect<string, CliFailure, HttpClient.HttpClient> =>\n revision === \"HEAD\"\n ? api.head().pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n Effect.flatMap((head) =>\n Option.isNone(head)\n ? fail(\"this pipeline has no published revision\", EXIT_USAGE)\n : Effect.succeed(head.value.revisionId),\n ),\n )\n : Effect.succeed(revision);\n\nconst renderDiff = (diff: PipelineDiff): string => {\n const lines: Array<string> = [];\n const stepLines = [\n ...diff.steps.added.map((step) => ` + ${step.id} (${step.name})`),\n ...diff.steps.removed.map((step) => ` - ${step.id} (${step.name})`),\n ...diff.steps.renamed.map(\n (step) =>\n ` ~ ${step.from.id} (${step.from.name}) -> ${step.to.id} (${step.to.name})`,\n ),\n ];\n const edgeLines = [\n ...diff.edges.added.map((edge) => ` + ${edge.from} -> ${edge.to}`),\n ...diff.edges.removed.map((edge) => ` - ${edge.from} -> ${edge.to}`),\n ];\n const portLines = diff.ports.map(\n (port) =>\n ` ${port.step}.${port.side}.${port.port} ${port.field}: ${show(port.from)} -> ${show(port.to)}`,\n );\n const paramLines = diff.params.map(\n (param) =>\n ` ${param.step}.${param.name} ${param.field}: ${show(param.from)} -> ${show(param.to)}`,\n );\n const runtimeLines = diff.runtime.map(\n (field) => ` ${field.field}: ${show(field.from)} -> ${show(field.to)}`,\n );\n const metadataLines = diff.metadata.map(\n (field) => ` ${field.field}: ${show(field.from)} -> ${show(field.to)}`,\n );\n const sections: ReadonlyArray<readonly [string, ReadonlyArray<string>]> = [\n [\"steps\", stepLines],\n [\"ports\", portLines],\n [\"params\", paramLines],\n [\"edges\", edgeLines],\n [\"runtime\", runtimeLines],\n [\"metadata\", metadataLines],\n ];\n sections.forEach(([name, section]) => {\n if (section.length > 0) lines.push(name, ...section);\n });\n return lines.length === 0 ? \"no changes\" : lines.join(\"\\n\");\n};\n\nexport const diffCommand = Command.make(\n \"diff\",\n {\n from: Flag.String(\"from\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the base revision (default: the sync state's base)\",\n ),\n ),\n to: Flag.String(\"to\").pipe(\n Flag.withDefault(\"HEAD\"),\n Flag.withDescription(\"the revision to compare against (default: HEAD)\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the report as JSON\"),\n ),\n },\n Effect.fn(function* ({ from, to, json: asJson }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const fromId = yield* Option.match(from, {\n onNone: () => Effect.succeed(state.baseRevisionId),\n onSome: (value) => resolveRevision(api, value),\n });\n const toId = yield* resolveRevision(api, to);\n if (fromId === toId) {\n yield* asJson\n ? printJson({ from: fromId, to: toId, diff: null })\n : Console.log(`no changes (${fromId})`);\n return;\n }\n const fetch = (revisionId: string) =>\n Effect.gen(function* () {\n const document = yield* api.revision(revisionId).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n return yield* decodePipelineIr(document.ir).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `revision ${revisionId} is unreadable: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n );\n });\n const [before, after] = yield* Effect.all([fetch(fromId), fetch(toId)], {\n concurrency: 2,\n });\n const diff = diffIr(before, after);\n if (asJson) {\n yield* printJson({\n from: fromId,\n to: toId,\n diff: encoded(PipelineDiff, diff),\n });\n return;\n }\n yield* Console.log(renderDiff(diff));\n }),\n).pipe(Command.withDescription(\"diff two revisions, section by section\"));\n\nconst renderPull = (outcome: PullOutcome): string => {\n if (outcome.status === \"up-to-date\")\n return `already at head ${outcome.head.revisionId} (revision ${outcome.head.number})`;\n if (outcome.status === \"fast-forward\")\n return `the definition advanced to revision ${outcome.head.number}; source is unchanged`;\n if (outcome.status === \"local-ahead\")\n return `local changes are not published; base advanced to revision ${outcome.head.number}`;\n if (outcome.status === \"applied\")\n return [\n `applied ${outcome.changes.length} edit(s) for ${outcome.proposals.length} proposal(s)`,\n ...outcome.changes.map(\n (change) => ` ${change.path}: ${change.before} -> ${change.after}`,\n ),\n ].join(\"\\n\");\n if (outcome.status === \"check\")\n return [\n outcome.changes.length === 0\n ? \"nothing to apply\"\n : `would apply ${outcome.changes.length} edit(s) for ${outcome.proposals.length} proposal(s)`,\n ...outcome.changes.map(\n (change) => ` ${change.path}: ${change.before} -> ${change.after}`,\n ),\n ].join(\"\\n\");\n if (outcome.status === \"remote-ahead\")\n return \"the published definition has changes this source does not contain; reconcile them in the source, then push\";\n if (outcome.status === \"conflict\") return \"conflict\";\n return \"refused\";\n};\n\nexport const pullCommand = Command.make(\n \"pull\",\n {\n apply: Flag.Boolean(\"apply\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"write round-trip-safe proposals to the source (the default)\",\n ),\n ),\n check: Flag.Boolean(\"check\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"compute everything, write nothing (CI)\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the report as JSON\"),\n ),\n },\n Effect.fn(function* ({ apply, check, json: asJson }) {\n if (apply && check)\n return yield* fail(\n \"--apply and --check are mutually exclusive\",\n EXIT_USAGE,\n );\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const sourceText = yield* readSource(cwd, state.source);\n const local = yield* compileLocal(cwd, state.source);\n const outcome = yield* pull({ cwd, api, local, sourceText, check });\n\n if (asJson) {\n if (outcome.status === \"conflict\")\n yield* printJson(conflictReport(outcome.conflicts));\n if (outcome.status === \"refused\")\n yield* printJson({\n status: \"refused\",\n refusals: outcome.refusals.map((refusal) =>\n encoded(PatchRefusal, refusal),\n ),\n });\n if (outcome.status === \"applied\" || outcome.status === \"check\")\n yield* printJson({\n status: outcome.status,\n head: headJson(outcome.head),\n proposals: outcome.proposals,\n changes: outcome.changes.map((change) =>\n encoded(PatchChange, change),\n ),\n });\n if (\n outcome.status === \"up-to-date\" ||\n outcome.status === \"fast-forward\" ||\n outcome.status === \"local-ahead\" ||\n outcome.status === \"remote-ahead\"\n )\n yield* printJson({\n status: outcome.status,\n head: headJson(outcome.head),\n });\n } else {\n yield* Console.log(renderPull(outcome));\n if (outcome.status === \"conflict\")\n yield* printConflicts(outcome.conflicts);\n if (outcome.status === \"refused\")\n yield* Console.log(\n outcome.refusals\n .map(\n (refusal) =>\n `refused ${refusal.op} at ${refusal.path} (${refusal.reason}): ${refusal.detail}`,\n )\n .join(\"\\n\"),\n );\n }\n\n if (\n outcome.status === \"conflict\" ||\n outcome.status === \"refused\" ||\n outcome.status === \"remote-ahead\"\n )\n return yield* fail(\"\", EXIT_CONFLICT);\n }),\n).pipe(\n Command.withDescription(\"fetch the head and apply round-trip-safe proposals\"),\n);\n\nexport const pushCommand = Command.make(\n \"push\",\n {\n base: Flag.String(\"base\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"merge from this revision instead of the state's base\",\n ),\n ),\n pipelineId: Flag.String(\"pipeline-id\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the pipeline to publish into (first push, without a state file)\",\n ),\n ),\n source: Flag.String(\"source\").pipe(\n Flag.optional,\n Flag.withDescription(\n \"the Python source (first push; default: ./pipeline.py)\",\n ),\n ),\n dryRun: Flag.Boolean(\"dry-run\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\n \"compute the merge and print what would be published\",\n ),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the report as JSON\"),\n ),\n },\n Effect.fn(function* ({ base, pipelineId, source, dryRun, json: asJson }) {\n const cwd = yield* currentDirectory;\n const state = yield* readState(cwd).pipe(\n Effect.catchTag(\"PipelineStateError\", (error) =>\n Effect.fail(\n new CliFailure({\n message: `${error.path}: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n ),\n );\n const credential = yield* resolveCredential({\n origin: Option.map(state, (value) => value.origin),\n email: Option.none(),\n }).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({ message: error.message, exitCode: EXIT_NETWORK }),\n ),\n );\n if (Option.isNone(credential))\n return yield* fail(\"not signed in \u2014 run `braven login`\", EXIT_NETWORK);\n\n const resolvedPipelineId = Option.orElse(pipelineId, () =>\n Option.map(state, (value) => value.pipelineId),\n );\n if (Option.isNone(resolvedPipelineId))\n return yield* fail(\n \"no pipeline to push to \u2014 pass --pipeline-id for the first push, or run `braven pipeline pull`\",\n EXIT_USAGE,\n );\n const resolvedSource = Option.getOrElse(\n Option.orElse(source, () => Option.map(state, (value) => value.source)),\n () => \"pipeline.py\",\n );\n const origin = Option.match(state, {\n onNone: () => credential.value.origin,\n onSome: (value) => value.origin,\n });\n const api = makeClient({\n origin,\n secret: credential.value.secret,\n pipelineId: resolvedPipelineId.value,\n });\n const local = yield* compileLocal(cwd, resolvedSource);\n const baseRevisionId = Option.orElse(base, () =>\n Option.map(state, (value) => value.baseRevisionId),\n );\n const outcome = yield* push({\n cwd,\n api,\n local,\n identity: {\n origin,\n pipelineId: resolvedPipelineId.value,\n source: resolvedSource,\n },\n baseRevisionId,\n dryRun,\n });\n\n if (asJson) {\n if (outcome.status === \"published\")\n yield* printJson({\n status: outcome.status,\n merged: outcome.merged,\n revision: {\n revisionId: outcome.revision.revisionId,\n number: outcome.revision.number,\n contentHash: outcome.revision.contentHash,\n },\n });\n if (outcome.status === \"conflict\")\n yield* printJson(conflictReport(outcome.conflicts));\n if (outcome.status === \"dry-run\")\n yield* printJson({\n status: outcome.status,\n merged: outcome.merged,\n irHash: yield* irHashOf(outcome.ir).pipe(Effect.orDie),\n ir: canonicalJson(outcome.ir),\n });\n if (\n outcome.status === \"up-to-date\" ||\n outcome.status === \"remote-has-changes\"\n )\n yield* printJson({\n status: outcome.status,\n head: headJson(outcome.head),\n });\n } else {\n if (outcome.status === \"published\")\n yield* Console.log(\n outcome.merged\n ? `published revision ${outcome.revision.number} (merged, ${outcome.revision.contentHash})`\n : `published revision ${outcome.revision.number} (${outcome.revision.contentHash})`,\n );\n if (outcome.status === \"up-to-date\")\n yield* Console.log(\n `already at head ${outcome.head.revisionId} (revision ${outcome.head.number})`,\n );\n if (outcome.status === \"remote-has-changes\")\n yield* Console.log(\n `the remote definition already contains your changes (revision ${outcome.head.number}); nothing published`,\n );\n if (outcome.status === \"dry-run\")\n yield* Console.log(\n `would publish ${yield* irHashOf(outcome.ir).pipe(Effect.orDie)}${outcome.merged ? \" (merged)\" : \"\"}`,\n );\n if (outcome.status === \"conflict\") {\n yield* printConflicts(outcome.conflicts);\n if (outcome.conflicts.length === 0)\n yield* Console.log(\n \"the head moved again while publishing; nothing was published \u2014 re-run push\",\n );\n }\n }\n\n if (outcome.status === \"conflict\") return yield* fail(\"\", EXIT_CONFLICT);\n }),\n).pipe(\n Command.withDescription(\"publish the local definition, merging divergence\"),\n);\n\nconst findProposal = (api: PipelineApi, proposalId: string) =>\n Effect.gen(function* () {\n const proposals = yield* api.proposals({}).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n const found = proposals.find(\n (proposal: ProposalSummary) => proposal.id === proposalId,\n );\n if (found === undefined)\n return yield* fail(\n `no proposal ${proposalId} on this pipeline`,\n EXIT_USAGE,\n );\n return found;\n });\n\nexport const applyCommand = Command.make(\n \"apply\",\n {\n proposalId: Argument.String(\"proposal-id\").pipe(\n Argument.withMetavar(\"id\"),\n Argument.withDescription(\"the proposal to apply to the source\"),\n ),\n },\n Effect.fn(function* ({ proposalId }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const proposal = yield* findProposal(api, proposalId);\n if (proposal.status !== \"open\")\n return yield* fail(\n `proposal ${proposalId} is ${proposal.status}, not open`,\n EXIT_USAGE,\n );\n const local = yield* compileLocal(cwd, state.source);\n const sourceText = yield* readSource(cwd, state.source);\n const baseDocument = yield* api.revision(proposal.baseRevisionId).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n const base = yield* decodePipelineIr(baseDocument.ir).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `the proposal's base revision is unreadable: ${error.message}`,\n exitCode: EXIT_USAGE,\n }),\n ),\n );\n const result = yield* applyVerified({\n cwd,\n source: state.source,\n sourceText,\n local,\n base,\n ops: proposal.patch,\n write: true,\n });\n if (result.status === \"refused\") {\n yield* Console.log(\n result.refusals\n .map(\n (refusal) =>\n `refused ${refusal.op} at ${refusal.path} (${refusal.reason}): ${refusal.detail}`,\n )\n .join(\"\\n\"),\n );\n return yield* fail(\"\", EXIT_CONFLICT);\n }\n yield* Console.log(\n [\n `applied proposal ${proposalId}`,\n ...result.changes.map(\n (change) => ` ${change.path}: ${change.before} -> ${change.after}`,\n ),\n \"the source is edited but not published; review it, then run `braven pipeline push`\",\n ].join(\"\\n\"),\n );\n }),\n).pipe(\n Command.withDescription(\n \"apply one proposal to the source (safe constructs only)\",\n ),\n);\n\nexport const rejectCommand = Command.make(\n \"reject\",\n {\n proposalId: Argument.String(\"proposal-id\").pipe(\n Argument.withMetavar(\"id\"),\n Argument.withDescription(\"the proposal to decline\"),\n ),\n },\n Effect.fn(function* ({ proposalId }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n yield* api.reject(proposalId).pipe(\n Effect.mapError(\n (error) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: EXIT_NETWORK,\n }),\n ),\n );\n yield* Console.log(`rejected ${proposalId}`);\n }),\n).pipe(Command.withDescription(\"decline a proposal on the server\"));\n", "/**\n * `braven pipeline recompute` and `braven pipeline compare` (plan 072).\n *\n * The engine and the API client live in `@braven/pipeline-sync`; this module\n * only renders the typed outcome and chooses the exit code. A comparison's axis\n * is printed before any delta \u2014 a reader must never see \"the number moved\"\n * without knowing whether the evidence moved too.\n */\nimport { Argument, Command, Flag } from \"effect/cli\";\nimport { Console, Effect, Match, Option, Schema } from \"effect\";\nimport * as Arr from \"effect/Array\";\nimport { CliFailure } from \"@braven/identity-store\";\nimport type {\n AnalysisResultRef,\n Comparison,\n ComparisonAxis,\n PipelineApiError,\n} from \"@braven/pipeline-sync\";\nimport { apiFor, currentDirectory, loadState, printJson } from \"./commands.ts\";\n\n/** 0 ok, 2 refused, 3 usage/unknown id, 4 network or server fault. */\nconst exitFor = (error: PipelineApiError): number =>\n Option.match(error.status, {\n onNone: () => 4,\n onSome: (status) => (status === 409 ? 2 : status < 500 ? 3 : 4),\n });\n\nconst apiFailure = (error: PipelineApiError) =>\n new CliFailure({\n message: `${error.procedure}: ${error.message}`,\n exitCode: exitFor(error),\n });\n\n/** `--param threshold=0.05` \u2192 `0.05`; `true`/`false` stay booleans, everything\n * else is a string. The server validates the kind against the revision. */\nconst scalar = (text: string): string | number | boolean =>\n Match.value(text).pipe(\n Match.when(\"true\", () => true),\n Match.when(\"false\", () => false),\n Match.orElse((value) =>\n Option.getOrElse(\n Schema.decodeUnknownOption(Schema.FiniteFromString)(value),\n () => value,\n ),\n ),\n );\n\nconst parametersOf = (\n supplied: Option.Option<Record<string, string>>,\n): Record<string, string | number | boolean> =>\n Option.match(supplied, {\n onNone: () => ({}),\n onSome: (values) =>\n Object.fromEntries(\n Object.entries(values).map(([key, value]) => [key, scalar(value)]),\n ),\n });\n\nconst axisLabel = (axis: ComparisonAxis): string =>\n Match.value(axis).pipe(\n Match.when(\n \"identical\",\n () => \"identical method, evidence and configuration\",\n ),\n Match.when(\n \"configuration\",\n () => \"same evidence \u00B7 same method \u00B7 different configuration\",\n ),\n Match.when(\"method\", () => \"same evidence \u00B7 different method\"),\n Match.when(\"evidence\", () => \"same method \u00B7 different evidence\"),\n Match.when(\"both\", () => \"different method \u00B7 different evidence\"),\n Match.exhaustive,\n );\n\n/** Hashes are long; the two-column report has one narrow field per side. */\nconst short = (hash: string | null): string =>\n hash === null ? \"\u2014\" : hash.slice(0, 14);\n\nconst at = (time: Date): string =>\n time.toISOString().slice(0, 16).replace(\"T\", \" \");\n\nconst row = (label: string, left: string, right: string): string =>\n `${label.padEnd(14)}${left.padEnd(34)}${right}`;\n\nconst renderComparison = (comparison: Comparison): string => {\n const outputLines = Arr.map(\n comparison.outputs,\n (output) =>\n ` ${output.name.padEnd(20)}${short(output.left?.content_hash ?? null)} \u2192 ${short(output.right?.content_hash ?? null)}${output.changed ? \" (changed)\" : \" (unchanged)\"}`,\n );\n const metricLines = Arr.map(\n comparison.metrics,\n (metric) =>\n ` ${metric.key.padEnd(20)}${String(metric.left)} \u2192 ${String(metric.right)}${\n metric.delta === null\n ? \"\"\n : ` (${metric.delta >= 0 ? \"+\" : \"\"}${metric.delta.toFixed(2)})`\n }`,\n );\n return [\n axisLabel(comparison.axis),\n \"\",\n row(\"\", \"left\", \"right\"),\n row(\n \"revision\",\n short(comparison.left.revision_hash),\n short(comparison.right.revision_hash),\n ),\n row(\n \"evidence\",\n short(comparison.left.input_snapshot_hash),\n short(comparison.right.input_snapshot_hash),\n ),\n row(\n \"configuration\",\n short(comparison.left.parameters_hash),\n short(comparison.right.parameters_hash),\n ),\n row(\n \"completed\",\n at(comparison.left.created_at),\n at(comparison.right.created_at),\n ),\n \"\",\n \"outputs\",\n ...(outputLines.length === 0 ? [\" (none)\"] : outputLines),\n \"\",\n \"kpis\",\n ...(metricLines.length === 0 ? [\" (no shared metrics)\"] : metricLines),\n \"\",\n \"manifests\",\n ` left run ${comparison.left.run_id}`,\n ` right run ${comparison.right.run_id}`,\n ].join(\"\\n\");\n};\n\nexport const recomputeCommand = Command.make(\n \"recompute\",\n {\n revision: Flag.String(\"revision\").pipe(\n Flag.withDescription(\"the published revision to run (the method)\"),\n ),\n snapshot: Flag.String(\"snapshot\").pipe(\n Flag.withDescription(\n \"the evidence hash a result was written on (its input_snapshot_hash)\",\n ),\n ),\n param: Flag.KeyValuePair(\"param\").pipe(\n Flag.optional,\n Flag.withDescription(\"a parameter as k=v; repeat for several\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the outcome as JSON\"),\n ),\n },\n Effect.fn(function* ({ revision, snapshot, param, json }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const outcome = yield* api\n .recompute({\n revisionId: revision,\n inputSnapshotId: snapshot,\n parameters: parametersOf(param),\n })\n .pipe(Effect.mapError(apiFailure));\n\n if (json) {\n yield* printJson({\n run_id: outcome.run.id,\n status: outcome.run.status,\n revision_id: outcome.run.revision_id,\n input_snapshot_id: outcome.input_snapshot_id,\n previous_results: Arr.map(\n outcome.previous_results,\n (result: AnalysisResultRef) => ({\n id: result.id,\n run_id: result.run_id,\n revision_id: result.revision_id,\n revision_hash: result.revision_hash,\n }),\n ),\n });\n return;\n }\n yield* Console.log(\n [\n `queued run ${outcome.run.id} on revision ${revision} (snapshot ${short(snapshot)})`,\n \"the result is written when the run succeeds; nothing here replaces an earlier result\",\n Arr.match(outcome.previous_results, {\n onEmpty: () => \"no earlier results on this evidence\",\n onNonEmpty: (results) =>\n [\n `${results.length} earlier result${results.length === 1 ? \"\" : \"s\"} on this evidence:`,\n ...results.map(\n (result) => ` ${result.id} ${short(result.revision_hash)}`,\n ),\n ].join(\"\\n\"),\n }),\n ].join(\"\\n\"),\n );\n }),\n).pipe(\n Command.withDescription(\n \"re-run a published revision on an existing input snapshot\",\n ),\n);\n\nexport const compareCommand = Command.make(\n \"compare\",\n {\n left: Argument.String(\"result-a\").pipe(\n Argument.withMetavar(\"result-a\"),\n Argument.withDescription(\"the baseline result id\"),\n ),\n right: Argument.String(\"result-b\").pipe(\n Argument.withMetavar(\"result-b\"),\n Argument.withDescription(\"the result to compare against it\"),\n ),\n json: Flag.Boolean(\"json\").pipe(\n Flag.withDefault(false),\n Flag.withDescription(\"print the comparison as JSON\"),\n ),\n },\n Effect.fn(function* ({ left, right, json }) {\n const cwd = yield* currentDirectory;\n const state = yield* loadState(cwd);\n const api = yield* apiFor(state);\n const comparison = yield* api\n .compare(left, right)\n .pipe(Effect.mapError(apiFailure));\n if (json) {\n yield* printJson(comparison);\n return;\n }\n yield* Console.log(renderComparison(comparison));\n }),\n).pipe(\n Command.withDescription(\n \"compare two immutable results, naming the axis that moved\",\n ),\n);\n", "import {\n type EnvironmentShape,\n CliFailure,\n EXIT_FAILURE,\n EXIT_USAGE,\n Environment,\n fail,\n oneLine,\n} from \"@braven/identity-store\";\nimport { Console, Effect, Equal, Match, Option } from \"effect\";\nimport * as Bool from \"effect/Boolean\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as P from \"effect/Predicate\";\nimport * as R from \"effect/Record\";\nimport * as Schema from \"effect/Schema\";\nimport * as Str from \"effect/String\";\nimport type { PlatformError } from \"effect/PlatformError\";\n\n/** The clients `braven mcp install --client` understands. */\nexport const CLIENTS = [\n \"claude\",\n \"cursor\",\n \"opencode\",\n \"zed\",\n \"vscode\",\n] as const;\n\n/** One supported MCP host. */\nexport type Client = (typeof CLIENTS)[number];\n\n/** The object each client nests custom stdio servers under. */\nconst serversKey: Record<Client, string> = {\n claude: \"mcpServers\",\n cursor: \"mcpServers\",\n opencode: \"mcp\",\n zed: \"context_servers\",\n vscode: \"servers\",\n};\n\nconst displayName: Record<Client, string> = {\n claude: \"Claude Desktop\",\n cursor: \"Cursor\",\n opencode: \"opencode\",\n zed: \"Zed\",\n vscode: \"VS Code\",\n};\n\n/**\n * The entry a client launches: the CLI's own stdio subcommand.\n *\n * VS Code needs the explicit `stdio` transport and opencode its `local` shape\n * with one command array; the others infer stdio. No credential is passed \u2014 the\n * server reads the identity store.\n */\nconst serverEntry = (client: Client): Record<string, unknown> =>\n Match.value(client).pipe(\n Match.when(\"vscode\", () => ({\n type: \"stdio\",\n command: \"braven\",\n args: [\"mcp\"],\n })),\n Match.when(\"opencode\", () => ({\n type: \"local\",\n command: [\"braven\", \"mcp\"],\n enabled: true,\n })),\n Match.orElse(() => ({ command: \"braven\", args: [\"mcp\"] })),\n );\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n P.isObject(value);\n\nconst asRecord = (value: unknown): Option.Option<Record<string, unknown>> =>\n Option.liftPredicate(isRecord)(value);\n\nconst value = (shape: EnvironmentShape, name: string) =>\n Option.filter(Option.fromNullishOr(shape.values[name]), Str.isNonEmpty);\n\nconst join = (shape: EnvironmentShape, ...parts: ReadonlyArray<string>) =>\n parts.join(shape.platform === \"win32\" ? \"\\\\\" : \"/\");\n\n/** The platform's per-user application directory. */\nconst applications = (shape: EnvironmentShape): string =>\n Match.value(shape.platform).pipe(\n Match.when(\"darwin\", () =>\n join(shape, shape.home, \"Library/Application Support\"),\n ),\n Match.when(\"win32\", () =>\n Option.getOrElse(value(shape, \"APPDATA\"), () =>\n join(shape, shape.home, \"AppData\\\\Roaming\"),\n ),\n ),\n Match.orElse(() =>\n Option.getOrElse(value(shape, \"XDG_CONFIG_HOME\"), () =>\n join(shape, shape.home, \".config\"),\n ),\n ),\n );\n\n/** opencode's config root: XDG on every platform, `~/.config` last. */\nconst configHome = (shape: EnvironmentShape): string =>\n Option.getOrElse(value(shape, \"XDG_CONFIG_HOME\"), () =>\n join(shape, shape.home, \".config\"),\n );\n\n/**\n * The MCP config file a client reads by default.\n *\n * VS Code is workspace-scoped (`.vscode/mcp.json` under the current\n * directory); the rest are per-user files. opencode honours `OPENCODE_CONFIG`\n * before its global file.\n */\nexport const configPathFor = (\n client: Client,\n shape: EnvironmentShape,\n): string =>\n Match.value(client).pipe(\n Match.when(\"claude\", () =>\n join(shape, applications(shape), \"Claude\", \"claude_desktop_config.json\"),\n ),\n Match.when(\"cursor\", () => join(shape, shape.home, \".cursor\", \"mcp.json\")),\n Match.when(\"zed\", () =>\n Match.value(shape.platform).pipe(\n Match.when(\"linux\", () =>\n join(shape, applications(shape), \"zed\", \"settings.json\"),\n ),\n Match.orElse(() =>\n join(shape, applications(shape), \"Zed\", \"settings.json\"),\n ),\n ),\n ),\n Match.when(\"opencode\", () =>\n Option.getOrElse(value(shape, \"OPENCODE_CONFIG\"), () =>\n join(shape, configHome(shape), \"opencode\", \"opencode.json\"),\n ),\n ),\n Match.when(\"vscode\", () => join(shape, shape.cwd, \".vscode\", \"mcp.json\")),\n Match.exhaustive,\n );\n\n/** What installing would do, decided without touching the file. */\nexport type InstallPlan =\n | { readonly kind: \"unchanged\" }\n | { readonly kind: \"conflict\"; readonly current: unknown }\n | { readonly kind: \"invalid\"; readonly reason: string }\n | { readonly kind: \"write\"; readonly config: Record<string, unknown> };\n\nconst decodeJson = Schema.decodeUnknownOption(\n Schema.fromJsonString(Schema.Unknown),\n);\n\n/**\n * Zed's documented entry carries `\"env\": {}`; an empty environment is the\n * same server, so it is not a conflict.\n */\nconst withoutEmptyEnv = (entry: unknown): unknown =>\n Option.match(asRecord(entry), {\n onNone: () => entry,\n onSome: (record) =>\n Option.match(Option.flatMap(R.get(record, \"env\"), asRecord), {\n onNone: () => record,\n onSome: (env) =>\n Match.value(R.isEmptyRecord(env)).pipe(\n Match.when(true, () => R.remove(record, \"env\")),\n Match.orElse(() => record),\n ),\n }),\n });\n\nconst withServer = (\n config: Record<string, unknown>,\n key: string,\n servers: Record<string, unknown>,\n client: Client,\n): InstallPlan => ({\n kind: \"write\",\n config: R.set(config, key, R.set(servers, \"braven\", serverEntry(client))),\n});\n\nconst invalid = (reason: string): InstallPlan => ({ kind: \"invalid\", reason });\n\nconst mergeEntry = (\n client: Client,\n config: Record<string, unknown>,\n key: string,\n servers: Record<string, unknown>,\n force: boolean,\n): InstallPlan =>\n Option.match(R.get(servers, \"braven\"), {\n onNone: () => withServer(config, key, servers, client),\n onSome: (entry) =>\n Bool.match(\n Equal.equals(\n withoutEmptyEnv(entry),\n withoutEmptyEnv(serverEntry(client)),\n ),\n {\n onTrue: () => ({ kind: \"unchanged\" as const }),\n onFalse: () =>\n Bool.match(force, {\n onTrue: () => withServer(config, key, servers, client),\n onFalse: () => ({ kind: \"conflict\" as const, current: entry }),\n }),\n },\n ),\n });\n\nconst mergeConfig = (\n client: Client,\n config: Record<string, unknown>,\n force: boolean,\n): InstallPlan => {\n const key = serversKey[client];\n return Option.match(R.get(config, key), {\n onNone: () => withServer(config, key, {}, client),\n onSome: (servers) =>\n Option.match(asRecord(servers), {\n onNone: () => invalid(`\"${key}\" is not an object`),\n onSome: (current) => mergeEntry(client, config, key, current, force),\n }),\n });\n};\n\n/**\n * Merges the client's stdio entry into an existing config without dropping\n * unrelated settings or servers. A differing `braven` entry is a conflict\n * unless forced; an unmergeable file is never overwritten.\n */\nexport const planInstall = (\n client: Client,\n existing: Option.Option<string>,\n force: boolean,\n): InstallPlan => {\n const text = Option.getOrElse(\n Option.filter(existing, (raw) => Str.trim(raw).length > 0),\n () => \"{}\",\n );\n return Option.match(decodeJson(text), {\n onNone: () => invalid(\"it is not valid JSON\"),\n onSome: (parsed) =>\n Option.match(asRecord(parsed), {\n onNone: () => invalid(\"its top level is not a JSON object\"),\n onSome: (config) => mergeConfig(client, config, force),\n }),\n });\n};\n\nconst cannot =\n (action: string, path: string) =>\n (cause: PlatformError): CliFailure =>\n new CliFailure({\n message: `cannot ${action} ${path}: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n });\n\nconst encodeJson = (space?: number) =>\n Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown, { space }));\n\n/** Renders one JSON value as a single line for the summary and refusal text. */\nconst inline = (json: unknown): Effect.Effect<string, CliFailure> =>\n encodeJson()(json).pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `cannot encode the config: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n );\n\n/** Writes the config atomically, keeping the original file's mode. */\nconst writeConfig = (\n path: string,\n text: string,\n mode: Option.Option<number>,\n): Effect.Effect<void, CliFailure, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const paths = yield* Path.Path;\n yield* fs\n .makeDirectory(paths.dirname(path), { recursive: true })\n .pipe(Effect.mapError(cannot(\"create\", path)));\n const temporary = `${path}.tmp`;\n yield* fs\n .writeFileString(\n temporary,\n text,\n Option.match(mode, {\n onNone: () => ({}),\n onSome: (value) => ({ mode: value }),\n }),\n )\n .pipe(Effect.mapError(cannot(\"write\", path)));\n yield* fs\n .rename(temporary, path)\n .pipe(Effect.mapError(cannot(\"replace\", path)));\n yield* Option.match(mode, {\n onNone: () => Effect.void,\n onSome: (value) =>\n fs.chmod(path, value).pipe(Effect.mapError(cannot(\"chmod\", path))),\n });\n });\n\nconst summary = (options: {\n readonly client: Client;\n readonly path: string;\n readonly entry: string;\n readonly backup: Option.Option<string>;\n}): string =>\n [\n `configured ${displayName[options.client]} at ${options.path}`,\n ` server ${options.entry}`,\n ` key ${serversKey[options.client]}.braven`,\n ...Option.match(options.backup, {\n onNone: () => [],\n onSome: (backup) => [` backup ${backup}`],\n }),\n ].join(\"\\n\");\n\n/** Merges the Braven stdio server into one client's MCP config. */\nexport const install = Effect.fn(\"mcp.install\")(function* (options: {\n readonly client: Client;\n readonly path: string;\n readonly force: boolean;\n}) {\n const fs = yield* FileSystem.FileSystem;\n const exists = yield* fs\n .exists(options.path)\n .pipe(Effect.mapError(cannot(\"inspect\", options.path)));\n const previous = yield* Bool.match(exists, {\n onFalse: () => Effect.succeed(Option.none<string>()),\n onTrue: () =>\n fs\n .readFileString(options.path)\n .pipe(\n Effect.map(Option.some),\n Effect.mapError(cannot(\"read\", options.path)),\n ),\n });\n\n yield* Match.value(planInstall(options.client, previous, options.force)).pipe(\n Match.when({ kind: \"unchanged\" }, () =>\n Console.log(`already configured at ${options.path} \u2014 no change`),\n ),\n Match.when({ kind: \"invalid\" }, ({ reason }) =>\n fail(\n `${options.path} cannot be merged: ${reason} \u2014 fix or remove it, then retry`,\n EXIT_FAILURE,\n ),\n ),\n Match.when({ kind: \"conflict\" }, ({ current }) =>\n Effect.flatMap(inline(current), (entry) =>\n Console.log(\n `braven is already configured differently:\\n file ${options.path}\\n current ${entry}`,\n ).pipe(\n Effect.andThen(\n fail(\n `${options.path} configures braven differently \u2014 rerun with --force to replace it (the original is copied to a sibling .bak file)`,\n EXIT_USAGE,\n ),\n ),\n ),\n ),\n ),\n Match.when({ kind: \"write\" }, ({ config }) =>\n Effect.gen(function* () {\n const backup = yield* Bool.match(exists, {\n onFalse: () => Effect.succeed(Option.none<string>()),\n onTrue: () => {\n const path = `${options.path}.bak`;\n return fs\n .copyFile(options.path, path)\n .pipe(\n Effect.mapError(cannot(\"back up\", options.path)),\n Effect.as(Option.some(path)),\n );\n },\n });\n const mode = yield* Bool.match(exists, {\n onFalse: () => Effect.succeed(Option.none<number>()),\n onTrue: () =>\n fs.stat(options.path).pipe(\n Effect.map((info) => Option.some(info.mode)),\n Effect.mapError(cannot(\"inspect\", options.path)),\n ),\n });\n const text = `${yield* encodeJson(2)(config).pipe(\n Effect.mapError(\n (cause) =>\n new CliFailure({\n message: `cannot encode the config: ${oneLine(cause.message)}`,\n exitCode: EXIT_FAILURE,\n }),\n ),\n )}\\n`;\n yield* writeConfig(options.path, text, mode);\n yield* Console.log(\n summary({\n client: options.client,\n path: options.path,\n entry: yield* inline(serverEntry(options.client)),\n backup,\n }),\n );\n }),\n ),\n Match.exhaustive,\n );\n});\n\n/** Resolves the flag or the client's default, then installs. */\nexport const installCommand = Effect.fn(\"mcp.installCommand\")(\n function* (options: {\n readonly client: Client;\n readonly force: boolean;\n readonly path: Option.Option<string>;\n }) {\n const environment = yield* Environment;\n const path = Option.getOrElse(options.path, () =>\n configPathFor(options.client, environment),\n );\n yield* install({ client: options.client, path, force: options.force });\n },\n);\n", "/**\n * `braven desktop install`: put the watcher window in Applications.\n *\n * The GUI is not npm code \u2014 it is a macOS `.app` \u2014 so this cannot ship inside\n * `bravenlab`. It takes a built app or the DMG the desktop build produces,\n * copies `Braven.app` to the user's Applications folder, and opens it.\n *\n * braven desktop install --dmg ~/Downloads/Braven-0.1.0-arm64.dmg\n * braven desktop install --app apps/desktop/dist/Braven.app\n */\nimport { Console, Effect } from \"effect\";\nimport { execFile } from \"node:child_process\";\nimport { cpSync, existsSync, mkdtempSync, rmSync } from \"node:fs\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\n\nexport interface DesktopInstall {\n /** A disk image that contains `Braven.app`. */\n readonly dmg?: string;\n /** An already-built `Braven.app`. */\n readonly app?: string;\n /** A Windows installer (`Braven-Setup-<version>.exe`). */\n readonly exe?: string;\n /** Windows: run the installer without its wizard. */\n readonly silent?: boolean;\n /** `/Applications` instead of `~/Applications`. */\n readonly system?: boolean;\n /** Override the install path (tests, alternate prefixes). */\n readonly destination?: string;\n}\n\nconst destinationOf = (input: DesktopInstall): string =>\n input.destination ??\n (input.system === true\n ? \"/Applications/Braven.app\"\n : join(homedir(), \"Applications\", \"Braven.app\"));\n\nconst run = (bin: string, args: ReadonlyArray<string>) =>\n Effect.tryPromise({\n try: () =>\n new Promise<string>((resolvePromise, reject) => {\n execFile(bin, [...args], (error, stdout) =>\n error === null ? resolvePromise(stdout) : reject(error),\n );\n }),\n catch: (cause) => new Error(`${bin} failed: ${String(cause)}`),\n });\n\nconst copyApp = (source: string, destination: string) =>\n Effect.sync(() => {\n if (!existsSync(join(source, \"Contents\", \"Info.plist\")))\n throw new Error(`${source} is not a Braven.app`);\n rmSync(destination, { recursive: true, force: true });\n cpSync(source, destination, { recursive: true });\n });\n\nexport const installDesktop = Effect.fn(\"desktop.install\")(function* (\n input: DesktopInstall,\n) {\n if (process.platform === \"win32\") {\n if (input.exe === undefined)\n return yield* Effect.fail(\n new Error(\"pass --exe <Braven-Setup.exe> on Windows\"),\n );\n yield* run(\n resolve(input.exe),\n input.silent === true\n ? [\"/SILENT\", \"/SUPPRESSMSGBOXES\", \"/NORESTART\"]\n : [],\n );\n yield* Console.log(\n input.silent === true\n ? \"installer finished\"\n : \"the installer will finish in its own window\",\n );\n return;\n }\n if (process.platform !== \"darwin\")\n return yield* Effect.fail(\n new Error(\"the watcher window is available on macOS and Windows\"),\n );\n if (input.dmg === undefined && input.app === undefined)\n return yield* Effect.fail(\n new Error(\"pass --dmg <file.dmg> or --app <Braven.app>\"),\n );\n\n const destination = destinationOf(input);\n if (input.app !== undefined) {\n yield* copyApp(resolve(input.app), destination);\n } else {\n const mount = mkdtempSync(join(tmpdir(), \"braven-dmg-\"));\n yield* Effect.ensuring(\n Effect.gen(function* () {\n yield* run(\"hdiutil\", [\n \"attach\",\n \"-nobrowse\",\n \"-readonly\",\n \"-mountpoint\",\n mount,\n resolve(input.dmg as string),\n ]);\n yield* copyApp(join(mount, \"Braven.app\"), destination);\n }),\n Effect.sync(() => {\n void run(\"hdiutil\", [\"detach\", mount]);\n rmSync(mount, { recursive: true, force: true });\n }),\n );\n }\n\n yield* Console.log(`installed ${destination}`);\n yield* run(\"open\", [destination]);\n});\n"],
5
+ "mappings": ";AAAA,SAAS,YAAAA,WAAoB,WAAAC,UAAS,QAAAC,aAAY;AAClD,SAAgB,WAAAC,UAAS,UAAAC,UAAQ,SAAAC,SAAO,UAAAC,gBAAc;;;ACDtD,SAAS,QAAAC,aAAY;AACrB,YAAY,aAAa;AAEzB,YAAY,YAAY;AACxB,YAAYC,aAAY;;;ACJxB,SAAS,YAAY;AACrB,YAAYC,aAAY;;;ACDxB,YAAY,YAAY;AAGjB,IAAM,iBAAN,cAAoC,mBAA4B;AAAA,EACrE;AAAA,EACA;AAAA,IACE,SAAgB;AAAA,IAChB,MAAa,mBAAmB,aAAM;AAAA,EACxC;AACF,EAAE;AAAC;;;ADJI,IAAM,QAAe,iBAAS,CAAC,QAAQ,SAAS,OAAO,SAAS,CAAC;AAIjE,IAAM,UAAiB,iBAAS,CAAC,OAAO,KAAK,CAAC;AAI9C,IAAM,cAAqB,eAAO;AAAA,EACvC,QAAe,sBAAc,KAAK;AAAA,EAClC,UAAiB,sBAAc,OAAO;AAAA;AAAA,EAEtC,eAAsB,oBAAmB,eAAO;AAAA;AAAA,EAEhD,OAAc,oBAAmB,eAAO;AAC1C,CAAC;AAGD,IAAM,WAAW;AAAA,EACf,QAAQ,CAAC,MAAM;AAAA,EACf,UAAU,CAAC,KAAK;AAClB;AAEA,IAAM,OAAO,CAKX,MACA,WAMA,KAAK,KAAK,MAAM,EAAE,GAAG,QAAQ,SAAS,eAAe,CAAC,EACnD,SAAS,KAAK,UAAU,IAAI,EAC5B,SAAS,KAAK,aAAa,KAAK,EAChC,SAAS,KAAK,YAAY,IAAI,EAC9B,SAAS,KAAK,WAAW,KAAK,EAC9B,SAAS,KAAK,MAAM,QAAQ;AAO1B,IAAM,SAAS,KAAK,iBAAiB;AAAA,EAC1C,aACE;AAAA,EACF,YAAY,KAAK;AAAA,EACjB,SAAgB,eAAO;AAAA,IACrB,OAAc,oBAAmB,cAAM;AAAA,IACvC,QAAe;AAAA,IACf,SAAgB,oBAAmB,cAAM;AAAA,IACzC,SAAgB,oBAAmB,cAAM;AAAA,EAC3C,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,UAAU;AAG3B,IAAM,eAAe,KAAK,wBAAwB;AAAA,EACvD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,WAAkB,oBAAmB,cAAM;AAAA,EAC7C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,MACL,eAAO;AAAA,QACZ,IAAW;AAAA,QACX,MAAa;AAAA,QACb,WAAkB;AAAA,QAClB,aAAoB,oBAAmB,cAAM;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,eAAe;AAGhC,IAAM,kBAAkB,KAAK,2BAA2B;AAAA,EAC7D,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,WAAkB;AAAA;AAAA,IAElB,QAAe,oBAAmB,cAAM;AAAA;AAAA,IAExC,UAAiB,oBAAmB,cAAM;AAAA,IAC1C,cAAqB,oBAAmB,cAAM;AAAA,IAC9C,OAAc,oBAAmB,iBAAS,CAAC,cAAc,YAAY,CAAC,CAAC;AAAA,IACvE,OAAc;AAAA,MACL,YAAI,MAAa,kBAAU,EAAE,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC;AAAA,IACjE;AAAA,IACA,QAAe;AAAA,MACN,YAAI,MAAa,+BAAuB,CAAC,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,MACL,eAAO;AAAA,QACZ,IAAW;AAAA,QACX,MAAa,oBAAmB,cAAM;AAAA,QACtC,WAAkB;AAAA,QAClB,cAAqB;AAAA,QACrB,YAAmB;AAAA,QACnB,WAAkB;AAAA,QAClB,YAAmB,oBAAmB,cAAM;AAAA,QAC5C,cAAqB,oBAAmB,cAAM;AAAA,QAC9C,MAAa,cAAa,cAAM;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,kBAAkB;AAGnC,IAAM,gBAAgB,KAAK,yBAAyB;AAAA,EACzD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,cAAqB;AAAA,EACvB,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,IAAW;AAAA,IACX,MAAa,oBAAmB,cAAM;AAAA,IACtC,OAAc,oBAAmB,cAAM;AAAA,IACvC,WAAkB;AAAA,IAClB,UAAiB,oBAAmB,cAAM;AAAA,IAC1C,YAAmB;AAAA,IACnB,YAAmB,oBAAmB,cAAM;AAAA,IAC5C,MAAa,cAAa,cAAM;AAAA,IAChC,QAAe,eAAc,gBAAe,cAAM;AAAA,IAClD,SAAgB,eAAc,gBAAe,cAAM;AAAA,IACnD,OAAc,cAAa,cAAM;AAAA,EACnC,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,mBAAmB;AAGpC,IAAM,cAAc,KAAK,uBAAuB;AAAA,EACrD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,WAAkB;AAAA,IAClB,MAAa,oBAAmB,cAAM;AAAA,IACtC,UAAiB,oBAAmB,cAAM;AAAA,EAC5C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,IAAW;AAAA,IACX,MAAa;AAAA,IACb,UAAiB;AAAA,IACjB,OAAc,oBAAmB,cAAM;AAAA,IACvC,OAAc,oBAAmB,cAAM;AAAA,IACvC,SAAgB;AAAA,IAChB,OAAc;AAAA,IACd,iBAAwB;AAAA,IACxB,SAAgB,cAAa,cAAM;AAAA,IACnC,QAAe;AAAA,MACN,eAAO;AAAA,QACZ,KAAY;AAAA,QACZ,OAAc,oBAAmB,cAAM;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,cAAc;AAG/B,IAAM,YAAY,KAAK,qBAAqB;AAAA,EACjD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,WAAkB;AAAA,IAClB,MAAa,oBAAmB,cAAM;AAAA,IACtC,UAAiB,oBAAmB,cAAM;AAAA,EAC5C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,IAAW;AAAA,IACX,MAAa;AAAA,IACb,WAAkB;AAAA,IAClB,WAAkB;AAAA,IAClB,UAAiB;AAAA,MACR,eAAO;AAAA,QACZ,UAAiB;AAAA,QACjB,MAAa;AAAA,QACb,SAAgB,oBAAmB,cAAM;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,cAAc;AAG/B,IAAM,gBAAgB,KAAK,yBAAyB;AAAA,EACzD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,WAAkB;AAAA,EACpB,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,MACL,eAAO;AAAA,QACZ,IAAW;AAAA,QACX,MAAa;AAAA,QACb,OAAc,oBAAmB,cAAM;AAAA,QACvC,WAAkB,oBAAmB,cAAM;AAAA,QAC3C,iBAAwB;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,gBAAgB;AAGjC,IAAM,cAAc,KAAK,uBAAuB;AAAA,EACrD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,WAAkB;AAAA,IAClB,YAAmB;AAAA,IACnB,WAAkB,oBAAmB,eAAO;AAAA,EAC9C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,IAAW;AAAA,IACX,MAAa;AAAA,IACb,gBAAuB,oBAAmB,cAAM;AAAA,IAChD,YAAmB,oBAAmB,WAAG;AAAA,IACzC,aAAoB,oBAAmB,cAAM;AAAA,IAC7C,QAAe,oBAAmB,cAAM;AAAA,IACxC,WAAkB,oBAAmB,cAAM;AAAA,EAC7C,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,gBAAgB;AAGjC,IAAM,iBAAiB,KAAK,0BAA0B;AAAA,EAC3D,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,YAAmB;AAAA,EACrB,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,YAAmB;AAAA,IACnB,MAAa;AAAA,MACJ,eAAO;AAAA,QACZ,YAAmB;AAAA,QACnB,QAAe;AAAA,QACf,aAAoB;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,iBAAiB;AAGlC,IAAM,WAAW,KAAK,oBAAoB;AAAA,EAC/C,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,YAAmB,oBAAmB,cAAM;AAAA,IAC5C,cAAqB,oBAAmB,cAAM;AAAA,IAC9C,QAAe,oBAAmB,cAAM;AAAA,EAC1C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,MACL,eAAO;AAAA,QACZ,IAAW;AAAA,QACX,YAAmB;AAAA,QACnB,cAAqB;AAAA,QACrB,QAAe;AAAA,QACf,WAAkB;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,WAAW;AAG5B,IAAM,YAAY,KAAK,qBAAqB;AAAA,EACjD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,UAAiB;AAAA,EACnB,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,IAAW;AAAA,IACX,OAAc,oBAAmB,cAAM;AAAA,IACvC,SAAgB,eAAc,gBAAe,YAAI;AAAA,IACjD,SAAgB;AAAA,MACP,eAAO;AAAA,QACZ,MAAa;AAAA,QACb,aAAoB,oBAAmB,cAAM;AAAA,QAC7C,OAAc,oBAAmB,WAAG;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,cAAc;AAG/B,IAAM,gBAAgB,KAAK,yBAAyB;AAAA,EACzD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,YAAmB;AAAA,IACnB,QAAe,oBAAmB,cAAM;AAAA,EAC1C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,MACL,eAAO;AAAA,QACZ,IAAW;AAAA,QACX,QAAe;AAAA,QACf,WAAkB,oBAAmB,cAAM;AAAA,QAC3C,WAAkB,oBAAmB,cAAM;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,gBAAgB;AAGjC,IAAM,iBAAiB,KAAK,0BAA0B;AAAA,EAC3D,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,cAAqB;AAAA,IACrB,eAAsB;AAAA,EACxB,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,MAAa;AAAA,IACb,YAAmB;AAAA,IACnB,cAAqB;AAAA,IACrB,mBAA0B;AAAA,IAC1B,MAAa;AAAA,IACb,OAAc;AAAA,EAChB,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,iBAAiB;AAGlC,IAAM,aAAoB,cAAM;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACT,CAAC;AAID,IAAM,QAAQ,CAKZ,MACA,WAMA,KAAK,KAAK,MAAM,EAAE,GAAG,QAAQ,SAAS,eAAe,CAAC,EACnD,SAAS,KAAK,UAAU,KAAK,EAC7B,SAAS,KAAK,aAAa,KAAK,EAChC,SAAS,KAAK,YAAY,KAAK,EAC/B,SAAS,KAAK,WAAW,KAAK,EAC9B,SAAS,KAAK,MAAM;AAAA,EACnB,QAAQ,CAAC,OAAO;AAAA,EAChB,UAAU,CAAC,KAAK;AAClB,CAAuB;AAGpB,IAAM,mBAAmB,MAAM,4BAA4B;AAAA,EAChE,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,WAAkB;AAAA,IAClB,MAAa,oBAAmB,cAAM;AAAA,IACtC,OAAc,oBAAmB,cAAM;AAAA,IACvC,UAAiB,oBAAmB,cAAM;AAAA,IAC1C,YAAmB,oBAAmB,cAAM;AAAA,EAC9C,CAAC;AAAA,EACD,SAAgB,eAAO,EAAE,IAAW,eAAO,CAAC;AAC9C,CAAC,EAAE,SAAS,KAAK,OAAO,sBAAsB;AAGvC,IAAM,mBAAmB,MAAM,4BAA4B;AAAA,EAChE,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,WAAkB;AAAA,IAClB,cAAqB;AAAA,IACrB,MAAa,oBAAmB,cAAM;AAAA,IACtC,OAAc,oBAAmB,cAAM;AAAA,EACzC,CAAC;AAAA,EACD,SAAgB,eAAO,EAAE,IAAW,eAAO,CAAC;AAC9C,CAAC,EAAE,SAAS,KAAK,OAAO,sBAAsB;AAGvC,IAAM,mBAAmB,MAAM,4BAA4B;AAAA,EAChE,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,YAAmB;AAAA,IACnB,OAAc;AAAA,IACd,OAAO;AAAA,IACP,QAAe,oBAAmB,cAAM;AAAA,IACxC,gBAAuB,oBAAmB,cAAM;AAAA,IAChD,WAAkB,oBAAmB,cAAM;AAAA,EAC7C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,YAAmB;AAAA,IACnB,gBAAuB;AAAA,IACvB,QAAe;AAAA,EACjB,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,4BAA4B;AAGpD,IAAM,WAAW,CAKf,MACA,WAMA,KAAK,KAAK,MAAM,EAAE,GAAG,QAAQ,SAAS,eAAe,CAAC,EACnD,SAAS,KAAK,UAAU,KAAK,EAC7B,SAAS,KAAK,aAAa,KAAK,EAChC,SAAS,KAAK,YAAY,KAAK,EAC/B,SAAS,KAAK,WAAW,KAAK,EAC9B,SAAS,KAAK,MAAM;AAAA,EACnB,QAAQ,CAAC,KAAK;AAAA,EACd,UAAU,CAAC,KAAK;AAAA,EAChB,eAAe;AACjB,CAAuB;AAGpB,IAAM,cAAc,SAAS,uBAAuB;AAAA,EACzD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,YAAmB;AAAA,IACnB,cAAqB;AAAA,IACrB,YAAmB,oBAAmB,cAAM;AAAA,IAC5C,YAAmB,oBAAmB,eAAc,gBAAQ,UAAU,CAAC;AAAA,IACvE,QAAe,oBAAmB,eAAO;AAAA,EAC3C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,IACd,QAAe;AAAA,IACf,YAAmB;AAAA,IACnB,cAAqB;AAAA,EACvB,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,gBAAgB;AAGjC,IAAM,QAAQ,SAAS,gBAAgB;AAAA,EAC5C,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,OAAc;AAAA,IACd,MAAa,iBAAS,CAAC,SAAS,gBAAgB,CAAC;AAAA,EACnD,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,IACd,QAAe;AAAA,IACf,YAAmB,oBAAmB,cAAM;AAAA,EAC9C,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,OAAO;AAGxB,IAAM,YAAY,SAAS,oBAAoB;AAAA,EACpD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,YAAmB;AAAA,IACnB,YAAmB;AAAA,IACnB,iBAAwB;AAAA,IACxB,YAAmB,oBAAmB,eAAc,gBAAQ,UAAU,CAAC;AAAA,EACzE,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,IACd,QAAe;AAAA,IACf,iBAAwB;AAAA,EAC1B,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,WAAW;AAG5B,IAAM,eAAe,MAAM,wBAAwB;AAAA,EACxD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,YAAmB;AAAA,IACnB,eAAsB,oBAAmB,cAAM;AAAA,IAC/C,OAAc,oBAAmB,eAAO;AAAA,EAC1C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,QAAe;AAAA,IACf,SAAgB;AAAA,EAClB,CAAC;AACH,CAAC,EACE,SAAS,KAAK,MAAM;AAAA,EACnB,QAAQ,CAAC,OAAO;AAAA,EAChB,UAAU,CAAC,KAAK;AAAA,EAChB,eAAe;AAAA,EACf,OAAO;AACT,CAAuB,EACtB,SAAS,KAAK,OAAO,iBAAiB;AAGlC,IAAM,eAAe,MAAM,wBAAwB;AAAA,EACxD,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,YAAmB,oBAAmB,cAAM;AAAA,IAC5C,eAAsB,oBAAmB,cAAM;AAAA,IAC/C,gBAAuB,oBAAmB,cAAM;AAAA,IAChD,SAAgB,oBAAmB,cAAM;AAAA,IACzC,QAAe,oBAAmB,eAAO;AAAA,EAC3C,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,QAAe;AAAA,IACf,SAAgB;AAAA,EAClB,CAAC;AACH,CAAC,EACE,SAAS,KAAK,MAAM;AAAA,EACnB,QAAQ,CAAC,OAAO;AAAA,EAChB,UAAU,CAAC,KAAK;AAAA,EAChB,eAAe;AAAA,EACf,OAAO;AACT,CAAuB,EACtB,SAAS,KAAK,OAAO,iBAAiB;AAEzC,IAAM,cAAc,CAKlB,MACA,WAMA,KAAK,KAAK,MAAM,EAAE,GAAG,QAAQ,SAAS,eAAe,CAAC,EACnD,SAAS,KAAK,UAAU,IAAI,EAC5B,SAAS,KAAK,aAAa,KAAK,EAChC,SAAS,KAAK,YAAY,IAAI,EAC9B,SAAS,KAAK,WAAW,KAAK,EAC9B,SAAS,KAAK,MAAM;AAAA,EACnB,QAAQ,CAAC,SAAS;AAAA,EAClB,UAAU,CAAC,KAAK;AAAA,EAChB,OAAO;AACT,CAAuB;AAE3B,IAAM,eAAe,CAKnB,MACA,WAMA,KAAK,KAAK,MAAM,EAAE,GAAG,QAAQ,SAAS,eAAe,CAAC,EACnD,SAAS,KAAK,UAAU,KAAK,EAC7B,SAAS,KAAK,aAAa,KAAK,EAChC,SAAS,KAAK,YAAY,KAAK,EAC/B,SAAS,KAAK,WAAW,KAAK,EAC9B,SAAS,KAAK,MAAM;AAAA,EACnB,QAAQ,CAAC,SAAS;AAAA,EAClB,UAAU,CAAC,KAAK;AAAA,EAChB,eAAe;AAAA,EACf,OAAO;AACT,CAAuB;AAGpB,IAAM,gBAAgB,YAAY,yBAAyB;AAAA,EAChE,aACE;AAAA,EACF,YAAY,KAAK;AAAA,EACjB,SAAgB,eAAO;AAAA,IACrB,WAAkB;AAAA,IAClB,SAAgB,oBAAmB,cAAM;AAAA,IACzC,KAAY,oBAAmB,WAAG;AAAA,IAClC,SAAgB,oBAAmB,cAAa,cAAM,CAAC;AAAA,IACvD,SAAgB,oBAAmB,WAAG;AAAA,IACtC,QAAe,oBAAmB,eAAO;AAAA,IACzC,WAAkB,oBAAmB,cAAM;AAAA,EAC7C,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,gBAAgB;AAGjC,IAAM,eAAe,YAAY,wBAAwB;AAAA,EAC9D,aACE;AAAA,EACF,YAAY,KAAK;AAAA,EACjB,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,MACL,eAAO;AAAA,QACZ,IAAW;AAAA,QACX,QAAe;AAAA,QACf,MAAa;AAAA,QACb,MAAa;AAAA,QACb,OAAc;AAAA,QACd,UAAiB;AAAA,QACjB,QAAe,oBAAmB,cAAM;AAAA,QACxC,WAAkB;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,eAAe;AAGhC,IAAM,cAAc,aAAa,uBAAuB;AAAA,EAC7D,aACE;AAAA,EACF,YAAY,KAAK;AAAA,EACjB,SAAgB,eAAO;AAAA,IACrB,IAAW;AAAA,IACX,UAAiB;AAAA,IACjB,QAAe;AAAA,IACf,UAAiB;AAAA,EACnB,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,kBAAkB;AAGnC,IAAM,gBAAgB,aAAa,yBAAyB;AAAA,EACjE,aACE;AAAA,EACF,YAAY,KAAK;AAAA,EACjB,SAAgB,eAAO;AAAA,IACrB,IAAW;AAAA,IACX,SAAgB;AAAA,IAChB,KAAY;AAAA,IACZ,SAAgB;AAAA,EAClB,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,gBAAgB;AAGjC,IAAM,eAAe,aAAa,wBAAwB;AAAA,EAC/D,aACE;AAAA,EACF,YAAY,KAAK;AAAA,EACjB,SAAgB,eAAO,EAAE,IAAW,iBAAS,QAAe,gBAAQ,CAAC;AACvE,CAAC,EAAE,SAAS,KAAK,OAAO,mBAAmB;AAGpC,IAAM,cAAc,aAAa,uBAAuB;AAAA,EAC7D,aACE;AAAA,EACF,YAAmB,eAAO,EAAE,MAAa,uBAAe,CAAC;AAAA,EACzD,SAAgB,eAAO,EAAE,IAAW,iBAAS,QAAe,eAAO,CAAC;AACtE,CAAC,EAAE,SAAS,KAAK,OAAO,qBAAqB;AAGtC,IAAM,gBAAgB,aAAa,yBAAyB;AAAA,EACjE,aACE;AAAA,EACF,YAAY,KAAK;AAAA,EACjB,SAAgB,eAAO,EAAE,IAAW,iBAAS,QAAe,gBAAQ,CAAC;AACvE,CAAC,EAAE,SAAS,KAAK,OAAO,oBAAoB;AAE5C,IAAM,UAAU,CAKd,MACA,WAMA,KAAK,KAAK,MAAM,EAAE,GAAG,QAAQ,SAAS,eAAe,CAAC,EACnD,SAAS,KAAK,UAAU,IAAI,EAC5B,SAAS,KAAK,aAAa,KAAK,EAChC,SAAS,KAAK,YAAY,IAAI,EAC9B,SAAS,KAAK,WAAW,KAAK,EAC9B,SAAS,KAAK,MAAM;AAAA,EACnB,QAAQ,CAAC,MAAM;AAAA,EACf,UAAU,CAAC,KAAK;AAClB,CAAuB;AAE3B,IAAM,WAAW,CAKf,MACA,WAMA,KAAK,KAAK,MAAM,EAAE,GAAG,QAAQ,SAAS,eAAe,CAAC,EACnD,SAAS,KAAK,UAAU,KAAK,EAC7B,SAAS,KAAK,aAAa,KAAK,EAChC,SAAS,KAAK,YAAY,IAAI,EAC9B,SAAS,KAAK,WAAW,KAAK,EAC9B,SAAS,KAAK,MAAM;AAAA,EACnB,QAAQ,CAAC,OAAO;AAAA,EAChB,UAAU,CAAC,KAAK;AAClB,CAAuB;AAE3B,IAAM,SAAS,CAKb,MACA,WAMA,KAAK,KAAK,MAAM,EAAE,GAAG,QAAQ,SAAS,eAAe,CAAC,EACnD,SAAS,KAAK,UAAU,KAAK,EAC7B,SAAS,KAAK,aAAa,KAAK,EAChC,SAAS,KAAK,YAAY,KAAK,EAC/B,SAAS,KAAK,WAAW,KAAK,EAC9B,SAAS,KAAK,MAAM;AAAA,EACnB,QAAQ,CAAC,KAAK;AAAA,EACd,UAAU,CAAC,KAAK;AAAA,EAChB,eAAe;AACjB,CAAuB;AAGpB,IAAM,cAAc,OAAO,iCAAiC;AAAA,EACjE,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,YAAmB;AAAA,IACnB,cAAqB;AAAA,EACvB,CAAC;AAAA,EACD,SAAgB,eAAO;AAAA,IACrB,OAAc;AAAA,IACd,QAAe;AAAA,EACjB,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,8BAA8B;AAG/C,IAAM,iBAAiB,QAAQ,0BAA0B;AAAA,EAC9D,aACE;AAAA,EACF,YAAY,KAAK;AAAA,EACjB,SAAgB,eAAO;AAAA,IACrB,MAAa;AAAA,IACb,WAAkB,oBAAmB,cAAM;AAAA,EAC7C,CAAC;AACH,CAAC,EAAE,SAAS,KAAK,OAAO,wBAAwB;AAGzC,IAAM,iBAAiB,SAAS,0BAA0B;AAAA,EAC/D,aACE;AAAA,EACF,YAAmB,eAAO;AAAA,IACxB,cAAqB;AAAA,IACrB,WAAkB,oBAAmB,cAAM;AAAA,EAC7C,CAAC;AAAA,EACD,SAAgB,eAAO,EAAE,MAAa,eAAO,CAAC;AAChD,CAAC,EAAE,SAAS,KAAK,OAAO,oBAAoB;AAGrC,IAAM,cAAc,SAAS,uBAAuB;AAAA,EACzD,aACE;AAAA,EACF,YAAmB,eAAO,EAAE,WAAkB,eAAO,CAAC;AAAA,EACtD,SAAgB,eAAO,EAAE,MAAa,eAAO,CAAC;AAChD,CAAC,EAAE,SAAS,KAAK,OAAO,gBAAgB;AAIjC,IAAM,WAAW;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,QAAQ;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ADlxBA,IAAM,UAAU,CAAC,SACR;AAAA,EACG,kBAAU,KAAK,aAAaC,MAAK,KAAK;AAAA,EAC9C,MAAM,KAAK;AACb;AAEF,IAAM,SAAS,CAAC,SACP,0BAAkB,WAAW;AAAA,EAC3B;AAAA,IACG,kBAAU,KAAK,aAAaA,MAAK,IAAI;AAAA,IAC7C,OAAO,CAAC;AAAA,EACV;AACF;AAGK,IAAM,WAAW,CAAC,SACvB,OAAO,IAAI,EAAE;AAEf,IAAM,UAAU,CAAC,SAAiC;AAChD,QAAM,OAAO,OAAO,IAAI;AACxB,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,OAAO,QAAQ,IAAI;AAAA,IACnB,aAAa,KAAK,eAAe;AAAA,IACjC,aAAoB,6BAAqB,KAAK,gBAAgB,EAAE;AAAA,IAChE,cAAqB,6BAAqB,KAAK,aAAa,EAAE;AAAA,IAC9D,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,OAAO,KAAK,SAAS;AAAA,IACrB,aAAa;AAAA,MACX,UAAkB,YAAI,KAAK,aAAaA,MAAK,QAAQ;AAAA,MACrD,aAAqB,YAAI,KAAK,aAAaA,MAAK,WAAW;AAAA,MAC3D,YAAoB,YAAI,KAAK,aAAaA,MAAK,UAAU;AAAA,MACzD,WAAmB,YAAI,KAAK,aAAaA,MAAK,SAAS;AAAA,MACvD,eAAe,KAAK,iBAAiB;AAAA,IACvC;AAAA,EACF;AACF;AAMO,IAAM,UAAuC,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA,EAC1E;AACF;AAOO,IAAM,cAA2C,QAAQ;AAAA,EAC9D,CAAC,UAAU,MAAM,SAAS,SAAS,KAAK,KAAK,CAAC,MAAM;AACtD;;;AGlFA,SAAS,iBAAiB;AAC1B,SAAS,UAAAC,UAAQ,SAAAC,QAAO,cAAc;AACtC,SAAS,uBAAuB;;;ACOhC,SAAS,SAAS,WAAAC,UAAS,UAAAC,SAAQ,OAAO,UAAAC,eAAc;AACxD,YAAY,gBAAgB;AAC5B,YAAY,UAAU;AACtB,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,YAAY,YAAY;;;ACPxB,SAAS,cAAc;AACvB,YAAYC,aAAY;AACxB,YAAY,SAAS;AAGd,IAAM,kBAAyB,iBAAS;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,cAAN,cAAiC,oBAAyB;AAAA,EAC/D;AAAA,EACA,EAAE,MAAM,iBAAiB,SAAgB,eAAO;AAClD,EAAE;AAAC;AAGI,IAAM,OAAO,CAAC,MAAuB,YAC1C,OAAO,KAAK,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC,CAAC;AAGzC,IAAM,UAAU,CAACC,WAClB,SAAS,YAAQ,QAAQ,GAAG,EAAE,OAAOA,MAAK,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG;;;ADAzD,IAAM,sBAAN,cAAkCC,QAAO,YAAiC;AAAA,EAC/E;AAAA,EACA,EAAE,SAASA,QAAO,OAAO;AAC3B,EAAE;AAAC;AAGI,IAAM,sBAAsB;AAG5B,IAAM,eAAN,cAA2BA,QAAO,YAA0B;AAAA,EACjE;AAAA,EACA,EAAE,MAAMA,QAAO,KAAK,SAASA,QAAO,OAAO;AAC7C,EAAE;AAAC;AAUI,IAAM,iBAAN,cAA6BC,SAAQ,QAG1C,EAAE,wBAAwB,EAAE;AAAC;AAE/B,IAAM,uBAAuB,CAAC,SAC5B,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AAG5C,IAAM,cAAc,CAAC,WACnBC,QAAO,IAAI,aAAa;AACtB,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,WAAO,QAAQ,IAAI,qBAAqB,OAAO,MAAM,CAAC;AAAA,EACxD;AACA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,WAAO,QAAQ,MAAM,qBAAqB,OAAO,MAAM,CAAC;AAAA,EAC1D;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,OAAOA,QAAO;AAAA,MACnB,IAAI,aAAa,EAAE,MAAM,OAAO,MAAM,SAAS,GAAG,CAAC;AAAA,IACrD;AAAA,EACF;AACF,CAAC;AAEH,IAAM,SAAS,CAAC,MAA6B,YAC3CA,QAAO,IAAI,aAAa;AACtB,QAAM,WAAW,OAAO;AACxB,QAAM,SAAS,OAAO,SAAS,IAAI,MAAM,OAAO;AAChD,SAAO,YAAY,MAAM;AACzB,SAAO;AACT,CAAC;AAEI,IAAM,aAAa,CACxB,SACA,QACA,OACA,YACG,OAAO,CAAC,SAAS,QAAQ,GAAG,KAAK,GAAG,OAAO;AAQzC,IAAM,YAAY,CAAC,QAAgB,YACxCA,QAAO,IAAI,aAAa;AACtB,QAAM,WAAW,OAAO;AACxB,QAAM,SAAS,OAAO,SAAS,IAAI,CAAC,WAAW,QAAQ,QAAQ,GAAG,OAAO;AACzE,MAAI,OAAO,SAAS,GAAG;AACrB,QAAI,OAAO,OAAO,SAAS;AACzB,aAAO,QAAQ,MAAM,qBAAqB,OAAO,MAAM,CAAC;AAC1D,WAAO,OAAOA,QAAO;AAAA,MACnB,IAAI,aAAa,EAAE,MAAM,OAAO,MAAM,SAAS,GAAG,CAAC;AAAA,IACrD;AAAA,EACF;AACA,SAAO,OAAO;AAChB,CAAC;AAQI,IAAM,kBAAkB,CAC7B,QACA,UAEA,iBAAiB,sBACb,IAAI,YAAY,EAAE,MAAM,UAAU,SAAS,MAAM,QAAQ,CAAC,IAC1D,IAAI,YAAY;AAAA,EACd,MAAM;AAAA,EACN,SACE,MAAM,QAAQ,SAAS,IACnB,MAAM,UACN,yBAAyB,MAAM,UAAU,MAAM,IAAI;AAC3D,CAAC;AAOA,IAAM,QAAQ,MAAM;AAAA,EACzB;AAAA,EACAA,QAAO,IAAI,aAAa;AACtB,UAAM,KAAK,OAAkB;AAC7B,UAAM,OAAO,OAAY;AACzB,UAAM,UAAU,OAAO;AACvB,UAAM,UAAU,OAAO,KAAK;AAAA,MAC1B,IAAI,IAAI,gCAAgC,YAAY,GAAG;AAAA,IACzD;AACA,UAAM,QAAQ,OAAO,GAAG,OAAO,KAAK,KAAK,SAAS,gBAAgB,CAAC;AACnE,UAAM,MAAM,QAAQ,OAAO;AAC3B,UAAM,SAAS,QACX,CAAC,OAAO,aAAa,SAAS,UAAU,MAAM,iBAAiB,IAC/D,CAAC,MAAM,iBAAiB;AAE5B,WAAO,eAAe,GAAG;AAAA,MACvB,KAAK,CAAC,MAAM,YACVA,QAAO;AAAA,QACLA,QAAO,IAAI,aAAa;AACtB,gBAAM,UAAU,aAAa;AAAA,YAC3B;AAAA,YACA,CAAC,GAAG,QAAQ,GAAG,IAAI;AAAA,YACnB,YAAY,SACR,SACA,EAAE,KAAK,QAAQ,KAAK,OAAO,QAAQ,MAAM;AAAA,UAC/C;AACA,gBAAM,SAAS,OAAO,QAAQ,MAAM,OAAO,EAAE;AAAA,YAC3CA,QAAO;AAAA,cACL,CAAC,UACC,IAAI,oBAAoB;AAAA,gBACtB,SAAS,cAAc,GAAG,KAAK,MAAM,OAAO;AAAA,cAC9C,CAAC;AAAA,YACL;AAAA,UACF;AACA,gBAAM,CAAC,QAAQ,QAAQ,IAAI,IAAI,OAAOA,QAAO;AAAA,YAC3C;AAAA,cACS,gBAAgB,kBAAW,OAAO,MAAM,CAAC;AAAA,cACzC,gBAAgB,kBAAW,OAAO,MAAM,CAAC;AAAA,cAChD,OAAO;AAAA,YACT;AAAA,YACA,EAAE,aAAa,YAAY;AAAA,UAC7B,EAAE;AAAA,YACAA,QAAO;AAAA,cACL,CAAC,UACC,IAAI,oBAAoB;AAAA,gBACtB,SAAS,GAAG,GAAG,2BAA2B,MAAM,OAAO;AAAA,cACzD,CAAC;AAAA,YACL;AAAA,UACF;AACA,iBAAO,EAAE,QAAQ,QAAQ,KAAK;AAAA,QAChC,CAAC;AAAA,MACH;AAAA,IACJ,CAAC;AAAA,EACH,CAAC;AACH;;;AD5LA,SAAS,aAAa,aAAAC,kBAAiB;;;AGJvC,SAAS,WAAAC,UAAS,UAAAC,SAAQ,SAAAC,QAAO,UAAAC,eAAc;AAC/C,YAAY,SAAS;AACrB,YAAYC,aAAY;AACxB,YAAYC,UAAS;;;ACHrB,SAAS,WAAAC,UAAS,SAAAC,QAAO,OAAO,UAAAC,eAAc;AAC9C,YAAYC,UAAS;AAGd,IAAM,qBAAqB;AAG3B,IAAM,qBAAqB;AAG3B,IAAM,2BAA2B;AAkBjC,IAAM,cAAN,cAA0BH,SAAQ,QAGvC,EAAE,oBAAoB,EAAE;AAAC;AAO3B,IAAM,QAAQ,CAAC,OAAyB,SACtCI,QAAO,cAAc,MAAM,OAAO,IAAI,CAAC,EAAE,KAAKA,QAAO,OAAW,eAAU,CAAC;AAE7E,IAAM,gBAAgB,CAAC,SACjB,aAAQ,WAAW,EAAE,EAAE,IAAI;AAU1B,IAAM,aAAa,CAAC,UAAoC;AAC7D,QAAM,MAAM,MAAM,OAAO,iBAAiB;AAC1C,QAAM,OAAO,MAAM,MAAM,MAAM,QAAQ,EAAE;AAAA,IACvC,MAAM;AAAA,MAAK;AAAA,MAAU,MACnBA,QAAO,UAAU,KAAK,MAAM,GAAG,MAAM,IAAI,8BAA8B;AAAA,IACzE;AAAA,IACA,MAAM;AAAA,MAAK;AAAA,MAAS,MAClBA,QAAO;AAAA,QACL,MAAM,OAAO,SAAS;AAAA,QACtB,MAAM,GAAG,MAAM,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,MAAMA,QAAO,UAAU,KAAK,MAAM,GAAG,MAAM,IAAI,UAAU,CAAC;AAAA,EACzE;AACA,QAAM,YAAY,MAAM,aAAa,UAAU,OAAO;AACtD,SAAO,GAAG,cAAc,IAAI,CAAC,GAAG,SAAS,SAAS,SAAS;AAC7D;AAOO,IAAM,gBAAgB,CAC3B,MACA,OACA,SAAgCA,QAAO,KAAK,MAE5C;AAAA,EACEA,QAAO;AAAA,IAAU;AAAA,IAAM,MACrBA,QAAO;AAAA,MAAU,MAAM,OAAO,gBAAgB;AAAA,MAAG,MAC/CA,QAAO,UAAU,QAAQ,MAAM,kBAAkB;AAAA,IACnD;AAAA,EACF;AACF;AAGK,IAAM,mBAAmB,CAC9B,MACA,OACA,SAAgCA,QAAO,KAAK,MAE5C;AAAA,EACEA,QAAO;AAAA,IAAU;AAAA,IAAM,MACrBA,QAAO;AAAA,MAAU,MAAM,OAAO,gBAAgB;AAAA,MAAG,MAC/CA,QAAO,UAAU,QAAQ,MAAM,kBAAkB;AAAA,IACnD;AAAA,EACF;AACF;AAGK,IAAM,kBAAkB,CAC7B,MACA,UAEAA,QAAO;AAAA,EAAU;AAAA,EAAM,MACrBA,QAAO;AAAA,IACL,MAAM,OAAO,kBAAkB;AAAA,IAC/B,MAAM;AAAA,EACR;AACF;AAGK,IAAM,qBAAqB,CAChC,MACA,UAEAA,QAAO,OAAO,IAAI,IAAI,OAAO,MAAM,OAAO,mBAAmB;;;AD5GxD,IAAM,aAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,cAAqB,4BAAoB,KAAK;AAM7C,IAAM,cAAc,CACzB,UAEAC,QAAO,IAAI,aAAa;AACtB,QAAM,QAAY;AAAA,IACZ,QAAQ,WAAM,GAAG,EAAE,KAAK,GAAO,SAAI;AAAA,IACnC;AAAA,EACN;AACA,QAAM,UAAc;AAAA,IAAO;AAAA,IAAO,CAAC,SACjCC,QAAO,OAAO,YAAY,IAAI,CAAC;AAAA,EACjC;AACA,MAAI,CAAK,yBAAqB,OAAO,GAAG;AACtC,WAAO,OAAOD,QAAO;AAAA,MACnB,IAAI,eAAe;AAAA,QACjB,SAAS,yBAA6B,SAAK,SAAS,IAAI,CAAC,gBAAoB,SAAK,YAAY,IAAI,CAAC;AAAA,QACnG,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAQ,yBAAqB,KAAK,GAAG;AACnC,WAAO,OAAOA,QAAO;AAAA,MACnB,IAAI,eAAe;AAAA,QACjB,SAAS,gDAAoD,SAAK,YAAY,IAAI,CAAC;AAAA,QACnF,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAW;AAAA,IACL,aAAa,QAAI,OAAO,CAAC,SAAS,YAAY,IAAI,CAAC,CAAC;AAAA,EAC1D;AACF,CAAC;AAOI,IAAM,SAAN,cAAqBE,SAAQ,QAA6B;AAAA,EAC/D;AACF,EAAE;AAAC;AAGI,IAAMC,SAAQC,OAAM,OAAO,MAAM;AAAA,EACtCJ,QAAO,IAAI,aAAa;AACtB,UAAM,cAAc,OAAO;AAC3B,UAAM,aAAaC,QAAO;AAAA,MACxB,YAAY,OAAO;AAAA,IACrB,EAAE,KAAKA,QAAO,OAAW,eAAU,CAAC;AACpC,UAAM,SAAS,OAAOA,QAAO,MAAM,YAAY;AAAA,MAC7C,QAAQ,MAAMD,QAAO,QAAQ,UAAU;AAAA,MACvC,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,EAC7B,CAAC;AACH;AAMO,IAAM,SAAS,CACpB,QACA,MACAK,SAEI,SAAK,SAAS,IAAI,GAAG,CAAC,UAAc,aAAS,OAAO,QAAQ,KAAK,CAAC,IAClEA,OACAL,QAAO;AAAA,EACL,IAAI,eAAe;AAAA,IACjB,SACE,GAAG,KAAK,IAAI,cAAc,SAAS,IAAI,EAAE,KAAK,GAAG,CAAC,8BAC5B,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,IAEhD,MAAM;AAAA,EACR,CAAC;AACH;;;AEnGN,SAAS,WAAAM,UAAS,UAAAC,UAAQ,SAAAC,QAAO,UAAAC,UAAQ,UAAAC,gBAAc;AACvD,YAAYC,WAAS;AACrB,YAAYC,QAAO;AACnB,YAAYC,QAAO;AACnB,YAAYC,UAAS;;;ACKrB,SAAS,UAAAC,SAAQ,SAAAC,cAAa;AAC9B,YAAYC,UAAS;AACrB,YAAY,SAAS;AACrB,YAAY,aAAa;AACzB,YAAYC,aAAY;AACxB,YAAY,WAAW;AACvB,YAAY,OAAO;AACnB,YAAY,OAAO;AACnB,YAAYC,aAAY;AACxB,YAAY,iBAAiB;AAC7B,YAAY,kBAAkB;AAC9B,YAAY,0BAA0B;AACtC,YAAYC,UAAS;;;ACdrB,YAAYC,aAAY;AAGjB,IAAM,cAAqB,uBAAe;AAAA,EACxC,kBAAU,uBAAuB;AAC1C,EAAE;AAAA,EACO,cAAM,aAAa;AAAA,EACnB,iBAAS;AAAA,IACd,OAAO;AAAA,IACP,aAAa;AAAA,EACf,CAAC;AACH;;;ADMA,IAAM,mBAAmB,EAAE,OAAO,GAAG,OAAO,EAAE;AAE9C,IAAM,mBAA0B;AAAA,EAC9B,CAACC,WAAkB;AACjB,UAAM,CAAC,QAAQ,OAAO,KAAK,QAAQ,OAAO,GAAG,IACvC,WAAM,GAAG,EAAEA,MAAK,EAAE,IAAI,MAAM;AAClC,WAAO,UAAU,iBAAiB,SAAS,SAAS,iBAAiB;AAAA,EACvE;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,aAAa,sCAAsC,iBAAiB,KAAK,gBAAgB,iBAAiB,KAAK;AAAA,IAC/G,SAAS,cAAc,iBAAiB,KAAK,uBAAuB,iBAAiB,KAAK;AAAA,EAC5F;AACF;AAMO,IAAM,YAAmB,eAAO;AAAA,EAC9B,kBAAU,8BAA8B;AACjD,EAAE,MAAM,gBAAgB;AAUjB,IAAM,WAAN,cAA8B,cAAgB,UAAU,EAAE;AAAA,EAC/D,OAAc;AAAA,EACd,MAAa;AACf,CAAC,EAAE;AAAC;AAEJ,IAAM,eAAN,cAAkC,cAAoB,cAAc,EAAE;AAAA,EACpE,OAAc;AAAA,EACd,MAAa,uBAAe;AAAA,IACnB,kBAAU,+CAA+C;AAAA,EAClE;AACF,CAAC,EAAE;AAAC;AAEJ,IAAM,gBAAuB,cAAM,CAAC,cAAqB,cAAM,CAAC,EAAE;AAAA,EACzD;AAAA,IACL;AAAA,IACqB,+BAAU;AAAA,MAC7B,QAAQ,CAAC,UACP,OAAO,UAAU,WACb,IAAI,SAAS,EAAE,OAAO,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC,IAClD,IAAI,SAAS,EAAE,OAAO,MAAM,OAAO,MAAM,MAAM,KAAK,CAAC;AAAA,MAC3D,QAAQ,CAAC,UAAU,MAAM;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;AAGO,IAAM,iBAAwB,cAAM;AAAA,EAClC;AAAA,EACA;AAAA,EACP;AACF,CAAC,EAAE,SAAS;AAAA,EACV,OAAO;AAAA,EACP,aAAa;AACf,CAAC;AAIM,IAAM,aAAoB,iBAAS;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,WAAN,cAA8B,cAAgB,UAAU,EAAE;AAAA,EAC/D,MAAa;AAAA,EACb,MAAa;AAAA,EACb,MAAa,8BAA6B,sBAAc;AAC1D,CAAC,EAAE;AAAC;AAGG,IAAM,kBAAN,cAAqC;AAAA,EAC1C;AACF,EAAE;AAAA,EACA,SAAgB,cAAM,QAAQ;AAChC,CAAC,EAAE;AAAC;AAGG,IAAM,SAAN,cAA4B,cAAc,QAAQ,EAAE;AAAA,EACzD,MAAM;AAAA,EACN,QAAe,8BAAsB,eAAe;AAAA,EACpD,OAAc,8BAA6B,sBAAc;AAAA,EACzD,aAAoB,8BAA6B,iBAAS,CAAC,OAAO,MAAM,CAAC,CAAC;AAC5E,CAAC,EAAE;AAAC;AAGG,IAAM,cAAN,cAAiC,cAAmB,aAAa,EAAE;AAAA,EACxE,MAAa,iBAAS,CAAC,UAAU,UAAU,SAAS,CAAC;AACvD,CAAC,EAAE;AAAC;AAGG,IAAM,SAAN,cAA4B,cAAc,QAAQ,EAAE;AAAA,EACzD,IAAW;AAAA,EACX,MAAM;AAAA,EACN,UAAiB,8BAA6B,eAAO;AACvD,CAAC,EAAE;AAAC;AAGG,IAAM,eAAN,cAAkC,cAAoB,cAAc,EAAE;AAAA,EAC3E,WAAkB,YAAI,MAAa,+BAAuB,CAAC,CAAC;AAAA,EAC5D,SAAgB,YAAI,MAAa,+BAAuB,CAAC,CAAC;AAC5D,CAAC,EAAE;AAAC;AAGG,IAAM,WAAN,cAA8B,cAAgB,UAAU,EAAE;AAAA,EAC/D,MAAa;AAAA,EACb,MAAM;AACR,CAAC,EAAE;AAAC;AAQG,IAAM,iBAAwB,iBAAS,CAAC,QAAQ,UAAU,CAAC;AAI3D,IAAM,kBAAN,cAAqC;AAAA,EAC1C;AACF,EAAE;AAAA,EACA,MAAa;AAAA,EACb,MAAM;AAAA,EACN,SAAgB,8BAAsB,cAAc;AAAA,EACpD,UAAiB,8BAA6B,eAAO;AAAA,EACrD,QAAQ;AACV,CAAC,EAAE;AAAC;AAGG,IAAM,UAAN,cAA6B,cAAe,SAAS,EAAE;AAAA,EAC5D,MAAa;AAAA,EACb,MAAM;AAAA,EACN,UAAiB,8BAA6B,eAAO;AAAA,EACrD,SAAgB,8BAAsB,cAAc;AAAA,EACpD,UAAiB,8BAA6B,eAAO;AAAA;AAAA,EAErD,SAAgB,8BAAsB,cAAc;AAAA;AAAA,EAEpD,eAAsB,8BAA6B,sBAAc;AACnE,CAAC,EAAE;AAAC;AAGG,IAAM,yBAAN,cAA4C;AAAA,EACjD;AACF,EAAE;AAAA,EACA,MAAa,gBAAQ,QAAQ;AAAA,EAC7B,QAAe;AAAA,EACf,UAAiB;AACnB,CAAC,EAAE;AAAC;AAGG,IAAM,mBAAN,cAAsC;AAAA,EAC3C;AACF,EAAE;AAAA,EACA,QAAe,cAAa,sBAAc;AAAA,EAC1C,SAAgB,cAAa,sBAAc;AAAA,EAC3C,QAAe,cAAa,sBAAc;AAC5C,CAAC,EAAE;AAAC;AAGG,IAAM,yBAAN,cAA4C;AAAA,EACjD;AACF,EAAE;AAAA,EACA,MAAa,gBAAQ,QAAQ;AAAA,EAC7B,YAAY;AAAA,EACZ,UAAU;AACZ,CAAC,EAAE;AAAC;AAGG,IAAM,mBAA0B,cAAM;AAAA,EAC3C;AAAA,EACA;AACF,CAAC;AAIM,IAAM,SAAN,cAA4B,cAAc,QAAQ,EAAE;AAAA,EACzD,IAAW;AAAA,EACX,MAAa,iBAAS,CAAC,YAAY,UAAU,QAAQ,QAAQ,CAAC;AAAA,EAC9D,MAAa;AAAA,EACb,QAAe,cAAM,MAAM;AAAA,EAC3B,SAAgB,cAAM,MAAM;AAAA,EAC5B,QAAe,cAAM,OAAO;AAAA,EAC5B,QAAQ;AAAA,EACR,gBAAgB;AAClB,CAAC,EAAE;AAAC;AAGG,IAAM,iBAAN,cAAoC;AAAA,EACzC;AACF,EAAE;AAAA,EACA,MAAa;AAAA,EACb,MAAa;AACf,CAAC,EAAE;AAAC;AAGG,IAAM,SAAN,cAA4B,cAAc,QAAQ,EAAE;AAAA,EACzD,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAY,iBAAS,CAAC,cAAc,eAAe,aAAa,CAAC;AACnE,CAAC,EAAE;AAAC;AAGG,IAAM,iBAAN,cAAoC;AAAA,EACzC;AACF,EAAE;AAAA,EACA,MAAa;AAAA,EACb,MAAM;AACR,CAAC,EAAE;AAAC;AAEG,IAAM,YAAN,cAA+B,cAAiB,WAAW,EAAE;AAAA,EAClE,QAAe;AAAA,EACf,OAAc;AAAA,EACd,cAAqB,8BAAsB,cAAc;AAAA,EACzD,SAAgB,cAAa,sBAAc;AAC7C,CAAC,EAAE;AAAC;AAGG,IAAM,aAAN,cAAgC,cAAkB,YAAY,EAAE;AAAA,EACrE,UAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,QAAe,8BAAsB,WAAW;AAClD,CAAC,EAAE;AAAC;AAGG,IAAM,aAAN,cAAgC,cAAkB,YAAY,EAAE;AAAA,EACrE,MAAa;AAAA,EACb,aAAoB,8BAA6B,cAAM;AAAA,EACvD,OAAc,iBAAS,CAAC,cAAc,YAAY,CAAC;AAAA;AAAA,EAEnD,QAAe,8BAA6B,cAAM,eAAe,CAAC;AACpE,CAAC,EAAE;AAAC;AAGG,IAAM,aAAN,cAAgC,cAAkB,YAAY,EAAE;AAAA,EACrE,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAc,cAAM,MAAM;AAAA,EAC1B,OAAc,cAAM,MAAM;AAAA,EAC1B,UAAU;AACZ,CAAC,EAAE;AAAC;AAGG,IAAM,kBAAN,cAAqC;AAAA,EAC1C;AACF,EAAE;AAAA,EACA,SAAgB;AAAA,EAChB,SAAgB;AAClB,CAAC,EAAE;AAAC;AAGG,IAAM,kBAAN,cAAqC,oBAA6B;AAAA,EACvE;AAAA,EACA,EAAE,QAAe,sBAAc,eAAe,EAAE;AAClD,EAAE;AAAA,EACA,IAAI,UAAkB;AACpB,WAAW;AAAA,MACT,KAAK,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,WAAW,GAAG,KAAK,MAAM,OAAO,EAAE;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AACF;AAKA,IAAM,eAAe,CAAC,UAChB,gBAAW,KAAK,IAAI,EAAM,gBAAW,KAAK,IAAI,EAAE,OAAO,KAAK,CAAC,CAAC;AAEpE,IAAM,YAAY,CAAC,SACjB,KAAK,WAAW,IAAI,KAAK,IAAI,KAAK,IAAI,YAAY,EAAE,KAAK,GAAG,CAAC;AAE/D,IAAM,aAAyB,iCAAqB;AAEpD,IAAM,UAAU,CACd,OACA,SAEA,IAAI,gBAAgB,EAAE,SAAS,UAAU,IAAI,GAAG,SAAS,WAAW,KAAK,EAAE,CAAC;AAE9E,IAAM,gBAAgB,CACpB,OACA,OAAmC,CAAC,MAEpCC,OAAM,MAAM,KAAK,EAAE;AAAA,EACjBA,OAAM;AAAA,IAAI;AAAA,IAAW,CAAC,YACpB,cAAc,QAAQ,OAAW,eAAU,MAAM,QAAQ,IAAI,CAAC;AAAA,EAChE;AAAA,EACAA,OAAM;AAAA,IAAI;AAAA,IAAa,CAAC,cAClB,WAAM,UAAU,QAAQ;AAAA,MAC1B,SAAS,MAAM,CAAC,QAAQ,WAAW,IAAI,CAAC;AAAA,MACxC,YAAY,CAAC,WACP,aAAQ,QAAQ,CAAC,UAAU,cAAc,OAAO,IAAI,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AAAA,EACAA,OAAM;AAAA,IAAI;AAAA,IAAS,CAAC,UACd,WAAM,MAAM,QAAQ;AAAA,MACtB,SAAS,MAAM,CAAC,QAAQ,OAAO,IAAI,CAAC;AAAA,MACpC,YAAY,CAAC,WACP,aAAQ,QAAQ,CAAC,UAAU,cAAc,OAAO,IAAI,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AAAA,EACAA,OAAM;AAAA,IAAI;AAAA,IAAU,CAACC,aACnBD,OAAM,MAAMC,SAAO,KAAK,EAAE;AAAA,MACxBD,OAAM,IAAI,gBAAgB,MAAM,CAAC,QAAQC,UAAQ,IAAI,CAAC,CAAC;AAAA,MACvDD,OAAM,OAAO,CAAC,UAAU,cAAc,OAAO,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EACAA,OAAM,IAAI,YAAY,CAAC,aAAa,cAAc,SAAS,OAAO,IAAI,CAAC;AAAA,EACvEA,OAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,MAAM,IAAI,CAAC,CAAC;AAC9C;AAEF,IAAM,mBAAmB,CAAC,MAAuB,SAC/C,KAAK,YAAY,KAAK,WAAW,KAAK,YAAY,KAAK;AAEzD,IAAM,YAAY,CAAC,SACjB,KAAK;AAAA,EACH;AAAA,EACA,CAAC,MAAcD,QAAgB,YAC7B,OAAOA,WAAU,YAAY,SAAS,WAAW,SAC7C,QAAQ,KAAK,QAAQ,MAAM,IACzB,EAAE,OAAAA,QAAO,MAAM,QAAQ,OAAO,IAC9BA,SACFA;AACR;AASK,IAAM,mBAAmBG,QAAO,GAAG,mBAAmB,EAAE,WAC7D,OACA;AACA,QAAMH,SACJ,OAAO,UAAU,WACb,OAAOG,QAAO,IAAI;AAAA,IAChB,KAAK,MAAM,UAAU,KAAK;AAAA,IAC1B,OAAO,CAAC,UACN,IAAI,gBAAgB;AAAA,MAClB,QAAQ;AAAA,QACN,IAAI,gBAAgB;AAAA,UAClB,SAAS;AAAA,UACT,SAAS,iBAAiB,OAAO,KAAK,CAAC;AAAA,QACzC,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACL,CAAC,IACD;AACN,SAAO,OAAoB,iCAAoB,YAAY;AAAA,IACzD,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB,CAAC,EAAEH,MAAK,EAAE;AAAA,IACRG,QAAO,SAAS,CAAC,UAAU;AACzB,YAAM,SAAa,gBAAW,cAAc,KAAK,GAAG,gBAAgB;AACpE,aAAO,IAAI,gBAAgB;AAAA,QACzB,QAAY,WAAM,QAAQ;AAAA,UACxB,SAAS,MAAM,CAAC,QAAQ,OAAO,CAAC,CAAC,CAAC;AAAA,UAClC,YAAY,CAAC,aAAa;AAAA,QAC5B,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF,CAAC;AAGD,IAAM,kBAAkB,CAAC,OAA4B;AACnD,QAAM,EAAE,QAAQ,SAAS,YAAY,aAAa,GAAG,SAAS,IAAI,GAAG;AACrE,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,UAAU;AAAA,MACR,GAAG,GAAG;AAAA,MACN,QAAe,cAAM,GAAG,SAAS,QAAQ;AAAA,QACvC,QAAQ,MAAM;AAAA,QACd,QAAQ,CAAC,WACP,OAAO,IAAI,CAAC,WAAW;AAAA,UACrB,GAAG;AAAA,UACH,QAAQ,EAAE,GAAG,MAAM,QAAQ,MAAM,OAAU;AAAA,QAC7C,EAAE;AAAA,MACN,CAAC;AAAA,IACH;AAAA,IACA,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU;AAAA,MAC7B,GAAG;AAAA,MACH,QAAQ,EAAE,GAAG,KAAK,QAAQ,MAAM,OAAU;AAAA,IAC5C,EAAE;AAAA,EACJ;AACF;AAOA,IAAM,iBAAiB,CAACH,WAA2B;AACjD,MAAIA,kBAAiB,SAAU,QAAOA,OAAM;AAC5C,MAAW,iBAASA,MAAK,GAAG;AAC1B,WAAc,cAAMA,QAAO;AAAA,MACzB,QAAQ,MAAM;AAAA,MACd,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,MAAI,MAAM,QAAQA,MAAK,GAAG;AACxB,WAAO,IAAQ,SAAIA,QAAO,cAAc,EAAE,KAAK,GAAG,CAAC;AAAA,EACrD;AACA,MAAM,WAASA,MAAK,GAAG;AACrB,UAAM,UAAc;AAAA,MACd;AAAA,QACF,OAAO,QAAQA,MAAK;AAAA,QACd;AAAA,UACE;AAAA,UACN,CAAC,UAAsC,MAAM,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,MACA,CAAC,CAACI,MAAKC,MAAK,MAAM;AAChB,YAAIA,WAAU,OAAW,QAAO,CAAC;AACjC,YAAW,iBAASA,MAAK,KAAY,eAAOA,MAAK,EAAG,QAAO,CAAC;AAC5D,eAAO,CAAC,GAAG,KAAK,UAAUD,IAAG,CAAC,IAAI,eAAeC,MAAK,CAAC,EAAE;AAAA,MAC3D;AAAA,IACF;AACA,WAAO,IAAI,QAAQ,KAAK,GAAG,CAAC;AAAA,EAC9B;AACA,SAAO,KAAK,UAAUL,MAAK;AAC7B;AAMO,IAAM,gBAAgB,CAAC,OAA2B,eAAe,EAAE;AAMnE,IAAM,WAAWG,QAAO,GAAG,iBAAiB,EAAE,WACnD,IACA;AACA,QAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,eAAe,gBAAgB,EAAE,CAAC,CAAC;AAC1E,QAAMG,UAAS,OAAOH,QAAO,WAAW;AAAA,IACtC,KAAK,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAAA,IAChD,OAAO,CAAC,UACN,IAAI,gBAAgB;AAAA,MAClB,QAAQ;AAAA,QACN,IAAI,gBAAgB;AAAA,UAClB,SAAS;AAAA,UACT,SAAS,uBAAuB,OAAO,KAAK,CAAC;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AACD,SAAO,UAAc,WAAO,IAAI,WAAWG,OAAM,CAAC,CAAC;AACrD,CAAC;AAGM,IAAM,mBAA0B,iBAAS;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,oBAAN,cAAuC;AAAA,EAC5C;AACF,EAAE;AAAA,EACA,MAAM;AAAA,EACN,MAAa;AAAA,EACb,SAAgB;AAClB,CAAC,EAAE;AAAC;AAGG,IAAM,0BAAN,cAA6C,oBAAqC;AAAA,EACvF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAa;AAAA,IACb,SAAgB;AAAA,EAClB;AACF,EAAE;AAAC;AAEH,IAAM,aAAa,CAACC,YACd;AAAA,EACE;AAAA,IACA,SAAW,aAAQA,SAAQ,MAAM,CAAC;AAAA,IACpC,CAAC,UAAU,MAAM,SAAS;AAAA,EAC5B;AAAA,EACA,CAAC,UAAU,MAAM,CAAC;AACpB;AAEF,IAAM,cAAc,CAAC,OAA8B,SAC7C,UAAK,OAAO,CAAC,SAAS,KAAK,GAAG,SAAS,IAAI;AAEjD,IAAM,cAAc,CAAC,OAA8B,SAC7C,UAAK,OAAO,CAAC,SAAS,KAAK,KAAK,SAAS,IAAI;AAEnD,IAAM,YAAY,CAChB,OACA,MACA,SAEI,aAAQ,OAAO,CAAC,SAAS,KAAK,GAAG,SAAS,QAAQ,KAAK,GAAG,SAAS,IAAI;AAE7E,IAAM,UAAU,CAAC,UACf,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAE7B,IAAM,YAAY,CAChB,MACA,UAEI,YAAO,IAAI,MAAU,YAAO,KAAK,KACjC,WAAM,MAAM,CAAC,SAAa,cAAS,OAAO,IAAI,CAAC;AAGrD,IAAM,WAAW,CACf,OACA,UACG;AACH,QAAM,WAAe;AAAA,IACnB;AAAA,IACQ;AAAA,MACN,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAU;AAAA,IAC3C;AAAA,IACA,CAAC,QAAQ,SACC;AAAA,MACN;AAAA,MACA,KAAK,GAAG;AAAA,MACD,YAAI,CAAC,MAAc,IAAI,CAAC;AAAA,IACjC;AAAA,EACJ;AACA,QAAM,QAAY;AAAA,IACZ;AAAA,MAAO;AAAA,MAAO,CAAC,SACV,iBAAiB,YAAI,UAAU,KAAK,EAAE,GAAG,CAAC;AAAA,IACnD;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,EACjB;AACA,QAAM,OAAO,CACX,SACA,UAEI,WAAM,OAAO;AAAA,IACf,SAAS,MAAM,CAAS,gBAAQ,OAAO;AAAA,IACvC,YAAY,CAAC,CAACC,OAAS,OAAI,MAAM;AAC/B,YAAM,CAAC,MAAM,MAAM,IAAQ;AAAA,QACrB,YAAO,OAAO,CAAC,SAAS,KAAK,KAAK,SAASA,KAAI;AAAA,QACnD,CAAC,MAAc,eAAO,SAASA,KAAI,CAAC;AAAA,QACpC,CAAC,CAAC,WAAW,OAAO,GAAG,SAAS;AAC9B,gBAAM,cAAsB;AAAA,YAC1B;AAAA,YACA,KAAK,GAAG;AAAA,YACD,YAAI,CAAC,MAAc,IAAI,CAAC;AAAA,UACjC;AACA,iBAAc,iBAAiB,YAAI,aAAa,KAAK,GAAG,IAAI,GAAG,CAAC,IAC3D,CAAK,YAAO,WAAW,KAAK,GAAG,IAAI,GAAG,WAAW,IACjD,CAAC,WAAW,WAAW;AAAA,QAC9B;AAAA,MACF;AACA,aAAO,KAAK,QAAQ,IAAI;AAAA,IAC1B;AAAA,EACF,CAAC;AACH,SAAO,KAAK,UAAU,KAAK;AAC7B;AAQO,IAAM,mBAAmB,CAC9B,OACqC;AACrC,QAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAC9C,QAAM,QAAQ,CACZ,MACA,MACA,YACsB,IAAI,kBAAkB,EAAE,MAAM,MAAM,QAAQ,CAAC;AAErE,QAAM,iBAAiB,WAAW,OAAO,EAAE;AAAA,IAAI,CAAC,OAC9C,MAAM,qBAAqB,UAAU,EAAE,IAAI,YAAY,EAAE,iBAAiB;AAAA,EAC5E;AAEA,QAAM,iBAAqB;AAAA,IAAQ,GAAG;AAAA,IAAO,CAAC,SACxC;AAAA,MACF,WAAW,QAAQ,KAAK,MAAM,CAAC,EAAE;AAAA,QAAI,CAAC,OACpC;AAAA,UACE;AAAA,UACA,UAAU,KAAK,EAAE,WAAW,EAAE;AAAA,UAC9B,eAAe,EAAE,2BAA2B,KAAK,EAAE;AAAA,QACrD;AAAA,MACF;AAAA,MACA,WAAW,QAAQ,KAAK,OAAO,CAAC,EAAE;AAAA,QAAI,CAAC,OACrC;AAAA,UACE;AAAA,UACA,UAAU,KAAK,EAAE,YAAY,EAAE;AAAA,UAC/B,gBAAgB,EAAE,2BAA2B,KAAK,EAAE;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAsB;AAAA,IAAQ,GAAG;AAAA,IAAO,CAAC,SAC7C,WAAW,KAAK,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,EAAE;AAAA,MAAI,CAAC,SACtD;AAAA,QACE;AAAA,QACA,UAAU,KAAK,EAAE,WAAW,IAAI;AAAA,QAChC,cAAc,IAAI,2BAA2B,KAAK,EAAE;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAmB,aAAQ,GAAG,OAAO,CAAC,MAAM,UAAU;AAC1D,UAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,KAAK,IAAI;AAC/D,UAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,GAAG,IAAI;AAC3D,UAAM,WAAqC,CAAC;AAC5C,QACE,SAAS,UACT,CAAK,cAAS,QAAQ,KAAK,OAAO,GAAG,KAAK,KAAK,IAAI,GACnD;AACA,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK,YAAY,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,UAAa,CAAK,cAAS,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG;AACvE,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK,YAAY,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,YAAgB;AAAA,IAAQ,GAAG;AAAA,IAAO,CAAC,SACnC,aAAQ,KAAK,QAAQ,CAAC,SAAS;AACjC,YAAM,WAAkB,kBAAU,KAAK,UAAU,MAAM,KAAK;AAC5D,YAAM,QAAQ,UAAU,GAAG,OAAO,KAAK,IAAI,KAAK,EAAE;AAClD,YAAM,QAAQ,WAAW,UAAU,IAAI,SAAS;AAChD,aAAO,QACH,CAAC,IACD;AAAA,QACE;AAAA,UACE;AAAA,UACA,UAAU,KAAK,EAAE,WAAW,KAAK,EAAE;AAAA,UACnC,UAAU,KAAK,EAAE,IAAI,KAAK,EAAE,SAAS,KAAK,6BAA6B,WAAW,gBAAgB,aAAa;AAAA,QACjH;AAAA,MACF;AAAA,IACN,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,SAAS,GAAG,OAAO,GAAG,KAAK,IACrC;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,IACA,CAAC;AAEL,QAAM,gBAAoB;AAAA,IACxB,GAAG;AAAA,IACH,CAAC,SAAS,CAAC,YAAY,GAAG,OAAO,KAAK,EAAE;AAAA,EAC1C,IACI,CAAC,IACD,CAAC,MAAM,kBAAkB,UAAU,iCAAiC,CAAC;AACzE,QAAM,cAAkB;AAAA,IACtB,GAAG;AAAA,IACH,CAAC,SAAS,CAAC,YAAY,GAAG,OAAO,KAAK,EAAE;AAAA,EAC1C,IACI,CAAC,IACD,CAAC,MAAM,gBAAgB,UAAU,+BAA+B,CAAC;AAErE,QAAM,SAAa,aAAQ,GAAG,OAAO,CAAC,SAAS;AAC7C,QAAI,EAAE,KAAK,0BAA0B,wBAAyB,QAAO,CAAC;AACtE,UAAM,WACJ,UAAU,KAAK,eAAe,SAAS,QAAQ,QAAQ,KAAK,MAAM,CAAC,KACnE,UAAU,KAAK,eAAe,SAAS,SAAS,QAAQ,KAAK,OAAO,CAAC;AACvE,WAAO,WACH,CAAC,IACD;AAAA,MACE;AAAA,QACE;AAAA,QACA,UAAU,KAAK,EAAE;AAAA,QACjB,gBAAgB,KAAK,EAAE;AAAA,MACzB;AAAA,IACF;AAAA,EACN,CAAC;AAED,QAAM,aACJ,GAAG,QAAQ,MAAM,WAAW,IACxB;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,IACA,CAAC;AAEP,SAAW,aAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,IAAM,eAAe,CAAC,MAAuB,UACvC,YAAO,KAAK,OAAO,MAAU,YAAO,MAAM,OAAO,KACjD;AAAA,EAAM,KAAK;AAAA,EAAS,CAAC,WACnB;AAAA,IACF,MAAM;AAAA,IACN,CAAC,cACC,UAAU,SAAS,OAAO,QAC1B,UAAU,SAAS,OAAO,QACnB,kBAAU,UAAU,MAAM,MAAM,EAAE,MAChC,kBAAU,OAAO,MAAM,MAAM,EAAE;AAAA,EAC5C;AACF;AAIK,IAAM,kBAAkB,CAAC,MAAc,OAAwB;AACpE,MAAI,KAAK,SAAS,YAAY,GAAG,SAAS,SAAU,QAAO;AAC3D,MAAI,KAAK,SAAS,GAAG,KAAM,QAAO;AAClC,MACS,eAAO,KAAK,KAAK,KACjB,eAAO,GAAG,KAAK,KACtB,KAAK,MAAM,UAAU,GAAG,MAAM;AAE9B,WAAO;AACT,MAAW,eAAO,KAAK,MAAM,KAAY,eAAO,GAAG,MAAM;AACvD,WAAO,aAAa,KAAK,OAAO,OAAO,GAAG,OAAO,KAAK;AACxD,SAAO,EACE,eAAO,KAAK,WAAW,KACvB,eAAO,GAAG,WAAW,KAC5B,KAAK,YAAY,UAAU,GAAG,YAAY;AAE9C;AAEA,IAAM,sBAAsB,CAC1BR,QACA,SAEAC,OAAM,MAAM,IAAI,EAAE;AAAA,EAChBA,OAAM,KAAK,UAAU,MAAM,OAAOD,WAAU,QAAQ;AAAA,EACpDC,OAAM,KAAK,WAAW,MAAM,OAAOD,WAAU,SAAS;AAAA,EACtDC,OAAM,KAAK,UAAU,MAAMD,kBAAiB,QAAQ;AAAA,EACpDC,OAAM;AACR;AAQK,IAAM,iBAAiB,CAC5B,OACqC;AACrC,QAAM,QAAQ,CACZ,MACA,MACA,YACsB,IAAI,kBAAkB,EAAE,MAAM,MAAM,QAAQ,CAAC;AAErE,QAAM,QAAQ,GAAG;AACjB,QAAM,WAAW,CAAC,OAAe,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACpE,QAAMQ,UAAS,CAAC,MAAc,IAAY,SACxC,KAAK,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AAE1C,QAAM,QAAY,aAAQ,GAAG,OAAO,CAAC,MAAM,UAAU;AACnD,UAAM,WAAW,SAAS,KAAK,KAAK,IAAI;AACxC,UAAM,SAAS,SAAS,KAAK,GAAG,IAAI;AACpC,UAAM,OAAO,YAAYA,QAAO,UAAU,KAAK,KAAK,MAAM,SAAS;AACnE,UAAM,KAAK,UAAUA,QAAO,QAAQ,KAAK,GAAG,MAAM,QAAQ;AAE1D,QAAI,CAAC,QAAQ,CAAC,MAAM,gBAAgB,KAAK,MAAM,GAAG,IAAI,EAAG,QAAO,CAAC;AACjE,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK,UAAU,KAAK,KAAK,IAAI,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,oBAAoB,GAAG,KAAK,IAAI;AAAA,MAC1G;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,SAAa;AAAA,IAAQ,GAAG;AAAA,IAAO,CAAC,SAChC;AAAA,MAAQ,KAAK;AAAA,MAAQ,CAAC,UACjB,cAAM,MAAM,SAAS;AAAA,QAC1B,QAAQ,MAAM,CAAC;AAAA,QACf,QAAQ,CAACT,WACP,oBAAoBA,QAAO,MAAM,KAAK,IAAI,IACtC,CAAC,IACD;AAAA,UACE;AAAA,YACE;AAAA,YACA,UAAU,KAAK,EAAE,WAAW,MAAM,IAAI;AAAA,YACtC,eAAe,KAAK,EAAE,IAAI,MAAM,IAAI,cAAc,MAAM,KAAK,IAAI;AAAA,UACnE;AAAA,QACF;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAW,eAAU,OAAO,MAAM;AACpC;AASO,IAAM,qBAAqBG,QAAO,GAAG,qBAAqB,EAAE,WACjE,IACA;AACA,QAAM,CAAC,KAAK,IAAQ,eAAU,iBAAiB,EAAE,GAAG,eAAe,EAAE,CAAC;AACtE,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,OAAOA,QAAO;AAAA,IACnB,IAAI,wBAAwB;AAAA,MAC1B,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AACF,CAAC;;;AEx3BD,YAAYO,aAAY;AAGjB,IAAM,aAAN,cAAgC,cAAkB,YAAY,EAAE;AAAA,EACrE,IAAW,YAAI,WAAW;AAAA,EAC1B,QAAe;AAAA,EACf,MAAa;AAAA,EACb,OAAc;AAChB,CAAC,EAAE;AAAC;AAQG,IAAM,qBAAN,cAAwC;AAAA,EAC7C;AACF,EAAE;AAAA,EACA,IAAW,YAAI,oBAAoB;AAAA,EACnC,MAAa;AAAA,EACb,OAAc;AAChB,CAAC,EAAE;AAAC;AAGG,IAAM,gBAAN,cAAmC,cAAqB,eAAe;AAAA,EAC5E;AAAA,IACE,IAAW,YAAI,eAAe;AAAA,IAC9B,QAAe;AAAA,IACf,MAAa;AAAA,EACf;AACF,EAAE;AAAC;AAGI,IAAM,mBAAN,cAAsC;AAAA,EAC3C;AACF,EAAE;AAAA,EACA,IAAW,YAAI,iBAAiB;AAAA,EAChC,aAAoB;AACtB,CAAC,EAAE;AAAC;AAGG,IAAM,eAAN,cAAkC,cAAoB,cAAc,EAAE;AAAA,EAC3E,IAAW,YAAI,aAAa;AAAA,EAC5B,SAAgB,eAAc,gBAAe,YAAI;AACnD,CAAC,EAAE;AAAC;AAGG,IAAM,YAAN,cAA+B,cAAiB,WAAW,EAAE;AAAA,EAClE,IAAW,YAAI,UAAU;AAAA,EACzB,UAAiB;AAAA,EACjB,UAAiB;AAAA,EACjB,QAAe;AAAA,EACf,QAAe;AACjB,CAAC,EAAE;AAAC;AAGG,IAAM,eAAN,cAAkC,cAAoB,cAAc,EAAE;AAAA,EAC3E,IAAW,YAAI,aAAa;AAAA,EAC5B,UAAiB;AAAA,EACjB,UAAiB;AAAA,EACjB,QAAe;AAAA,EACf,QAAe;AACjB,CAAC,EAAE;AAAC;AAGG,IAAM,OAAc,cAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,EACE,KAAY,sBAAc,IAAI,CAAC,EAC/B,SAAS;AAAA,EACR,OAAO;AAAA,EACP,aAAa;AACf,CAAC;;;AC7EH,SAAS,UAAAC,SAAQ,UAAAC,gBAAc;AAC/B,YAAYC,aAAY;AACxB,SAAS,YAAY,mBAAmB,0BAA0B;AAI3D,IAAM,mBAAN,cAA+BC,SAAO,YAA8B;AAAA,EACzE;AAAA,EACA;AAAA,IACE,WAAWA,SAAO;AAAA,IAClB,SAASA,SAAO;AAAA,IAChB,QAAQA,SAAO,oBAAoBA,SAAO,KAAK;AAAA,MAC7C,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACD,MAAMA,SAAO,oBAAoBA,SAAO,QAAQ;AAAA,MAC9C,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACF,EAAE;AAAC;AAGI,IAAM,eAAN,cAA2BA,SAAO,MAAoB,cAAc,EAAE;AAAA,EAC3E,YAAYA,SAAO;AAAA,EACnB,QAAQA,SAAO;AAAA,EACf,aAAaA,SAAO;AACtB,CAAC,EAAE;AAAC;AAGG,IAAM,kBAAN,cAA8BA,SAAO;AAAA,EAC1C;AACF,EAAE;AAAA,EACA,IAAIA,SAAO;AAAA,EACX,QAAQA,SAAO;AAAA,EACf,aAAaA,SAAO;AACtB,CAAC,EAAE;AAAC;AAGG,IAAM,mBAAN,cAA+BA,SAAO;AAAA,EAC3C;AACF,EAAE;AAAA,EACA,UAAU;AAAA,EACV,IAAIA,SAAO;AACb,CAAC,EAAE;AAAC;AAGG,IAAM,oBAAN,cAAgCA,SAAO;AAAA,EAC5C;AACF,EAAE;AAAA,EACA,YAAYA,SAAO;AAAA,EACnB,QAAQA,SAAO;AAAA,EACf,aAAaA,SAAO;AAAA,EACpB,gBAAgBA,SAAO;AACzB,CAAC,EAAE;AAAC;AAGG,IAAM,kBAAN,cAA8BA,SAAO;AAAA,EAC1C;AACF,EAAE;AAAA,EACA,IAAIA,SAAO;AAAA,EACX,gBAAgBA,SAAO;AAAA,EACvB,UAAUA,SAAO;AAAA,EACjB,OAAOA,SAAO,MAAM,IAAI;AAAA,EACxB,WAAWA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACtC,QAAQA,SAAO,SAAS,CAAC,QAAQ,WAAW,YAAY,YAAY,CAAC;AAAA,EACrE,WAAWA,SAAO;AACpB,CAAC,EAAE;AAAC;AA2BG,IAAM,oBAAN,cAAgCA,SAAO;AAAA,EAC5C;AACF,EAAE;AAAA,EACA,IAAIA,SAAO;AAAA,EACX,QAAQA,SAAO;AAAA,EACf,aAAaA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACxC,eAAeA,SAAO;AAAA,EACtB,qBAAqBA,SAAO;AAAA,EAC5B,iBAAiBA,SAAO;AAAA,EACxB,YAAYA,SAAO;AAAA,EACnB,WAAWA,SAAO;AAAA,EAClB,SAASA,SAAO;AAAA,IACdA,SAAO,OAAO;AAAA,MACZ,MAAMA,SAAO;AAAA,MACb,aAAaA,SAAO,OAAOA,SAAO,MAAM;AAAA,MACxC,cAAcA,SAAO,OAAOA,SAAO,MAAM;AAAA,IAC3C,CAAC;AAAA,EACH;AACF,CAAC,EAAE;AAAC;AAIG,IAAM,iBAAiBA,SAAO,SAAS;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,aAAN,cAAyBA,SAAO,MAAkB,YAAY,EAAE;AAAA,EACrE,MAAM;AAAA,EACN,aAAaA,SAAO;AAAA,EACpB,eAAeA,SAAO;AAAA,EACtB,oBAAoBA,SAAO;AAAA,EAC3B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAASA,SAAO;AAAA,IACdA,SAAO,OAAO;AAAA,MACZ,MAAMA,SAAO;AAAA,MACb,MAAMA,SAAO;AAAA,QACXA,SAAO,OAAO;AAAA,UACZ,MAAMA,SAAO;AAAA,UACb,cAAcA,SAAO,OAAOA,SAAO,MAAM;AAAA,QAC3C,CAAC;AAAA,MACH;AAAA,MACA,OAAOA,SAAO;AAAA,QACZA,SAAO,OAAO;AAAA,UACZ,MAAMA,SAAO;AAAA,UACb,cAAcA,SAAO,OAAOA,SAAO,MAAM;AAAA,QAC3C,CAAC;AAAA,MACH;AAAA,MACA,SAASA,SAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EACA,SAASA,SAAO;AAAA,IACdA,SAAO,OAAO;AAAA,MACZ,KAAKA,SAAO;AAAA,MACZ,MAAMA,SAAO;AAAA,MACb,OAAOA,SAAO;AAAA,MACd,OAAOA,SAAO,OAAOA,SAAO,MAAM;AAAA,IACpC,CAAC;AAAA,EACH;AACF,CAAC,EAAE;AAAC;AAGG,IAAM,mBAAN,cAA+BA,SAAO;AAAA,EAC3C;AACF,EAAE;AAAA,EACA,KAAKA,SAAO,OAAO;AAAA,IACjB,IAAIA,SAAO;AAAA,IACX,QAAQA,SAAO;AAAA,IACf,aAAaA,SAAO,OAAOA,SAAO,MAAM;AAAA,IACxC,mBAAmBA,SAAO,SAASA,SAAO,MAAM;AAAA,EAClD,CAAC;AAAA,EACD,mBAAmBA,SAAO;AAAA,EAC1B,kBAAkBA,SAAO,MAAM,iBAAiB;AAClD,CAAC,EAAE;AAAC;AAqDJ,IAAM,YAAN,cAAwBA,SAAO,MAAiB,WAAW,EAAE;AAAA,EAC3D,SAASA,SAAO,SAASA,SAAO,MAAM;AAAA,EACtC,MAAMA,SAAO,SAASA,SAAO,MAAM;AAAA,EACnC,MAAMA,SAAO;AAAA,IACXA,SAAO,OAAO,EAAE,MAAMA,SAAO,SAASA,SAAO,MAAM,EAAE,CAAC;AAAA,EACxD;AACF,CAAC,EAAE;AAAC;AAGJ,IAAM,cAAN,cAA0BA,SAAO,MAAmB,aAAa,EAAE;AAAA,EACjE,MAAMA,SAAO;AACf,CAAC,EAAE;AAAC;AAEJ,IAAM,YAAYA,SAAO,OAAO;AAAA,EAC9B,MAAMA,SAAO,SAAS,SAAS;AAAA,EAC/B,SAASA,SAAO,SAASA,SAAO,MAAM;AACxC,CAAC;AAED,IAAM,aAAaA,SAAO;AAAA,EACxBA,SAAO,eAAeA,SAAO,OAAO;AACtC;AAGA,IAAM,YAAY,CAAC,SACV;AAAA,EAAQ,WAAW,IAAI;AAAA,EAAG,CAAC,WAChCA,SAAO,oBAAoB,SAAS,EAAE,MAAM,EAAE;AAAA,IACrC;AAAA,MAAQ,CAAC,SACP;AAAA,QAAc,sBAAc,KAAK,IAAI;AAAA,QAAG,MACtC;AAAA,UACE,sBAAc,KAAK,OAAO;AAAA,UACjC,CAAC,YAAY,IAAI,UAAU,EAAE,QAAQ,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEF,IAAM,WAAW,CAAC,aAChB,SAAS;AAEX,IAAM,UAAU,CACd,WACA,SACA,QACA,SAEA,IAAI,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAYH,IAAM,UAAU,CACd,SACA,WACA,MACA,QACA,SAAiB,aAEjB,UAA4C,CAAC,MAE7CC,QAAO,IAAI,aAAa;AACtB,MAAI,CAAC,yBAAyB,KAAK,SAAS,GAAG;AAC7C,WAAO,OAAOA,QAAO;AAAA,MACnB;AAAA,QACE;AAAA,QACA;AAAA,QACO,aAAK;AAAA,QACL,aAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,QAAQ,OAAO,kBAAkB;AAAA,IACrC,GAAG,QAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,EAC9C,EAAE;AAAA,IACA,kBAAkB,YAAY,QAAQ,MAAM;AAAA,IAC5C,kBAAkB,WAAW,OAAO;AAAA;AAAA;AAAA,IAGpC,kBAAkB,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IACzCA,QAAO;AAAA,MAAS,CAAC,UACf;AAAA,QACE;AAAA,QACA,8BAA8B,MAAM,OAAO;AAAA,QACpC,aAAK;AAAA,QACL,aAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,OAAO,OACrB,QAAQ,KAAK,EACb;AAAA,IACCA,QAAO;AAAA,MAAS,CAAC,UACf;AAAA,QACE;AAAA,QACA,gBAAgB,QAAQ,MAAM,KAAK,MAAM,OAAO;AAAA,QACzC,aAAK;AAAA,QACL,aAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF,MAAI,SAAS,QAAQ,IAAI,OAAO,SAAS,QAAQ,KAAK,KAAK;AACzD,UAAM,OAAO,OAAO,SAAS,KAAK,KAAKA,QAAO,cAAc,MAAM,EAAE,CAAC;AACrE,WAAO,OAAOA,QAAO;AAAA,MACZ,cAAM,UAAU,IAAI,GAAG;AAAA,QAC5B,QAAQ,MACN;AAAA,UACE;AAAA,UACA,oBAAoB,SAAS,QAAQ,CAAC;AAAA,UAC/B,aAAK,SAAS,QAAQ,CAAC;AAAA,UACvB,aAAK;AAAA,QACd;AAAA,QACF,QAAQ,CAAC,UACP;AAAA,UACE;AAAA,UACA,MAAM,WAAW,oBAAoB,SAAS,QAAQ,CAAC;AAAA,UAChD,aAAK,SAAS,QAAQ,CAAC;AAAA,UACvB;AAAA,YAAc,sBAAc,MAAM,IAAI;AAAA,YAAG,MACvC;AAAA,cAAe,sBAAc,MAAM,IAAI;AAAA,cAAG,CAAC,SACzC,sBAAc,KAAK,IAAI;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,OAAO,mBAAmB,eAAe,WAAW,EAAE,QAAQ,EAAE;AAAA,IACrEA,QAAO;AAAA,MAAQ,CAAC,aACdD,SAAO,oBAAoB,MAAM,EAAE,SAAS,IAAI;AAAA,IAClD;AAAA,IACAC,QAAO;AAAA,MAAS,CAAC,UACf;AAAA,QACE;AAAA,QACA,2BAA2B,MAAM,OAAO;AAAA,QACjC,aAAK,SAAS,QAAQ,CAAC;AAAA,QACvB,aAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGI,IAAM,aAAa;AAGnB,IAAM,gBAAgB,CAAC,UACrB,iBAAS,MAAM,QAAQ,GAAG,KAC1B,iBAAS,MAAM,MAAM,cAAc;AAMrC,IAAM,aAAa,CAAC,aAIP;AAAA,EAClB,MAAM,MACJ;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,YAAY,QAAQ,WAAW;AAAA,IACjCD,SAAO,OAAO,YAAY;AAAA,EAC5B,EAAE,KAAKC,QAAO,IAAW,qBAAa,CAAC;AAAA,EACzC,UAAU,CAAC,eACT;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,YAAY,QAAQ,YAAY,WAAW;AAAA,IAC7C;AAAA,EACF;AAAA,EACF,SAAS,CAAC,UACR;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,MAAM;AAAA,MAClB,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM;AAAA,MACd,kBAAkB,MAAM;AAAA,MACxB,gBAAgB,MAAM;AAAA,MACtB,SAAS,MAAM,WAAW;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAAA,EACF,WAAW,CAACC,WAAS,CAAC,MACpB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,QAAQ;AAAA,MACpB,QAAQA,SAAO,UAAU;AAAA,MACzB,MAAMA,SAAO,QAAQ;AAAA,IACvB;AAAA,IACAF,SAAO,MAAM,eAAe;AAAA,EAC9B;AAAA,EACF,SAAS,CAAC,UACR;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,MAAM;AAAA,MAClB,gBAAgB,MAAM;AAAA,MACtB,OAAO,MAAM;AAAA,MACb,WAAW,MAAM;AAAA,IACnB;AAAA,IACAA,SAAO,OAAO,EAAE,YAAYA,SAAO,eAAe,CAAC;AAAA,EACrD;AAAA,EACF,QAAQ,CAAC,eACP;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,YAAY,YAAY,WAAW;AAAA,IACrCA,SAAO,OAAO,EAAE,IAAIA,SAAO,QAAQ,CAAC;AAAA,EACtC,EAAE,KAAKC,QAAO,MAAM;AAAA,EACtB,WAAW,CAAC,UACV;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,QAAQ;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,iBAAiB,MAAM;AAAA,MACvB,YAAY,MAAM,cAAc;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACF,SAAS,CAAC,cAAc,kBACtB;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,cAAc,cAAc;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACJ;;;ACrdA,SAAS,UAAAE,SAAQ,UAAAC,SAAQ,SAAAC,QAAO,UAAAC,gBAAsB;AACtD,YAAYC,UAAS;AACrB,YAAYC,iBAAgB;AAC5B,YAAYC,WAAU;AACtB,YAAYC,QAAO;;;ACGnB,SAAS,QAAQ,UAAAC,SAAQ,SAAAC,QAAO,UAAAC,gBAAc;AAC9C,YAAYC,UAAS;AACrB,YAAYC,aAAY;AACxB,YAAYC,YAAW;AACvB,YAAYC,aAAY;AACxB,YAAYC,UAAS;;;ACVrB,SAAS,SAAAC,cAAa;AACtB,YAAYC,UAAS;AACrB,YAAYC,cAAa;AACzB,YAAYC,aAAY;AACxB,YAAYC,YAAW;AACvB,YAAYC,QAAO;AACnB,YAAYC,QAAO;AACnB,YAAYC,aAAY;AACxB,YAAYC,cAAY;;;ACTxB,SAAS,SAAAC,cAAa;AACtB,YAAYC,UAAS;AACrB,YAAYC,aAAY;AACxB,YAAYC,QAAO;AACnB,YAAY,YAAY;AACxB,YAAYC,cAAY;AACxB,YAAYC,UAAS;AAId,IAAM,iBAAwB,kBAAS,CAAC,SAAS,QAAQ,CAAC;AAI1D,IAAM,0BAAiC,kBAAS;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,oBAAN,cAAuC;AAAA,EAC5C;AACF,EAAE;AAAA,EACA,MAAa;AAAA,EACb,QAAQ;AAAA,EACR,QAAe;AACjB,CAAC,EAAE;AAAC;AAQG,IAAM,sBAAN,cAAyC;AAAA,EAC9C;AACF,EAAE;AAAA,EACA,SAAgB;AAAA,EAChB,OAAc,gBAAc,iBAAQ,cAAc;AACpD,CAAC,EAAE;AAAC;AAaJ,IAAM,WAAW,CAAC,UACZ,gBAAW,MAAM,GAAG,EAAM,gBAAW,MAAM,GAAG,EAAE,KAAK,CAAC;AAG5D,IAAM,aAAa,CAAC,SACd,SAAQ,UAAS,WAAM,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,QAAQ;AAG9C,IAAM,cAAc,CAAC,SAA6C;AACvE,QAAMC,YAAW,WAAW,IAAI;AAChC,QAAMC,MAAK,CAAC,UACH,sBAAcD,UAAS,KAAK,CAAC;AACtC,QAAM,KAAK,CAAC,OAAe,aACzBA,UAAS,KAAK,MAAM;AACtB,SAAON,OAAM,MAAMM,UAAS,MAAM,EAAE;AAAA,IAClCN,OAAM;AAAA,MACJ,CAAC,UAAU,UAAU,KAAK,GAAG,GAAG,UAAU,KAAK,GAAG,GAAG,aAAa;AAAA,MAClE,MAAa,aAAkB,EAAE,MAAM,cAAc,CAAC;AAAA,IACxD;AAAA,IACAA,OAAM;AAAA,MACJ,CAAC,UAAU,UAAU,KAAK,GAAG,GAAG,OAAO,KAAK,GAAG,GAAG,MAAM;AAAA,MACxD,MACS;AAAA,QACLO,IAAG,CAAC;AAAA,QACJ,CAAC,YAAyB,EAAE,MAAM,aAAa,OAAO;AAAA,MACxD;AAAA,IACJ;AAAA,IACAP,OAAM;AAAA,MACJ,CAAC,UACC,UAAU,KAAK,GAAG,GAAG,UAAU,KAAK,GAAG,GAAG,QAAQ,KAAK,GAAG,GAAG,SAAS;AAAA,MACxE,MACS;AAAA,QACLO,IAAG,CAAC;AAAA,QACJ,CAAC,UAAuB,EAAE,MAAM,0BAA0B,KAAK;AAAA,MACjE;AAAA,IACJ;AAAA,IACAP,OAAM;AAAA,MACJ,CAAC,UACC,UAAU,KAAK,GAAG,GAAG,OAAO,KAAK,GAAG,GAAG,QAAQ,KAAK,GAAG,GAAG,SAAS;AAAA,MACrE,MACS,YAAI,EAAE,QAAQO,IAAG,CAAC,GAAG,MAAMA,IAAG,CAAC,EAAE,CAAC,EAAE;AAAA,QAClC;AAAA,UACL,CAAC,YAAyB,EAAE,MAAM,iBAAiB,GAAG,OAAO;AAAA,QAC/D;AAAA,MACF;AAAA,IACJ;AAAA,IACAP,OAAM,OAAO,MAAa,aAAkB,CAAC;AAAA,EAC/C;AACF;AAEA,IAAM,SAAS,CAACQ,WACZ,YAASA,MAAK,KAAS,gBAAWA,MAAK,IAC9B,aAAKA,MAAK,IACV,aAAK;AAElB,IAAM,YAAY,CAACA,WACf,YAASA,MAAK,KAAO,YAASA,MAAK,KAAO,aAAUA,MAAK,IAChD,aAAKA,MAAK,IACV,aAAK;AAElB,IAAM,QAAQ,CAAC,QAAqBA,WAClCR,OAAM,MAAM,MAAM,EAAE;AAAA,EAClBA,OAAM,cAAc,MAAM;AAAA,IAAE;AAAA,IAAe,MAClC;AAAA,MACL,OAAOQ,MAAK;AAAA,MACZ,CAAC,iBAAuB,EAAE,IAAI,mBAAmB,YAAY;AAAA,IAC/D;AAAA,EACF;AAAA,EACAR,OAAM,cAAc,MAAM;AAAA,IAAE;AAAA,IAAa,CAAC,UACjC;AAAA,MACL,OAAOQ,MAAK;AAAA,MACZ,CAAC,UAAgB,EAAE,IAAI,iBAAiB,QAAQ,MAAM,QAAQ,KAAK;AAAA,IACrE;AAAA,EACF;AAAA,EACAR,OAAM,cAAc,MAAM;AAAA,IAAE;AAAA,IAAiB,CAAC,UACrC;AAAA,MACL,UAAUQ,MAAK;AAAA,MACf,CAAC,aAAmB;AAAA,QAClB,IAAI;AAAA,QACJ,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACAR,OAAM,cAAc,MAAM;AAAA,IAAE;AAAA,IAA0B,CAAC,UAC9C;AAAA,MACL,UAAUQ,MAAK;AAAA,MACf,CAAC,aAAmB;AAAA,QAClB,IAAI;AAAA,QACJ,MAAM,MAAM;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACAR,OAAM;AACR;AAgBK,IAAM,aAAa,CACxB,MACA,OACA,QACA,SAC2C;AAC3C,QAAM,SAAS,SAAS,UAAU,QAAQ;AAC1C,SAAc,cAAM,YAAY,IAAI,GAAG;AAAA,IACrC,QAAQ,MACC;AAAA,MACL,IAAI,kBAAkB;AAAA,QACpB;AAAA,QACA,QAAQ;AAAA,QACR,QACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,WACA,cAAM,MAAM,QAAQ,MAAM,GAAG;AAAA,MAClC,QAAQ,MACC;AAAA,QACL,IAAI,kBAAkB;AAAA,UACpB;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ,OAAO,IAAI;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,MACF,QAAe;AAAA,IACjB,CAAC;AAAA,EACL,CAAC;AACH;AAGO,IAAM,kBAAkB,CAC7B,aAEI;AAAA,EACF;AAAA,EACA,CAACS,aAAY,GAAGA,SAAQ,IAAI,KAAKA,SAAQ,MAAM,WAAMA,SAAQ,MAAM;AACrE;;;ADpKK,IAAM,eAAsB,kBAAS;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,QAAgD;AAAA,EACpD,sBAAsB;AAAA,EACtB,WACE;AAAA,EACF,eACE;AAAA,EACF,uBACE;AAAA,EACF,sBACE;AACJ;AAGO,IAAM,aAAN,cAAgC,eAAkB,YAAY,EAAE;AAAA;AAAA,EAErE,MAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAa;AAAA,EACb,OAAc;AAAA,EACd,QAAe;AAAA,EACf,MAAa;AACf,CAAC,EAAE;AAAC;AAiBJ,IAAMC,gBAAe,CAAC,UACpB,MAAM,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,IAAI;AAElD,IAAM,KAAK,CAAC,SAAiB,WAC3B,GAAG,IAAI,IAAI,OAAO,IAAIA,aAAY,EAAE,KAAK,GAAG,CAAC;AAQxC,IAAM,aAAa,CAACC,WACzBC,OAAM,MAAMD,MAAK,EAAE;AAAA,EACjBC,OAAM;AAAA,IAAK,MAAM;AAAA,IAAS,CAAC,UACzB,MAAM,IAAI,UAAU,EAAE,KAAK,GAAG;AAAA,EAChC;AAAA,EACAA,OAAM;AAAA,IAAO;AAAA,IAAU,CAACC,YAClB;AAAA,MACE;AAAA,QACF,OAAO,QAAQA,OAAM;AAAA,QACf;AAAA,UACE;AAAA,UACN,CAAC,UAAsC,MAAM,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,MACA,CAAC,CAACC,MAAKC,MAAK,MAAM,GAAGD,KAAI,MAAM,IAAIA,IAAG,IAAI,WAAWC,MAAK,CAAC;AAAA,IAC7D,EAAE,KAAK,GAAG;AAAA,EACZ;AAAA,EACAH,OAAM,KAAO,aAAU,CAAC,SAAiB,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE;AAAA,EAClEA,OAAM,KAAO,cAAW,CAAC,SAAmB,OAAO,OAAO,IAAK;AAAA,EAC/DA,OAAM,KAAO,aAAU,CAAC,WAAmB,IAAI,MAAM,EAAE;AAAA,EACvDA,OAAM,KAAO,WAAQ,MAAM,GAAG;AAAA,EAC9BA,OAAM,OAAO,MAAM,GAAG;AACxB;AAEF,IAAM,UAAU,CACd,QACAD,WACW,WAAkB,oBAAW,MAAM,EAAEA,MAAK,CAAC;AAGjD,IAAM,iBAAiB,CAAC,SAC7B;AAAA,EACE;AAAA,EACA,IAAI,OAAO;AAAA,IACT,GAAG;AAAA,IACH,QAAQ,IAAI,SAAS;AAAA,MACnB,MAAM,KAAK,OAAO;AAAA,MAClB,MAAM,IAAI,aAAa,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC;AAAA,IACrD,CAAC;AAAA,EACH,CAAC;AACH;AAEF,IAAM,WAAW,CAAC,UAChB,IAAI,gBAAgB;AAAA,EAClB,GAAG;AAAA,EACH,QAAQ,IAAI,SAAS;AAAA,IACnB,MAAM,MAAM,OAAO;AAAA,IACnB,MAAM,IAAI,aAAa,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC;AAAA,EACrD,CAAC;AACH,CAAC;AAGI,IAAM,0BAA0B,CAAC,UACtC,QAAQ,iBAAiB,SAAS,KAAK,CAAC;AAG1C,IAAM,iBAAiB,CAAC,aACtB,IAAI,WAAW;AAAA,EACb,GAAG;AAAA,EACH,QAAe;AAAA,IAAI,SAAS;AAAA,IAAQ,CAAC,WAC/B,SAAI,QAAQ,CAAC,UAAU,SAAS,KAAK,CAAC;AAAA,EAC5C;AACF,CAAC;AAEH,IAAM,UAAU,CAAC,SACf,CAAC,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,GAAG,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAQ;AAE5E,IAAM,WAAW,CAAC,SAChB,OAAc,oBAAW,MAAM,EAAE,IAAI,CAAC;AAExC,IAAM,SAAS,CAACA,WACP,2BAAyB,aAAI,EAAEA,MAAK;AAE7C,IAAM,SAAS,CACb,QACAA,WACgB,OAAc,oBAAW,MAAM,EAAEA,MAAK,CAAC;AAEzD,IAAM,aAAa,CACjBA,QACA,WACuB,cAAMA,QAAO,EAAE,QAAQ,MAAM,MAAM,QAAQ,OAAO,CAAC;AAE5E,IAAM,cAAc,CAClBA,WAEA;AAAA,EAAWA;AAAA,EAAO,CAAC,UACjB,iBAAiB,WAAW,MAAM,QAAQ;AAC5C;AAEF,IAAM,WAAW,CAAC,SAA8B,OAAO,QAAQ,IAAI;AAEnE,IAAM,YAAY,CAAC,OACjB,IAAI,WAAW;AAAA,EACb,GAAG;AAAA,EACH,UAAU,IAAI,WAAW,EAAE,GAAG,GAAG,UAAU,QAAe,aAAK,EAAE,CAAC;AACpE,CAAC;AAGI,IAAM,qBAAqB,CAAC,OACjC,WAAW;AAAA,EACT,WAAW,GAAG;AAAA,EACd,UAAiB,oBAAW,UAAU,EAAE,eAAe,GAAG,QAAQ,CAAC;AAAA,EACnE,SAAgB,oBAAW,SAAS,EAAE,GAAG,OAAO;AAAA,EAChD,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS;AAAA,IAC5B,KAAK;AAAA,IACL,eAAe,IAAI;AAAA,IACnB,KAAK,OAAO;AAAA,EACd,CAAC;AAAA,EACD,OAAc,oBAAkB,eAAM,MAAM,CAAC,EAAE,GAAG,KAAK;AAAA,EACvD,UAAU;AAAA,IACR,UAAU,GAAG,SAAS;AAAA,IACtB,YAAY,GAAG,SAAS;AAAA,EAC1B;AACF,CAAC;AAYH,IAAM,WAAW,CACf,OACA,MACA,MACA,MACA,OACA,WACyB;AACzB,QAAM,UAAU;AAAA,IACd,IAAI,WAAW,EAAE,MAAM,MAAM,MAAM,OAAO,QAAQ,MAAM,MAAM,IAAI,EAAE,CAAC;AAAA,EACvE;AACA,SAAc,aAAK;AACrB;AAQA,IAAM,OAAO,CACX,OACA,MACA,MACA,MACA,OACA,QACA,OACA,WACqB;AACrB,QAAM,IAAI,MAAM,IAAI;AACpB,QAAM,IAAI,MAAM,KAAK;AACrB,QAAM,IAAI,MAAM,MAAM;AACtB,MAAI,MAAM,EAAG,QAAc,aAAK,KAAK;AACrC,MAAI,MAAM,EAAG,QAAc,aAAK,MAAM;AACtC,MAAI,MAAM,EAAG,QAAc,aAAK,KAAK;AAErC,QAAM,OAAO,MAAM,YAAY,IAAI;AACnC,MAAI,SAAS,QAAW;AACtB,UAAM,UACJ,SAAS,uBACL,WAAW,MAAM,OAAO,KAAK,GAAG,OAAO,MAAM,GAAG,IAAI,IAC7C;AAAA,MACL,IAAI,kBAAkB;AAAA,QACpB;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ,GAAG,IAAI;AAAA,MACjB,CAAC;AAAA,IACH;AACN,QAAW,kBAAU,OAAO,GAAG;AAC7B,YAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,aAAc,aAAK;AAAA,IACrB;AACA,UAAM,QAAQ,KAAK,IAAI;AACvB,WAAc,aAAK,SAAS,UAAU,QAAQ,MAAM;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,IAAI;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,OAAO,MAAM;AAAA,EACf;AACF;AAOA,IAAM,kBAAkB,CAAC,UAA4B;AACnD,QAAM,YAAgB;AAAA,IAClB,QAAK,MAAM,WAAW;AAAA,IACxB,CAAC,SACC,CAAK,cAAS,MAAM,SAAS,IAAI,KACjC,CAAK,UAAK,MAAM,UAAU,CAACK,aAAYA,SAAQ,SAAS,IAAI;AAAA,EAChE;AACA,EAAI,aAAQ,WAAW,CAAC,SAAS;AAC/B,UAAM,QAAY,UAAK,MAAM,WAAW,CAAC,SAAS,KAAK,SAAS,IAAI;AACpE,UAAM,SAAS;AAAA,MACb,IAAI,kBAAkB;AAAA,QACpB;AAAA,QACA,QAAQ,QAAQ,eAAe;AAAA,QAC/B,QAAQ,QACJ,8EACA;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,IAAM,QAAQ,CACZ,OACA,MACA,MACA,OACA,QACA,OACA,WAEA,KAAK,OAAO,MAAM,sBAAsB,MAAM,OAAO,QAAQ,OAAO,MAAM;AAE5E,IAAM,YAAY,CAACL,WACjB,WAAWA,MAAK;AAElB,IAAM,aAAa,CAACA,WAClBA;AASF,IAAM,UAAU,CACd,OACA,MACA,MACA,OACA,QACA,OACA,QACA,aACqB;AACrB,MAAW,eAAO,IAAI,GAAG;AACvB,QAAW,eAAO,KAAK,KAAY,eAAO,MAAM;AAC9C,aAAO,SAAS,KAAK,OAAO,MAAM,OAAO,OAAO,KAAK;AACvD,UAAM,UAAU,MAAM,KAAK,KAAK;AAChC,QAAW,eAAO,KAAK;AACrB,aAAc,cAAM,QAAQ;AAAA,QAC1B,QAAQ,MAAa,aAAK;AAAA,QAC1B,QAAQ,CAAC,gBACP,MAAM,WAAW,MAAM,UACZ,aAAK,IACZ;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,KAAK,KAAK;AAAA,UACjB;AAAA,UACA,OAAO,WAAW;AAAA,QACpB;AAAA,MACR,CAAC;AACH,WAAO,MAAM,MAAM,KAAK,MAAM,UACnB,aAAK,IACZ;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,KAAK,KAAK;AAAA,MACjB,OAAO,MAAM,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,EACN;AAEA,MAAW,eAAO,KAAK,KAAY,eAAO,MAAM;AAC9C,WAAO,MAAM,MAAM,KAAK,MAAM,MAAM,OAAO,KAAK,IACrC,aAAK,MAAM,KAAK,IACvB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,MAAM,KAAK;AAAA,MAClB,OAAO,OAAO,KAAK;AAAA,IACrB;AACN,SAAc,eAAO,KAAK,IAAI,QAAQ;AACxC;AAEA,IAAM,UAAU,CACd,OACA,UAEQ,sBAAa,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,GAAG,IAAI,CAAU,CAAC;AAExE,IAAM,SAAS,CACb,OACA,UAC8B,YAAO,MAAM,IAAI,KAAK,CAAC;AAEvD,IAAM,UAAU,CACd,MACA,OACA,QACA,UAEI;AAAA,EACE;AAAA,IACE;AAAA,MACF,OAAO,MAAM,KAAK;AAAA,MACd,eAAU,OAAO,OAAO,KAAK,GAAG,OAAO,QAAQ,KAAK,CAAC;AAAA,IAC3D;AAAA,IACM;AAAA,EACR;AACF;AAEF,IAAM,SAAS,CACb,OACAG,SAC6B,aAAI,OAAOA,IAAG;AAE7C,IAAM,aAAa,CACjB,OACA,MACA,MACA,OACA,WACyC;AACzC,QAAMG,QAAO,QAAQ,MAAM,OAAO,QAAQ,CAAC,SAAS,KAAK,EAAE;AAC3D,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI;AAAA,IAChB,QAAQ,MAAM,CAAC,SAAS,KAAK,EAAE;AAAA,IAC/B,QAAQ,OAAO,CAAC,SAAS,KAAK,EAAE;AAAA,IAChC,QAAQ,QAAQ,CAAC,SAAS,KAAK,EAAE;AAAA,EACnC;AACA,QAAM,SAASA,MAAK;AAAA,IAAI,CAAC,OACvB;AAAA,MACE;AAAA,MACA,GAAG,MAAM,EAAE;AAAA,MACX,OAAO,GAAG,EAAE;AAAA,MACZ,OAAO,GAAG,EAAE;AAAA,MACZ,OAAO,GAAG,EAAE;AAAA,MACZ,CAAC,SAAS,QAAQ,QAAQ,IAAI;AAAA,MAC9B,CAAC,SAAS,OAAO,QAAQ,IAAI;AAAA,MAC7B,CAAC,UAAU,WAAW,eAAe;AACnC,cAAM,WAAW,GAAG,MAAM,EAAE;AAC5B,cAAM,OAAO;AAAA,UACX;AAAA,UACA,GAAG,UAAU,MAAM;AAAA,UACnB,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAW;AAAA,UACX,CAACN,WAAU,QAAQ,QAAQA,MAAK;AAAA,UAChC,CAACA,WAAU,OAAO,QAAQA,MAAK;AAAA,QACjC;AACA,cAAM,WAAW;AAAA,UACf;AAAA,UACA,GAAG,UAAU,UAAU;AAAA,UACvB,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAW;AAAA,UACX,CAACA,WACC,WAAkB,oBAAkB,gBAAc,gBAAO,CAAC,EAAEA,MAAK,CAAC;AAAA,UACpE,CAACA,WAAU,WAAWA,QAAO,CAAC,SAAS,IAAI;AAAA,QAC7C;AACA,eAAc,YAAI,EAAE,MAAM,SAAS,CAAC,EAAE;AAAA,UAC7B;AAAA,YACL,CAAC,WACC,IAAI,OAAO;AAAA,cACT;AAAA,cACA,MAAM,OAAO;AAAA,cACb,UAAU,OAAO;AAAA,YACnB,CAAC;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAc;AAAA,IACR;AAAA,MACF,OAAO,QAAe,eAAO;AAAA,MACvB,gBAAe,eAAQ,CAAC,SAAiB,KAAK,EAAE;AAAA,IACxD;AAAA,EACF;AACF;AAEA,IAAM,cAAc,CAClB,OACA,MACA,MACA,OACA,WAC0C;AAC1C,QAAM,SAAS,CAAC,UAAmB,MAAM;AACzC,QAAMM,QAAO,QAAQ,MAAM,OAAO,QAAQ,MAAM;AAChD,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI;AAAA,IAChB,QAAQ,MAAM,MAAM;AAAA,IACpB,QAAQ,OAAO,MAAM;AAAA,IACrB,QAAQ,QAAQ,MAAM;AAAA,EACxB;AACA,QAAM,SAASA,MAAK;AAAA,IAAI,CAAC,SACvB;AAAA,MACE;AAAA,MACA,GAAG,MAAM,IAAI;AAAA,MACb,OAAO,GAAG,IAAI;AAAA,MACd,OAAO,GAAG,IAAI;AAAA,MACd,OAAO,GAAG,IAAI;AAAA,MACd,CAAC,UAAU,QAAQ,SAAS,KAAK;AAAA,MACjC,CAAC,UAAU,OAAO,SAAS,KAAK;AAAA,MAChC,CAAC,WAAW,YAAY,gBAAgB;AACtC,cAAM,YAAY,GAAG,MAAM,IAAI;AAG/B,cAAM,UACG,eAAO,WAAW,aAAa,KAC/B,eAAO,YAAY,aAAa;AACzC,cAAM,OAAO;AAAA,UACX;AAAA,UACA,GAAG,WAAW,MAAM;AAAA,UACpB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,CAACN,WAAU,QAAQ,aAAaA,MAAK;AAAA,UACrC,CAACA,WAAU,OAAO,aAAaA,MAAK;AAAA,QACtC;AACA,cAAM,WAAW,UACN,aAAK,WAAW,QAAQ,IAC/B;AAAA,UACE;AAAA,UACA,GAAG,WAAW,UAAU;AAAA,UACxB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,CAACA,WACC;AAAA,YACS,oBAAkB,gBAAc,gBAAO,CAAC,EAAEA,MAAK;AAAA,UACxD;AAAA,UACF,CAACA,WAAU,WAAWA,QAAO,CAAC,SAAS,IAAI;AAAA,QAC7C;AACJ,cAAMO,gBAAe,UACV,aAAK,WAAW,OAAO,IAC9B;AAAA,UACE;AAAA,UACA,GAAG,WAAW,SAAS;AAAA,UACvB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,CAACP,WACC;AAAA,YACS,oBAAkB,gBAAO,cAAc,CAAC,EAAEA,MAAK;AAAA,UACxD;AAAA,UACF;AAAA,QACF;AACJ,cAAM,WAAW,UACN,aAAK,WAAW,QAAQ,IAC/B;AAAA,UACE;AAAA,UACA,GAAG,WAAW,UAAU;AAAA,UACxB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,CAACA,WACC;AAAA,YACS,oBAAkB,gBAAc,gBAAO,CAAC,EAAEA,MAAK;AAAA,UACxD;AAAA,UACF,CAACA,WAAU,WAAWA,QAAO,CAAC,SAAS,IAAI;AAAA,QAC7C;AACJ,cAAM,UAAU;AAAA,UACd;AAAA,UACA,GAAG,WAAW,SAAS;AAAA,UACvB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,CAACA,WACC,WAAkB,oBAAkB,gBAAO,cAAc,CAAC,EAAEA,MAAK,CAAC;AAAA,UACpE,CAACA,WAAU,WAAWA,QAAO,CAAC,SAAS,IAAI;AAAA,QAC7C;AACA,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA,GAAG,WAAW,eAAe;AAAA,UAC7B,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,CAACA,WACC;AAAA,YACS,oBAAkB,gBAAc,uBAAc,CAAC,EAAEA,MAAK;AAAA,UAC/D;AAAA,UACF,CAACA,WAAU,WAAWA,QAAO,CAACQ,UAASA,KAAI;AAAA,QAC7C;AACA,eAAc,YAAI;AAAA,UAChB;AAAA,UACA;AAAA,UACA,SAASD;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC,EAAE;AAAA,UACM;AAAA,YACL,CAAC,WACC,IAAI,QAAQ;AAAA,cACV;AAAA,cACA,MAAM,OAAO;AAAA,cACb,UAAU,OAAO;AAAA,cACjB,SAAS,OAAO;AAAA,cAChB,UAAU,OAAO;AAAA,cACjB,SAAS,OAAO;AAAA,cAChB,eAAe,OAAO;AAAA,YACxB,CAAC;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAc;AAAA,IACR;AAAA,MACF,OAAO,QAAe,eAAO;AAAA,MACvB,gBAAe,eAAQ,CAAC,UAAmB,MAAM,IAAI;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,IAAM,sBAAsB,CAC1B,OACA,MACA,MACA,OACA,WACoC;AACpC,QAAM,QAAQ,CAACP,WAA4B,QAAQ,kBAAkBA,MAAK;AAC1E,QAAM,SAAS,CAACA,WAA4B,OAAO,kBAAkBA,MAAK;AAC1E,QAAM,IAAI,MAAM,IAAI;AACpB,QAAM,IAAI,MAAM,KAAK;AACrB,QAAM,IAAI,MAAM,MAAM;AACtB,MAAI,MAAM,EAAG,QAAc,aAAK,KAAK;AACrC,MAAI,MAAM,EAAG,QAAc,aAAK,MAAM;AACtC,MAAI,MAAM,EAAG,QAAc,aAAK,KAAK;AAErC,MACE,iBAAiB,0BACjB,kBAAkB,wBAClB;AACA,UAAM,SAAS;AAAA,MACb;AAAA,MACA,GAAG,MAAM,QAAQ;AAAA,MACjB,gBAAgB,yBAAyB,KAAK,SAAS,MAAM;AAAA,MAC7D,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACT;AAAA,MACA,GAAG,MAAM,UAAU;AAAA,MACnB,gBAAgB,yBAAyB,KAAK,WAAW,MAAM;AAAA,MAC/D,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF;AACA,WAAc,YAAI,EAAE,QAAQ,UAAU,GAAG,CAAC,EAAE;AAAA,MACnC;AAAA,QACL,CAAC,WACC,IAAI,uBAAuB;AAAA,UACzB,MAAM;AAAA,UACN,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,QACnB,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,MACE,iBAAiB,0BACjB,kBAAkB,wBAClB;AAGA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,GAAG,MAAM,YAAY;AAAA,MACrB;AAAA,MACA,gBAAgB,yBACZ,KAAK,aACL,MAAM;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF;AACA,UAAM,WAAW;AAAA,MACf;AAAA,MACA,GAAG,MAAM,UAAU;AAAA,MACnB,gBAAgB,yBAAyB,KAAK,WAAW,MAAM;AAAA,MAC/D,MAAM;AAAA,MACN,OAAO;AAAA,MACP,CAACA,WAAU,QAAQ,kBAAkBA,MAAK;AAAA,MAC1C,CAACA,WAAU,OAAO,kBAAkBA,MAAK;AAAA,IAC3C;AACA,WAAc,YAAI,EAAE,YAAY,SAAS,CAAC,EAAE;AAAA,MACnC;AAAA,QACL,CAAC,WACC,IAAI,uBAAuB;AAAA,UACzB,MAAM;AAAA,UACN,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,QACnB,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,IAAI;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,OAAO,MAAM;AAAA,EACf;AACF;AAEA,IAAM,YAAY,CAChB,OACA,MACA,MACA,OACA,WAC0B;AAC1B,QAAM,OAAO;AAAA,IACX;AAAA,IACA,GAAG,MAAM,MAAM;AAAA,IACf,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACA,QAAM,OAAO;AAAA,IACX;AAAA,IACA,GAAG,MAAM,MAAM;AAAA,IACf,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb;AAAA,IACA,GAAG,MAAM,QAAQ;AAAA,IACjB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACA,QAAM,UAAU;AAAA,IACd;AAAA,IACA,GAAG,MAAM,SAAS;AAAA,IAClB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACA,QAAM,SAAS;AAAA,IACb;AAAA,IACA,GAAG,MAAM,QAAQ;AAAA,IACjB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,GAAG,MAAM,gBAAgB;AAAA,IACzB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,GAAG,MAAM,UAAU,MAAM;AAAA,IACzB,KAAK,OAAO;AAAA,IACZ,MAAM,OAAO;AAAA,IACb,OAAO,OAAO;AAAA,IACd;AAAA,IACA;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,OAAO;AAC1B,SAAc,YAAI;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EAAE;AAAA,IACM;AAAA,MACL,CAAC,WACC,IAAI,OAAO;AAAA,QACT,IAAI,MAAM;AAAA,QACV,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO;AAAA,QAChB,QAAQ,OAAO;AAAA,QACf,QAAQ,IAAI,SAAS,EAAE,MAAM,OAAO,YAAY,KAAK,CAAC;AAAA,QACtD,gBAAgB,OAAO;AAAA,MACzB,CAAC;AAAA,IACL;AAAA,EACF;AACF;AAEA,IAAM,aAAa,CACjB,OACA,MACA,OACA,WACyC;AACzC,QAAM,OAAO,CAAC,SAAiB,KAAK;AACpC,QAAMM,QAAO,QAAQ,MAAM,OAAO,QAAQ,IAAI;AAC9C,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI;AAAA,IAChB,QAAQ,MAAM,IAAI;AAAA,IAClB,QAAQ,OAAO,IAAI;AAAA,IACnB,QAAQ,QAAQ,IAAI;AAAA,EACtB;AACA,QAAM,SAASA,MAAK;AAAA,IAAI,CAAC,OACvB;AAAA,MACE;AAAA,MACA,GAAG,UAAU,EAAE;AAAA,MACf,OAAO,GAAG,EAAE;AAAA,MACZ,OAAO,GAAG,EAAE;AAAA,MACZ,OAAO,GAAG,EAAE;AAAA,MACZ;AAAA,MACA;AAAA,MACA,CAAC,UAAU,WAAW,eACpB,UAAU,OAAO,GAAG,UAAU,EAAE,GAAG,UAAU,WAAW,UAAU;AAAA,IACtE;AAAA,EACF;AACA,SAAc;AAAA,IACR;AAAA,MACF,OAAO,QAAe,eAAO;AAAA,MACvB,gBAAe,eAAQ,IAAI;AAAA,IACnC;AAAA,EACF;AACF;AAEA,IAAM,aAAa,CACjB,OACA,MACA,OACA,WACyC;AACzC,QAAM,QAAQ;AACd,QAAM,QAAQ,CAAC,SAAiB,GAAG,QAAQ,IAAI,CAAC,KAAS,KAAK,GAAG;AACjE,QAAMA,QAAO,QAAQ,MAAM,OAAO,QAAQ,KAAK;AAC/C,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI;AAAA,IAChB,QAAQ,MAAM,KAAK;AAAA,IACnB,QAAQ,OAAO,KAAK;AAAA,IACpB,QAAQ,QAAQ,KAAK;AAAA,EACvB;AACA,QAAM,SAASA,MAAK;AAAA,IAAI,CAACH,SACvB;AAAA,MACE;AAAA,MACA,GAAG,UAAUA,KAAI,WAAW,MAAU,GAAG,CAAC;AAAA,MAC1C,OAAO,GAAGA,IAAG;AAAA,MACb,OAAO,GAAGA,IAAG;AAAA,MACb,OAAO,GAAGA,IAAG;AAAA,MACb;AAAA,MACA;AAAA,MACA,CAAC,UAAU,WAAW,eACpB;AAAA,QACE;AAAA,QACA,GAAG,UAAUA,KAAI,WAAW,MAAU,GAAG,GAAG,KAAK;AAAA,QACjD,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MACF,EAAE;AAAA,QACO;AAAA,UACL,CAAC,QACC,IAAI,OAAO;AAAA,YACT,MAAM,UAAU;AAAA,YAChB,IAAI,UAAU;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AACA,SAAc;AAAA,IACR;AAAA,MACF,OAAO,QAAe,eAAO;AAAA,MACvB,gBAAe,eAAQ,OAAO;AAAA,IACtC;AAAA,EACF;AACF;AAQA,IAAM,sBAAsB,CAC1B,OACA,WAEI;AAAA,EACF;AAAA,EACA,CAAC,SACC,IAAI,OAAO;AAAA,IACT,GAAG;AAAA,IACH,QAAY,SAAI,KAAK,QAAQ,CAAC,UAAU;AACtC,YAAM,UAAiB,kBAAU,MAAM,aAAa;AACpD,YAAM,WACJ,YAAY,OACR,SACA,OAAO,KAAK,CAAC,cAAc,UAAU,SAAS,OAAO;AAC3D,aAAO,aAAa,SAChB,QACA,IAAI,QAAQ;AAAA,QACV,GAAG;AAAA,QACH,SAAS,SAAS;AAAA,QAClB,UAAU,SAAS,QAAQ;AAAA,UAClB,cAAM;AAAA,YACX,QAAQ,MAAa,aAAK,IAAI;AAAA,YAC9B,QAAQ,MAAa,aAAK;AAAA,UAC5B,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AACL;AAEF,IAAM,oBAAoB,CACxB,OACA,UAEI,YAAO,OAAO,CAAC,SAAS;AAC1B,QAAM,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,KAAK,IAAI;AAC5D,QAAM,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,GAAG,IAAI;AACxD,QAAM,WAAW,MAAM,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,KAAK,IAAI;AACxE,QAAM,SAAS,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,GAAG,IAAI;AACjE,SACE,aAAa,UACb,WAAW,UACX,CAAC,gBAAgB,SAAS,MAAM,OAAO,IAAI;AAE/C,CAAC;AAEH,IAAM,sBAAsB,CAC1B,OACA,MACA,MACA,OACA,WACkD;AAClD,QAAM,SAAS,CAAC,UAA2B,MAAM;AACjD,QAAMG,QAAO,QAAQ,MAAM,OAAO,QAAQ,MAAM;AAChD,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI;AAAA,IAChB,QAAQ,MAAM,MAAM;AAAA,IACpB,QAAQ,OAAO,MAAM;AAAA,IACrB,QAAQ,QAAQ,MAAM;AAAA,EACxB;AACA,QAAM,SAASA,MAAK;AAAA,IAAI,CAAC,SACvB;AAAA,MACE;AAAA,MACA,GAAG,MAAM,IAAI;AAAA,MACb,OAAO,GAAG,IAAI;AAAA,MACd,OAAO,GAAG,IAAI;AAAA,MACd,OAAO,GAAG,IAAI;AAAA,MACd;AAAA,MACA,CAAC,UAAU,OAAO,iBAAiB,KAAK;AAAA,MACxC,CAAC,WAAW,YAAY,gBAAgB;AACtC,cAAM,YAAY,GAAG,MAAM,IAAI;AAC/B,cAAM,OAAO;AAAA,UACX;AAAA,UACA,GAAG,WAAW,MAAM;AAAA,UACpB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,CAACN,WAAU,QAAQ,aAAaA,MAAK;AAAA,UACrC,CAACA,WAAU,OAAO,aAAaA,MAAK;AAAA,QACtC;AACA,cAAMO,gBAAe;AAAA,UACnB;AAAA,UACA,GAAG,WAAW,SAAS;AAAA,UACvB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,CAACP,WACC,WAAkB,oBAAkB,gBAAO,cAAc,CAAC,EAAEA,MAAK,CAAC;AAAA,UACpE;AAAA,QACF;AACA,cAAM,WAAW;AAAA,UACf;AAAA,UACA,GAAG,WAAW,UAAU;AAAA,UACxB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,CAACA,WACC,WAAkB,oBAAkB,gBAAc,gBAAO,CAAC,EAAEA,MAAK,CAAC;AAAA,UACpE,CAACA,WAAU,WAAWA,QAAO,CAAC,SAAS,IAAI;AAAA,QAC7C;AACA,cAAM,aAAa;AAAA,UACjB;AAAA,UACA,GAAG,WAAW,UAAU,MAAM;AAAA,UAC9B,UAAU,OAAO;AAAA,UACjB,WAAW,OAAO;AAAA,UAClB,YAAY,OAAO;AAAA,UACnB;AAAA,UACA;AAAA,QACF;AAEA,cAAM,OAAO,WAAW,OAAO;AAC/B,eAAc,YAAI;AAAA,UAChB;AAAA,UACA,SAASO;AAAA,UACT;AAAA,UACA;AAAA,QACF,CAAC,EAAE;AAAA,UACM;AAAA,YACL,CAAC,WACC,IAAI,gBAAgB;AAAA,cAClB;AAAA,cACA,MAAM,OAAO;AAAA,cACb,SAAS,OAAO;AAAA,cAChB,UAAU,OAAO;AAAA,cACjB,QAAQ,IAAI,SAAS,EAAE,MAAM,OAAO,YAAY,KAAK,CAAC;AAAA,YACxD,CAAC;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAc;AAAA,IACR;AAAA,MACF,OAAO,QAAe,eAAO;AAAA,MACvB,gBAAe,eAAQ,MAAM;AAAA,IACrC;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB,CACpB,OACA,MACA,OACA,WAC8B;AAC9B,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,CAACP,WACC,WAAkB,oBAAkB,gBAAc,eAAM,CAAC,EAAEA,MAAK,CAAC;AAAA,IACnE,CAACA,WAAU,WAAWA,QAAO,CAAC,SAAS,IAAI;AAAA,EAC7C;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACO,kBAAU,KAAK,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC/B,kBAAU,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA,IAChC,kBAAU,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC1C;AACA,SAAc,YAAI,EAAE,MAAM,aAAa,OAAO,OAAO,CAAC,EAAE;AAAA,IAC/C;AAAA,MACL,CAAC,WACC,IAAI,WAAW;AAAA,QACb,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,OAAO,OAAO;AAAA,QACd,QAAY,WAAM,OAAO,QAAQ;AAAA,UAC/B,SAAS,MAAa,aAAK;AAAA,UAC3B,YAAY,CAACS,YAAkB,aAAKA,OAAM;AAAA,QAC5C,CAAC;AAAA,MACH,CAAC;AAAA,IACL;AAAA,EACF;AACF;AAEA,IAAM,eAAe,CACnB,OACA,MACA,OACA,WAC6B;AAC7B,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,CAACT,WACC,WAAkB,oBAAkB,gBAAO,cAAc,CAAC,EAAEA,MAAK,CAAC;AAAA,IACpE,CAACA,WAAU,WAAWA,QAAO,CAAC,SAAS,OAAO,gBAAgB,IAAI,CAAC;AAAA,EACrE;AACA,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,CAACA,WACC,WAAkB,oBAAkB,eAAa,eAAM,CAAC,EAAEA,MAAK,CAAC;AAAA,IAClE,CAACA,WAAU,OAAc,oBAAkB,eAAa,eAAM,CAAC,EAAEA,MAAK,CAAC;AAAA,EACzE;AACA,SAAc,YAAI,EAAE,QAAQ,OAAO,cAAc,QAAQ,CAAC,EAAE;AAAA,IACnD;AAAA,MACL,CAAC,WACC,IAAI,UAAU;AAAA,QACZ,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,cAAc,OAAO;AAAA,QACrB,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACL;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB,CACpB,OACA,MACA,OACA,WAC8B;AAC9B,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACA,SAAc,YAAI,EAAE,UAAU,WAAW,CAAC,EAAE;AAAA,IACnC;AAAA,MACL,CAAC,WACC,IAAI,WAAW;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,QACnB,QAAe,aAAK;AAAA,MACtB,CAAC;AAAA,IACL;AAAA,EACF;AACF;AAeO,IAAM,QAAQ,CACnB,MACA,OACA,QACA,cAAwD,CAAC,MACzC;AAChB,QAAM,IAAI,UAAU,IAAI;AACxB,QAAM,IAAI,UAAU,KAAK;AACzB,QAAM,IAAI,UAAU,MAAM;AAE1B,QAAM,KAAK,mBAAmB,CAAC;AAC/B,QAAM,KAAK,mBAAmB,CAAC;AAC/B,QAAM,KAAK,mBAAmB,CAAC;AAC/B,MAAI,OAAO,GAAI,QAAO,EAAE,QAAQ,SAAS,IAAI,EAAE;AAC/C,MAAI,OAAO,GAAI,QAAO,EAAE,QAAQ,SAAS,IAAI,EAAE;AAC/C,MAAI,OAAO,GAAI,QAAO,EAAE,QAAQ,SAAS,IAAI,EAAE;AAE/C,QAAM,QAAoB;AAAA,IACxB,WAAW,CAAC;AAAA,IACZ;AAAA,IACA,SAAS,CAAC;AAAA,IACV,UAAU,CAAC;AAAA,EACb;AACA,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,QAAM,WAAW,cAAc,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ;AACxE,QAAM,UAAU,aAAa,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO;AACnE,QAAM,WAAW,cAAc,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ;AACxE,QAAM,QAAQ,WAAW,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK;AACzD,QAAM,QAAQ,WAAW,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK;AAEzD,kBAAgB,KAAK;AACrB,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO,EAAE,QAAQ,WAAW,UAAU,MAAM,SAAS;AACvD,MAAI,MAAM,UAAU,SAAS;AAC3B,WAAO,EAAE,QAAQ,YAAY,WAAW,MAAM,UAAU;AAC1D,MACS,eAAO,SAAS,KAChB,eAAO,QAAQ,KACf,eAAO,OAAO,KACd,eAAO,QAAQ,KACf,eAAO,KAAK,KACZ,eAAO,KAAK;AAEnB,WAAO,EAAE,QAAQ,YAAY,WAAW,MAAM,UAAU;AAE1D,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACC,kBAAU,SAAS,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA,EAClD;AACA,QAAM,SAAS,kBAAkB,aAAa,MAAM,KAAK;AACzD,MAAI,OAAO,SAAS;AAClB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW,OAAO;AAAA,QAChB,CAAC,SACC,IAAI,WAAW;AAAA,UACb,MAAM;AAAA,YACJ;AAAA,YACA,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI;AAAA,UACtE;AAAA,UACA,MAAM;AAAA,UACN,MAAM,SAAS,IAAI;AAAA,UACnB,OAAO,SAAS,IAAI;AAAA,UACpB,QAAQ,SAAS,IAAI;AAAA,UACrB,MAAM,MAAM,oBAAoB;AAAA,QAClC,CAAC;AAAA,MACL;AAAA,IACF;AAEF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,IAAI,IAAI,WAAW;AAAA,MACjB,WAAW,UAAU;AAAA,MACrB,UAAU,SAAS;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB,OAAO;AAAA,MACP,OAAO,MAAM;AAAA,MACb,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AACF;;;AD9vCO,IAAM,gBAAgBU,SAAO,SAAS;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AACF,CAAC;AAIM,IAAM,eAAN,cAA2BA,SAAO,MAAoB,cAAc,EAAE;AAAA,EAC3E,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO;AAAA,EACb,QAAQ;AAAA,EACR,QAAQA,SAAO;AACjB,CAAC,EAAE;AAAC;AAGG,IAAM,cAAN,cAA0BA,SAAO,MAAmB,aAAa,EAAE;AAAA,EACxE,MAAMA,SAAO;AAAA;AAAA,EAEb,QAAQA,SAAO;AAAA;AAAA,EAEf,OAAOA,SAAO;AAChB,CAAC,EAAE;AAAC;AA+BJ,IAAM,UAAU,CACd,IACA,MACA,QACA,WACiB,IAAI,aAAa,EAAE,IAAI,GAAG,IAAI,MAAM,QAAQ,OAAO,CAAC;AAEvE,IAAM,MAAM,CAAC,UACP;AAAA,EACF,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,EAC9D;AACF;AAEF,IAAM,SAAS,CAAC,SACdC,QAAO,IAAI,aAAa;AACtB,QAAMC,UAAS,OAAO,OAAO;AAC7B,QAAM,QAAQ,OAAOA,QAAO;AAAA,IAC1B;AAAA,IACA,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EAC/B;AACA,SAAO,UAAU,IAAI,KAAK,CAAC;AAC7B,CAAC,EAAE,KAAKD,QAAO,KAAK;AAEtB,IAAM,iBACJ;AAEF,IAAM,YAAY,CAAC,SACjB,eAAe,KAAS,UAAK,IAAI,CAAC;AAMpC,IAAM,gBAAgB,CAACE,WACrB,OAAOA,WAAU,WACN,aAAK,KAAK,UAAUA,MAAK,CAAC,IACjC,OAAOA,WAAU,YACR,aAAKA,SAAQ,SAAS,OAAO,IACpC,OAAOA,WAAU,WACR,aAAK,OAAOA,MAAK,CAAC,IAClB,aAAK;AAGtB,IAAM,YAAY,CAChB,MACA,WACA,YACqD;AACrD,QAAM,QAAY,WAAM,IAAI,EAAE,IAAI;AAClC,QAAM,QAAY;AAAA,IACZ,UAAK,OAAO,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC;AAAA,IAC1C;AAAA,IACA,CAAC,QAAQ,SAAS,SAAS,KAAK,SAAS;AAAA,EAC3C;AACA,QAAM,OAAO,MAAM,UAAU,CAAC,KAAK;AACnC,SAAO,EAAE,OAAO,KAAK,QAAQ,KAAK,OAAO;AAC3C;AAQA,IAAM,aAAa,CAAC,MAAc,UAA0B;AAC1D,QAAM,QAAQ,KAAK,KAAK;AACxB,QAAM,OAAO,CAAC,WAA2B;AACvC,QAAI,UAAU,KAAK,OAAQ,QAAO,KAAK,SAAS;AAChD,UAAM,OAAO,KAAK,MAAM;AACxB,QAAI,SAAS,KAAM,QAAO,KAAK,SAAS,CAAC;AACzC,QAAI,SAAS,MAAO,QAAO;AAC3B,WAAO,KAAK,SAAS,CAAC;AAAA,EACxB;AACA,SAAO,KAAK,QAAQ,CAAC;AACvB;AAGA,IAAM,aAAa,CAAC,MAAcC,UAAwC;AACxE,QAAM,OAAO,CAAC,QAAgB,UAAyC;AACrE,QAAI,UAAU,KAAK,OAAQ,QAAc,aAAK;AAC9C,UAAM,OAAO,KAAK,MAAM;AACxB,QAAI,SAAS,OAAO,SAAS;AAC3B,aAAO,KAAK,WAAW,MAAM,MAAM,IAAI,GAAG,KAAK;AACjD,QAAI,SAAS,IAAK,QAAO,KAAK,SAAS,GAAG,QAAQ,CAAC;AACnD,QAAI,SAAS;AACX,aAAO,UAAU,IAAW,aAAK,MAAM,IAAI,KAAK,SAAS,GAAG,QAAQ,CAAC;AACvE,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AACA,SAAO,KAAKA,KAAI,MAAM,MAAM,KAAKA,QAAO,GAAG,CAAC,IAAW,aAAK;AAC9D;AAGA,IAAM,WAAW,CAAC,MAAc,SAAyC;AACvE,QAAM,OAAO,CACX,QACA,OACA,OACA,UAC2B;AAC3B,QAAI,UAAU,KAAK;AACjB,aAAO,CAAC,GAAG,OAAO,EAAE,MAAM,KAAK,MAAM,KAAK,GAAG,OAAO,OAAO,MAAM,CAAC;AACpE,UAAM,OAAO,KAAK,MAAM;AACxB,QAAI,SAAS,OAAO,SAAS;AAC3B,aAAO,KAAK,WAAW,MAAM,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK;AAC/D,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS;AAC3C,aAAO,KAAK,SAAS,GAAG,QAAQ,GAAG,OAAO,KAAK;AACjD,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS;AAC3C,aAAO,KAAK,SAAS,GAAG,QAAQ,GAAG,OAAO,KAAK;AACjD,QAAI,SAAS,OAAO,UAAU;AAC5B,aAAO,KAAK,SAAS,GAAG,GAAG,SAAS,GAAG;AAAA,QACrC,GAAG;AAAA,QACH,EAAE,MAAM,KAAK,MAAM,OAAO,MAAM,GAAG,OAAO,OAAO,MAAM;AAAA,MACzD,CAAC;AACH,WAAO,KAAK,SAAS,GAAG,OAAO,OAAO,KAAK;AAAA,EAC7C;AACA,SAAO,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AACzB;AAEA,IAAM,eAAe,CAAC,SACpB,KAAK,SAAa,eAAU,IAAI,EAAE;AAGpC,IAAM,UAAU,CACd,MACA,MACA,gBAEI;AAAA,EACE,aAAQ,SAAS,MAAM,IAAI,GAAG,CAAC,YAAY;AAC7C,UAAM,OAAW,eAAU,QAAQ,IAAI;AACvC,UAAM,SAAS,QAAQ,QAAQ,aAAa,QAAQ,IAAI;AACxD,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,SAAS,EAAG,QAAO,CAAC;AACxB,QAAQ,UAAK,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,YAAa,QAAO,CAAC;AAC7D,UAAM,MAAM,KAAK,MAAM,SAAS,CAAC;AACjC,UAAMD,SAAY,UAAK,GAAG;AAC1B,UAAM,QAAQ,SAAS,SAAS,IAAI,aAAa,GAAG;AACpD,WAAO,CAAC,EAAE,OAAO,KAAK,QAAQA,OAAM,OAAO,CAAC;AAAA,EAC9C,CAAC;AACH;AAEF,IAAM,oBAAoB,CACxB,MACA,MACA,iBACqE;AACrE,QAAM,SAAS,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG;AAC9C,QAAM,SAAS,OAAO,YAAY;AAClC,QAAM,QAAQ,OAAO,QAAQ,MAAM;AACnC,MAAI,QAAQ,KAAK,OAAO,QAAQ,QAAQ,QAAQ,CAAC,KAAK,EAAG,QAAc,aAAK;AAC5E,QAAMC,QAAO,OAAO,QAAQ,KAAK,QAAQ,OAAO,MAAM;AACtD,MAAIA,QAAO,EAAG,QAAc,aAAK;AACjC,SAAc,YAAI,WAAW,QAAQA,KAAI,GAAG,CAAC,WAAW;AAAA,IACtD,MAAM,KAAK,QAAQA;AAAA,IACnB,OAAO,KAAK,QAAQ;AAAA,EACtB,EAAE;AACJ;AAEA,IAAM,eAAe,CACnB,WACA,SAEI,eAAU,SAAS,WAAW,CAAC,GAAG,CAAC,YAAY;AACjD,QAAM,OAAW,UAAK,QAAQ,IAAI;AAClC,QAAMC,QAAO,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AAClD,SAAW,UAAKA,KAAI,EAAE,WAAW,KAAK,EAAE,MAAM;AAChD,CAAC;AAEH,IAAM,WAAW,CAAC,IAAgB,OAC5B,eAAU,GAAG,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE;AAElD,IAAM,YAAY,CAAC,MAAc,SAC3B,eAAU,KAAK,QAAQ,CAAC,UAAU,MAAM,SAAS,IAAI;AAE3D,IAAM,oBAAoB,CACxB,IACA,SAEO;AAAA,EAAQ,GAAG,SAAS;AAAA,EAAQ,CAAC,WAC9B,eAAU,QAAQ,CAAC,UAAU,MAAM,SAAS,IAAI;AACtD;AAGF,IAAM,aAAa,CAAC,MAAc,SAAyB;AACzD,QAAM,OAAO,CAAC,QAAgB,UAA0B;AACtD,QAAI,UAAU,KAAK,OAAQ,QAAO;AAClC,UAAM,OAAO,KAAK,MAAM;AACxB,QAAI,SAAS,OAAO,SAAS;AAC3B,aAAO,KAAK,WAAW,MAAM,MAAM,IAAI,GAAG,KAAK;AACjD,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS;AAC3C,aAAO,KAAK,SAAS,GAAG,QAAQ,CAAC;AACnC,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS;AAC3C,aAAO,UAAU,IAAI,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC;AAC1D,SAAK,SAAS,OAAO,SAAS,SAAS,UAAU,EAAG,QAAO;AAC3D,WAAO,KAAK,SAAS,GAAG,KAAK;AAAA,EAC/B;AACA,SAAO,KAAK,MAAM,CAAC;AACrB;AAQA,IAAM,mBAAmB,CACvB,MACA,MACA,SAKI;AACJ,QAAM,SAAS,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG;AAC9C,QAAM,UAAU,KAAK,QAAQ,uBAAuB,MAAM;AAC1D,QAAMC,UAAQ,IAAI,OAAO,gBAAgB,OAAO,OAAO,EAAE,KAAK,MAAM;AACpE,MAAIA,YAAU,KAAM,QAAc,aAAK;AACvC,QAAM,gBAAgB,WAAW,QAAQA,QAAM,QAAQA,QAAM,CAAC,EAAE,MAAM;AACtE,QAAM,SAAS,OAAO,QAAQ,KAAKA,QAAM,QAAQA,QAAM,CAAC,EAAE,MAAM;AAEhE,MAAI,SAAS,KAAK,SAAS,cAAe,QAAc,aAAK;AAC7D,QAAM,MAAM,OAAO,MAAM,SAAS,GAAG,WAAW,QAAQ,SAAS,CAAC,CAAC;AACnE,QAAMH,SAAY,UAAK,GAAG;AAC1B,QAAM,QAAQ,KAAK,QAAQ,SAAS,IAAI,aAAa,GAAG;AACxD,SAAc,aAAK,EAAE,OAAO,KAAK,QAAQA,OAAM,QAAQ,OAAAA,OAAM,CAAC;AAChE;AAGA,IAAM,YAAY,CAChB,MACA,MACA,SAKI;AACJ,QAAM,SAAS,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG;AAC9C,QAAM,SAAS,IAAI,IAAI;AACvB,QAAM,QAAQ,OAAO,QAAQ,MAAM;AACnC,MAAI,QAAQ,KAAK,OAAO,QAAQ,QAAQ,QAAQ,CAAC,KAAK,EAAG,QAAc,aAAK;AAC5E,QAAM,QAAQ,QAAQ,OAAO;AAC7B,QAAM,OAAO,OAAO,MAAM,KAAK;AAC/B,QAAM,OAAO,SAAS,KAAK,SAAa,eAAU,IAAI,EAAE;AACxD,MAAI,OAAO,IAAI,MAAM;AACnB,WAAc,aAAK,EAAE,IAAI,KAAK,QAAQ,OAAO,MAAM,IAAI,OAAO,GAAG,CAAC;AACpE,SAAc,YAAI,WAAW,QAAQ,IAAI,GAAG,CAAC,WAAW;AAAA,IACtD,IAAI,KAAK,QAAQ;AAAA,IACjB,MAAM,KAAK,QAAQ;AAAA,IACnB,OAAO,KAAK,QAAQ;AAAA,EACtB,EAAE;AACJ;AAEA,IAAM,eAAe,CACnB,OACA,OAEAF,QAAO,IAAI,aAAa;AACtB,QAAM,OAAO,UAAU,GAAG,MAAM,WAAW,GAAG,IAAI;AAClD,QAAM,WAAkB;AAAA,IAAQ,SAAS,MAAM,MAAM,GAAG,MAAM;AAAA,IAAG,CAACM,UACzD,YAAI,UAAUA,OAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,MAAAA,OAAM,MAAM,EAAE;AAAA,EACnE;AACA,QAAM,YAAmB;AAAA,IAAQ,SAAS,MAAM,OAAO,GAAG,MAAM;AAAA,IAAG,CAACA,UAC3D,YAAI,UAAUA,OAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,MAAAA,OAAM,MAAM,EAAE;AAAA,EACnE;AACA,MAAW,eAAO,QAAQ,KAAY,eAAO,SAAS;AACpD,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEF,QAAM,eAAe,OAAO,OAAO,eAAe,SAAS,MAAM,IAAI,CAAC;AACtE,QAAM,aAAa,OAAO,OAAO,eAAe,UAAU,MAAM,IAAI,CAAC;AACrE,MAAI,iBAAiB;AACnB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,6BAA6B,UAAU,OAAO,YAAY;AAAA,MAC5D;AAAA,IACF;AACF,MAAW,eAAO,UAAU,MAAM,MAAM,OAAO;AAC7C,WAAc;AAAA,MACZ,QAAQ,IAAI,MAAM,cAAc,sCAAsC;AAAA,IACxE;AACF,QAAM,WAAW,cAAc,GAAG,KAAK;AACvC,MAAW,eAAO,QAAQ;AACxB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACF,QAAM,cAAc,SAAS;AAE7B,QAAM,OAAO,UAAU,MAAM;AAC7B,QAAM,OAAO;AAAA,IACX,MAAM;AAAA,IACN,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,OAAO,KAAK;AAAA,EACnB;AACA,QAAM,YAAY;AAAA,IAChB,MAAM;AAAA,IACN;AAAA,IACA,KAAK,eAAe,SAAS,WACzB,KAAK,eAAe,WACpB,KAAK;AAAA,EACX;AACA,MAAW,eAAO,SAAS;AACzB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACF,QAAMH,QAAO,UAAU,MAAM;AAC7B,QAAM,OAAO,MAAM,WAAW,MAAMA,QAAO,GAAG,UAAU,MAAM,KAAK;AACnE,QAAM,UAAU,aAAa,MAAM,GAAG,IAAI;AAC1C,MAAW,eAAO,OAAO;AACvB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,0CAA0C,GAAG,MAAM;AAAA,MACrD;AAAA,IACF;AACF,QAAM,OAAO,QAAQ,MAAM;AAC3B,QAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,MAAI,SAAS;AACX,WAAc;AAAA,MACZ,QAAQ,IAAI,MAAM,cAAc,sCAAsC;AAAA,IACxE;AACF,QAAM,MAAM,KAAK,MAAM,SAAS,CAAC;AACjC,QAAMD,SAAY,UAAK,GAAG;AAC1B,MAAI,CAAC,UAAUA,MAAK;AAClB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,iCAAiCA,MAAK;AAAA,MACxC;AAAA,IACF;AACF,QAAM,QACJC,QAAO,IAAI,QAAQ,MAAM,QAAQ,SAAS,IAAI,aAAa,GAAG;AAChE,SAAc,gBAAQ;AAAA,IACpB;AAAA,IACA,KAAK,QAAQD,OAAM;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AACH,CAAC;AAEH,IAAM,uBAAuB,CAC3B,OACA,OAEAF,QAAO,IAAI,aAAa;AACtB,QAAM,OAAO,oBAAoB,GAAG,IAAI;AACxC,QAAM,WAAW,kBAAkB,MAAM,MAAM,GAAG,IAAI;AACtD,QAAM,YAAY,kBAAkB,MAAM,OAAO,GAAG,IAAI;AACxD,MAAW,eAAO,QAAQ,KAAY,eAAO,SAAS;AACpD,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEF,QAAM,eAAe,OAAO,OAAO,wBAAwB,SAAS,KAAK,CAAC;AAC1E,QAAM,aAAa,OAAO,OAAO,wBAAwB,UAAU,KAAK,CAAC;AACzE,MAAI,iBAAiB;AACnB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,4CAA4C,UAAU,OAAO,YAAY;AAAA,MAC3E;AAAA,IACF;AACF,MAAW,eAAO,UAAU,MAAM,OAAO;AACvC,WAAc;AAAA,MACZ,QAAQ,IAAI,MAAM,cAAc,sCAAsC;AAAA,IACxE;AACF,QAAM,WAAW,cAAc,GAAG,KAAK;AACvC,MAAW,eAAO,QAAQ;AACxB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEF,QAAM,QAAQ,UAAU;AACxB,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM,OAAO,KAAK;AAAA,MAClB,MAAM,OAAO,KAAK;AAAA,IACpB;AAAA,IACA,GAAG;AAAA,EACL;AACA,MAAW,eAAO,KAAK;AACrB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACF,MAAI,CAAC,UAAU,MAAM,MAAM,KAAK;AAC9B,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,iCAAiC,MAAM,MAAM,KAAK;AAAA,MACpD;AAAA,IACF;AACF,SAAc,gBAAQ;AAAA,IACpB,OAAO,MAAM,MAAM;AAAA,IACnB,KAAK,MAAM,MAAM;AAAA,IACjB,aAAa,SAAS;AAAA,IACtB;AAAA,EACF,CAAC;AACH,CAAC;AAEH,IAAM,kBAAkB,CACtB,OACA,OAEAA,QAAO,IAAI,aAAa;AACtB,QAAM,OAAO,UAAU,GAAG,MAAM;AAChC,QAAM,WAAW,SAAS,MAAM,MAAM,GAAG,MAAM;AAC/C,QAAM,YAAY,SAAS,MAAM,OAAO,GAAG,MAAM;AACjD,MAAW,eAAO,QAAQ,KAAY,eAAO,SAAS;AACpD,WAAc;AAAA,MACZ,QAAQ,IAAI,MAAM,aAAa,2BAA2B;AAAA,IAC5D;AACF,QAAM,eAAe,OAAO,OAAO,eAAe,SAAS,KAAK,CAAC;AACjE,QAAM,aAAa,OAAO,OAAO,eAAe,UAAU,KAAK,CAAC;AAChE,MAAI,iBAAiB;AACnB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,6BAA6B,UAAU,OAAO,YAAY;AAAA,MAC5D;AAAA,IACF;AAEF,QAAM,OAAO,UAAU;AACvB,QAAM,OAAO;AAAA,IACX,MAAM;AAAA,IACN,KAAK,OAAO,KAAK;AAAA,IACjB,KAAK,OAAO,KAAK;AAAA,EACnB;AACA,QAAM,QAAQ,UAAU,MAAM,YAAY,MAAM,MAAM;AACtD,MAAW,eAAO,KAAK;AACrB,WAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACF,QAAM,UAAU,KAAK,UAAU,GAAG,IAAI;AACtC,QAAM,WACJ,MAAM,MAAM,OAAO,IACR,aAAK,IACZ;AAAA,IACE,MAAM,WAAW,MAAM,MAAM,MAAM,OAAO,GAAG,MAAM,MAAM,KAAK;AAAA,IAC9D,MAAM,MAAM,OAAO;AAAA,IACnB;AAAA,EACF;AACN,MAAW,eAAO,QAAQ;AACxB,WAAc,gBAAQ;AAAA,MACpB,OAAO,SAAS,MAAM;AAAA,MACtB,KAAK,SAAS,MAAM;AAAA,MACpB,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AACH,MAAI,MAAM,MAAM,OAAO;AACrB,WAAc,gBAAQ;AAAA,MACpB,OAAO,MAAM,MAAM;AAAA,MACnB,KAAK,MAAM,MAAM,KAAK,QAAQ;AAAA,MAC9B,aAAa,cAAc,OAAO;AAAA,MAClC;AAAA,IACF,CAAC;AACH,QAAM,OAAO,MAAM,WAAW;AAAA,IAC5B,MAAM,MAAM,OAAO;AAAA,IACnB,MAAM,MAAM;AAAA,EACd;AACA,QAAM,QAAY,UAAK,IAAI,EAAE,WAAW;AACxC,SAAc,gBAAQ;AAAA,IACpB,OAAO,MAAM,MAAM,OAAO;AAAA,IAC1B,KAAK,MAAM,MAAM,OAAO;AAAA,IACxB,aAAa,QAAQ,QAAQ,OAAO,KAAK,QAAQ,OAAO;AAAA,IACxD;AAAA,EACF,CAAC;AACH,CAAC;AAEH,IAAM,qBAAqB,CACzB,OACA,OAC2E;AAC3E,QAAM,OAAO;AACb,QAAM,WAAW,MAAM,KAAK,SAAS;AACrC,QAAM,SAAS,MAAM,MAAM,SAAS;AACpC,MAAW,kBAAU,QAAQ,MAAa,kBAAU,MAAM;AACxD,WAAOA,QAAO;AAAA,MACL;AAAA,QACL;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACF,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,EAAE,OAAO,GAAG,KAAK,MAAM,WAAW,OAAO;AAAA,IACzC;AAAA,EACF;AACA,MAAW,eAAO,KAAK,KAAK,MAAM,MAAM,OAAO;AAC7C,WAAOA,QAAO;AAAA,MACL;AAAA,QACL,QAAQ,IAAI,MAAM,aAAa,mCAAmC;AAAA,MACpE;AAAA,IACF;AACF,QAAM,UAAU,KAAK,UAAU,GAAG,WAAW;AAC7C,QAAM,WAAW;AAAA,IACf,MAAM,WAAW,MAAM,MAAM,MAAM,OAAO,GAAG,MAAM,MAAM,KAAK;AAAA,IAC9D,MAAM,MAAM,OAAO;AAAA,IACnB;AAAA,EACF;AACA,MAAW,eAAO,QAAQ;AACxB,WAAOA,QAAO;AAAA,MACL,gBAAQ;AAAA,QACb,OAAO,SAAS,MAAM;AAAA,QACtB,KAAK,SAAS,MAAM;AAAA,QACpB,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AACF,QAAM,OAAO,MAAM,WAAW,MAAM,MAAM,MAAM,OAAO,GAAG,MAAM,MAAM,KAAK;AAC3E,QAAM,QAAY,UAAK,IAAI,EAAE,WAAW;AACxC,SAAOA,QAAO;AAAA,IACL,gBAAQ;AAAA,MACb,OAAO,MAAM,MAAM,OAAO;AAAA,MAC1B,KAAK,MAAM,MAAM,OAAO;AAAA,MACxB,aAAa,QACT,eAAe,OAAO,KACtB,eAAe,OAAO;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,IAAM,cAAc,CAAC,OAA2B;AAC9C,QAAM,UAAqE;AAAA,IACzE,YAAY,CAAC,cACX,UAAU,OAAO,aACb,gBAAgB,UAAU,QAAQ,IAAI,UAAU,QAAQ,OAAO,UAAU,MAAM,IAAI,UAAU,MAAM,KACnG;AAAA,IACN,eAAe,CAAC,cACd,UAAU,OAAO,gBACb,mBAAmB,UAAU,QAAQ,IAAI,UAAU,QAAQ,OAAO,UAAU,MAAM,IAAI,UAAU,MAAM,KACtG;AAAA,IACN,eAAe,CAAC,cACd,UAAU,OAAO,gBACb,sBAAsB,OAAO,QAAQ,UAAU,OAAO,EACnD,IAAI,CAAC,CAACO,MAAKL,MAAK,MAAM,GAAGK,IAAG,IAAI,OAAOL,MAAK,CAAC,EAAE,EAC/C,KAAK,IAAI,CAAC,KACb;AAAA,IACN,aAAa,MAAM;AAAA,IACnB,sBAAsB,MAAM;AAAA,IAC5B,iBAAiB,MAAM;AAAA,IACvB,mBAAmB,MAAM;AAAA,EAC3B;AACA,SAAO;AAAA,IACL;AAAA,IACA,GAAG,OAAO,cAAc,GAAG,OAAO,gBAC9B,WACA,GAAG,OAAO,gBACR,aACA;AAAA,IACN;AAAA,IACA,GAAG,QAAQ,GAAG,EAAE,EAAE,EAAE,CAAC;AAAA,EACvB;AACF;AAEA,IAAM,UAAU,CACd,OACA,OAEAM,OAAM,MAAM,EAAE,EAAE;AAAA,EACdA,OAAM,cAAc,IAAI;AAAA,IAAE;AAAA,IAAa,CAACN,WACtC,aAAa,OAAOA,MAAK;AAAA,EAC3B;AAAA,EACAM,OAAM,cAAc,IAAI;AAAA,IAAE;AAAA,IAAsB,CAACN,WAC/C,qBAAqB,OAAOA,MAAK;AAAA,EACnC;AAAA,EACAM,OAAM,cAAc,IAAI;AAAA,IAAE;AAAA,IAAiB,CAACN,WAC1C,gBAAgB,OAAOA,MAAK;AAAA,EAC9B;AAAA,EACAM,OAAM,cAAc,IAAI;AAAA,IAAE;AAAA,IAAmB,CAACN,WAC5C,mBAAmB,OAAOA,MAAK;AAAA,EACjC;AAAA,EACAM,OAAM,OAAO,CAACN,WAAUF,QAAO,QAAe,aAAK,YAAYE,MAAK,CAAC,CAAC,CAAC;AACzE;AAEF,IAAM,YAAY,CAACA,WACjB,OAAOA,WAAU,WACN,aAAK,IAAI,SAAS,EAAE,OAAAA,QAAO,MAAM,OAAOA,MAAK,EAAE,CAAC,CAAC,IACxD,OAAOA,WAAU,YAAY,OAAOA,WAAU,YACrC,aAAKA,MAAK,IACV,aAAK;AAGb,IAAM,eAAe,CAC1B,IACA,QAEI;AAAA,EAAO;AAAA,EAAK;AAAA,EAAI,CAAC,SAAS,OAC5BM,OAAM,MAAM,EAAE,EAAE;AAAA,IACdA,OAAM,cAAc,IAAI;AAAA,MACtB;AAAA,MACA,CAACN,WACC,IAAI,WAAW;AAAA,QACb,GAAG;AAAA,QACH,OAAO,QAAQ,MAAM;AAAA,UAAI,CAAC,SACxB,KAAK,OAAOA,OAAM,SACd,OACA,IAAI,OAAO;AAAA,YACT,GAAG;AAAA,YACH,QAAQ,KAAK,OAAO;AAAA,cAAI,CAAC,UACvB,MAAM,SAASA,OAAM,OACjB,QACA,IAAI,QAAQ;AAAA,gBACV,GAAG;AAAA,gBACH,SAAgB;AAAA,kBACd,UAAUA,OAAM,KAAK;AAAA,kBACrB,MAAM,MAAM;AAAA,gBACd;AAAA,cACF,CAAC;AAAA,YACP;AAAA,UACF,CAAC;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACL;AAAA,IACAM,OAAM,cAAc,IAAI;AAAA,MAAE;AAAA,MAAsB,CAACN,WACxC,cAAM,UAAUA,OAAM,KAAK,GAAG;AAAA,QACnC,QAAQ,MAAM;AAAA,QACd,QAAQ,CAAC,SACP,IAAI,WAAW;AAAA,UACb,GAAG;AAAA,UACH,UAAU,IAAI,WAAW;AAAA,YACvB,GAAG,QAAQ;AAAA,YACX,QAAe;AAAA,cAAI,QAAQ,SAAS;AAAA,cAAQ,CAAC,WAC3C,OAAO;AAAA,gBAAI,CAAC,UACV,MAAM,SAASA,OAAM,OACjB,QACA,IAAI,gBAAgB;AAAA,kBAClB,GAAG;AAAA,kBACH,SAAgB,aAAK,IAAI;AAAA,gBAC3B,CAAC;AAAA,cACP;AAAA,YACF;AAAA,UACF,CAAC;AAAA;AAAA,UAED,OAAO,QAAQ,MAAM;AAAA,YACnB,CAAC,SACC,IAAI,OAAO;AAAA,cACT,GAAG;AAAA,cACH,QAAQ,KAAK,OAAO;AAAA,gBAAI,CAAC,UAChB,iBAAS,MAAM,eAAeA,OAAM,IAAI,IAC3C,IAAI,QAAQ;AAAA,kBACV,GAAG;AAAA,kBACH,SAAgB,aAAK,IAAI;AAAA,kBACzB,UAAiB,aAAK;AAAA,gBACxB,CAAC,IACD;AAAA,cACN;AAAA,YACF,CAAC;AAAA,UACL;AAAA,QACF,CAAC;AAAA,MACL,CAAC;AAAA,IACH;AAAA,IACAM,OAAM,cAAc,IAAI;AAAA,MACtB;AAAA,MACA,CAACN,WACC,IAAI,WAAW;AAAA,QACb,GAAG;AAAA,QACH,OAAO,QAAQ,MAAM;AAAA,UAAI,CAAC,SACxB,KAAK,OAAOA,OAAM,SACd,IAAI,OAAO,EAAE,GAAG,MAAM,MAAMA,OAAM,KAAK,CAAC,IACxC;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACL;AAAA,IACAM,OAAM,cAAc,IAAI;AAAA,MACtB;AAAA,MACA,CAACN,WACC,IAAI,WAAW;AAAA,QACb,GAAG;AAAA,QACH,UAAU,IAAI,WAAW;AAAA,UACvB,GAAG,QAAQ;AAAA,UACX,aAAoB,aAAKA,OAAM,WAAW;AAAA,QAC5C,CAAC;AAAA,MACH,CAAC;AAAA,IACL;AAAA,IACAM,OAAM,OAAO,MAAM,OAAO;AAAA,EAC5B;AACF;AASK,IAAM,aAAa,CACxB,UAEAR,QAAO,IAAI,aAAa;AACtB,QAAM,UAAU,OAAOA,QAAO;AAAA,IAC5B,MAAM;AAAA,IACN,CAAC,OAAO,QAAQ,OAAO,EAAE;AAAA,IACzB;AAAA,MACE,aAAa;AAAA,IACf;AAAA,EACF;AACA,QAAM,WAAe;AAAA,IAAQ;AAAA,IAAS,CAAC,WAC9B,cAAM,QAAQ;AAAA,MACnB,WAAW,MAAM,CAAC;AAAA,MAClB,WAAW,CAACS,aAAY,CAACA,QAAO;AAAA,IAClC,CAAC;AAAA,EACH;AACA,MAAI,SAAS,SAAS,EAAG,QAAO,EAAE,QAAQ,WAAW,SAAS;AAE9D,QAAM,QAAY;AAAA,IAAQ;AAAA,IAAS,CAAC,WAC3B,cAAM,QAAQ;AAAA,MACnB,WAAW,CAAC,SAAS,CAAC,IAAI;AAAA,MAC1B,WAAW,MAAM,CAAC;AAAA,IACpB,CAAC;AAAA,EACH;AACA,QAAMC,WAAc;AAAA,IAClB;AAAA,IACM,gBAAe,eAAQ,CAAC,SAAe,KAAK,KAAK;AAAA,EACzD;AACA,QAAM,WAAe;AAAA,IACf,SAAIA,UAAa,UAAKA,UAAS,CAAC,CAAC;AAAA,IACrC,CAAC,CAAC,MAAM,KAAK,MAAM,MAAM,QAAQ,KAAK;AAAA,EACxC;AACA,MAAI,SAAS,SAAS;AACpB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,QACR,IAAI,aAAa;AAAA,UACf,IAAI;AAAA,UACJ,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ;AAAA,UAC/B,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAEF,QAAM,OAAW;AAAA,IACfA;AAAA,IACA,MAAM;AAAA,IACN,CAAC,SAAS,SACR,GAAG,QAAQ,MAAM,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,WAAW,GAAG,QAAQ,MAAM,KAAK,GAAG,CAAC;AAAA,EAChF;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,SAASA,SAAQ;AAAA,MACf,CAAC,SACC,IAAI,YAAY;AAAA,QACd,MAAM,KAAK;AAAA,QACX,QAAQ,MAAM,WAAW,MAAM,KAAK,OAAO,KAAK,GAAG;AAAA,QACnD,OAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACL;AAAA,IACA,UAAU,aAAa,MAAM,OAAO,MAAM,GAAG;AAAA,EAC/C;AACF,CAAC;;;AGr4BH,SAAS,UAAAC,eAAc;AACvB,YAAYC,iBAAgB;AAC5B,YAAYC,WAAU;AAIf,IAAM,aAAa,CAAC,KAAa,WACtCC,QAAO,IAAI,aAAa;AACtB,QAAM,KAAK,OAAkB;AAC7B,QAAM,OAAO,OAAY;AACzB,SAAO,OAAO,GAAG,eAAe,KAAK,QAAQ,KAAK,MAAM,CAAC,EAAE;AAAA,IACzDA,QAAO;AAAA,MACL,CAAC,UACC,IAAI,YAAY;AAAA,QACd,MAAM;AAAA,QACN,SAAS,eAAe,MAAM,KAAK,MAAM,OAAO;AAAA,MAClD,CAAC;AAAA,IACL;AAAA,EACF;AACF,CAAC;AAGI,IAAM,cAAc,CAAC,KAAa,QAAgB,SACvDA,QAAO,IAAI,aAAa;AACtB,QAAM,KAAK,OAAkB;AAC7B,QAAM,OAAO,OAAY;AACzB,QAAM,SAAS,KAAK,QAAQ,KAAK,MAAM;AACvC,QAAM,YAAY,GAAG,MAAM;AAC3B,SAAO,GAAG,gBAAgB,WAAW,IAAI,EAAE;AAAA,IACzCA,QAAO;AAAA,MACL,CAAC,UACC,IAAI,YAAY;AAAA,QACd,MAAM;AAAA,QACN,SAAS,gBAAgB,MAAM,KAAK,MAAM,OAAO;AAAA,MACnD,CAAC;AAAA,IACL;AAAA,EACF;AACA,SAAO,GAAG,OAAO,WAAW,MAAM,EAAE;AAAA,IAClCA,QAAO;AAAA,MACL,CAAC,UACC,IAAI,YAAY;AAAA,QACd,MAAM;AAAA,QACN,SAAS,kBAAkB,MAAM,KAAK,MAAM,OAAO;AAAA,MACrD,CAAC;AAAA,IACL;AAAA,EACF;AACF,CAAC;;;AJPH,IAAMC,WAAU,CACd,IACA,MACA,QACA,WACiB,IAAI,aAAa,EAAE,IAAI,GAAG,IAAI,MAAM,QAAQ,OAAO,CAAC;AAEvE,IAAM,SAAS,CAAC,OACdC,OAAM,MAAM,EAAE,EAAE;AAAA,EACdA,OAAM,cAAc,IAAI;AAAA,IACtB;AAAA,IACA,CAACC,WAAU,UAAUA,OAAM,MAAM,WAAWA,OAAM,IAAI;AAAA,EACxD;AAAA,EACAD,OAAM,cAAc,IAAI;AAAA,IACtB;AAAA,IACA,CAACC,WAAU,oBAAoBA,OAAM,IAAI;AAAA,EAC3C;AAAA,EACAD,OAAM,cAAc,IAAI;AAAA,IACtB;AAAA,IACA,CAACC,WAAU,UAAUA,OAAM,MAAM;AAAA,EACnC;AAAA,EACAD,OAAM,cAAc,IAAI,EAAE,mBAAmB,MAAM,uBAAuB;AAAA,EAC1EA,OAAM,OAAO,MAAM,GAAG;AACxB;AAEF,IAAME,YAAW,CAAC,IAAgB,OAC5B,eAAU,GAAG,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE;AAElD,IAAMC,qBAAoB,CAAC,IAAgB,SACzCC,SAAO;AAAA,EAAQ,GAAG,SAAS;AAAA,EAAQ,CAAC,WAC9B,eAAU,QAAQ,CAAC,UAAU,MAAM,SAAS,IAAI;AACtD;AAGF,IAAMC,UAAS,CAACJ,WACdA,kBAAiB,WACbA,OAAM,OACJ,YAASA,MAAK,IACd,IAAIA,MAAK,MACT,OAAOA,MAAK;AAGpB,IAAM,YAAY,CAAC,UAAuB,WACxCD,OAAM,MAAM,QAAQ,EAAE;AAAA,EACpBA,OAAM;AAAA,IACF;AAAA,IACF,CAACC,WAAU,kBAAkB,YAAY,OAAO,UAAUA;AAAA,EAC5D;AAAA,EACAD,OAAM,KAAO,aAAU,CAACC,WAAY,YAAS,MAAM,KAAK,WAAWA,MAAK;AAAA,EACxED,OAAM,KAAO,cAAW,CAACC,WAAY,aAAU,MAAM,KAAK,WAAWA,MAAK;AAAA,EAC1ED,OAAM,OAAO,MAAM,KAAK;AAC1B;AAKF,IAAM,eAAe,CACnB,UACA,OACgC;AAChC,QAAM,OAAO,OAAO,EAAE;AACtB,QAAM,QAAQI,SAAO;AAAA,IAAQF,UAAS,UAAU,GAAG,MAAM;AAAA,IAAG,CAAC,SACvD,eAAU,KAAK,QAAQ,CAAC,cAAc,UAAU,SAAS,GAAG,IAAI;AAAA,EACtE;AACA,MAAIE,SAAO,OAAO,KAAK,GAAG;AACxB,WAAOA,SAAO;AAAA,MACZL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,kCAAkC,GAAG,MAAM,IAAI,GAAG,IAAI;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAUK,SAAO,UAAU,MAAM,MAAM,aAAa;AAC1D,MAAI,YAAY,MAAM;AACpB,WAAOA,SAAO;AAAA,MACZL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,6BAA6B,GAAG,MAAM,IAAI,GAAG,IAAI,gCAAgC,OAAO,kBAAkB,SAAS,SAAS,IAAI,+BAA+B,OAAO;AAAA,MACxK;AAAA,IACF;AAAA,EACF;AACA,MAAIK,SAAO,OAAO,MAAM,MAAM,OAAO,GAAG;AACtC,WAAOA,SAAO;AAAA,MACZL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,GAAG,MAAM,IAAI,GAAG,IAAI,qDAAqDM,QAAO,GAAG,KAAK,CAAC;AAAA,MAC3G;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,MAAM,MAAM,QAAQ;AACnC,MAAI,UAAU,GAAG,OAAO,MAAM,EAAG,QAAOD,SAAO,KAAK;AACpD,SAAOA,SAAO;AAAA,IACZL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,6BAA6B,GAAG,MAAM,IAAI,GAAG,IAAI,oDAAoD,SAAS,SAAS,IAAI,WAAW,GAAG,MAAM,uCAAuCM,QAAO,MAAM,CAAC,cAAcA,QAAO,GAAG,KAAK,CAAC;AAAA,IACpO;AAAA,EACF;AACF;AAEA,IAAM,uBAAuB,CAC3B,UACA,OACgC;AAChC,QAAM,OAAO,OAAO,EAAE;AACtB,QAAM,QAAQF,mBAAkB,UAAU,GAAG,IAAI;AACjD,MAAIC,SAAO,OAAO,KAAK,GAAG;AACxB,WAAOA,SAAO;AAAA,MACZL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,sDAAsD,GAAG,IAAI;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AACA,MAAIK,SAAO,OAAO,MAAM,MAAM,OAAO,GAAG;AACtC,WAAOA,SAAO;AAAA,MACZL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,oCAAoC,GAAG,IAAI,qDAAqDM,QAAO,GAAG,KAAK,CAAC;AAAA,MAClH;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,MAAM,MAAM,QAAQ;AACnC,SAAO,UAAU,GAAG,OAAO,MAAM,IAC7BD,SAAO,KAAK,IACZA,SAAO;AAAA,IACLL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,oCAAoC,GAAG,IAAI,OAAOM,QAAO,MAAM,CAAC,cAAcA,QAAO,GAAG,KAAK,CAAC;AAAA,IAChG;AAAA,EACF;AACN;AAEA,IAAM,kBAAkB,CACtB,UACA,OACgC;AAChC,QAAM,OAAO,OAAO,EAAE;AACtB,QAAM,OAAOH,UAAS,UAAU,GAAG,MAAM;AACzC,MAAIE,SAAO,OAAO,IAAI,GAAG;AACvB,WAAOA,SAAO;AAAA,MACZL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,uCAAuC,GAAG,MAAM;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,MAAM,SAAS,GAAG,OAC1BK,SAAO,KAAK,IACZA,SAAO;AAAA,IACLL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,4CAA4C,GAAG,MAAM,KAAK,KAAK,MAAM,IAAI;AAAA,IAC3E;AAAA,EACF;AACN;AAEA,IAAM,qBAAqB,CACzB,UACA,OAEAK,SAAO;AAAA,EACL,SAAS,SAAS;AAAA,EAClB,CAACH,WAAUA,WAAU,GAAG;AAC1B,IACIG,SAAO,KAAK,IACZA,SAAO;AAAA,EACLL;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,mCAAmCM,QAAO,GAAG,WAAW,CAAC;AAAA,EAC3D;AACF;AAGC,IAAM,YAAY,CACvB,UACA,QAEI;AAAA,EAAQ;AAAA,EAAK,CAAC,OAChBD,SAAO;AAAA,IACLJ,OAAM,MAAM,EAAE,EAAE;AAAA,MACdA,OAAM,cAAc,IAAI;AAAA,QAAE;AAAA,QAAa,CAACC,WACtC,aAAa,UAAUA,MAAK;AAAA,MAC9B;AAAA,MACAD,OAAM,cAAc,IAAI;AAAA,QAAE;AAAA,QAAsB,CAACC,WAC/C,qBAAqB,UAAUA,MAAK;AAAA,MACtC;AAAA,MACAD,OAAM,cAAc,IAAI;AAAA,QAAE;AAAA,QAAiB,CAACC,WAC1C,gBAAgB,UAAUA,MAAK;AAAA,MACjC;AAAA,MACAD,OAAM,cAAc,IAAI;AAAA,QAAE;AAAA,QAAmB,CAACC,WAC5C,mBAAmB,UAAUA,MAAK;AAAA,MACpC;AAAA,MACAD,OAAM,OAAO,MAAMI,SAAO,KAAmB,CAAC;AAAA,IAChD;AAAA,IACA,EAAE,QAAQ,MAAM,CAAC,GAAG,QAAQ,CAACH,WAAU,CAACA,MAAK,EAAE;AAAA,EACjD;AACF;AAOF,IAAM,gBAAgB,CAAC,OAA2B,SAChDK,QAAO,IAAI,aAAa;AACtB,QAAM,KAAK,OAAkB;AAC7B,QAAM,OAAO,OAAY;AACzB,QAAMC,UAAS,OAAOC,QAAO;AAC7B,QAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,MAAM,KAAK,MAAM,MAAM,CAAC;AACpE,QAAM,QAAQ,OAAOD,QAAO,aAAa,EAAE;AAAA,IACzCD,QAAO;AAAA,MACL,CAAC,UACC,IAAI,YAAY;AAAA,QACd,MAAM;AAAA,QACN,SAAS,gBAAgB,MAAM,MAAM,sBAAsB,MAAM,OAAO;AAAA,MAC1E,CAAC;AAAA,IACL;AAAA,EACF;AACA,QAAM,OAAO,KAAK,KAAK,WAAW,kBAAkB,KAAK,KAAK;AAC9D,SAAO,GAAG,gBAAgB,MAAM,IAAI,EAAE;AAAA,IACpCA,QAAO;AAAA,MACL,CAAC,UACC,IAAI,YAAY;AAAA,QACd,MAAM;AAAA,QACN,SAAS,gBAAgB,MAAM,MAAM,sBAAsB,MAAM,OAAO;AAAA,MAC1E,CAAC;AAAA,IACL;AAAA,EACF;AACA,SAAO,OAAOA,QAAO;AAAA,IACnBA,QAAO,IAAI,aAAa;AACtB,YAAM,WAAW,OAAO,UAAU,MAAM,EAAE,KAAK,MAAM,IAAI,CAAC,EAAE;AAAA,QAC1DA,QAAO,SAAS,CAAC,UAAU,gBAAgB,MAAM,QAAQ,KAAK,CAAC;AAAA,MACjE;AACA,aAAO,OAAO,iBAAiB,QAAQ,EAAE;AAAA,QACvCA,QAAO;AAAA,UACL,CAAC,UACC,IAAI,YAAY;AAAA,YACd,MAAM;AAAA,YACN,SAAS,0DAA0D,MAAM,MAAM,KAAK,MAAM,OAAO;AAAA,UACnG,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,GAAG,OAAO,IAAI,EAAE,KAAKA,QAAO,cAAc,MAAM,MAAS,CAAC;AAAA,EAC5D;AACF,CAAC;AASI,IAAM,gBAAgB,CAC3B,UAMAA,QAAO,IAAI,aAAa;AACtB,QAAM,UAAU,OAAO,WAAW;AAAA,IAChC,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,KAAK,MAAM;AAAA,EACb,CAAC;AACD,MAAI,QAAQ,WAAW,UAAW,QAAO;AAGzC,MAAI,MAAM,IAAI,WAAW,EAAG,QAAO;AAEnC,QAAM,WAAW,OAAO,cAAc,OAAO,QAAQ,IAAI;AACzD,QAAM,WAAW,UAAU,UAAU,MAAM,GAAG;AAC9C,MAAI,SAAS,SAAS,EAAG,QAAO,EAAE,QAAQ,WAAW,SAAS;AAE9D,MAAI,MAAM,MAAO,QAAO,YAAY,MAAM,KAAK,MAAM,QAAQ,QAAQ,IAAI;AACzE,SAAO;AACT,CAAC;;;AKjVH,YAAYG,UAAS;AACrB,YAAYC,cAAa;AACzB,YAAYC,cAAY;AACxB,YAAYC,YAAW;AACvB,YAAYC,cAAY;AAexB,IAAMC,UAAS,CAACC,WACP,2BAAyB,aAAI,EAAEA,MAAK;AAE7C,IAAMC,UAAS,CACb,QACAD,WACgBD,QAAc,oBAAW,MAAM,EAAEC,MAAK,CAAC;AAGlD,IAAM,UAAN,cAA6B,eAAe,SAAS,EAAE;AAAA,EAC5D,IAAW;AAAA,EACX,MAAa;AACf,CAAC,EAAE;AAAC;AAGG,IAAM,cAAN,cAAiC,eAAmB,aAAa,EAAE;AAAA,EACxE,MAAM;AAAA,EACN,IAAI;AACN,CAAC,EAAE;AAAC;AAGG,IAAM,cAAN,cAAiC,eAAmB,aAAa,EAAE;AAAA,EACxE,OAAc;AAAA,EACd,MAAa;AAAA,EACb,IAAW;AACb,CAAC,EAAE;AAAC;AAGG,IAAM,aAAN,cAAgC,eAAkB,YAAY,EAAE;AAAA,EACrE,MAAa;AAAA,EACb,MAAa,kBAAS,CAAC,UAAU,SAAS,CAAC;AAAA,EAC3C,MAAa;AAAA,EACb,OAAc,kBAAS,CAAC,QAAQ,UAAU,CAAC;AAAA,EAC3C,MAAa;AAAA,EACb,IAAW;AACb,CAAC,EAAE;AAAC;AAGG,IAAM,cAAN,cAAiC,eAAmB,aAAa,EAAE;AAAA,EACxE,MAAa;AAAA,EACb,MAAa;AAAA,EACb,OAAc,kBAAS;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,MAAa;AAAA,EACb,IAAW;AACb,CAAC,EAAE;AAAC;AAGG,IAAM,UAAN,cAA6B,eAAe,SAAS,EAAE;AAAA,EAC5D,MAAa;AAAA,EACb,IAAW;AACb,CAAC,EAAE;AAAC;AAGG,IAAM,eAAN,cAAkC,eAAoB,cAAc,EAAE;AAAA,EAC3E,OAAc,gBAAO;AAAA,IACnB,OAAc,eAAM,OAAO;AAAA,IAC3B,SAAgB,eAAM,OAAO;AAAA,IAC7B,SAAgB,eAAM,WAAW;AAAA,EACnC,CAAC;AAAA,EACD,OAAc,eAAM,UAAU;AAAA,EAC9B,QAAe,eAAM,WAAW;AAAA,EAChC,OAAc,gBAAO;AAAA,IACnB,OAAc,eAAM,OAAO;AAAA,IAC3B,SAAgB,eAAM,OAAO;AAAA,EAC/B,CAAC;AAAA,EACD,SAAgB,eAAM,WAAW;AAAA,EACjC,UAAiB,eAAM,WAAW;AACpC,CAAC,EAAE;AAAC;AAEJ,IAAM,UAAU,CAAC,SAAiB,IAAI,QAAQ,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,KAAK,CAAC;AAE9E,IAAM,UAAU,CAAC,SACf,IAAI,QAAQ;AAAA,EACV,MAAM,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;AAAA,EACzC,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI;AACrC,CAAC;AAEH,IAAME,WAAU,CAAC,SACf,CAAC,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,GAAG,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;AAEvE,IAAM,WAAW,CAAC,UAA2B,MAAM;AAEnD,IAAM,aAAa,CAAC,MAAc,UAChC,KAAK,OAAO,SAAS,MAAM,OAAO,QAClC,KAAK,OAAO,KAAK,cAAc,MAAM,OAAO,KAAK,aACjD,KAAK,OAAO,KAAK,YAAY,MAAM,OAAO,KAAK;AAEjD,IAAM,eAAe,CAAC,UACb,eAAM,MAAM,SAAS;AAAA,EAC1B,QAAQ,MAAM;AAAA,EACd,QAAQ,CAACF,WACPA,kBAAiB,WAAWA,OAAM,QAAQA;AAC9C,CAAC;AAEH,IAAM,aAAa,CACjB,OACAG,WAEAA,WAAU,SACNF,QAAO,aAAa,MAAM,IAAI,IAC9BE,WAAU,aACD,mBAAU,MAAM,QAAQ,IACxB,mBAAU,MAAM,QAAQ;AAEvC,IAAM,UAAU,CACd,MACA,SAC2B,SAAS,WAAW,KAAK,SAAS,KAAK;AAEpE,IAAM,YAAY,CAAC,UACT,sBAAa,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAU,CAAC;AAEpE,IAAM,OAAO,CAAC,OAAwC,OAC5C,aAAI,OAAO,EAAE;AAGhB,IAAM,SAAS,CAAC,MAAkB,OAAiC;AACxE,QAAM,YAAY,UAAU,KAAK,KAAK;AACtC,QAAM,UAAU,UAAU,GAAG,KAAK;AAElC,QAAM,aAAa,KAAK,MACrB,OAAO,CAAC,SAAS,CAAS,aAAI,SAAS,KAAK,EAAE,CAAC,EAC/C,IAAI,CAAC,SAAS,KAAK,EAAE;AACxB,QAAM,WAAW,GAAG,MACjB,OAAO,CAAC,SAAS,CAAS,aAAI,WAAW,KAAK,EAAE,CAAC,EACjD,IAAI,CAAC,SAAS,KAAK,EAAE;AAGxB,QAAM,cAAkB,aAAQ,YAAY,CAAC,OAAO;AAClD,UAAM,UAAU,KAAK,WAAW,EAAE;AAClC,QAAW,gBAAO,OAAO,EAAG,QAAO,CAAC;AACpC,UAAM,QAAY;AAAA,MAAU;AAAA,MAAU,CAAC,gBAC9B,eAAM,KAAK,SAAS,WAAW,GAAG;AAAA,QACvC,QAAQ,MAAM;AAAA,QACd,QAAQ,CAAC,cAAc,WAAW,QAAQ,OAAO,SAAS;AAAA,MAC5D,CAAC;AAAA,IACH;AACA,WAAc,gBAAO,KAAK,IACtB,CAAC,IACM,eAAM,KAAK,SAAS,MAAM,KAAK,GAAG;AAAA,MACvC,QAAQ,MAAM,CAAC;AAAA,MACf,QAAQ,CAAC,SAAS;AAAA,QAChB,EAAE,SAAS,QAAQ,OAAO,OAAO,MAAM,SAAS,MAAM,MAAM;AAAA,MAC9D;AAAA,IACF,CAAC;AAAA,EACP,CAAC;AAED,QAAM,iBAAqB;AAAA,IAAQ,KAAK;AAAA,IAAO,CAAC,SACvC,eAAM,KAAK,SAAS,KAAK,EAAE,GAAG;AAAA,MACnC,QAAQ,MAAM,CAAC;AAAA,MACf,QAAQ,CAAC,cACP,UAAU,SAAS,KAAK,OACpB,CAAC,IACD,CAAC,IAAI,YAAY,EAAE,MAAM,QAAQ,IAAI,GAAG,IAAI,QAAQ,SAAS,EAAE,CAAC,CAAC;AAAA,IACzE,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,IAAI,IAAI,YAAY,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;AACzE,QAAM,eAAe,IAAI,IAAI,YAAY,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC;AAEpE,QAAM,QAAQ;AAAA,IACZ,OAAW;AAAA,MACT,SAAS,OAAO,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;AAAA,MAC7C,CAAC,OAAc,iBAAe,aAAI,KAAK,SAAS,EAAE,GAAG,OAAO,CAAC;AAAA,IAC/D;AAAA,IACA,SAAa;AAAA,MACX,WAAW,OAAO,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;AAAA,MACjD,CAAC,OAAc,iBAAe,aAAI,KAAK,WAAW,EAAE,GAAG,OAAO,CAAC;AAAA,IACjE;AAAA,IACA,SAAS;AAAA,MACP,GAAG,YAAY;AAAA,QACb,CAAC,SACC,IAAI,YAAY;AAAA,UACd,MAAM,QAAQ,KAAK,OAAO;AAAA,UAC1B,IAAI,QAAQ,KAAK,KAAK;AAAA,QACxB,CAAC;AAAA,MACL;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAEA,QAAM,YAAgB;AAAA,IAChB,kBAAqB,cAAK,SAAS,CAAC,EAAE;AAAA,MAAO,CAAC,OACxC,aAAI,SAAS,EAAE;AAAA,IACzB;AAAA,IACM;AAAA,EACR;AAEA,QAAM,OAAO,CAAC,OACL,aAAI,EAAE,QAAQ,KAAK,WAAW,EAAE,GAAG,OAAO,KAAK,SAAS,EAAE,EAAE,CAAC;AAEtE,QAAM,QAAY;AAAA,IAAQ;AAAA,IAAW,CAAC,OAC7B,eAAM,KAAK,EAAE,GAAG;AAAA,MACrB,QAAQ,MAAM,CAAC;AAAA,MACf,QAAQ,CAAC,EAAE,QAAQ,MAAM,MACnB;AAAA,QAAQ,CAAC,UAAU,SAAS;AAAA,QAAY,CAAC,SACvC,aAAQ,QAAQ,QAAQ,IAAI,GAAG,CAAC,SAAS;AAC3C,gBAAM,YAAY,QAAQ,OAAO,IAAI,EAAE;AAAA,YACrC,CAAC,UAAU,MAAM,OAAO,KAAK;AAAA,UAC/B;AACA,cAAI,cAAc,OAAW,QAAO,CAAC;AACrC,gBAAM,UAA6B,CAAC;AACpC,cACE,WAAWF,QAAO,QAAQ,KAAK,IAAI,CAAC,MACpC,WAAWA,QAAO,QAAQ,UAAU,IAAI,CAAC;AAEzC,oBAAQ;AAAA,cACN,IAAI,WAAW;AAAA,gBACb,MAAM;AAAA,gBACN;AAAA,gBACA,MAAM,KAAK;AAAA,gBACX,OAAO;AAAA,gBACP,MAAMA,QAAO,QAAQ,KAAK,IAAI;AAAA,gBAC9B,IAAIA,QAAO,QAAQ,UAAU,IAAI;AAAA,cACnC,CAAC;AAAA,YACH;AACF,cACS,mBAAU,KAAK,QAAQ,MACvB,mBAAU,UAAU,QAAQ;AAEnC,oBAAQ;AAAA,cACN,IAAI,WAAW;AAAA,gBACb,MAAM;AAAA,gBACN;AAAA,gBACA,MAAM,KAAK;AAAA,gBACX,OAAO;AAAA,gBACP,MAAa,mBAAU,KAAK,QAAQ;AAAA,gBACpC,IAAW,mBAAU,UAAU,QAAQ;AAAA,cACzC,CAAC;AAAA,YACH;AACF,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,SAAa;AAAA,IAAQ;AAAA,IAAW,CAAC,OAC9B,eAAM,KAAK,EAAE,GAAG;AAAA,MACrB,QAAQ,MAAM,CAAC;AAAA,MACf,QAAQ,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC7B,cAAM,QAAQ,MAAM,OACjB;AAAA,UACC,CAAC,UACC,CAAC,OAAO,OAAO,KAAK,CAAC,UAAU,SAAS,KAAK,MAAM,MAAM,IAAI;AAAA,QACjE,EACC;AAAA,UACC,CAAC,UACC,IAAI,YAAY;AAAA,YACd,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,OAAO;AAAA,YACP,MAAM;AAAA,YACN,IAAI,aAAa,KAAK;AAAA,UACxB,CAAC;AAAA,QACL;AACF,cAAM,UAAU,OAAO,OACpB;AAAA,UACC,CAAC,UACC,CAAC,MAAM,OAAO,KAAK,CAAC,UAAU,SAAS,KAAK,MAAM,MAAM,IAAI;AAAA,QAChE,EACC;AAAA,UACC,CAAC,UACC,IAAI,YAAY;AAAA,YACd,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,OAAO;AAAA,YACP,MAAM,aAAa,KAAK;AAAA,YACxB,IAAI;AAAA,UACN,CAAC;AAAA,QACL;AACF,cAAM,UAAc,aAAQ,OAAO,QAAQ,CAAC,UAAU;AACpD,gBAAM,YAAY,MAAM,OAAO;AAAA,YAC7B,CAAC,UAAU,MAAM,SAAS,MAAM;AAAA,UAClC;AACA,cAAI,cAAc,OAAW,QAAO,CAAC;AACrC,gBAAM,UAA8B,CAAC;AACrC,cAAI,aAAa,KAAK,MAAM,aAAa,SAAS;AAChD,oBAAQ;AAAA,cACN,IAAI,YAAY;AAAA,gBACd,MAAM;AAAA,gBACN,MAAM,MAAM;AAAA,gBACZ,OAAO;AAAA,gBACP,MAAM,aAAa,KAAK;AAAA,gBACxB,IAAI,aAAa,SAAS;AAAA,cAC5B,CAAC;AAAA,YACH;AACF,iBAAW;AAAA,YACT;AAAA,YACI,aAAQ,CAAC,QAAQ,YAAY,UAAU,GAAY,CAACE,WAAU;AAChE,oBAAM,OAAO,WAAW,OAAOA,MAAK;AACpC,oBAAM,QAAQ,WAAW,WAAWA,MAAK;AACzC,qBAAO,WAAW,IAAI,MAAM,WAAW,KAAK,IACxC,CAAC,IACD;AAAA,gBACE,IAAI,YAAY;AAAA,kBACd,MAAM;AAAA,kBACN,MAAM,MAAM;AAAA,kBACZ,OAAAA;AAAA,kBACA,MAAM;AAAA,kBACN,IAAI;AAAA,gBACN,CAAC;AAAA,cACH;AAAA,YACN,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AACD,eAAO,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO;AAAA,MAC1C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,YAAoB;AAAA,IACxB,KAAK,MAAM,IAAI,CAAC,SAAS,CAACD,SAAQ,IAAI,GAAG,IAAI,CAAU;AAAA,EACzD;AACA,QAAM,UAAkB;AAAA,IACtB,GAAG,MAAM,IAAI,CAAC,SAAS,CAACA,SAAQ,IAAI,GAAG,IAAI,CAAU;AAAA,EACvD;AAEA,QAAM,QAAQ;AAAA,IACZ,OAAO,GAAG,MACP,OAAO,CAAC,SAAS,CAAS,aAAI,WAAWA,SAAQ,IAAI,CAAC,CAAC,EACvD,IAAI,OAAO;AAAA,IACd,SAAS,KAAK,MACX,OAAO,CAAC,SAAS,CAAS,aAAI,SAASA,SAAQ,IAAI,CAAC,CAAC,EACrD,IAAI,OAAO;AAAA,EAChB;AAEA,QAAM,UAAc;AAAA,IAClB;AAAA,MACE,CAAC,UAAU,KAAK,QAAQ,QAAQ,GAAG,QAAQ,MAAM;AAAA,MACjD,CAAC,SAAS,KAAK,QAAQ,OAAO,GAAG,QAAQ,KAAK;AAAA,MAC9C;AAAA,QACE;AAAA,QACO,eAAM,KAAK,QAAQ,cAAc;AAAA,UACtC,QAAQ,MAAM;AAAA,UACd,QAAQ,CAACF,WAAUC,QAAO,gBAAgBD,MAAK;AAAA,QACjD,CAAC;AAAA,QACM,eAAM,GAAG,QAAQ,cAAc;AAAA,UACpC,QAAQ,MAAM;AAAA,UACd,QAAQ,CAACA,WAAUC,QAAO,gBAAgBD,MAAK;AAAA,QACjD,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE;AAAA,QACAC,QAAc,eAAa,eAAM,GAAG,KAAK,QAAQ,OAAO;AAAA,QACxDA,QAAc,eAAa,eAAM,GAAG,GAAG,QAAQ,OAAO;AAAA,MACxD;AAAA,IACF;AAAA,IACA,CAAC,CAACE,QAAO,QAAQ,KAAK,MACpB,WAAW,MAAM,MAAM,WAAW,KAAK,IACnC,CAAC,IACD,CAAC,IAAI,YAAY,EAAE,OAAAA,QAAO,MAAM,QAAQ,IAAI,MAAM,CAAC,CAAC;AAAA,EAC5D;AAEA,QAAM,WAAe;AAAA,IACnB;AAAA,MACE,CAAC,QAAQ,KAAK,SAAS,MAAM,GAAG,SAAS,IAAI;AAAA,MAC7C;AAAA,QACE;AAAA,QACO,mBAAU,KAAK,SAAS,WAAW;AAAA,QACnC,mBAAU,GAAG,SAAS,WAAW;AAAA,MAC1C;AAAA,MACA,CAAC,SAAS,KAAK,SAAS,OAAO,GAAG,SAAS,KAAK;AAAA,IAClD;AAAA,IACA,CAAC,CAACA,QAAO,QAAQ,KAAK,MACpB,WAAW,QACP,CAAC,IACD,CAAC,IAAI,YAAY,EAAE,OAAAA,QAAO,MAAM,QAAQ,IAAI,MAAM,CAAC,CAAC;AAAA,EAC5D;AAEA,SAAO,IAAI,aAAa,EAAE,OAAO,OAAO,QAAQ,OAAO,SAAS,SAAS,CAAC;AAC5E;;;ACvYA,SAAiB,UAAAC,UAAQ,UAAAC,gBAAc;AACvC,YAAYC,UAAS;AACrB,OAA4B;AAE5B,OAAsB;AACtB,YAAYC,QAAO;AACnB,YAAYC,aAAY;AACxB,YAAYC,cAAY;;;ACXxB,SAAS,UAAAC,SAAQ,UAAAC,gBAAc;AAC/B,YAAYC,iBAAgB;AAC5B,YAAYC,cAAY;AACxB,YAAYC,WAAU;AAIf,IAAM,eAAe;AAGrB,IAAM,qBAAN,cAAiCC,SAAO,YAAgC;AAAA,EAC7E;AAAA,EACA,EAAE,MAAMA,SAAO,QAAQ,SAASA,SAAO,OAAO;AAChD,EAAE;AAAC;AAGI,IAAM,oBAAN,cAAgCA,SAAO;AAAA,EAC5C;AACF,EAAE;AAAA,EACA,QAAQA,SAAO,QAAQ,YAAY,EAAE;AAAA,IACnCA,SAAO,uBAAuBC,QAAO,QAAQ,YAAY,CAAC;AAAA,EAC5D;AAAA,EACA,QAAQD,SAAO;AAAA,EACf,YAAYA,SAAO;AAAA,EACnB,QAAQA,SAAO;AAAA;AAAA,EAEf,gBAAgBA,SAAO;AAAA;AAAA,EAEvB,iBAAiB;AAAA,EACjB,cAAcA,SAAO;AACvB,CAAC,EAAE;AAAC;AAEJ,IAAM,YAAYA,SAAO,eAAe,mBAAmB,EAAE,OAAO,EAAE,CAAC;AAGhE,IAAM,YAAY,CAAC,QACxBC,QAAO,IAAS,YAAM,CAAC,SAAS,KAAK,KAAK,KAAK,WAAW,eAAe,CAAC;AAGrE,IAAM,YAAY,CAAC,QACxBA,QAAO,IAAI,aAAa;AACtB,QAAM,KAAK,OAAkB;AAC7B,QAAM,OAAO,OAAO,UAAU,GAAG;AACjC,QAAM,SAAS,OAAO,GAAG,OAAO,IAAI,EAAE;AAAA,IACpCA,QAAO;AAAA,MACL,CAAC,UACC,IAAI,mBAAmB;AAAA,QACrB;AAAA,QACA,SAAS,+BAA+B,MAAM,OAAO;AAAA,MACvD,CAAC;AAAA,IACL;AAAA,EACF;AACA,MAAI,CAAC,OAAQ,QAAc,cAAwB;AACnD,QAAM,OAAO,OAAO,GAAG,eAAe,IAAI,EAAE;AAAA,IAC1CA,QAAO;AAAA,MACL,CAAC,UACC,IAAI,mBAAmB;AAAA,QACrB;AAAA,QACA,SAAS,+BAA+B,MAAM,OAAO;AAAA,MACvD,CAAC;AAAA,IACL;AAAA,EACF;AACA,SAAc;AAAA,IACZ,OAAOD,SAAO,oBAAoB,SAAS,EAAE,IAAI,EAAE;AAAA,MACjDC,QAAO;AAAA,QACL,CAAC,UACC,IAAI,mBAAmB;AAAA,UACrB;AAAA,UACA,SAAS,iCAAiC,MAAM,OAAO;AAAA,QACzD,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAQI,IAAM,aAAa,CAAC,KAAa,UACtCA,QAAO,IAAI,aAAa;AACtB,QAAM,KAAK,OAAkB;AAC7B,QAAM,OAAO,OAAY;AACzB,QAAM,SAAS,OAAO,UAAU,GAAG;AACnC,QAAM,YAAY,KAAK,QAAQ,MAAM;AACrC,QAAM,YAAY,GAAG,MAAM;AAC3B,SAAO,GAAG,cAAc,WAAW,EAAE,WAAW,KAAK,CAAC,EAAE;AAAA,IACtDA,QAAO;AAAA,MACL,CAAC,UACC,IAAI,mBAAmB;AAAA,QACrB,MAAM;AAAA,QACN,SAAS,iBAAiB,SAAS,KAAK,MAAM,OAAO;AAAA,MACvD,CAAC;AAAA,IACL;AAAA,EACF;AACA,SAAOD,SAAO,aAAa,SAAS,EAAE,KAAK,EAAE;AAAA,IAC3CC,QAAO,QAAQ,CAAC,SAAS,GAAG,gBAAgB,WAAW,GAAG,IAAI;AAAA,CAAI,CAAC;AAAA,IACnEA,QAAO;AAAA,MACL,CAAC,UACC,IAAI,mBAAmB;AAAA,QACrB,MAAM;AAAA,QACN,SAAS,gCAAgC,MAAM,OAAO;AAAA,MACxD,CAAC;AAAA,IACL;AAAA,EACF;AACA,SAAO,GAAG,OAAO,WAAW,MAAM,EAAE;AAAA,IAClCA,QAAO;AAAA,MACL,CAAC,UACC,IAAI,mBAAmB;AAAA,QACrB,MAAM;AAAA,QACN,SAAS,kCAAkC,MAAM,OAAO;AAAA,MAC1D,CAAC;AAAA,IACL;AAAA,EACF;AACF,CAAC;;;ACnHH,SAAS,OAAO,UAAU,UAAAC,UAAQ,UAAAC,gBAAc;AAChD,OAA8B;AAE9B,YAAYC,UAAS;AACrB,OAA4B;AAC5B,OAAsB;AACtB,YAAYC,aAAY;AACxB,YAAYC,cAAY;AAiCxB,IAAM,MAAMC,SAAO;AAAA,EAAI,MAAM;AAAA,EAAmB,CAAC,WACxC,2BAAyB,uBAAc;AAAA,IAC5C,SAAS,UAAU,SAAS,WAAW,MAAM,CAAC;AAAA,EAChD;AACF;AAEA,IAAM,UAAU,CAAC,UACfC,SAAO,MAAM,MAAM,QAAQ;AAAA,EACzB,QAAQ,MAAM;AAAA,EACd,QAAQ,CAAC,WACP,WAAW,MACP,UACA,WAAW,OAAO,WAAW,MAC3B,aACA;AACV,CAAC;AAEI,IAAM,aAAa,CAAC,UACzB,IAAI,YAAY;AAAA,EACd,MAAM,QAAQ,KAAK;AAAA,EACnB,SAAS,GAAG,MAAM,SAAS,KAAK,QAAQ,MAAM,OAAO,CAAC;AACxD,CAAC;AAEH,IAAM,eAAe,CAAC,UACpB,IAAI,YAAY;AAAA,EACd,MAAM;AAAA,EACN,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO;AAC1C,CAAC;AAGH,IAAM,eAAe,CAAC,QACpBD,SAAO,IAAI,aAAa;AACtB,QAAM,QAAQ,OAAO,UAAU,GAAG;AAClC,MAAIC,SAAO,OAAO,KAAK;AACrB,WAAO,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AACF,SAAO,MAAM;AACf,CAAC,EAAE;AAAA,EACDD,SAAO;AAAA,IAAS;AAAA,IAAsB,CAAC,UACrCA,SAAO,KAAK,aAAa,KAAK,CAAC;AAAA,EACjC;AACF;AAEF,IAAM,WAAW,CAAC,SAChB,iBAAiB,IAAI,EAAE;AAAA,EACrBA,SAAO;AAAA,IACL,CAAC,UACC,IAAI,YAAY;AAAA,MACd,MAAM;AAAA,MACN,SAAS,oCAAwC;AAAA,QAC/C,MAAM,OAAO;AAAA,UACX,CAAC,UACC,GAAG,MAAM,WAAW,GAAG,KAAK,MAAM,OAAO;AAAA,QAC7C;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACL;AACF;AAEF,IAAM,OAAO,CAAC,SACL,2BAAkB,WAAW,EAAE,IAAI;AAS5C,IAAM,SAAS,CACb,KACA,UACA,SAEAA,SAAO,IAAI,aAAa;AACtB,QAAME,MAAK,OAAO;AAClB,SAAO;AAAA,IACL;AAAA,IACA,IAAI,kBAAkB;AAAA,MACpB,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,MACrB,QAAQ,SAAS;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,iBAAiB,KAAK,KAAK,WAAW;AAAA,MACtC,cAAcA;AAAA,IAChB,CAAC;AAAA,EACH;AACF,CAAC,EAAE;AAAA,EACDF,SAAO;AAAA,IAAS;AAAA,IAAsB,CAAC,UACrCA,SAAO,KAAK,aAAa,KAAK,CAAC;AAAA,EACjC;AACF;AAGK,IAAM,aAAa,CAAC,KAAkB,eAC3CA,SAAO,IAAI,aAAa;AACtB,QAAM,WAAW,OAAO,IACrB,SAAS,UAAU,EACnB,KAAKA,SAAO,SAAS,UAAU,CAAC;AACnC,SAAO,OAAO,SAAS,SAAS,EAAE;AACpC,CAAC;AAiDH,IAAM,WAAW,CACf,OACAG,OACA,WACA,UAEAH,SAAO,IAAI,aAAa;AACtB,MAAI,cAAcG,MAAK,YAAa,QAAO,EAAE,MAAM,cAAc,MAAAA,MAAK;AACtE,MAAIF,SAAO,OAAO,MAAM,cAAc;AACpC,WAAO,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AACF,QAAM,SAAS,MAAM,eAAe;AACpC,MAAI,WAAWE,MAAK;AAClB,WAAO,EAAE,MAAM,WAAW,IAAI,MAAM,OAAO,QAAQ,MAAM;AAE3D,QAAM,OAAO,OAAO,WAAW,MAAM,KAAK,MAAM;AAChD,QAAM,SAAS,OAAO,WAAW,MAAM,KAAKA,MAAK,UAAU;AAC3D,QAAM,SAAS,MAAM,MAAM,MAAM,OAAO,QAAQ,KAAK;AACrD,MAAI,OAAO,WAAW;AACpB,WAAO,OAAO;AAAA,MACZ;AAAA,MACA,qCAAyC,UAAK,gBAAgB,OAAO,QAAQ,GAAG,IAAI,CAAC;AAAA,IACvF;AACF,MAAI,OAAO,WAAW;AACpB,WAAO,EAAE,MAAM,YAAY,WAAW,OAAO,UAAU;AACzD,MAAI,mBAAmB,OAAO,EAAE,MAAM,mBAAmB,MAAM;AAC7D,WAAO,EAAE,MAAM,sBAAsB,MAAAA,MAAK;AAC5C,SAAO,EAAE,MAAM,WAAW,IAAI,OAAO,IAAI,QAAQ,KAAK;AACxD,CAAC;AAgBI,IAAM,OAAO,CAClB,UAMAH,SAAO,IAAI,aAAa;AACtB,QAAM,YAAY,OAAO,SAAS,MAAM,KAAK,EAAE,KAAKA,SAAO,KAAK;AAEhE,QAAM,cAAc,OAAO,MAAM,IAC9B,KAAK,EACL,KAAKA,SAAO,SAAS,UAAU,CAAC;AACnC,MAAIC,SAAO,OAAO,WAAW,GAAG;AAC9B,QAAI,MAAM;AACR,aAAO,EAAE,QAAQ,WAAW,IAAI,MAAM,OAAO,QAAQ,MAAM;AAC7D,UAAM,WAAW,OAAO,MAAM,IAC3B,QAAQ;AAAA,MACP,YAAY,MAAM,SAAS;AAAA,MAC3B,QAAQ,cAAc,MAAM,KAAK;AAAA,MACjC,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC,EACA,KAAKD,SAAO,SAAS,UAAU,CAAC;AACnC,WAAO,OAAO,MAAM,KAAK,MAAM,UAAU;AAAA,MACvC,YAAY,SAAS;AAAA,MACrB,aAAa,SAAS;AAAA,IACxB,CAAC;AACD,WAAO,EAAE,QAAQ,aAAa,UAAU,QAAQ,MAAM;AAAA,EACxD;AAEA,QAAM,aAAa,CACjBG,UAEAH,SAAO,IAAI,aAAa;AAItB,UAAM,QAAQC,SAAO,MAAM,MAAM,eAAeA,SAAO,KAAK,GAAG;AAAA,MAC7D,QAAQ,OAAO,CAAC;AAAA,MAChB,QAAQ,CAACG,SAASA,KAAI,YAAYD,MAAK,aAAaC,KAAI,QAAQ,CAAC;AAAA,IACnE,CAAC;AACD,UAAM,SAAS,OAAO,SAAS,OAAOD,OAAM,WAAW,KAAK;AAC5D,QAAI,OAAO,SAAS;AAClB,aAAO,EAAE,WAAW,OAAO,SAAS,EAAE,QAAQ,cAAc,MAAAA,MAAK,EAAE;AACrE,QAAI,OAAO,SAAS;AAClB,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS,EAAE,QAAQ,sBAAsB,MAAAA,MAAK;AAAA,MAChD;AACF,QAAI,OAAO,SAAS;AAClB,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,WAAW,OAAO;AAAA,UAClB,MAAMF,SAAO,KAAKE,KAAI;AAAA,QACxB;AAAA,MACF;AACF,QAAI,MAAM;AACR,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,IAAI,OAAO;AAAA,UACX,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AACF,UAAM,cAAc,OAAO,SAAS,OAAO,EAAE,EAAE,KAAKH,SAAO,KAAK;AAChE,UAAM,SAAS,OAAO,MAAM,IACzB,QAAQ;AAAA,MACP,YAAY,MAAM,SAAS;AAAA,MAC3B,QAAQ,cAAc,OAAO,EAAE;AAAA,MAC/B,QAAQ;AAAA,MACR,kBAAkBG,MAAK;AAAA,MACvB,gBAAgBA,MAAK;AAAA,MACrB,SACE,MAAM,YACL,OAAO,SACJ,wBAAwBA,MAAK,MAAM,KACnC;AAAA,IACR,CAAC,EACA,KAAKH,SAAO,MAAM;AACrB,QAAW,kBAAU,MAAM,GAAG;AAC5B,UAAI,cAAc,OAAO,OAAO;AAC9B,eAAO,EAAE,WAAW,MAAM,OAAO,KAAK;AACxC,aAAO,OAAOA,SAAO,KAAK,WAAW,OAAO,OAAO,CAAC;AAAA,IACtD;AACA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QAAM,SAAS,CACb,QACA,QACA,WAMAA,SAAO,IAAI,aAAa;AAKtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SACI,EAAE,YAAY,OAAO,YAAY,aAAa,OAAO,YAAY,IACjE;AAAA,QACE,YAAY,OAAO;AAAA,QACnB,aAAa,OAAO;AAAA,MACtB;AAAA,IACN;AACA,WAAO,EAAE,QAAQ,aAAa,UAAU,QAAQ,OAAO;AAAA,EACzD,CAAC;AAEH,QAAM,QAAQ,OAAO,WAAW,YAAY,KAAK;AACjD,MAAI,CAAC,MAAM,UAAW,QAAO,MAAM;AACnC,MAAI,YAAY;AACd,WAAO,OAAO,OAAO,MAAM,QAAQ,MAAM,QAAQ,YAAY,KAAK;AAGpE,QAAM,YAAY,OAAO,MAAM,IAAI,KAAK,EAAE,KAAKA,SAAO,SAAS,UAAU,CAAC;AAC1E,MAAIC,SAAO,OAAO,SAAS;AACzB,WAAO,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AACF,QAAM,SAAS,OAAO,WAAW,UAAU,KAAK;AAChD,MAAI,CAAC,OAAO,UAAW,QAAO,OAAO;AACrC,MAAI,YAAY;AACd,WAAO,OAAO,OAAO,OAAO,QAAQ,OAAO,QAAQ,UAAU,KAAK;AACpE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,WAAW,CAAC;AAAA,IACZ,MAAMA,SAAO,KAAK,UAAU,KAAK;AAAA,EACnC;AACF,CAAC;AAiDI,IAAM,OAAO,CAClB,UAUAD,SAAO,IAAI,aAAa;AACtB,QAAM,QAAQ,OAAO,aAAa,MAAM,GAAG;AAC3C,QAAM,WAAW,mBAAmB,MAAM,KAAK;AAE/C,QAAM,aAAa,OAAO,MAAM,IAC7B,KAAK,EACL,KAAKA,SAAO,SAAS,UAAU,CAAC;AACnC,MAAIC,SAAO,OAAO,UAAU;AAC1B,WAAO,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AACF,QAAME,QAAO,WAAW;AAExB,QAAME,QAAO,OAAO,MAAM,IACvB,UAAU,EAAE,QAAQ,OAAO,CAAC,EAC5B,KAAKL,SAAO,SAAS,UAAU,CAAC;AACnC,QAAM,cAAcK,MAAK,IAAI,CAAC,aAAa,SAAS,EAAE;AACtD,QAAM,SAAS,OAAO,WAAW,MAAM,KAAKF,MAAK,UAAU;AAC3D,QAAM,YAAY,mBAAmB,MAAM;AAE3C,QAAM,UAAUH,SAAO,IAAI,aAAa;AACtC,QAAI,MAAM,mBAAmBG,MAAK,WAAY;AAC9C,QAAI,MAAM,MAAO;AACjB,WAAO,OAAO,MAAM,KAAK,OAAO;AAAA,MAC9B,YAAYA,MAAK;AAAA,MACjB,aAAaA,MAAK;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,aAAa,aAAaE,MAAK,WAAW,GAAG;AAC/C,WAAO;AACP,WAAO,EAAE,QAAQ,cAAc,MAAAF,MAAK;AAAA,EACtC;AAEA,QAAM,OAAO,OAAO,WAAW,MAAM,KAAK,MAAM,cAAc;AAE9D,MAAI,aAAa,WAAW;AAG1B,UAAM,SAAS,MAAM,MAAM,MAAM,OAAO,MAAM;AAC9C,QAAI,OAAO,WAAW;AACpB,aAAO,EAAE,QAAQ,YAAY,WAAW,OAAO,UAAU;AAC3D,QAAI,OAAO,WAAW;AAEpB,aAAO,OAAOH,SAAO,IAAI,yCAAyC;AACpE,UAAM,UAAU,mBAAmB,IAAI;AACvC,UAAM,YAAY,mBAAmB,OAAO,EAAE;AAC9C,QAAI,aAAa,WAAW,cAAc,WAAWK,MAAK,WAAW,GAAG;AAEtE,aAAO;AACP,aAAO,EAAE,QAAQ,gBAAgB,MAAAF,OAAM,WAAW,CAAC,EAAE;AAAA,IACvD;AACA,QAAI,cAAc;AAEhB,aAAO,EAAE,QAAQ,gBAAgB,MAAAA,MAAK;AAAA,EAC1C;AAEA,MAAIE,MAAK,WAAW,GAAG;AACrB,WAAO;AACP,WAAO,EAAE,QAAQ,eAAe,MAAAF,MAAK;AAAA,EACvC;AAEA,QAAM,UAAU,OAAO,cAAc;AAAA,IACnC,KAAK,MAAM;AAAA,IACX,QAAQ,MAAM;AAAA,IACd,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM;AAAA,IACb;AAAA,IACA,KAAS,aAAQE,OAAM,CAAC,aAAa,SAAS,KAAK;AAAA,IACnD,OAAO,CAAC,MAAM;AAAA,EAChB,CAAC;AACD,MAAI,QAAQ,WAAW;AACrB,WAAO,EAAE,QAAQ,WAAW,UAAU,QAAQ,SAAS;AAEzD,MAAI,MAAM;AACR,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAAF;AAAA,MACA,WAAW;AAAA,MACX,SAAS,QAAQ;AAAA,IACnB;AAEF,SAAO,OAAO,MAAM,KAAK,OAAO;AAAA,IAC9B,YAAYA,MAAK;AAAA,IACjB,aAAaA,MAAK;AAAA,EACpB,CAAC;AACD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAAA;AAAA,IACA,WAAW;AAAA,IACX,SAAS,QAAQ;AAAA,EACnB;AACF,CAAC;;;AC1hBH,YAAYG,cAAY;AACxB,YAAYC,cAAY;AAQjB,IAAM,aAAoB,kBAAS;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,cAAN,cAAiC,eAAmB,aAAa,EAAE;AAAA,EACxE,YAAmB;AAAA,EACnB,aAAoB;AACtB,CAAC,EAAE;AAAC;AAGG,IAAM,YAAN,cAA+B,eAAiB,WAAW,EAAE;AAAA,EAClE,QAAQ;AAAA,EACR,cAAqB,gBAAO,WAAW;AAAA,EACvC,cAAqB,gBAAO,YAAY;AAAA,EACxC,WAAkB,gBAAO,WAAW;AAAA;AAAA,EAEpC,SAAgB,gBAAO,YAAY;AAAA;AAAA,EAEnC,UAAiB,gBAAO,YAAY;AAAA,EACpC,WAAkB,eAAM,eAAe;AAAA,EACvC,WAAkB,eAAM,UAAU;AAAA,EAClC,WAAkB,gBAAO,WAAW;AACtC,CAAC,EAAE;AAAC;;;AH2CG,IAAM,aAAoB,kBAAS,CAAC,QAAQ,QAAQ,OAAO,CAAC;;;AIlEnE,SAAS,UAAAC,UAAQ,SAAAC,QAAO,UAAAC,UAAQ,iBAAiB;AACjD,YAAYC,WAAS;AACrB,YAAYC,QAAO;AACnB,YAAYC,aAAY;;;AC1BxB,SAAS,UAAAC,gBAAc;AACvB,YAAYC,WAAS;AACrB,YAAYC,cAAY;AAkBxB,IAAM,WAAW,CAAC,QAAgB,UAAgC;AAChE,QAAM,UAAiB,mBAAU,MAAM,SAAS,MAAM,MAAe;AACrE,QAAM,eAAsB,mBAAU,MAAM,eAAe,MAAM,MAAM,IAAI;AAC3E,SAAO,YAAY,aACf;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,oBAAoB,YAAY;AAAA,EACxC,IACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,MAAM,UAAU,MAAM,WAAW,MAAM,IAAI;AAAA,EAC7C;AACN;AAOO,IAAM,qBAAqB,CAChC,IACA,UAC+C;AAC/C,QAAMC,WAAc;AAAA,IAAQ,GAAG;AAAA,IAAO,CAAC,SACrC,MAAM,WAAW,UAAa,KAAK,OAAO,MAAM,SACxC;AAAA,MACE,aAAO,KAAK,QAAQ,CAAC,UAAU,MAAM,SAAS,MAAM,KAAK;AAAA,MAC7D,CAAC,WAAW,EAAE,QAAQ,KAAK,IAAI,MAAM;AAAA,IACvC,IACA,CAAC;AAAA,EACP;AAEA,MAAIA,SAAQ,SAAS,GAAG;AACtB,WAAOC,SAAO;AAAA,MACZ,IAAI,eAAe;AAAA,QACjB,SAAS,cAAc,MAAM,KAAK;AAAA,QAClC,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAc,eAAU,WAAKD,QAAO,GAAG;AAAA,IACrC,QAAQ,MACNC,SAAO;AAAA,MACL,IAAI,eAAe;AAAA,QACjB,SAAS,cAAc,MAAM,KAAK;AAAA,QAClC,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,EAAE,QAAQ,MAAM,MAAMA,SAAO,QAAQ,SAAS,QAAQ,KAAK,CAAC;AAAA,EACvE,CAAC;AACH;;;AhBtDA,IAAM,aAAN,cAAyBC,SAAO,MAAkB,iBAAiB,EAAE;AAAA,EACnE,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO;AAAA,EACb,YAAYA,SAAO;AAAA,EACnB,cAAcA,SAAO,OAAOA,SAAO,MAAM;AAC3C,CAAC,EAAE;AAAC;AAEJ,IAAM,cAAN,cAA0BA,SAAO,MAAmB,kBAAkB,EAAE;AAAA,EACtE,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO;AAAA,EACb,OAAOA,SAAO,OAAOA,SAAO,MAAM;AAAA,EAClC,YAAYA,SAAO;AAAA,EACnB,aAAaA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACxC,kBAAkBA,SAAO;AAC3B,CAAC,EAAE;AAAC;AAEJ,IAAM,UAAN,cAAsBA,SAAO,MAAe,cAAc,EAAE;AAAA,EAC1D,YAAYA,SAAO;AAAA,EACnB,QAAQA,SAAO;AAAA,EACf,aAAaA,SAAO;AACtB,CAAC,EAAE;AAAC;AAEJ,IAAM,cAAN,cAA0BA,SAAO,MAAmB,kBAAkB,EAAE;AAAA,EACtE,UAAUA,SAAO,OAAO;AAAA,IACtB,IAAIA,SAAO;AAAA,IACX,QAAQA,SAAO;AAAA,IACf,aAAaA,SAAO;AAAA,EACtB,CAAC;AAAA,EACD,IAAIA,SAAO;AACb,CAAC,EAAE;AAAC;AAEJ,IAAM,SAAN,cAAqBA,SAAO,MAAc,aAAa,EAAE;AAAA,EACvD,IAAIA,SAAO;AAAA,EACX,aAAaA,SAAO;AAAA,EACpB,eAAeA,SAAO;AAAA,EACtB,QAAQA,SAAO;AAAA,EACf,aAAaA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACxC,YAAYA,SAAO;AACrB,CAAC,EAAE;AAAC;AAEJ,IAAM,eAAN,cAA2BA,SAAO,MAAoB,mBAAmB,EAAE;AAAA,EACzE,KAAKA,SAAO,OAAO;AAAA,IACjB,IAAIA,SAAO;AAAA,IACX,QAAQA,SAAO;AAAA,IACf,aAAaA,SAAO,OAAOA,SAAO,MAAM;AAAA,EAC1C,CAAC;AAAA,EACD,mBAAmBA,SAAO;AAC5B,CAAC,EAAE;AAAC;AAEJ,IAAM,YAAN,cAAwBA,SAAO,MAAiB,gBAAgB,EAAE;AAAA,EAChE,IAAIA,SAAO;AAAA,EACX,QAAQA,SAAO;AAAA,EACf,SAASA,SAAO,OAAOA,SAAO,QAAQA,SAAO,IAAI;AAAA,EACjD,SAASA,SAAO;AAAA,IACdA,SAAO,OAAO;AAAA,MACZ,MAAMA,SAAO;AAAA,MACb,cAAcA,SAAO,OAAOA,SAAO,MAAM;AAAA,MACzC,OAAOA,SAAO,OAAOA,SAAO,MAAM;AAAA,IACpC,CAAC;AAAA,EACH;AACF,CAAC,EAAE;AAAC;AAEJ,IAAM,cAAN,cAA0BA,SAAO,MAAmB,kBAAkB,EAAE;AAAA,EACtE,IAAIA,SAAO;AAAA,EACX,QAAQA,SAAO;AAAA,EACf,WAAWA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACtC,WAAWA,SAAO,YAAYA,SAAO,MAAM;AAC7C,CAAC,EAAE;AAAC;AAGJ,IAAM,gBAAN,cAA4BA,SAAO,MAAqB,oBAAoB,EAAE;AAAA,EAC5E,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACjC,YAAYA,SAAO;AAAA,EACnB,eAAeA,SAAO;AAAA,EACtB,aAAaA,SAAO;AAAA,EACpB,YAAYA,SAAO;AAAA,EACnB,WAAWA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACtC,aAAaA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACxC,aAAaA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACxC,eAAeA,SAAO,OAAOA,SAAO,MAAM;AAAA,EAC1C,MAAMA,SAAO,MAAMA,SAAO,OAAO,EAAE,MAAMA,SAAO,OAAO,CAAC,CAAC;AAC3D,CAAC,EAAE;AAAC;AAGJ,IAAM,sBAAN,cAAkCA,SAAO;AAAA,EACvC;AACF,EAAE;AAAA,EACA,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACjC,OAAOA,SAAO,OAAOA,SAAO,MAAM;AAAA,EAClC,YAAYA,SAAO;AAAA,EACnB,sBAAsBA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACjD,aAAaA,SAAO;AAAA,EACpB,aAAaA,SAAO,OAAOA,SAAO,MAAM;AAAA,EACxC,MAAMA,SAAO,MAAMA,SAAO,OAAO,EAAE,MAAMA,SAAO,OAAO,CAAC,CAAC;AAAA,EACzD,UAAUA,SAAO;AAAA,IACfA,SAAO,OAAO;AAAA,MACZ,KAAKA,SAAO;AAAA,MACZ,OAAOA,SAAO,OAAOA,SAAO,MAAM;AAAA,MAClC,UAAUA,SAAO;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EACA,OAAOA,SAAO,MAAMA,SAAO,OAAO,EAAE,UAAUA,SAAO,OAAO,CAAC,CAAC;AAChE,CAAC,EAAE;AAAC;AAGJ,IAAM,YAAN,cAAwBA,SAAO,MAAiB,gBAAgB,EAAE;AAAA,EAChE,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO;AAAA,EACb,WAAWA,SAAO;AACpB,CAAC,EAAE;AAAC;AAGJ,IAAM,QAAN,cAAoBA,SAAO,MAAa,YAAY,EAAE,EAAE,IAAIA,SAAO,OAAO,CAAC,EAAE;AAAC;AAG9E,IAAM,cAAN,cAA0BA,SAAO,MAAmB,kBAAkB,EAAE;AAAA,EACtE,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO;AAAA,EACb,WAAWA,SAAO;AAAA,EAClB,OAAOA,SAAO,OAAOA,SAAO,MAAM;AAAA,EAClC,OAAOA,SAAO,OAAOA,SAAO,MAAM;AAAA,EAClC,SAASA,SAAO;AAAA,EAChB,OAAOA,SAAO;AAAA,EACd,kBAAkBA,SAAO;AAAA,EACzB,SAASA,SAAO,MAAMA,SAAO,MAAM;AAAA,EACnC,cAAcA,SAAO;AAAA,IACnBA,SAAO,OAAO;AAAA,MACZ,WAAWA,SAAO;AAAA,MAClB,OAAOA,SAAO,OAAOA,SAAO,MAAM;AAAA,IACpC,CAAC;AAAA,EACH;AACF,CAAC,EAAE;AAAC;AAGJ,IAAM,mBAAN,cAA+BA,SAAO;AAAA,EACpC;AACF,EAAE;AAAA,EACA,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO;AAAA,EACb,YAAYA,SAAO;AACrB,CAAC,EAAE;AAAC;AAGJ,IAAM,YAAN,cAAwBA,SAAO,MAAiB,gBAAgB,EAAE;AAAA,EAChE,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO;AAAA,EACb,YAAYA,SAAO;AAAA,EACnB,YAAYA,SAAO;AAAA,EACnB,UAAUA,SAAO;AAAA,IACfA,SAAO,OAAO;AAAA,MACZ,UAAUA,SAAO;AAAA,MACjB,MAAMA,SAAO;AAAA,MACb,SAASA,SAAO,OAAOA,SAAO,MAAM;AAAA,IACtC,CAAC;AAAA,EACH;AACF,CAAC,EAAE;AAAC;AAGJ,IAAM,gBAAN,cAA4BA,SAAO,MAAqB,oBAAoB,EAAE;AAAA,EAC5E,IAAIA,SAAO;AAAA,EACX,QAAQA,SAAO;AAAA,EACf,aAAaA,SAAO;AACtB,CAAC,EAAE;AAAC;AAEJ,IAAM,gBAAN,cAA4BA,SAAO,MAAqB,oBAAoB,EAAE;AAAA,EAC5E,MAAMA,SAAO;AAAA,EACb,aAAaA,SAAO;AAAA,EACpB,eAAeA,SAAO;AAAA,EACtB,oBAAoBA,SAAO;AAAA,EAC3B,MAAMA,SAAO,OAAO,EAAE,IAAIA,SAAO,OAAO,CAAC;AAAA,EACzC,OAAOA,SAAO,OAAO,EAAE,IAAIA,SAAO,OAAO,CAAC;AAC5C,CAAC,EAAE;AAAC;AA0JG,IAAM,YAAN,cAAwBC,SAAQ,QA4JrC,EAAE,kBAAkB,EAAE;AAAC;AAMzB,IAAM,cAAc,CAAC,UACnBC,SAAO,MAAM,MAAM,MAAM;AAAA,EACvB,QAAQ,MAAM,IAAI,eAAe,EAAE,SAAS,MAAM,QAAQ,CAAC;AAAA,EAC3D,QAAQ,CAAC,SAAS,IAAI,eAAe,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AACvE,CAAC;AAGI,IAAM,OAAO,CAAC,YAGO;AAC1B,QAAM,OAAO,CACX,QACA,WACA,MACA,QACA,UAA4C,CAAC,MAE7C,WAAW,SAAS,WAAW,MAAM,QAAQ,QAAQ,OAAO,EAAE;AAAA,IAC5DC,SAAO,SAAS,WAAW;AAAA,EAC7B;AAGF,QAAM,YAAY,CAAC,eAAuB,EAAE,gBAAgB,UAAU;AAEtE,QAAM,iBAAiB,CAAC,cACtB;AAAA,IACE;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACDH,SAAO,MAAM,UAAU;AAAA,EACzB,EAAE;AAAA,IACAG,SAAO;AAAA,MAAQ,CAAC,SACdD,SAAO;AAAA,QACD,gBAAU,MAAM,CAACE,SAAQA,KAAI,OAAO,SAAS;AAAA,QACjD;AAAA,UACE,QAAQ,MACND,SAAO;AAAA,YACL,IAAI,eAAe;AAAA,cACjB,SAAS,yBAAyB,SAAS;AAAA,cAC3C,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,UACF,QAAQ,CAACC,SAAQD,SAAO,QAAQC,KAAI,UAAU;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIF,QAAM,YAAY,CAChB,MACAC,aAOG;AACH,UAAMC,OAAMD,SAAQ,SAAS,YAAY;AACzC,UAAME,WAAc;AAAA,MAClB;AAAA,MACA,CAACH,SAAQA,KAAI,OAAOC,SAAQ,YAAYD,KAAI,KAAK,YAAY,MAAME;AAAA,IACrE;AACA,WAAW,YAAMC,UAAS;AAAA,MACxB,SAAS,MACPJ,SAAO;AAAA,QACL,IAAI,eAAe;AAAA,UACjB,SAAS,MAAME,SAAQ,KAAK,UAAUA,SAAQ,QAAQ,YAAYA,SAAQ,KAAK;AAAA,UAC/E,MAAMA,SAAQ;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,MACF,YAAY,CAAC,CAAC,OAAU,OAAI,MACtB,2BAAqB,IAAI,IACzBF,SAAO,QAAQ,MAAM,EAAE,IACvBA,SAAO;AAAA,QACL,IAAI,eAAe;AAAA,UACjB,SAAS,GAAGI,SAAQ,MAAM,IAAIF,SAAQ,KAAK,eAAeA,SAAQ,QAAQ;AAAA,UAC1E,MAAMA,SAAQ;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACR,CAAC;AAAA,EACH;AAGA,QAAM,aAAa,CAAC,WAAmB,aACrC;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,UAAU;AAAA,IACZL,SAAO,MAAM,SAAS;AAAA,EACxB,EAAE;AAAA,IACAG,SAAO;AAAA,MAAQ,CAAC,SACd,UAAU,MAAM;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEF,QAAM,eAAe,CAAC,WAAmB,aACvC;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,UAAU;AAAA,IACZH,SAAO,MAAM,WAAW;AAAA,EAC1B,EAAE;AAAA,IACAG,SAAO;AAAA,MAAQ,CAAC,SACd,UAAU,MAAM;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEF,QAAM,aAAa,CAAC,WAAmB,SACrC;AAAA,IACE;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACDH,SAAO,MAAM,gBAAgB;AAAA,IAC7B,UAAU,SAAS;AAAA,EACrB,EAAE;AAAA,IACAG,SAAO;AAAA,MAAQ,CAAC,SACd,UAAU,MAAM;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAGF,QAAM,UAAU;AAChB,QAAM,iBAAiBH,SAAO;AAAA,IAC5BA,SAAO,eAAeA,SAAO,OAAO;AAAA,EACtC;AAIA,QAAM,UAAU,CAACQ,WACX,cAAQA,MAAK,IACT,cAAQA,QAAO,OAAO,IACxB,YAASA,MAAK,IACV;AAAA,IAAU,aAAUA,MAAK;AAAA,IAAG,CAAC,CAACF,MAAK,KAAK,MAC1CA,SAAQ,UAAY,YAAS,KAAK,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK;AAAA,EAC/D,IACA,CAAC;AAGT,QAAM,YAAY,CAAC,YAA2B;AAC5C,QAAI,YAAY,KAAM,QAAO,CAAC;AAC9B,UAAM,OAAOJ,SAAO,MAAM,eAAe,OAAO,GAAG;AAAA,MACjD,QAAQ,MAAM;AAAA,MACd,QAAQ,CAAC,aAAiB,UAAS,WAAK,QAAQ,QAAQ,GAAG,GAAG,CAAC;AAAA,IACjE,CAAC;AACD,WAAW,gBAAW,IAAI,IAAI,EAAE,SAAS,KAAK,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC;AAAA,EACvE;AAGA,QAAM,WAAW,CACf,SAKA,aAEE;AAAA,IACI;AAAA,MAAQ;AAAA,MAAS,CAAC,UACpB,MAAM,aAAa,YAAY,MAAM,UAAU,OAC3C,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,CAAU,IAClC,CAAC;AAAA,IACP;AAAA,EACF;AAEF,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,cAAc,CAAC,UACb;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,WAAW,MAAM,UAAU;AAAA,MAC7BF,SAAO,MAAM,UAAU;AAAA,IACzB,EAAE;AAAA,MACAG,SAAO;AAAA,QAAI,CAAC,SACV,KAAK,IAAI,CAACC,UAAS;AAAA,UACjB,IAAIA,KAAI;AAAA,UACR,MAAMA,KAAI;AAAA,UACV,WAAWA,KAAI;AAAA,UACf,GAAIA,KAAI,iBAAiB,OACrB,CAAC,IACD,EAAE,aAAaA,KAAI,aAAa;AAAA,QACtC,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,IACF,eAAe,CAAC,UACd;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,WAAW,MAAM,UAAU;AAAA,MAC7BJ,SAAO,MAAM,WAAW;AAAA,IAC1B,EAAE;AAAA,MACAG,SAAO;AAAA,QAAI,CAAC,SACV,KAAK,IAAI,CAACC,UAAS;AAAA,UACjB,IAAIA,KAAI;AAAA,UACR,MAAMA,KAAI;AAAA,UACV,iBAAiBA,KAAI;AAAA,UACrB,GAAIA,KAAI,UAAU,OAAO,CAAC,IAAI,EAAE,OAAOA,KAAI,MAAM;AAAA,UACjD,GAAIA,KAAI,gBAAgB,OAAO,CAAC,IAAI,EAAE,WAAWA,KAAI,YAAY;AAAA,QACnE,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,IACF,aAAa,CAAC,EAAE,WAAW,YAAY,YAAY,MAAM,MACvDD,SAAO,IAAI,aAAa;AAGtB,YAAM,WAAW,OAAO;AAAA,QACtB;AAAA,QACA;AAAA,QACA,EAAE,WAAW,WAAW;AAAA,QACxB;AAAA,MACF;AACA,YAAMM,QAAO,OAAO;AAAA,QAClB;AAAA,QACA;AAAA,QACA,EAAE,WAAW;AAAA,QACbT,SAAO,OAAO,OAAO;AAAA,MACvB;AACA,YAAM,WACJ,aAAaS,UAAS,OAClB,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,EAAE,YAAY,YAAYA,MAAK,WAAW;AAAA,QAC1C;AAAA,MACF,IACA;AACN,aAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,MAAM,SAAS;AAAA,QACf,WAAW,SAAS;AAAA,QACpB,iBAAiB,SAAS;AAAA,QAC1B,GAAI,SAAS,UAAU,OAAO,CAAC,IAAI,EAAE,OAAO,SAAS,MAAM;AAAA,QAC3D,GAAI,SAAS,gBAAgB,OACzB,CAAC,IACD,EAAE,WAAW,SAAS,YAAY;AAAA,QACtC,GAAIA,UAAS,OACT,CAAC,IACD;AAAA,UACE,gBAAgBA,MAAK;AAAA,UACrB,YAAYA,MAAK;AAAA,UACjB,aAAaA,MAAK;AAAA,QACpB;AAAA,QACJ,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,QAAQ,SAAS,GAAG;AAAA,MAC1D;AAAA,IACF,CAAC;AAAA,IACH,gBAAgB,CAAC,EAAE,WAAW,MAC5B;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,WAAW;AAAA,MACbT,SAAO,OAAO,OAAO;AAAA,IACvB,EAAE;AAAA,MACAG,SAAO,IAAI,CAACM,WAAU;AAAA,QACpB;AAAA,QACA,MAAMA,UAAS,OAAO,OAAOA;AAAA,MAC/B,EAAE;AAAA,IACJ;AAAA,IACF,UAAU,CAAC,UACT;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,YAAY,MAAM;AAAA,QAClB,cAAc,MAAM;AAAA,QACpB,QAAQ,MAAM;AAAA,MAChB;AAAA,MACAT,SAAO,MAAM,MAAM;AAAA,IACrB,EAAE;AAAA,MACAG,SAAO;AAAA,QAAI,CAAC,SACV,KAAK,IAAI,CAACC,UAAS;AAAA,UACjB,IAAIA,KAAI;AAAA,UACR,YAAYA,KAAI;AAAA,UAChB,cAAcA,KAAI;AAAA,UAClB,QAAQA,KAAI;AAAA,UACZ,WAAWA,KAAI;AAAA,QACjB,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,IACF,WAAW,CAAC,EAAE,SAAS,MACrB,KAAgB,gBAAgB,UAAU,EAAE,SAAS,GAAG,SAAS,EAAE;AAAA,MACjED,SAAO,IAAI,CAACC,UAAS;AAAA,QACnB,IAAIA,KAAI;AAAA,QACR,OAAOA,KAAI;AAAA,QACX,SAASA,KAAI;AAAA,QACb,SAASA,KAAI,QAAQ,IAAI,CAAC,YAAY;AAAA,UACpC,MAAM,OAAO;AAAA,UACb,GAAI,OAAO,iBAAiB,OACxB,CAAC,IACD,EAAE,aAAa,OAAO,aAAa;AAAA,UACvC,GAAI,OAAO,UAAU,OAAO,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,QACzD,EAAE;AAAA,MACJ,EAAE;AAAA,IACJ;AAAA,IACF,eAAe,CAAC,EAAE,YAAY,OAAO,MACnC;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,YAAY,OAAO;AAAA,MACrBJ,SAAO,MAAM,WAAW;AAAA,IAC1B,EAAE;AAAA,MACAG,SAAO;AAAA,QAAI,CAAC,SACV,KAAK,IAAI,CAACC,UAAS;AAAA,UACjB,IAAIA,KAAI;AAAA,UACR,QAAQA,KAAI;AAAA,UACZ,GAAIA,KAAI,cAAc,OAAO,CAAC,IAAI,EAAE,WAAWA,KAAI,UAAU;AAAA,UAC7D,GAAIA,KAAI,cAAc,SAClB,CAAC,IACD,EAAE,WAAWA,KAAI,UAAU;AAAA,QACjC,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,IACF,SAAS,CAAC,EAAE,cAAc,cAAc,MACtC;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,cAAc,cAAc;AAAA,MAC9B;AAAA,IACF,EAAE;AAAA,MACAD,SAAO,IAAI,CAACC,UAAS;AAAA,QACnB,MAAMA,KAAI;AAAA,QACV,YAAYA,KAAI;AAAA,QAChB,cAAcA,KAAI;AAAA,QAClB,mBAAmBA,KAAI;AAAA,QACvB,MAAMA,KAAI,KAAK;AAAA,QACf,OAAOA,KAAI,MAAM;AAAA,MACnB,EAAE;AAAA,IACJ;AAAA,IACF,iBAAiB,CAAC,UAChBD,SAAO,IAAI,aAAa;AACtB,YAAM,YAAY,OAAO,eAAe,MAAM,SAAS;AACvD,YAAM,YACJ,MAAM,WAAW,SACb,SACA,CAAC,OAAO,WAAW,WAAW,MAAM,MAAM,CAAC;AACjD,YAAM,cACJ,MAAM,aAAa,SACf,SACA,CAAC,OAAO,aAAa,WAAW,MAAM,QAAQ,CAAC;AACrD,YAAM,OAAO,OAAO;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,UACE,SAAS;AAAA,YACP;AAAA,YACA;AAAA,YACA,WAAW,MAAM;AAAA,YACjB,OAAO,MAAM;AAAA,UACf;AAAA,UACA,OAAO,MAAM,SAAS;AAAA,UACtB,QAAQ,MAAM,UAAU;AAAA,QAC1B;AAAA,QACAH,SAAO,MAAM,aAAa;AAAA,QAC1B,UAAU,MAAM,SAAS;AAAA,MAC3B;AACA,aAAO,KAAK,IAAI,CAACI,UAAS;AAAA,QACxB,IAAIA,KAAI;AAAA,QACR,WAAWA,KAAI;AAAA,QACf,cAAcA,KAAI;AAAA,QAClB,YAAYA,KAAI;AAAA,QAChB,WAAWA,KAAI;AAAA,QACf,MAAMA,KAAI,KAAK,IAAI,CAACM,SAAQA,KAAI,IAAI;AAAA,QACpC,GAAIN,KAAI,SAAS,OAAO,CAAC,IAAI,EAAE,MAAMA,KAAI,KAAK;AAAA,QAC9C,GAAIA,KAAI,gBAAgB,OAAO,CAAC,IAAI,EAAE,YAAYA,KAAI,YAAY;AAAA,QAClE,GAAIA,KAAI,kBAAkB,OACtB,CAAC,IACD,EAAE,cAAcA,KAAI,cAAc;AAAA,MACxC,EAAE;AAAA,IACJ,CAAC;AAAA,IACH,kBAAkB,CAAC,UACjB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA,UAAU,MAAM,SAAS;AAAA,IAC3B,EAAE,KAAKD,SAAO,IAAI,CAACC,UAAS,EAAE,IAAIA,KAAI,GAAG,EAAE,CAAC;AAAA,IAC9C,kBAAkB,CAAC,UACjB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,cAAc,MAAM;AAAA,QACpB,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,MACf;AAAA,MACA;AAAA,MACA,UAAU,MAAM,SAAS;AAAA,IAC3B,EAAE,KAAKD,SAAO,IAAI,CAACC,UAAS,EAAE,IAAIA,KAAI,GAAG,EAAE,CAAC;AAAA,IAC9C,eAAe,CAAC,EAAE,aAAa,MAC7B;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,aAAa;AAAA,MACf;AAAA,IACF,EAAE;AAAA,MACAD,SAAO,IAAI,CAACC,UAAS;AAAA,QACnB,IAAIA,KAAI;AAAA,QACR,WAAWA,KAAI;AAAA,QACf,YAAYA,KAAI;AAAA,QAChB,MAAMA,KAAI,KAAK,IAAI,CAACM,SAAQA,KAAI,IAAI;AAAA,QACpC,QAAQ,SAASN,KAAI,UAAU,QAAQ;AAAA,QACvC,SAAS,SAASA,KAAI,UAAU,SAAS;AAAA,QACzC,OAAOA,KAAI,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ;AAAA,QAC5C,GAAIA,KAAI,SAAS,OAAO,CAAC,IAAI,EAAE,MAAMA,KAAI,KAAK;AAAA,QAC9C,GAAIA,KAAI,UAAU,OAAO,CAAC,IAAI,EAAE,OAAOA,KAAI,MAAM;AAAA,QACjD,GAAIA,KAAI,yBAAyB,OAC7B,CAAC,IACD,EAAE,UAAUA,KAAI,qBAAqB;AAAA,QACzC,GAAIA,KAAI,gBAAgB,OAAO,CAAC,IAAI,EAAE,YAAYA,KAAI,YAAY;AAAA,MACpE,EAAE;AAAA,IACJ;AAAA,IACF,aAAa,CAAC,UACZD,SAAO,IAAI,aAAa;AACtB,YAAM,WACJ,MAAM,aACL,MAAM,SAAS,SACZ,SACA,OAAO,WAAW,MAAM,WAAW,MAAM,IAAI;AACnD,UAAI,aAAa,QAAW;AAC1B,eAAO,OAAOA,SAAO;AAAA,UACnB,IAAI,eAAe;AAAA,YACjB,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAMC,OAAM,OAAO;AAAA,QACjB;AAAA,QACA;AAAA,QACA,EAAE,SAAS;AAAA,QACX;AAAA,MACF;AACA,aAAO;AAAA,QACL,IAAIA,KAAI;AAAA,QACR,MAAMA,KAAI;AAAA,QACV,UAAUA,KAAI;AAAA,QACd,SAASA,KAAI;AAAA,QACb,OAAOA,KAAI;AAAA,QACX,iBAAiBA,KAAI;AAAA,QACrB,SAASA,KAAI;AAAA,QACb,QAAQA,KAAI,aAAa,IAAI,CAACO,YAAW;AAAA,UACvC,KAAKA,OAAM;AAAA,UACX,GAAIA,OAAM,UAAU,OAAO,CAAC,IAAI,EAAE,OAAOA,OAAM,MAAM;AAAA,QACvD,EAAE;AAAA,QACF,GAAIP,KAAI,UAAU,OAAO,CAAC,IAAI,EAAE,OAAOA,KAAI,MAAM;AAAA,QACjD,GAAIA,KAAI,UAAU,OAAO,CAAC,IAAI,EAAE,OAAOA,KAAI,MAAM;AAAA,MACnD;AAAA,IACF,CAAC;AAAA,IACH,WAAW,CAAC,UACVD,SAAO,IAAI,aAAa;AACtB,YAAM,WACJ,MAAM,aACL,MAAM,SAAS,SACZ,SACA,OAAO,WAAW,MAAM,WAAW,MAAM,IAAI;AACnD,UAAI,aAAa,QAAW;AAC1B,eAAO,OAAOA,SAAO;AAAA,UACnB,IAAI,eAAe;AAAA,YACjB,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAMC,OAAM,OAAO;AAAA,QACjB;AAAA,QACA;AAAA,QACA,EAAE,SAAS;AAAA,QACX;AAAA,QACA,UAAU,MAAM,SAAS;AAAA,MAC3B;AACA,aAAO;AAAA,QACL,IAAIA,KAAI;AAAA,QACR,MAAMA,KAAI;AAAA,QACV,WAAWA,KAAI;AAAA,QACf,WAAWA,KAAI;AAAA,QACf,UAAUA,KAAI,SAAS,IAAI,CAAC,aAAa;AAAA,UACvC,UAAU,QAAQ;AAAA,UAClB,MAAM,QAAQ;AAAA,UACd,GAAG,UAAU,QAAQ,OAAO;AAAA,QAC9B,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,IACH,kBAAkB,CAAC,UACjBD,SAAO,IAAI,aAAa;AACtB,YAAM,UACJ,MAAM,mBAAmB,SACrB,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,EAAE,YAAY,MAAM,WAAW;AAAA,QAC/BH,SAAO,OAAO,OAAO;AAAA,MACvB,IACA;AACN,YAAM,iBAAiB,MAAM,kBAAkB,SAAS;AACxD,UAAI,mBAAmB,QAAW;AAChC,eAAO,OAAOG,SAAO;AAAA,UACnB,IAAI,eAAe;AAAA,YACjB,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAM,WAAW,OAAO;AAAA,QACtB;AAAA,QACA;AAAA,QACA,EAAE,YAAY,MAAM,YAAY,YAAY,eAAe;AAAA,QAC3D;AAAA,MACF;AACA,YAAM,KAAK,OAAO,iBAAiB,SAAS,EAAE,EAAE;AAAA,QAC9CA,SAAO;AAAA,UACL,CAAC,UACC,IAAI,eAAe;AAAA,YACjB,SAAS,gCAAoC;AAAA,cAC3C,MAAM;AAAA,cACN,CAAC,UAAU,MAAM;AAAA,YACnB,EAAE,KAAK,IAAI,CAAC;AAAA,YACZ,MAAM;AAAA,UACR,CAAC;AAAA,QACL;AAAA,MACF;AACA,YAAM,SAAS,OAAO,mBAAmB,IAAI;AAAA,QAC3C,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,MAChB,CAAC;AACD,YAAM,KACJ,OAAO,SAAS,aACZ,IAAI,mBAAmB;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,OAAO,MAAM;AAAA,MACf,CAAC,IACD,IAAI,WAAW;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,MAAM,OAAO;AAAA,QACb,OAAO,MAAM;AAAA,MACf,CAAC;AACP,YAAM,YACJ,MAAM,cAAc,UAAa,MAAM,UAAU,WAAW,IACxD,UAAU,MAAM,KAAK,OAAO,OAAO,MAAM,KAAK,CAAC,6BAC/C,MAAM;AACZ,YAAM,EAAE,WAAW,IAAI,OAAO;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,UACE,YAAY,MAAM;AAAA,UAClB;AAAA,UACA,OAAO,CAAC,EAAE;AAAA,UACV;AAAA,QACF;AAAA,QACAH,SAAO,OAAO,EAAE,YAAYA,SAAO,OAAO,CAAC;AAAA,MAC7C;AACA,aAAO,EAAE,YAAY,gBAAgB,QAAQ,OAAO,KAAK;AAAA,IAC3D,CAAC;AAAA,IACH,WAAW,CAAC,UACV;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,YAAY,MAAM;AAAA,QAClB,cAAc,MAAM;AAAA,QACpB,YAAY,MAAM;AAAA,QAClB,YAAY,MAAM;AAAA,QAClB,QAAQ,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,IACF,EAAE;AAAA,MACAG,SAAO,IAAI,CAACC,UAAS;AAAA,QACnB,OAAOA,KAAI;AAAA,QACX,QAAQA,KAAI;AAAA,QACZ,YAAYA,KAAI;AAAA,QAChB,cAAc,MAAM;AAAA,MACtB,EAAE;AAAA,IACJ;AAAA,IACF,OAAO,CAAC,UACN;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,OAAO,MAAM,OAAO,MAAM,MAAM,KAAK;AAAA,MACvC;AAAA,IACF,EAAE;AAAA,MACAD,SAAO,IAAI,CAACC,UAAS;AAAA,QACnB,OAAOA,KAAI;AAAA,QACX,QAAQA,KAAI;AAAA,QACZ,GAAIA,KAAI,gBAAgB,OAAO,CAAC,IAAI,EAAE,YAAYA,KAAI,YAAY;AAAA,MACpE,EAAE;AAAA,IACJ;AAAA,IACF,WAAW,CAAC,UACV;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,YAAY,MAAM;AAAA,QAClB,YAAY,MAAM;AAAA,QAClB,iBAAiB,MAAM;AAAA,QACvB,YAAY,MAAM,cAAc;AAAA,MAClC;AAAA,MACA;AAAA,IACF,EAAE;AAAA,MACAD,SAAO,IAAI,CAACC,UAAS;AAAA,QACnB,OAAOA,KAAI,IAAI;AAAA,QACf,QAAQA,KAAI,IAAI;AAAA,QAChB,iBAAiBA,KAAI;AAAA,MACvB,EAAE;AAAA,IACJ;AAAA,EACJ;AACF;;;AiBpnCA,SAAS,WAAAQ,UAAS,UAAAC,UAAQ,SAAAC,QAAO,UAAAC,gBAAc;;;ACA/C,SAAS,UAAAC,gBAAc;AACvB,YAAYC,cAAY;AACxB,YAAYC,UAAS;AAGd,IAAM,eAAe;AAErB,IAAM,aAAa;AAEnB,IAAM,qBAAqB;AAQ3B,IAAM,aAAN,cAAgC,qBAAwB,EAAE,cAAc;AAAA,EAC7E,SAAgB;AAAA,EAChB,UAAiB;AACnB,CAAC,EAAE;AAAC;AAGG,IAAMC,QAAO,CAAC,SAAiB,WAAmB,iBACvDH,SAAO,KAAK,IAAI,WAAW,EAAE,SAAS,SAAS,CAAC,CAAC;AAG5C,IAAMI,WAAU,CAACC,WAClB,UAAS,aAAQ,QAAQ,GAAG,EAAE,OAAOA,MAAK,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG;;;AC5BhE,SAAS,WAAAC,UAAS,UAAAC,UAAQ,SAAAC,QAAO,UAAAC,UAAQ,YAAY;AACrD,YAAYC,WAAS;AACrB,YAAYC,QAAO;AACnB,YAAYC,kBAAgB;AAC5B,YAAYC,YAAU;AACtB,YAAY,eAAe;AAC3B,YAAYC,cAAY;AACxB,YAAYC,UAAS;AAWd,IAAM,iBAAiB;AAE9B,IAAM,iBAAwB,kBAAS,CAAC,WAAW,QAAQ,CAAC;AAMrD,IAAM,UAAN,cAA6B,eAAe,SAAS,EAAE;AAAA,EAC5D,QAAe;AAAA,EACf,OAAc;AAAA,EACd,MAAM;AAAA,EACN,OAAc,+BAA6B,eAAM;AACnD,CAAC,EAAE;AAAC;AAMG,IAAM,aAAN,cAAgC,eAAkB,YAAY,EAAE;AAAA,EACrE,SAAgB,aAAI;AAAA,IACX,gCAAuBC,SAAO,QAAQ,cAAc,CAAC;AAAA,IACrD,gCAAuBA,SAAO,QAAQ,cAAc,CAAC;AAAA,EAC9D;AAAA,EACA,SAAgB,6BAA2B,iBAAQ;AAAA,IACjD,gBAAgB;AAAA,EAClB,CAAC,EAAE;AAAA,IACM,gCAAuBA,SAAO,QAAQC,SAAO,KAAK,CAAC,CAAC;AAAA,IACpD,gCAAuBD,SAAO,QAAQ,IAAI,CAAC;AAAA,EACpD;AAAA,EACA,UAAiB,eAAM,OAAO,EAAE;AAAA,IACvB,gCAAuBA,SAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,IACzC,gCAAuBA,SAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,EAClD;AAAA,EACA,UAAiB,gBAAc,iBAAe,gBAAO,EAAE;AAAA,IAC9C,gCAAuBA,SAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,IACzC,gCAAuBA,SAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,EAClD;AAAA,EACA,SAAgB,gBAAc,iBAAe,gBAAO,EAAE;AAAA,IAC7C,gCAAuBA,SAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,IACzC,gCAAuBA,SAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,EAClD;AACF,CAAC,EAAE;AAAC;AAMJ,IAAM,aAAoB,wBAAe,YAAY,EAAE,OAAO,EAAE,CAAC;AAG1D,IAAM,cAAN,cAA0BE,SAAQ,QAGvC,EAAE,oBAAoB,EAAE;AAAC;AASpB,IAAM,mBAAmB;AAezB,IAAM,UAAN,cAAsBA,SAAQ,QAA+B;AAAA,EAClE;AACF,EAAE;AAAC;AAEH,IAAM,cAAqB;AAAA,EAClB,gBAAc,iBAAe,eAAM;AAAA,EAC1C,EAAE,OAAO,EAAE;AACb;AAGO,IAAM,kBAAkB,CAACC,gBAC1B,aAAQ,iBAAiB,gBAAgB,EAAEA,WAAU;AAGpD,IAAM,eAITC,OAAM,OAAO,OAAO;AAAA,EACtBC,SAAO,IAAI,aAAa;AACtB,UAAM,EAAE,KAAK,IAAI,OAAO;AACxB,UAAM,KAAK,OAAkB;AAC7B,UAAM,cAAc,OAAY;AAChC,UAAM,OAAO,gBAAgB,IAAI;AAEjC,UAAMC,QAAO,MACXD,SAAO,IAAI,aAAa;AACtB,UACE,EAAE,OAAO,GACN,OAAO,IAAI,EACX,KAAKA,SAAO,SAAS,eAAe,QAAQ,IAAI,CAAC,CAAC,IACrD;AACA,eAAO,CAAC;AAAA,MACV;AACA,YAAM,OAAO,OAAO,GACjB,eAAe,IAAI,EACnB,KAAKA,SAAO,SAAS,eAAe,QAAQ,IAAI,CAAC,CAAC;AACrD,aAAO,OAAc,6BAAoB,WAAW,EAAE,IAAI,EAAE;AAAA,QAC1DA,SAAO;AAAA,UACL,CAAC,UACC,IAAI,WAAW;AAAA,YACb,SAAS,GAAG,IAAI,+BAA+BE,SAAQ,MAAM,OAAO,CAAC;AAAA,YACrE,UAAU;AAAA,UACZ,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACF,CAAC;AAEH,UAAMC,SAAQ,CAAC,YACbH,SAAO,IAAI,aAAa;AACtB,YAAM,OAAO,OAAc,6BAAoB,WAAW;AAAA,QACxD;AAAA,MACF,EAAE,KAAKA,SAAO,SAAS,eAAe,UAAU,IAAI,CAAC,CAAC;AACtD,aAAO,GACJ,cAAc,YAAY,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC,EAC5D,KAAKA,SAAO,SAAS,eAAe,UAAU,IAAI,CAAC,CAAC;AACvD,YAAM,YAAY,GAAG,IAAI;AACzB,aAAO,GACJ,gBAAgB,WAAW,MAAM,EAAE,MAAM,IAAM,CAAC,EAChD,KAAKA,SAAO,SAAS,eAAe,SAAS,IAAI,CAAC,CAAC;AACtD,aAAO,GACJ,MAAM,WAAW,GAAK,EACtB,KAAKA,SAAO,SAAS,eAAe,SAAS,IAAI,CAAC,CAAC;AACtD,aAAO,GACJ,OAAO,WAAW,IAAI,EACtB,KAAKA,SAAO,SAAS,eAAe,SAAS,IAAI,CAAC,CAAC;AAAA,IACxD,CAAC;AAEH,UAAM,SAAS,CACb,WAEAA,SAAO,IAAI,aAAa;AACtB,aAAOG,OAAM,OAAO,OAAOF,MAAK,CAAC,CAAC;AAAA,IACpC,CAAC;AAEH,WAAO,QAAQ,GAAG;AAAA,MAChB,KAAK,CAAC,YACJA,MAAK,EAAE,KAAKD,SAAO,IAAI,CAACI,SAAQC,SAAO,cAAcD,KAAI,OAAO,CAAC,CAAC,CAAC;AAAA,MACrE,KAAK,CAAC,SAAS,WAAW,OAAO,CAACA,SAAU,OAAIA,MAAK,SAAS,MAAM,CAAC;AAAA,MACrE,QAAQ,CAAC,YAAY,OAAO,CAACA,SAAU,UAAOA,MAAK,OAAO,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH,CAAC;AACH;AAGO,IAAM,aAAa,CAAC,QAAgB,UACzC,GAAG,gBAAgB,MAAM,CAAC,IAAI,KAAK;AAErC,IAAM,kBAAkB,CAAC,WACnB,aAAQ,QAAQ,EAAE,EAAE,MAAM;AAEhC,IAAM,iBACJ,CAAC,QAAgB,SACjB,CAAC,UACC,IAAI,WAAW;AAAA,EACb,SAAS,GAAG,MAAM,IAAI,IAAI,KAAKF,SAAQ,MAAM,OAAO,CAAC;AAAA,EACrD,UAAU;AACZ,CAAC;AAGE,IAAM,aAAa,MAKxBF,SAAO,IAAI,aAAa;AACtB,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,KAAK,OAAkB;AAC7B,MACE,EAAE,OAAO,GACN,OAAO,IAAI,EACX,KAAKA,SAAO,SAAS,eAAe,QAAQ,IAAI,CAAC,CAAC,IACrD;AACA,WAAO,IAAI,WAAW,CAAC,CAAC;AAAA,EAC1B;AACA,QAAM,OAAO,OAAO,GACjB,eAAe,IAAI,EACnB,KAAKA,SAAO,SAAS,eAAe,QAAQ,IAAI,CAAC,CAAC;AACrD,QAAM,SAAS,OAAc,6BAAoB,UAAU,EAAE,IAAI,EAAE;AAAA,IACjEA,SAAO;AAAA,MACL,CAAC,UACC,IAAI,WAAW;AAAA,QACb,SAAS,GAAG,IAAI,qBAAqB,cAAc,YAAYE,SAAQ,MAAM,OAAO,CAAC;AAAA,QACrF,UAAU;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACF;AACA,MAAI,OAAO,YAAY,gBAAgB;AACrC,WAAO,OAAOI;AAAA,MACZ,GAAG,IAAI,eAAe,OAAO,OAAO,cAAc,cAAc;AAAA,IAClE;AAAA,EACF;AACA,SAAO;AACT,CAAC;AAGI,IAAM,aAAa,CACxB,WAMAN,SAAO,IAAI,aAAa;AACtB,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,KAAK,OAAkB;AAC7B,QAAM,cAAc,OAAY;AAChC,QAAM,OAAO,OAAc,6BAAoB,UAAU,EAAE,MAAM,EAAE;AAAA,IACjEA,SAAO,SAAS,eAAe,UAAU,IAAI,CAAC;AAAA,EAChD;AACA,SAAO,GACJ,cAAc,YAAY,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC,EAC5D,KAAKA,SAAO,SAAS,eAAe,UAAU,IAAI,CAAC,CAAC;AACvD,QAAM,YAAY,GAAG,IAAI;AACzB,SAAO,GACJ,gBAAgB,WAAW,IAAI,EAC/B,KAAKA,SAAO,SAAS,eAAe,SAAS,IAAI,CAAC,CAAC;AACtD,SAAO,GACJ,OAAO,WAAW,IAAI,EACtB,KAAKA,SAAO,SAAS,eAAe,SAAS,IAAI,CAAC,CAAC;AACxD,CAAC;AAEH,IAAM,UACJ,CAAC,QAA+B,UAChC,CAAC,YACCK,SAAO,MAAM,QAAQ;AAAA,EACnB,QAAQ,MAAM;AAAA,EACd,QAAQ,CAACE,WACP,gBAAgB,QAAQ,MAAM,MAAM,gBAAgBA,MAAK;AAC7D,CAAC,KACDF,SAAO,MAAM,OAAO;AAAA,EAClB,QAAQ,MAAM;AAAA,EACd,QAAQ,CAACE,WAAU,QAAQ,UAAUA;AACvC,CAAC;AAGE,IAAM,cAAc,CACzB,QACA,QACA,UAEA,KAAK,OAAO,UAAc,gBAAU,QAAQ,QAAQ,KAAK,CAAC,CAAC;AAGtD,IAAM,iBAAiB,CAAC,WAC7BF,SAAO;AAAA,EAAQ,OAAO;AAAA,EAAS,CAACG,SAC9B;AAAA,IACE,OAAO;AAAA,IACH;AAAA,MACF,CAAC,YAAY,WAAW,QAAQ,QAAQ,QAAQ,KAAK,MAAMA;AAAA,IAC7D;AAAA,EACF;AACF;AAeK,IAAM,kBAAkB,CAC7B,YACA,QAA+BH,SAAO,KAAK,MAM3CL,SAAO,IAAI,aAAa;AACtB,MAAI,WAAW,OAAO,WAAW,GAAG;AAClC,WAAO,OAAOM,MAAK,mCAAmC;AAAA,EACxD;AACA,MAAI,WAAW,MAAM,WAAW,GAAG;AACjC,WAAO,OAAOA,MAAK,qCAAqC;AAAA,EAC1D;AACA,QAAM,SAAS,gBAAgB,WAAW,MAAM;AAChD,QAAME,OAAM,WAAW,QAAQ,WAAW,KAAK;AAC/C,QAAM,UAAU,OAAO;AACvB,SAAO,QAAQ,IAAIA,MAAK,WAAW,MAAM;AACzC,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,UAAU,IAAI,QAAQ;AAAA,IAC1B;AAAA,IACA,OAAO,WAAW;AAAA,IAClB,MAAM,WAAW;AAAA,IACjB;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,MACb,GAAG;AAAA,MACH,UAAU;AAAA,QACR,GAAG,OAAO,SAAS;AAAA,UACjB,CAAC,WAAW,WAAW,OAAO,QAAQ,OAAO,KAAK,MAAMA;AAAA,QAC1D;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAASH,SAAO,KAAKG,IAAG;AAAA,IAC1B,CAAC;AAAA,EACH;AACA,SAAO;AACT,CAAC;AAGI,IAAM,aAAa,CACxB,UAMAR,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,UAAU,YAAY,QAAQK,SAAO,KAAK,GAAGA,SAAO,KAAK,KAAK,CAAC;AACrE,MAAIA,SAAO,OAAO,OAAO,GAAG;AAC1B,WAAO,OAAOC;AAAA,MACZ,yBAAyB,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,MACb,GAAG;AAAA,MACH,SAASD,SAAO;AAAA,QACd,WAAW,QAAQ,MAAM,QAAQ,QAAQ,MAAM,KAAK;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,QAAQ;AACjB,CAAC;AAQI,IAAM,mBAAmB,CAC9B,UAMAL,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,UAAUK,SAAO,OAAO,KAAK,IAC/B,YAAY,QAAQA,SAAO,KAAK,GAAG,KAAK,IACxC,eAAe,MAAM;AACzB,MAAIA,SAAO,OAAO,OAAO,EAAG,QAAOA,SAAO,KAAK;AAC/C,QAAM,SAAS,QAAQ;AACvB,QAAMG,OAAM,WAAW,OAAO,QAAQ,OAAO,KAAK;AAClD,QAAM,UAAU,OAAO;AACvB,SAAO,QAAQ,OAAOA,IAAG;AACzB,QAAM,WAAW,OAAO,SAAS;AAAA,IAC/B,CAAC,WAAW,WAAW,OAAO,QAAQ,OAAO,KAAK,MAAMA;AAAA,EAC1D;AACA,QAAM,OAAW,WAAK,QAAQ,EAAE;AAAA,IAC9BH,SAAO,IAAI,CAAC,WAAW,WAAW,OAAO,QAAQ,OAAO,KAAK,CAAC;AAAA,EAChE;AACA,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,MACb,GAAG;AAAA,MACH;AAAA,MACA,SAASA,SAAO,SAAS,OAAO,SAASG,IAAG,IAAI,OAAO,OAAO;AAAA,IAChE,CAAC;AAAA,EACH;AACA,SAAOH,SAAO,KAAK,MAAM;AAC3B,CAAC;AAGI,IAAM,kBAAkB,MAQ7BL,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAO,WAAW;AACjC,QAAMS,aAAY,CAACD,SACjBH,SAAO,cAAc,OAAO,SAASG,IAAG,CAAC,EAAE;AAAA,IACzCH,SAAO,OAAiB,kBAAQ;AAAA,EAClC;AACF,SAAO,EAAE,SAASI,WAAU,SAAS,GAAG,SAASA,WAAU,SAAS,EAAE;AACxE,CAAC;AAGI,IAAM,cAAc,CACzBD,SAMAR,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAO,WAAW;AACjC,SAAOK,SAAO,cAAc,OAAO,SAASG,IAAG,CAAC,EAAE;AAAA,IAChDH,SAAO,OAAiB,kBAAQ;AAAA,EAClC;AACF,CAAC;AAGI,IAAM,aAAa,CACxB,MACAE,WAMAP,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,UAAU,IAAI,WAAW;AAAA,IAC7B,GAAG;AAAA,IACH,UAAUK,SAAO,MAAME,QAAO;AAAA,MAC5B,QAAQ,MAAQ,UAAO,OAAO,UAAU,IAAI;AAAA,MAC5C,QAAQ,CAAC,SAAW,OAAI,OAAO,UAAU,MAAM,KAAK,KAAK,CAAC;AAAA,IAC5D,CAAC;AAAA,EACH,CAAC;AACD,SAAO,WAAW,OAAO;AACzB,SAAO;AACT,CAAC;AAWH,IAAM,WAAW,CACf,OACA,SAEAF,SAAO,cAAc,MAAM,OAAO,IAAI,CAAC,EAAE,KAAKA,SAAO,OAAW,eAAU,CAAC;AAItE,IAAM,mBAAmB,CAAC,YAQ/BL,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,UACJK,SAAO,OAAO,QAAQ,MAAM,KAAKA,SAAO,OAAO,QAAQ,KAAK,IACxD,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,KAAK,IACjD,eAAe,MAAM;AAC3B,MAAIA,SAAO,OAAO,OAAO,EAAG,QAAOA,SAAO,KAAK;AAC/C,QAAM,SAAS,QAAQ;AACvB,QAAM,UAAU,OAAO;AACvB,QAAM,SAAS,OAAO,QAAQ,IAAI,WAAW,OAAO,QAAQ,OAAO,KAAK,CAAC;AACzE,MAAIA,SAAO,OAAO,MAAM,EAAG,QAAOA,SAAO,KAAK;AAC9C,SAAOA,SAAO,KAAK;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO;AAAA,IACf,OAAOA,SAAO,KAAK,OAAO,KAAK;AAAA,IAC/B,OAAO,OAAO;AAAA,EAChB,CAAC;AACH,CAAC;AAQI,IAAM,oBAAoB,CAAC,YAQhCL,SAAO,IAAI,aAAa;AACtB,QAAM,QAAQ,OAAO;AACrB,QAAM,mBAAmBK,SAAO,OAAO,QAAQ,MAAM,IACjD,QAAQ,SACR,SAAS,OAAO,gBAAgB;AACpC,QAAM,YAAYA,SAAO;AAAA,IACvB;AAAA,IACA,MAAM;AAAA,EACR;AACA,QAAM,SAAS,SAAS,OAAO,gBAAgB;AAC/C,MAAIA,SAAO,OAAO,MAAM,GAAG;AACzB,WAAOA,SAAO,KAAK;AAAA,MACjB,QAAQ,gBAAgB,SAAS;AAAA,MACjC,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,MACf,OAAOA,SAAO,KAAK;AAAA,MACnB,OAAOA,SAAO,KAAK,KAAK;AAAA,IAC1B,CAAC;AAAA,EACH;AACA,QAAM,UAAU,SAAS,OAAO,sBAAsB;AACtD,MAAIA,SAAO,OAAO,OAAO,GAAG;AAC1B,WAAOA,SAAO,KAAK;AAAA,MACjB,QAAQ,gBAAgB,SAAS;AAAA,MACjC,MAAM;AAAA,MACN,QAAQ,QAAQ;AAAA,MAChB,OAAOA,SAAO,KAAK;AAAA,MACnB,OAAOA,SAAO,KAAK,KAAK;AAAA,IAC1B,CAAC;AAAA,EACH;AACA,SAAO,OAAO,iBAAiB,OAAO;AACxC,CAAC;;;AF5hBI,IAAM,aAAN,cAAyBK,SAAQ,QAAqC;AAAA,EAC3E;AACF,EAAE;AAAC;AAGI,IAAMC,SAAQC,OAAM,OAAO,UAAU;AAAA,EAC1CC,SAAO,IAAI,aAAa;AACtB,UAAM,WAAW,OAAO,kBAAkB;AAAA,MACxC,QAAQC,SAAO,KAAK;AAAA,MACpB,OAAOA,SAAO,KAAK;AAAA,IACrB,CAAC,EAAE;AAAA,MACDD,SAAO;AAAA,QACL,CAAC,UAAU,IAAI,eAAe,EAAE,SAAS,MAAM,QAAQ,CAAC;AAAA,MAC1D;AAAA,IACF;AACA,QAAIC,SAAO,OAAO,QAAQ,GAAG;AAC3B,aAAO,OAAOD,SAAO;AAAA,QACnB,IAAI,eAAe;AAAA,UACjB,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAME,SAAQ,SAAS;AACvB,WAAO;AAAA,MACL,QAAQA,OAAM;AAAA,MACd,QAAQA,OAAM;AAAA,MACd,OAAOD,SAAO,eAAeC,OAAM,KAAK;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;;;AG5CA,SAAS,WAAAC,gBAAe;AAMjB,IAAM,aAAN,cAAyBA,SAAQ,QAGtC,EAAE,mBAAmB,EAAE;AAAC;;;ACT1B,SAAS,UAAAC,gBAAc;AACvB,YAAYC,aAAY;AACxB,YAAYC,kBAAgB;AAC5B,YAAYC,YAAU;AACtB,SAAS,aAAAC,YAAW,WAAAC,gBAAe;AACnC,YAAYC,iBAAgB;;;ACL5B,SAAS,UAAAC,UAAQ,UAAAC,gBAAc;;;ACA/B,SAAS,UAAAC,gBAAc;AAGvB,YAAYC,cAAY;;;ACHxB,YAAY,WAAW;AACvB,SAAS,UAAAC,gBAAc;AACvB,SAAS,iBAAiB;AAC1B,YAAYC,cAAY;AAGxB,IAAMC,WAAU,CAAC,QAAgB,aAC/B,IAAI,eAAe;AAAA,EACjB,SAAS,GAAG,MAAM,yBAAyB,QAAQ;AAAA,EACnD,MAAM;AACR,CAAC;AAGH,IAAM,mBACJ;AAOK,IAAM,gBAAgB,CAC3B,SACA,MACA,WAAmB,qBAEnB,UAAU,OAAO;AAAA,EACf;AAAA,EACA,QAAe,gBAAO,EAAE,SAAgB,iBAAQ,IAAI,EAAE,CAAC;AACzD,CAAC,EAAE;AAAA,EACDC,SAAO;AAAA,EACPA,SAAO;AAAA,IAAS;AAAA,IAAuB,MACrCA,SAAO;AAAA,MACLD,SAAQ,iDAAiD,QAAQ;AAAA,IACnE;AAAA,EACF;AAAA,EACAC,SAAO;AAAA,IAAW,CAAC,UACX,wBAAkB,KAAK,IACzBA,SAAO,KAAKD,SAAQ,uBAAuB,QAAQ,CAAC,IACpDC,SAAO,UAAU,KAAK;AAAA,EAC5B;AACF;;;ADlBK,IAAM,cAAc,CAAC,UAC1BC,SAAO,IAAI,aAAa;AACtB,QAAM,MAAM,OAAO;AACnB,QAAM,aAAa,OAAc;AAAA,IACxB,uBAAc,MAAM,UAAU;AAAA,IACrC;AAAA,MACE,QAAQ,CAAC,UAAUA,SAAO,QAAe,cAAK,KAAK,CAAC;AAAA,MACpD,QAAQ,MACN,IACG,eAAe,EAAE,YAAY,MAAM,WAAW,CAAC,EAC/C;AAAA,QACCA,SAAO;AAAA,UAAI,CAAC,WACH,uBAAc,OAAO,MAAM,UAAU;AAAA,QAC9C;AAAA,MACF;AAAA,IACN;AAAA,EACF;AACA,MAAW,gBAAO,UAAU,GAAG;AAC7B,WAAO,OAAOA,SAAO;AAAA,MACnB,IAAI,eAAe;AAAA,QACjB,SACE;AAAA,QACF,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,MAAM,WAAW;AACvB,SAAO;AAAA,IACL,2BAA2B,MAAM,UAAU,mBAAmB,MAAM,YAAY,gBAAgB,GAAG;AAAA,IACnG;AAAA,EACF;AACA,SAAO,OAAO,IAAI,UAAU;AAAA,IAC1B,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM;AAAA,IACpB,YAAY;AAAA,IACZ,YAAY,MAAM;AAAA,IAClB,QAAe,mBAAiB,uBAAc,MAAM,MAAM,GAAG,MAAM,KAAK;AAAA,EAC1E,CAAC;AACH,CAAC;AAYI,IAAM,gBAAgB,CAAC,UAC5BA,SAAO,IAAI,aAAa;AACtB,QAAM,MAAM,OAAO;AACnB,SAAO;AAAA,IACL,WAAW,MAAM,IAAI,iBAAiB,MAAM,KAAK;AAAA,IACjD;AAAA,EACF;AACA,SAAO,OAAO,IAAI,MAAM,KAAK;AAC/B,CAAC;AAmBI,IAAM,oBAAoB,CAAC,UAChCA,SAAO,IAAI,aAAa;AACtB,QAAM,MAAM,OAAO;AACnB,SAAO;AAAA,IACL,sBAAsB,MAAM,UAAU,gBAAgB,MAAM,UAAU,kBAAkB,MAAM,eAAe;AAAA,IAC7G;AAAA,EACF;AACA,SAAO,OAAO,IAAI,UAAU;AAAA,IAC1B,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,iBAAiB,MAAM;AAAA,IACvB,YAAY,MAAM;AAAA,EACpB,CAAC;AACH,CAAC;;;AEjHH,SAAS,WAAW,eAAe;AACnC,YAAYC,iBAAgB;AAgCrB,IAAM,YAAY;AAAA,EACvB,OAAO,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EACnE,aAAa,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EACzE,gBAAgB,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EAC5E,cAAc,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EAC1E,iBAAiB,cAAc,SAAS,EAAE;AAAA,IAC7B;AAAA,EACb;AAAA,EACA,iBAAiB,cAAc,SAAS,EAAE;AAAA,IAC7B;AAAA,EACb;AAAA,EACA,YAAY,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EACxE,UAAU,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EACtE,cAAc,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EAC1E,YAAY,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EACxE,eAAe,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EAC3E,SAAS,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EACrE,UAAU,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EACtE,cAAc,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EAC1E,eAAe,cAAc,SAAS,EAAE,cAAyB,sBAAU;AAAA,EAC3E,iBAAiB,cAAc,SAAS,EAAE;AAAA,IAC7B;AAAA,EACb;AAAA,EACA,YAAY,cAAc,SAAS,EAChC,cAAyB,sBAAU,EACnC,cAAc,UAAU,eAAe;AAAA,EAC1C,MAAM,cAAc,SAAS,EAC1B,cAAyB,sBAAU,EACnC,cAAc,UAAU,eAAe;AAAA,EAC1C,UAAU,cAAc,SAAS,EAC9B,cAAyB,sBAAU,EACnC,cAAc,UAAU,eAAe;AAC5C;AAEO,IAAM,YAAY,QAAQ,KAAK,GAAG,SAAS;;;AHlC3C,IAAM,eAAe,CAAC,WAC3B,UAAU,GAAG;AAAA,EACX,eAAe,MACN;AAAA,IACL;AAAA,IACA;AAAA,IACAC,SAAO,IAAI,aAAa;AACtB,YAAM,MAAM,OAAO;AAGnB,YAAM,QAAQ,OAAOA,SAAO,cAAc,UAAU;AACpD,YAAM,QAAQC,SAAO;AAAA,QAAQ;AAAA,QAAO,CAACC,WACnCD,SAAO,cAAcC,OAAM,KAAK;AAAA,MAClC;AAGA,YAAM,WAAW,OAAO,IAAI,aAAa,CAAC,CAAC;AAC3C,YAAM,UAAUD,SAAO;AAAA,QACrB,SAAS,KAAK,CAAC,YAAY,QAAQ,gBAAgB,MAAS,GACxD;AAAA,MACN;AACA,aAAO;AAAA,QACL,QAAQ,IAAI;AAAA,QACZ,GAAGA,SAAO,MAAM,OAAO;AAAA,UACrB,QAAQ,OAAO,CAAC;AAAA,UAChB,QAAQ,CAACC,YAAW,EAAE,OAAOA,OAAM;AAAA,QACrC,CAAC;AAAA,QACD,GAAGD,SAAO,MAAM,SAAS;AAAA,UACvB,QAAQ,OAAO,CAAC;AAAA,UAChB,QAAQ,CAACC,YAAW,EAAE,SAASA,OAAM;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACF,sBAAsB,CAAC,EAAE,UAAU,MAC1B;AAAA,IACL;AAAA,IACA;AAAA,IACAF,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IACG,aAAa,EAAE,UAAU,CAAC,EAC1B,KAAKA,SAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;AAAA,IAC5C;AAAA,EACF;AAAA,EACF,yBAAyB,CAAC;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MACS;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IACG,gBAAgB;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,KAAKA,SAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;AAAA,IAC5C;AAAA,EACF;AAAA,EACF,0BAA0B,CAAC;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MACS;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IAAI,iBAAiB;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACF,0BAA0B,CAAC,EAAE,WAAW,cAAc,MAAM,MAAM,MACzD;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IAAI,iBAAiB,EAAE,WAAW,cAAc,MAAM,MAAM,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA,EACF,uBAAuB,CAAC,EAAE,aAAa,MAC9B;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO,QAAQ,WAAW,CAAC,QAAQ,IAAI,cAAc,EAAE,aAAa,CAAC,CAAC;AAAA,EACxE;AAAA,EACF,qBAAqB,CAAC,EAAE,WAAW,MAAM,SAAS,MACzC;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IAAI,YAAY,EAAE,WAAW,MAAM,SAAS,CAAC;AAAA,IAC/C;AAAA,EACF;AAAA,EACF,mBAAmB,CAAC,EAAE,WAAW,MAAM,SAAS,MACvC;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IAAI,UAAU,EAAE,WAAW,MAAM,SAAS,CAAC;AAAA,IAC7C;AAAA,EACF;AAAA,EACF,uBAAuB,CAAC,EAAE,UAAU,MAC3B;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IACG,cAAc,EAAE,UAAU,CAAC,EAC3B,KAAKA,SAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;AAAA,IAC5C;AAAA,EACF;AAAA,EACF,qBAAqB,CAAC,EAAE,WAAW,YAAY,UAAU,MAChD;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IAAI,YAAY;AAAA,QACd;AAAA,QACA;AAAA,QACA,WAAW,aAAa;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACF,wBAAwB,CAAC,EAAE,WAAW,MAC7B;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO,QAAQ,WAAW,CAAC,QAAQ,IAAI,eAAe,EAAE,WAAW,CAAC,CAAC;AAAA,EACvE;AAAA,EACF,kBAAkB,CAAC,EAAE,YAAY,cAAc,OAAO,MAC7C;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IACG,SAAS,EAAE,YAAY,cAAc,OAAO,CAAC,EAC7C,KAAKA,SAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;AAAA,IAC5C;AAAA,EACF;AAAA,EACF,mBAAmB,CAAC,EAAE,SAAS,MACtB;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO,QAAQ,WAAW,CAAC,QAAQ,IAAI,UAAU,EAAE,SAAS,CAAC,CAAC;AAAA,EAChE;AAAA,EACF,uBAAuB,CAAC,EAAE,YAAY,OAAO,MACpC;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IACG,cAAc,EAAE,YAAY,OAAO,CAAC,EACpC,KAAKA,SAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;AAAA,IAC5C;AAAA,EACF;AAAA,EACF,wBAAwB,CAAC,EAAE,cAAc,cAAc,MAC9C;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IAAI,QAAQ,EAAE,cAAc,cAAc,CAAC;AAAA,IAC7C;AAAA,EACF;AAAA,EACF,0BAA0B,CAAC;AAAA,IACzB;AAAA,IACA;AAAA,IACA,OAAAE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MACS;AAAA,IACL;AAAA,IACA;AAAA,IACAF,SAAO;AAAA,MAAQ;AAAA,MAAW,CAAC,QACzB,IAAI,iBAAiB;AAAA,QACnB;AAAA,QACA;AAAA,QACA,OAAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACF,qBAAqB,CAAC,UACb,OAAO,QAAQ,aAAa,YAAY,KAAK,CAAC;AAAA,EACvD,cAAc,CAAC,UAAiB,OAAO,QAAQ,OAAO,cAAc,KAAK,CAAC;AAAA,EAC1E,kBAAkB,CAAC,UACV,OAAO,QAAQ,WAAW,kBAAkB,KAAK,CAAC;AAC7D,CAAC;;;AIlPH,SAAS,UAAAC,UAAQ,UAAAC,gBAAc;AAG/B,YAAYC,YAAU;AA0BtB,IAAMC,WAAU,CAAC,SAAiB,OAAO,kBACvC,IAAI,eAAe,EAAE,SAAS,KAAK,CAAC;AAO/B,IAAM,eAAe,CAAC,UAC3BC,SAAO,IAAI,aAAa;AACtB,QAAM,QAAQ,OAAY;AAC1B,QAAM,cAAc,OAAO;AAC3B,QAAM,aAAa,OAAO;AAC1B,QAAM,YAAY,MAAM;AAAA,IACtB,YAAY;AAAA,IACZ,MAAM,iBAAiB;AAAA,EACzB;AACA,MAAIC,SAAO,OAAO,SAAS,GAAG;AAC5B,WAAO,OAAOD,SAAO;AAAA,MACnBD;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,UAAU;AAEtB,QAAM,QAAQ,OAAO,UAAU,GAAG,EAAE;AAAA,IAClCC,SAAO,SAAS,CAAC,UAAUD,SAAQ,MAAM,SAAS,eAAe,CAAC;AAAA,EACpE;AACA,MAAIE,SAAO,OAAO,KAAK,GAAG;AACxB,WAAO,OAAOD,SAAO;AAAA,MACnBD;AAAA,QACE,GAAG,GAAG;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,UAAU,MAAM,MAAM,QAAQ,EAAE,IAAI,CAAC,EAAE;AAAA,IAC1DC,SAAO,QAAQ,gBAAgB;AAAA,IAC/BA,SAAO;AAAA,MAAS,CAAC,UACfD;AAAA,QACE,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC5F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAa,OAAO,WAAW,KAAK,MAAM,MAAM,MAAM,EAAE;AAAA,IAC5DC,SAAO,SAAS,CAAC,UAAUD,SAAQ,MAAM,SAAS,aAAa,CAAC;AAAA,EAClE;AACA,QAAM,MAAM,WAAW;AAAA,IACrB,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW;AAAA,IACnB,YAAY,MAAM;AAAA,EACpB,CAAC;AAED,MAAI,MAAM,UAAU,MAAM;AACxB,WAAO;AAAA,MACL,iCAAiC,MAAM,MAAM,MAAM,OAAO,GAAG;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,KAAK;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM,UAAU;AAAA,EACzB,CAAC,EAAE;AAAA,IACDC,SAAO;AAAA,MAAS,CAAC,UACfD,SAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI,EAAE;AAAA,IAC7C;AAAA,EACF;AACA,QAAM,YACJ,eAAe,UAAU,KAAK,QAAQ,UAAU,MAAM,gBAAgB;AACxE,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ,QAAQ,MAAM,GAAG,SAAS;AAAA,EAC7C;AACF,CAAC;;;AC9GH,SAAS,UAAAG,UAAQ,UAAAC,gBAAc;AAG/B,YAAYC,YAAU;AA2BtB,IAAMC,WAAU,CAAC,SAAiB,OAAO,kBACvC,IAAI,eAAe,EAAE,SAAS,KAAK,CAAC;AAO/B,IAAM,eAAe,CAAC,UAC3BC,SAAO,IAAI,aAAa;AACtB,QAAM,QAAQ,OAAY;AAC1B,QAAM,cAAc,OAAO;AAC3B,QAAM,aAAa,OAAO;AAC1B,QAAM,YAAY,MAAM;AAAA,IACtB,YAAY;AAAA,IACZ,MAAM,iBAAiB;AAAA,EACzB;AACA,MAAIC,SAAO,OAAO,SAAS,GAAG;AAC5B,WAAO,OAAOD,SAAO;AAAA,MACnBD;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,UAAU;AACtB,QAAM,QAAQ,OAAO,UAAU,GAAG,EAAE;AAAA,IAClCC,SAAO,SAAS,CAAC,UAAUD,SAAQ,MAAM,SAAS,eAAe,CAAC;AAAA,EACpE;AACA,MAAIE,SAAO,OAAO,KAAK,GAAG;AACxB,WAAO,OAAOD,SAAO;AAAA,MACnBD;AAAA,QACE,GAAG,GAAG;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAa,MAAM,cAAc,MAAM,MAAM;AACnD,QAAM,SAAS,MAAM,MAAM;AAC3B,QAAM,SAAS,MAAM,WAAW;AAGhC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,4BAA4B,MAAM,OAAO,GAAG,gBAAgB,UAAU;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,UAAU,QAAQ,EAAE,IAAI,CAAC,EAAE;AAAA,IAC9CC,SAAO,QAAQ,gBAAgB;AAAA,IAC/BA,SAAO;AAAA,MAAS,CAAC,UACfD;AAAA,QACE,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC5F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,WAAW;AAAA,IACrB,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW;AAAA,IACnB;AAAA,EACF,CAAC;AACD,QAAM,iBAAiBE,SAAO;AAAA,IAC5B,MAAM,kBAAkB,MAAM,MAAM;AAAA,EACtC;AACA,QAAM,UAAU,OAAO,KAAK;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,EAAE,QAAQ,WAAW,QAAQ,YAAY,OAAO;AAAA,IAC1D;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,EACjB,CAAC,EAAE;AAAA,IACDD,SAAO;AAAA,MAAS,CAAC,UACfD,SAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI,EAAE;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ,QAAQ,MAAM,GAAG,QAAQ,WAAW,cAAc,gBAAgB,QAAQ,SAAS,UAAU,KAAK,EAAE;AAAA,EACvH;AACF,CAAC;;;AChHH,SAAS,WAAAG,UAAS,UAAU,UAAAC,UAAQ,SAAAC,QAAO,UAAAC,UAAQ,UAAAC,gBAAc;AACjE,YAAYC,kBAAgB;AAC5B,YAAYC,YAAU;AACtB,YAAYC,iBAAgB;AAC5B,YAAYC,wBAAuB;AACnC,YAAYC,yBAAwB;AAK7B,IAAM,mBAAN,cAA+BC,SAAO;AAAA,EAC3C;AACF,EAAE;AAAA,EACA,SAASA,SAAO;AAAA,EAChB,KAAKA,SAAO;AAAA,EACZ,MAAMA,SAAO;AAAA,EACb,OAAOA,SAAO;AAAA,EACd,OAAOA,SAAO,MAAMA,SAAO,MAAM;AAAA,EACjC,WAAWA,SAAO;AACpB,CAAC,EAAE;AAAC;AAuBJ,IAAM,iBAAiBA,SAAO,OAAO;AAAA,EACnC,WAAWA,SAAO;AAAA,EAClB,SAASA,SAAO;AAAA,EAChB,KAAKA,SAAO;AAAA,EACZ,WAAWA,SAAO;AAAA,EAClB,SAASA,SAAO,MAAMA,SAAO,MAAM;AAAA,EACnC,SAASA,SAAO;AAAA,EAChB,QAAQA,SAAO;AACjB,CAAC;AAED,IAAM,iBAAiBA,SAAO,OAAO;AAAA,EACnC,IAAIA,SAAO;AAAA,EACX,MAAMA,SAAO;AAAA,EACb,SAASA,SAAO;AAAA,EAChB,KAAKA,SAAO;AACd,CAAC;AAED,IAAM,eAAeA,SAAO,OAAO;AAAA,EACjC,YAAYA,SAAO,OAAO;AAAA,IACxB,SAASA,SAAO;AAAA,IAChB,OAAOA,SAAO;AAAA,IACd,SAASA,SAAO;AAAA,IAChB,YAAYA,SAAO;AAAA,EACrB,CAAC;AAAA,EACD,QAAQA,SAAO,OAAO;AAAA,IACpB,SAASA,SAAO;AAAA,IAChB,KAAKA,SAAO;AAAA,IACZ,WAAWA,SAAO;AAAA,IAClB,SAASA,SAAO;AAAA,EAClB,CAAC;AAAA,EACD,SAASA,SAAO,OAAO;AAAA,IACrB,UAAUA,SAAO;AAAA,IACjB,QAAQA,SAAO;AAAA,IACf,UAAUA,SAAO;AAAA,EACnB,CAAC;AACH,CAAC;AAED,IAAM,iBAAiBA,SAAO,OAAO;AAAA,EACnC,SAASA,SAAO;AAAA,EAChB,KAAKA,SAAO;AAAA,EACZ,WAAWA,SAAO;AAAA,EAClB,SAASA,SAAO;AAClB,CAAC;AAED,IAAM,eAAeA,SAAO,OAAO,EAAE,QAAQA,SAAO,OAAO,CAAC;AAE5D,IAAM,gBAAgBA,SAAO,OAAO;AAAA,EAClC,OAAOA,SAAO;AAAA,IACZA,SAAO,OAAO;AAAA,MACZ,IAAIA,SAAO;AAAA,MACX,QAAQA,SAAO;AAAA,MACf,MAAMA,SAAO;AAAA,MACb,MAAMA,SAAO;AAAA,MACb,OAAOA,SAAO;AAAA,MACd,UAAUA,SAAO;AAAA,MACjB,QAAQA,SAAO,YAAYA,SAAO,MAAM;AAAA,MACxC,WAAWA,SAAO;AAAA,IACpB,CAAC;AAAA,EACH;AACF,CAAC;AAED,IAAM,cAAc,MAClB,IAAI,eAAe;AAAA,EACjB,SACE;AAAA,EACF,MAAM;AACR,CAAC;AAEH,IAAM,cAAc,CAAC,YACnB,IAAI,eAAe,EAAE,SAAS,MAAM,gBAAgB,CAAC;AAEvD,IAAMC,WAAU,CACd,WACA,QACA,QACA,MACA,SAEAC,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAkB;AACjC,QAAM,OAAO,oBAAoB,UAAU,IAAI;AAC/C,QAAM,MAAM,GAAG,IAAI,GAAG,IAAI;AAC1B,QAAM,QACJ,WAAW,QACW,uBAAI,GAAG,IACP,wBAAK,GAAG;AAChC,QAAM,WACJ,SAAS,SACL,QACkB,kCAAe,OAAO,IAAI;AAClD,QAAM,QAA0B,+BAAY,UAAU,UAAU,KAAK;AACrE,QAAM,UAAU,OAAO,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC3CA,SAAO,cAAc,SAAS,QAAQ,CAAC,CAAC;AAAA,IACxCA,SAAO;AAAA,MAAS,CAAC,UACf,YAAY,6BAA6B,MAAM,OAAO,EAAE;AAAA,IAC1D;AAAA,EACF;AACA,MAAIC,SAAO,OAAO,OAAO,GAAG;AAC1B,WAAO,OAAOD,SAAO;AAAA,MACnB,YAAY,+CAA+C;AAAA,IAC7D;AAAA,EACF;AACA,QAAM,WAAW,QAAQ;AACzB,MAAI,SAAS,SAAS,OAAO,SAAS,UAAU,KAAK;AACnD,WAAO,OAAOA,SAAO;AAAA,MACnB,YAAY,wBAAwB,SAAS,MAAM,EAAE;AAAA,IACvD;AAAA,EACF;AACA,SAAO,OAA0B,mCAAe,MAAM,EAAE,QAAQ,EAAE;AAAA,IAChEA,SAAO;AAAA,MAAS,CAAC,UACf,YAAY,qCAAqC,MAAM,OAAO,EAAE;AAAA,IAClE;AAAA,EACF;AACF,CAAC;AAGI,IAAM,UAAN,cAAsBE,SAAQ,QAmDnC,EAAE,gBAAgB,EAAE;AAAC;AAEvB,IAAM,gBAAgB,CACpBC,OAKA,QAIAA,MAAK;AAAA,EACHH,SAAO;AAAA,IACLC,SAAO,MAAM;AAAA,MACX,QAAQ,MAAMD,SAAO,KAAK,YAAY,CAAC;AAAA,MACvC,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEF,IAAMI,QAAO,CACXD,WAKwB;AAAA,EACxB,QAAQA,MAAK;AAAA,IACXH,SAAO;AAAA,MACLC,SAAO,MAAM;AAAA,QACX,QAAQ,MAAMD,SAAO,QAAuB,EAAE,WAAW,MAAM,CAAC;AAAA,QAChE,QAAQ,CAACK,WACPN,SAAQM,QAAO,gBAAgB,OAAO,SAAS,EAAE;AAAA,UAC/CL,SAAO,IAAI,CAAC,YAAY;AAAA,YACtB,WAAW;AAAA,YACX,SAAS,OAAO;AAAA,YAChB,KAAK,OAAO;AAAA,YACZ,SAAS,OAAO;AAAA,YAChB,SAAS,OAAO;AAAA,YAChB,QAAQ,OAAO;AAAA,YACf,WAAW,OAAO;AAAA,UACpB,EAAE;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IAAcG;AAAA,IAAM,CAACE,WAC1BN,SAAQM,QAAO,eAAe,OAAO,QAAQ,EAAE;AAAA,MAC7CL,SAAO;AAAA,QAAI,CAAC,UACV,MAAM,MAAM,IAAI,CAAC,UAAU;AAAA,UACzB,IAAI,KAAK;AAAA,UACT,QAAQ,KAAK;AAAA,UACb,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,UACb,WAAW,KAAK;AAAA,QAClB,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IAAcG;AAAA,IAAM,CAACE,WACzBN,SAAQM,QAAO,cAAc,QAAQ,OAAO,EAAE;AAAA,MAC5CL,SAAO,IAAI,CAAC,YAAY;AAAA,QACtB,IAAI,OAAO,QAAQ,WAAW;AAAA,QAC9B,UAAU,OAAO,QAAQ;AAAA,QACzB,QAAQ,OAAO,QAAQ;AAAA,QACvB,UAAU,OAAO,QAAQ;AAAA,MAC3B,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IAAcG;AAAA,IAAM,CAACE,WAC3BN,SAAQM,QAAO,gBAAgB,QAAQ,SAAS,EAAE;AAAA,MAChDL,SAAO,IAAI,CAAC,YAAY;AAAA,QACtB,IAAI;AAAA,QACJ,SAAS,OAAO;AAAA,QAChB,KAAK,OAAO;AAAA,QACZ,SAAS,OAAO;AAAA,MAClB,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IAAcG;AAAA,IAAM,CAACE,WAC1BN,SAAQM,QAAOP,SAAO,SAAS,QAAQ,QAAQ,EAAE;AAAA,MAC/CE,SAAO,IAAI,OAAO,EAAE,IAAI,MAAM,QAAQ,KAAK,EAAE;AAAA,IAC/C;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IAAcG;AAAA,IAAM,CAACE,WAC3BN,SAAQM,QAAOP,SAAO,SAAS,QAAQ,SAAS,EAAE;AAAA,MAChDE,SAAO,IAAI,OAAO,EAAE,IAAI,MAAM,QAAQ,MAAM,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EACA,MAAM,CAAC,SACL;AAAA,IAAcG;AAAA,IAAM,CAACE,WACnBN,SAAQM,QAAO,cAAc,QAAQ,SAAS,EAAE,KAAK,CAAC,EAAE;AAAA,MACtDL,SAAO,IAAI,CAAC,YAAY,EAAE,IAAI,MAAM,QAAQ,OAAO,OAAO,EAAE;AAAA,IAC9D;AAAA,EACF;AACJ;AAEA,IAAM,kBAAkBF,SAAO;AAAA,EAC7BA,SAAO,eAAe,gBAAgB;AACxC;AAQO,IAAMQ,SAAQC,OAAM,OAAO,OAAO;AAAA,EACvCP,SAAO,IAAI,aAAa;AACtB,UAAM,KAAK,OAAkB;AAC7B,UAAM,OAAO,OAAY;AACzB,UAAM,cAAc,OAAO;AAC3B,UAAM,gBAAgB,KAAK;AAAA,MACzB,KAAK,QAAQ,WAAW,WAAW,CAAC;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AACA,UAAMG,QAAO,GAAG,eAAe,aAAa,EAAE;AAAA,MAC5CH,SAAO,IAAI,eAAe;AAAA,MAC1BA,SAAO,MAAM,MAAMA,SAAO,QAAQC,SAAO,KAAK,CAAC,CAAC;AAAA,MAChDD,SAAO;AAAA,QAAQ,CAAC,UACdC,SAAO,MAAM,OAAO;AAAA,UAClB,QAAQ,MAAMD,SAAO,QAAQC,SAAO,KAAK,CAAC;AAAA,UAC1C,QAAQ,CAAC,cACPD,SAAO,IAAI;AAAA,YACT,KAAK,MAAM;AACT,sBAAQ,KAAK,UAAU,KAAK,CAAC;AAC7B,qBAAO;AAAA,YACT;AAAA,YACA,OAAO,MAAM;AAAA,UACf,CAAC,EAAE;AAAA,YACDA,SAAO,cAAc,MAAM,KAAK;AAAA,YAChCA,SAAO;AAAA,cAAQ,CAAC,UACd,QACID,SAAQ,WAAW,gBAAgB,OAAO,SAAS,EAAE;AAAA,gBACnDC,SAAO;AAAA,kBAAI,CAAC,WACV,OAAO,SAAS,kBAChB,OAAO,QAAQ,UAAU,MACrBC,SAAO,KAAK,SAAS,IACrBA,SAAO,KAAK;AAAA,gBAClB;AAAA,gBACAD,SAAO,MAAM,MAAMA,SAAO,QAAQC,SAAO,KAAK,CAAC,CAAC;AAAA,cAClD,IACAD,SAAO,QAAQC,SAAO,KAAK,CAAC;AAAA,YAClC;AAAA,UACF;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAOG,MAAKD,KAAI;AAAA,EAClB,CAAC;AACH;;;AP3UA,IAAM,aAAa;AAAA,EACjB,aAAa,cAAc,UAAU,EAClC,cAAc,WAAW,EACzB,cAAyB,uBAAU,EACnC,cAAmB,WAAI,EACvB,cAAyB,sBAAU,EACnC,cAAqB,cAAM,EAC3B,cAAc,cAAc,EAC5B,cAAcK,WAAU,eAAe;AAAA,EAC1C,aAAa,cAAc,UAAU,EAClC,cAAc,WAAW,EACzB,cAAyB,uBAAU,EACnC,cAAmB,WAAI,EACvB,cAAyB,sBAAU,EACnC,cAAqB,cAAM,EAC3B,cAAc,cAAc,EAC5B,cAAcA,WAAU,eAAe;AAAA,EAC1C,cAAc,cAAc,OAAO,EAAE,cAAyB,sBAAU;AAAA,EACxE,aAAa,cAAc,OAAO,EAAE,cAAyB,sBAAU;AAAA,EACvE,YAAY,cAAc,OAAO,EAC9B,cAAyB,sBAAU,EACnC,cAAcA,WAAU,eAAe;AAAA,EAC1C,cAAc,cAAc,OAAO,EAChC,cAAyB,sBAAU,EACnC,cAAcA,WAAU,eAAe;AAAA,EAC1C,aAAa,cAAc,OAAO,EAC/B,cAAyB,sBAAU,EACnC,cAAcA,WAAU,eAAe;AAAA,EAC1C,YAAY,cAAc,OAAO,EAC9B,cAAyB,sBAAU,EACnC,cAAcA,WAAU,eAAe;AAAA,EAC1C,cAAc,cAAc,OAAO,EAChC,cAAyB,sBAAU,EACnC,cAAcA,WAAU,eAAe;AAC5C;AAGO,IAAM,aAAaC,SAAQ,KAAK,GAAG,WAAW,GAAG,UAAU;AAQ3D,IAAM,cAAc,CAAC,WAC1B,WAAW,GAAG;AAAA,EACZ,GAAG,aAAa,MAAM;AAAA,EACtB,sBAAsB,CAAC,UACd,OAAO,QAAQ,cAAc,aAAa,KAAK,CAAC;AAAA,EACzD,sBAAsB,CAAC,UACd,OAAO,QAAQ,cAAc,aAAa,KAAK,CAAC;AAAA,EACzD,uBAAuB,MACd;AAAA,IACL;AAAA,IACA;AAAA,IACAC,SAAO,QAAQ,SAAS,CAAC,YAAY,QAAQ,MAAM;AAAA,EACrD;AAAA,EACF,sBAAsB,MACb;AAAA,IACL;AAAA,IACA;AAAA,IACAA,SAAO;AAAA,MAAQ;AAAA,MAAS,CAAC,YACvB,QAAQ,MAAM,KAAKA,SAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;AAAA,IACvD;AAAA,EACF;AAAA,EACF,qBAAqB,MACZ;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,IACF,EAAE;AAAA,MACAA,SAAO,QAAQA,SAAO,QAAQ,SAAS,CAAC,YAAY,QAAQ,IAAI,CAAC;AAAA,IACnE;AAAA,EACF;AAAA,EACF,uBAAuB,MACd;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,IACF,EAAE;AAAA,MACAA,SAAO,QAAQA,SAAO,QAAQ,SAAS,CAAC,YAAY,QAAQ,MAAM,CAAC;AAAA,IACrE;AAAA,EACF;AAAA,EACF,qBAAqB,CAAC,EAAE,KAAK,MACpB;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ,IAAI;AAAA,MACZ;AAAA,MACA;AAAA,IACF,EAAE;AAAA,MACAA,SAAO;AAAA,QACLA,SAAO,QAAQ,SAAS,CAAC,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EACF,sBAAsB,MACb;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,IACF,EAAE;AAAA,MACAA,SAAO,QAAQA,SAAO,QAAQ,SAAS,CAAC,YAAY,QAAQ,KAAK,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EACF,uBAAuB,MACd;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,IACF,EAAE;AAAA,MACAA,SAAO,QAAQA,SAAO,QAAQ,SAAS,CAAC,YAAY,QAAQ,MAAM,CAAC;AAAA,IACrE;AAAA,EACF;AACJ,CAAC;AAEI,IAAM,WAAW,WAAW;AAAA,EACjCA,SAAO,IAAW,QAAQ,CAAC,WAAW,YAAY,MAAM,CAAC;AAC3D;;;A1BpJA,IAAM,YAAYC,OAAM,OAAO,SAAS;AAAA,EACtCC,SAAO;AAAA,IAAI;AAAA,IAAY,CAAC,eACtB,KAAK,EAAE,QAAQ,WAAW,QAAQ,QAAQ,WAAW,OAAO,CAAC;AAAA,EAC/D;AACF;AAGA,IAAM,aAAaD,OAAM,OAAO,UAAU;AAAA,EACxCC,SAAO;AAAA,IAAI;AAAA,IAAY,CAAC,eACtB,WAAW;AAAA,MACT,WAAW,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,WAAW,MAAM;AAAA,IAClE;AAAA,EACF;AACF;AAEA,IAAM,WAAWD,OAAM;AAAA,EACrBE;AAAA,EACAF,OAAM,QAAQ,YAAYE,MAAe;AAAA,EACzCF,OAAM,QAAQ,WAAWE,MAAe;AAAA,EACxC,gBAAgB;AAAA,EAChBA;AAAA,EACA;AAAA,EACAA;AACF;AAQO,IAAMA,SAAQ,CAAC,YACpBF,OAAM;AAAA,EACJG,WAAU,QAAQ,UAAU,EAAE,KAAKH,OAAM,aAAa,QAAQ,CAAC;AACjE,EAAE;AAAA,EACAA,OAAM;AAAA,IACJG,WAAU,WAAW;AAAA,MACnB,MAAM;AAAA,MACN;AAAA,MACA,cACE;AAAA,MAIF,WAAW,CAAC,YAAY,aAAa,YAAY,WAAW;AAAA,IAC9D,CAAC;AAAA,EACH;AAAA,EACAH,OAAM,QAAQ,UAAU,KAAK;AAAA,EAC7BA,OAAM,QAAQ,QAAQ;AAAA,EACtBA,OAAM,QAAQ,OAAO,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC;AAAA,EACpDA,OAAM,aAAaA,OAAM,QAAQ,OAAO,aAAa,IAAI,CAAC;AAC5D;AAGK,IAAM,SAAS,CAAC,YACrBA,OAAM,OAAOE,OAAM,OAAO,CAAC,EAAE;AAAA,EAC3BD,SAAO,QAAQ,OAAO,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC;AAAA,EACrDA,SAAO,QAAQD,OAAM,QAAQ,OAAO,aAAa,IAAI,CAAC;AACxD;;;AJlEF,YAAYI,WAAS;;;AsCLrB,SAAS,WAAAC,UAAmB,UAAAC,UAAQ,UAAAC,gBAAc;AAClD,YAAY,UAAU;AACtB,YAAYC,YAAU;;;ACUtB,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B;AAAA,EACE,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,OACK;AACP;AAAA,EACE,cAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAA4B;AAC5B,YAAY,gBAAgB;AAC5B,OAAsB;AACtB,YAAYC,WAAS;AAYd,IAAM,gBAAgBC,UAAS,QAAQ,CAAC;AAMxC,IAAM,eAAeC,SAAO,SAAS;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,gBAAN,cAA4BA,SAAO,YAA2B;AAAA,EACnE;AAAA,EACA,EAAE,QAAQ,cAAc,SAASA,SAAO,OAAO;AACjD,EAAE;AAAC;AAGI,IAAM,UAAN,cAAsBC,UAAQ,QAGnC,EAAE,gBAAgB,EAAE;AAAC;AAGhB,IAAM,eAAqCC,OAAM,QAAQ,OAAO,EAAE;AAAA,EACvE,MAAM,CAAC,QACLC,SAAO,WAAW;AAAA,IAChB,KAAK,MAAM,KAAK,GAAG;AAAA,IACnB,OAAO,CAAC,UACN,IAAI,WAAW;AAAA,MACb,SAAS,6BAA6B,GAAG,KAAKC,SAAQ,KAAK,CAAC;AAAA,MAC5D,UAAU;AAAA,IACZ,CAAC;AAAA,EACL,CAAC,EAAE,KAAKD,SAAO,MAAM;AACzB,CAAC;AAGM,IAAM,WAAN,cAAuBF,UAAQ,QAapC,EAAE,iBAAiB,EAAE;AAAC;AAExB,IAAM,cAAc,MAAMI,qBAAoBL,SAAO;AAAA,EACnD;AACF,EAAE,EAAE,OAAOA,SAAO,eAAe,CAAC,EAAE;AAAC;AAErC,IAAM,cAAc,MAAMM,qBAAoBN,SAAO;AAAA,EACnD;AACF,EAAE,EAAE,MAAM,YAAY,CAAC,EAAE;AAAC;AAE1B,IAAM,gBAAgB,CAAC,QAAgB,UACrC,IAAI,WAAW;AAAA,EACb,SAAS,8BAA8B,MAAM,KAAKI,SAAQ,MAAM,OAAO,CAAC;AAAA,EACxE,UAAU;AACZ,CAAC;AAQI,IAAM,cAAc,CACzB,QACA,UAEAD,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAOI,YAAW;AACjC,QAAM,WAAW,OAAO,OACrB,IAAI,GAAG,MAAM,yBAAyB;AAAA,IACrC,SAAS,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,EAC9C,CAAC,EACA,KAAKJ,SAAO,SAAS,CAAC,UAAU,cAAc,QAAQ,KAAK,CAAC,CAAC;AAChE,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,SAAS,OAAO,SAAS,KAAK,KAAKA,SAAO,cAAc,MAAM,EAAE,CAAC;AACvE,WAAO,OAAOK;AAAA,MACZ,kCAAkC,SAAS,MAAM,IAAI,SAAS,KAAKJ,SAAQ,MAAM,CAAC,KAAK,EAAE;AAAA,IAC3F;AAAA,EACF;AACA,QAAM,OAAO,OAAOK,oBAAmB,eAAe,WAAW;AAAA,IAC/D;AAAA,EACF,EAAE,KAAKN,SAAO,SAAS,CAAC,UAAU,cAAc,QAAQ,KAAK,CAAC,CAAC;AAC/D,SAAO,KAAK,KAAK;AACnB,CAAC;AAII,IAAM,gBAAgB,CAC3B,QACA,UAEAA,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAOI,YAAW;AACjC,QAAM,WAAW,OAAO,OACrB;AAAA,IACCG,mBAAkB,KAAK,GAAG,MAAM,oBAAoB,EAAE;AAAA,MACpDA,mBAAkB,YAAY,KAAK;AAAA,MACnCA,mBAAkB,eAAe,CAAC,CAAC;AAAA,IACrC;AAAA,EACF,EACC;AAAA,IACCP,SAAO;AAAA,MACL,CAAC,UACC,IAAI,WAAW;AAAA,QACb,SAAS,gBAAgB,MAAM,iBAAiBC,SAAQ,MAAM,OAAO,CAAC;AAAA,QACtE,UAAU;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACF;AACF,MAAI,SAAS,WAAW,OAAO,SAAS,WAAW,IAAK;AACxD,QAAM,SAAS,OAAO,SAAS,KAAK,KAAKD,SAAO,cAAc,MAAM,EAAE,CAAC;AACvE,SAAO,OAAOK;AAAA,IACZ,iCAAiC,SAAS,MAAM,IAAI,SAAS,KAAKJ,SAAQ,MAAM,CAAC,KAAK,EAAE;AAAA,EAC1F;AACF,CAAC;AAGI,IAAM,gBAITF,OAAM,OAAO,QAAQ;AAAA,EACvBC,SAAO,IAAII,YAAW,YAAY,CAAC,YAAY;AAAA,IAC7C,UAAU,CAAC,QAAQ,UACjB,YAAY,QAAQ,KAAK,EAAE;AAAA,MACzBJ,SAAO,eAAeI,YAAW,YAAY,MAAM;AAAA,IACrD;AAAA,IACF,QAAQ,CAAC,QAAQ,UACf,cAAc,QAAQ,KAAK,EAAE;AAAA,MAC3BJ,SAAO,eAAeI,YAAW,YAAY,MAAM;AAAA,IACrD;AAAA,EACJ,EAAE;AACJ;AAQA,IAAM,UAAU,CACd,WAEAI,SAAO,cAAc,OAAO,OAAO,CAAC,EAAE;AAAA,EACpCA,SAAO;AAAA,IAAQ,CAACC,WACdC,WAAU,SAASD,MAAK,IAAID,SAAO,KAAKC,MAAK,IAAID,SAAO,KAAK;AAAA,EAC/D;AAAA,EACAA,SAAO,OAAW,gBAAU;AAC9B;AAEF,IAAM,aAAa,CAAC,WAClB,WAAW;AAAA,EACT;AAAA,EACA;AAAA,EACAR,SAAO,IAAI,aAAa;AACtB,UAAM,SAAS,OAAO,kBAAkB;AACxC,WAAO,OAAOQ,SAAO,MAAM,QAAQ,MAAM,GAAG;AAAA,MAC1C,QAAQ,MACNR,SAAO;AAAA,QACL,mBAAmB,KAAK,kBAAkB,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3D;AAAA,MACF,QAAQ,CAAC,UACPA,SAAO,IAAI,aAAa;AACtB,eAAO,SAAS,QAAQ,QAAQ,KAAK;AACrC,eAAO,mBAAmB;AAAA,UACxB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACL,CAAC;AAAA,EACH,CAAC;AACH;AAEF,IAAM,kBAAkB,CAAC,YACvB,IAAI,cAAc,EAAE,QAAQ,YAAY,QAAQ,CAAC;AAEnD,IAAM,SAAS,CACb,YAEW,yBAAc,OAAO,IAC5BA,SAAO,QAAQ,QAAQ,IAAI,IAC3BA,SAAO;AAAA,EACL,gBAAgB,4CAA4C;AAC9D;AAKN,IAAM,eAAe,CAAC,QACpB,WAAW,GAAG;AAAA;AAWT,IAAM,aAAa,CAAC,YAKzBA,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAO,SAAS,KAAa;AAC5C,QAAM,MAAM,WAAW;AAAA,IACrBD,OAAM;AAAA,MACJ,WAAW,MAAM;AAAA,MACjB,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,mBAAmB,KAAK,kBAAkB,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,IACA;AAAA,MACE,eAAe;AAAA,MACf,kBAAkB;AAAA,IACpB;AAAA,EACF,EAAE;AAAA,IACAA,OAAM;AAAA,MACJ,eAAe,MAAM,cAAc,EAAE,MAAM,aAAa,MAAM,EAAE,CAAC;AAAA,IACnE;AAAA,EACF;AACA,SAAO,OAAOC,SAAO,IAAI,aAAa;AACpC,UAAM,SAAS,OAAO,WAAW;AACjC,UAAM,OAAO,OAAO,OAAO,OAAO,OAAO;AACzC,UAAM,UAAU,OAAO;AACvB,UAAM,WAAW,GAAG,QAAQ,SAAS,mBAAmB,IAAI;AAG5D,WAAOQ,SAAO,MAAMA,SAAO,cAAc,QAAQ,UAAU,GAAG;AAAA,MAC5D,QAAQ,MAAMG,SAAQ,IAAI,aAAa,QAAQ,CAAC;AAAA,MAChD,QAAQ,CAAC,WAAW,OAAO,QAAQ;AAAA,IACrC,CAAC;AACD,WAAO,QAAQ,KAAK,QAAQ,EAAE;AAAA,MAC5BX,SAAO;AAAA,QACL,CAACY,aACC,IAAI,cAAc;AAAA,UAChB,QAAQ;AAAA,UACR,SAASA,SAAQ;AAAA,QACnB,CAAC;AAAA,MACL;AAAA,IACF;AACA,WAAO,EAAE,OAAO,OAAO,SAAS,MAAM,MAAM,GAAG,KAAK;AAAA,EACtD,CAAC,EAAE;AAAA,IACDZ,SAAO,cAAc;AAAA,MACnB,UAAU,QAAQ,WAAW;AAAA,MAC7B,QAAQ,MACNA,SAAO;AAAA,QACL,IAAI,cAAc;AAAA,UAChB,QAAQ;AAAA,UACR,SACE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACJ,CAAC;AAAA,IACDA,SAAO,QAAQ,GAAG;AAAA,IAClBA,SAAO;AAAA,MAAS;AAAA,MAAc,CAAC,UAC7BA,SAAO;AAAA,QACL;AAAA,UACE,oCAAoCC,SAAQ,MAAM,OAAO,CAAC;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAEH,IAAM,kBACJ,CAAC,WACD,CAACW,aACC,IAAI,cAAc,EAAE,QAAQ,SAASA,SAAQ,QAAQ,CAAC;AASnD,IAAM,kBAAkB,CAC7B,QACA,UAMAZ,SAAO,IAAI,aAAa;AACtB,QAAM,WAAW,OAAO;AACxB,QAAM,QAAQ,OAAO,SAClB,SAAS,QAAQ,KAAK,EACtB,KAAKA,SAAO,SAAS,gBAAgB,UAAU,CAAC,CAAC;AACpD,SAAO,OAAO,gBAAgB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC,EAAE,KAAKA,SAAO,SAAS,gBAAgB,SAAS,CAAC,CAAC;AACrD,CAAC;AAQI,IAAM,SAAS,CAAC,YAUrBA,SAAO,IAAI,aAAa;AACtB,QAAM,EAAE,MAAM,IAAI,OAAO,WAAW,OAAO;AAC3C,SAAO,OAAO,gBAAgB,QAAQ,QAAQ,KAAK;AACrD,CAAC;;;ACjYH;AAAA,EACE,SAAAa;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAAC,aAAY,qBAAAC,oBAAmB,sBAAAC,2BAA0B;AAClE,YAAYC,cAAY;AACxB,YAAY,WAAW;AA8BhB,IAAM,oBAAoB;AAG1B,IAAM,eAAe;AAG5B,IAAM,uBAAuBC,UAAS,QAAQ,EAAE;AAChD,IAAM,uBAAuBA,UAAS,QAAQ,CAAC;AAG/C,IAAM,mBAAmBA,UAAS,QAAQ,CAAC;AAM3C,IAAM,YAAY,CAAC,QAAgB,aACjC,GAAG,MAAM,oBAAoB,QAAQ;AAGhC,IAAM,aAAN,cAAgC,eAAkB,YAAY,EAAE;AAAA,EACrE,aAAoB;AAAA,EACpB,WAAkB;AAAA,EAClB,kBAAyB;AAAA,EACzB,2BAAkC,+BAA6B,eAAM;AAAA,EACrE,YAAmB,aAAI;AAAA,IACd;AAAA,MACLC,SAAO,QAAQD,UAAS,UAAU,oBAAoB,CAAC;AAAA,IACzD;AAAA,IACO;AAAA,MACLC,SAAO,QAAQD,UAAS,UAAU,oBAAoB,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EACA,UAAiB,aAAI;AAAA,IACZ;AAAA,MACLC,SAAO,QAAQD,UAAS,UAAU,oBAAoB,CAAC;AAAA,IACzD;AAAA,IACO;AAAA,MACLC,SAAO,QAAQD,UAAS,UAAU,oBAAoB,CAAC;AAAA,IACzD;AAAA,EACF;AACF,CAAC,EAAE;AAAC;AAMG,IAAM,cAAN,cAAiC,eAAmB,aAAa,EAAE;AAAA,EACxE,cAAqB,+BAA6B,eAAM;AAAA,EACxD,OAAc,+BAA6B,eAAM;AAAA,EACjD,mBAA0B,+BAA6B,eAAM;AAC/D,CAAC,EAAE;AAAC;AASJ,IAAM,YAAY;AAElB,IAAM,uBAAuB,MAC3B,IAAI,WAAW;AAAA,EACb,SAAS,yDAAoD,SAAS;AAAA,EACtE,UAAU;AACZ,CAAC;AAEH,IAAM,mBAAmB,CACvB,QACA,UAEA,IAAI,WAAW;AAAA,EACb,SAAS,mCAAmC,MAAM,KAAKE,SAAQ,MAAM,OAAO,CAAC;AAAA,EAC7E,UAAU;AACZ,CAAC;AAEH,IAAM,WAAW,CAAC,gBAChBC,SAAO,MAAM,aAAa;AAAA,EACxB,QAAQ,MAAM;AAAA,EACd,QAAQ,CAACC,WAAU,KAAKF,SAAQE,MAAK,CAAC;AACxC,CAAC;AAGH,IAAM,aAAa,CACjB,OACA,gBAEAC,OAAM,MAAM,KAAK,EAAE;AAAA,EACjBA,OAAM,KAAK,iBAAiB,oBAAoB;AAAA,EAChDA,OAAM;AAAA,IACJ;AAAA,IACA,MACE,IAAI,WAAW;AAAA,MACb,SAAS,gDAA2C,SAAS;AAAA,MAC7D,UAAU;AAAA,IACZ,CAAC;AAAA,EACL;AAAA,EACAA,OAAM;AAAA,IACJ;AAAA,IACA,MACE,IAAI,WAAW;AAAA,MACb,SAAS,6CAAwC,SAAS;AAAA,MAC1D,UAAU;AAAA,IACZ,CAAC;AAAA,EACL;AAAA,EACAA,OAAM;AAAA,IACJ,CAAC,UACC,IAAI,WAAW;AAAA,MACb,SAAS,8BAA8B,KAAK,IAAI,SAAS,WAAW,CAAC;AAAA,MACrE,UAAU;AAAA,IACZ,CAAC;AAAA,EACL;AACF;AAEF,IAAMC,WAAU,CAAC,WAAmC;AAAA,EAClD,MAAM;AAAA,EACN,SAAS;AACX;AAGA,IAAM,YAAY,CAAC,SACjBH,SAAO,MAAM,KAAK,cAAc;AAAA,EAC9B,QAAQ,CAAC,UAAUF,SAAO,QAAoB,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,EACxE,QAAQ,MACNI,OAAM,MAAMF,SAAO,UAAU,KAAK,OAAO,MAAM,eAAe,CAAC,EAAE;AAAA,IAC/DE,OAAM;AAAA,MAAK;AAAA,MAAyB,MAClCJ,SAAO,QAAoB,EAAE,MAAM,UAAU,CAAC;AAAA,IAChD;AAAA,IACAI,OAAM;AAAA,MAAK;AAAA,MAAa,MACtBJ,SAAO,QAAoB,EAAE,MAAM,WAAW,CAAC;AAAA,IACjD;AAAA,IACAI,OAAM;AAAA,MAAO,CAAC,UACZJ,SAAO,KAAK,WAAW,OAAO,KAAK,iBAAiB,CAAC;AAAA,IACvD;AAAA,EACF;AACJ,CAAC;AAMI,IAAM,oBAAoB,CAC/B,QACA,aAEAA,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAOM,YAAW;AACjC,QAAMC,WAAU,OAAOC,mBAAkB;AAAA,IACvC,UAAU,QAAQ,MAAM;AAAA,EAC1B,EAAE;AAAA,IACAA,mBAAkB,SAAS;AAAA,MACzB,WAAW;AAAA,MACX,OAAO;AAAA,IACT,CAAC;AAAA,IACDR,SAAO,SAAS,CAAC,UAAU,iBAAiB,QAAQ,KAAK,CAAC;AAAA,EAC5D;AACA,QAAM,WAAW,OAAO,OACrB,QAAQO,QAAO,EACf,KAAKP,SAAO,SAAS,CAAC,UAAU,iBAAiB,QAAQ,KAAK,CAAC,CAAC;AACnE,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,SAAS,OAAO,SAAS,KAAK,KAAKA,SAAO,cAAc,MAAM,EAAE,CAAC;AACvE,WAAO,OAAOS;AAAA,MACZ,0CAA0C,SAAS,MAAM,IAAI,SAAS,KAAKR,SAAQ,MAAM,CAAC,KAAK,EAAE,WAAM,SAAS;AAAA,IAClH;AAAA,EACF;AACA,SAAO,OAAOS,oBAAmB,eAAe,UAAU,EAAE,QAAQ,EAAE;AAAA,IACpEV,SAAO;AAAA,MACL,CAAC,UACC,IAAI,WAAW;AAAA,QACb,SAAS,kCAAkC,MAAM,KAAKC,SAAQ,MAAM,OAAO,CAAC;AAAA,QAC5E,UAAU;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACF;AACF,CAAC;AAGH,IAAM,kBAAkB,CACtB,QACA,UACA,eAEAD,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAOM,YAAW;AACjC,QAAM,WAAW,OAAO,OACrB;AAAA,IACCE,mBAAkB,KAAK,UAAU,QAAQ,OAAO,CAAC,EAAE;AAAA;AAAA,MAEjDA,mBAAkB,eAAe;AAAA,QAC/B,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF,EACC,KAAKR,SAAO,SAAS,CAAC,UAAU,iBAAiB,QAAQ,KAAK,CAAC,CAAC;AACnE,QAAM,OAAO,OAAOU,oBAAmB,eAAe,WAAW;AAAA,IAC/D;AAAA,EACF,EAAE;AAAA,IACAV,SAAO;AAAA,MACL,MACE,IAAI,WAAW;AAAA,QACb,SAAS,sBAAsB,MAAM;AAAA,QACrC,UAAU;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACF;AACA,SAAO,OAAO,UAAU,IAAI;AAC9B,CAAC,EAAE;AAAA;AAAA;AAAA,EAGDA,SAAO,MAAM,CAAC,UAAUA,SAAO,QAAQK,SAAQ,KAAK,CAAC,CAAC;AACxD;AAOK,IAAM,qBAAqB,CAChC,UAEA,SAAS;AAAA,EACPL,SAAO;AAAA,IACL,IAAI,KAAK,KAAK;AAAA,IACd,CAAC,aAAa,CAAC,aACbI,OAAM,MAAM,SAAS,KAAK,EAAE;AAAA,MAC1BA,OAAM,IAAI,WAAW,MAAMO,OAAM,KAAK,SAAS,KAAK,CAAC;AAAA,MACrDP,OAAM,IAAI,WAAW,MAAMO,OAAM,KAAK,SAAS,KAAK,CAAC;AAAA,MACrDP,OAAM;AAAA,QAAI;AAAA,QAAW,MACnB,IAAI,IAAI,QAAQ,EAAE;AAAA,UAChBJ,SAAO,IAAI,CAAC,UAAgB,WAAK,SAAS,OAAO,KAAK,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,MACAI,OAAM;AAAA,QAAI;AAAA,QAAY,MACpB,IAAI;AAAA,UAAa;AAAA,UAAU,CAAC,UAC1BL,UAAS;AAAA,YACPA,UAAS,SAAS,KAAK,IAAIA,UAAS,SAAS,gBAAgB;AAAA,UAC/D;AAAA,QACF,EAAE,KAAKC,SAAO,IAAI,CAAC,UAAgB,WAAK,SAAS,OAAO,KAAK,CAAC,CAAC;AAAA,MACjE;AAAA,MACAI,OAAM;AAAA,IACR;AAAA,EACJ;AACF;AAWK,IAAM,cAAc,CAAC,YAK1BJ,SAAO,IAAI,aAAa;AACtB,QAAM,OAAO,OAAO,kBAAkB,QAAQ,QAAQ,QAAQ,QAAQ;AACtE,QAAM,eAAeE,SAAO;AAAA,IAC1B,KAAK;AAAA,IACL,MAAM,KAAK;AAAA,EACb;AAEA,SAAOU,SAAQ;AAAA,IACb,cAAc,YAAY;AAAA,uBAA0B,KAAK,SAAS;AAAA,EACpE;AACA,QAAM,UAAU,OAAO;AACvB,SAAO,QAAQ,KAAK,YAAY;AAChC,QAAM,WAAWb,UAAS,QAAQ,KAAK,QAAQ;AAC/C,QAAM,OAAO;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAGA,QAAM,iBAAiB,OAAO,IAAI,KAAK,IAAI;AAC3C,QAAM,UAAU,OAAOC,SAAO;AAAA,IAAQ,MACpCA,SAAO;AAAA,MAAQ,IAAI,UAAU,gBAAgB,KAAK;AAAA,MAAG,CAAC,YACpD,UAAUA,SAAO,MAAM,MAAM,QAAQ,IAAI;AAAA,IAC3C;AAAA,EACF,EAAE;AAAA,IACAA,SAAO,OAAO,mBAAmB,QAAQ,CAAC;AAAA,IAC1CA,SAAO,cAAc;AAAA,MACnB,UAAU,QAAQ,WAAWD,UAAS,QAAQ,KAAK,UAAU;AAAA,MAC7D,QAAQ,MAAMC,SAAO,KAAK,qBAAqB,CAAC;AAAA,IAClD,CAAC;AAAA,EACH;AACA,SAAO,OAAOI,OAAM,MAAM,OAAO,EAAE;AAAA,IACjCA,OAAM,IAAI,WAAW,CAAC,YAAYJ,SAAO,QAAQ,QAAQ,KAAK,CAAC;AAAA,IAC/DI,OAAM,IAAI,WAAW,CAAC,YAAYJ,SAAO,KAAK,QAAQ,OAAO,CAAC;AAAA,IAC9DI,OAAM,OAAO,MAAMJ,SAAO,KAAK,qBAAqB,CAAC,CAAC;AAAA,EACxD;AACF,CAAC;;;ACpVH,SAAS,UAAAa,UAAQ,UAAAC,gBAAc;AAC/B,YAAYC,WAAS;AACrB,YAAYC,kBAAgB;AAC5B,SAAS,cAAAC,cAAY,qBAAAC,oBAAmB,sBAAAC,2BAA0B;AAClE,YAAYC,YAAU;AACtB,YAAYC,cAAY;AAwBxB,IAAM,UAAN,cAA6B,eAAe,SAAS,EAAE;AAAA,EACrD,IAAW;AAAA,EACX,MAAa;AAAA,EACb,cAAqB;AACvB,CAAC,EAAE;AAAC;AAGG,IAAM,eAAN,cAAkC,eAAoB,cAAc,EAAE;AAAA,EAC3E,IAAW;AAAA,EACX,eAAsB;AAAA,EACtB,UAAiB;AACnB,CAAC,EAAE;AAAC;AAEJ,IAAM,YAAN,cAA+B,eAAiB,WAAW,EAAE;AAAA,EAC3D,SAAgB;AAClB,CAAC,EAAE;AAAC;AAGJ,IAAMC,aAAN,cAA+B,eAAiB,WAAW,EAAE;AAAA,EAC3D,MAAM;AACR,CAAC,EAAE;AAAC;AAEJ,IAAM,eAAsB;AAAA,EACnB,wBAAeA,UAAS;AACjC;AAEA,IAAM,iBACJ,CAAC,QAAgB,WACjB,CAAC,UACC,IAAI,WAAW;AAAA,EACb,SAAS,GAAG,MAAM,IAAI,MAAM,KAAKC,SAAQ,MAAM,OAAO,CAAC;AAAA,EACvD,UAAU;AACZ,CAAC;AAEL,IAAM,eAAe,CAAC,SACpBC,SAAO,MAAM,aAAa,IAAI,GAAG;AAAA,EAC/B,QAAQ,MAAM;AAAA,EACd,QAAQ,CAAC,SAAS,KAAK,KAAK;AAC9B,CAAC;AAEH,IAAM,gBAAgB,CACpB,QACA,QACA,SAEA,IAAI,WAAW;AAAA,EACb,SACE,GAAG,MAAM,YAAY,MAAM,IAAI,OAAO,KAAKD,SAAQ,aAAa,IAAI,CAAC,CAAC,KAAK,EAAE,MAC5E,WAAW,OAAO,WAAW,MAC1B,wDACA;AAAA,EACN,UAAU;AACZ,CAAC;AAEH,IAAM,gBAAgB,CACpB,QACA,WAEAE,SAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAOC,aAAW;AACjC,QAAM,WAAW,OAAO,OACrB,IAAI,GAAG,MAAM,aAAa;AAAA,IACzB,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG;AAAA,EAC/C,CAAC,EACA,KAAKD,SAAO,SAAS,eAAe,2BAA2B,MAAM,CAAC,CAAC;AAC1E,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,OAAO,OAAO,SAAS,KAAK,KAAKA,SAAO,cAAc,MAAM,EAAE,CAAC;AACrE,WAAO,OAAOA,SAAO;AAAA,MACnB,cAAc,oBAAoB,SAAS,QAAQ,IAAI;AAAA,IACzD;AAAA,EACF;AACA,SAAO,OAAOE,oBAAmB,eAAsB,eAAM,OAAO,CAAC;AAAA,IACnE;AAAA,EACF,EAAE;AAAA,IACAF,SAAO,SAAS,eAAe,6BAA6B,MAAM,CAAC;AAAA,EACrE;AACF,CAAC;AAOI,IAAM,iBAAiB,CAAC,YAS7BA,SAAO,IAAI,aAAa;AACtB,QAAM,cAAc,OAAO;AAC3B,QAAM,UAAU,mBAAmB,QAAQ,MAAM,WAAW;AAC5D,MAAID,SAAO,OAAO,OAAO,EAAG,QAAO,QAAQ;AAC3C,QAAM,WAAW,OAAO,gBAAgB;AACxC,MAAIA,SAAO,OAAO,SAAS,OAAO,GAAG;AACnC,WAAO,OAAOI;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,WAAW,OAAO,cAAc,QAAQ,QAAQ,QAAQ,MAAM;AACpE,QAAMC,WAAc;AAAA,IAClB;AAAA,IACA,CAAC,YACC,QAAQ,SAAS,QACjBL,SAAO,MAAM,SAAS,SAAS;AAAA,MAC7B,QAAQ,MAAM;AAAA,MACd,QAAQ,CAAC,YAAY,QAAQ,iBAAiB;AAAA,IAChD,CAAC;AAAA,EACL;AACA,SAAO,OAAW,YAAMK,UAAS;AAAA,IAC/B,SAAS,MACPD;AAAA,MACE,qBAAqB,IAAI,QAAQ,QAAQ,MAAM;AAAA,MAC/C;AAAA,IACF;AAAA,IACF,YAAY,CAAC,UACX,MAAM,SAAS,IACXA;AAAA,MACE,mCAAmC,IAAI;AAAA,MACvC;AAAA,IACF,IACAH,SAAO,QAAQ,MAAM,CAAC,EAAE,EAAE;AAAA,EAClC,CAAC;AACH,CAAC;AAIH,IAAM,YAAY,CAChB,SACA,MACA,UACa;AACb,QAAM,OAAO,IAAI,SAAS;AAC1B,OAAK,OAAO,QAAQ,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC;AAC5D,OAAK,OAAO,QAAQ,QAAQ,IAAI;AAChC,OAAK,OAAO,YAAY,QAAQ,WAAW,SAAS,OAAO;AAC3D,SAAO;AACT;AAOO,IAAM,SAAS,CACpB,YAMAA,SAAO,IAAI,aAAa;AACtB,QAAM,KAAK,OAAkB;AAC7B,QAAM,QAAQ,OAAY;AAC1B,QAAM,QAAQ,OAAO,GAClB,SAAS,QAAQ,IAAI,EACrB,KAAKA,SAAO,SAAS,eAAe,eAAe,QAAQ,IAAI,CAAC,CAAC;AACpE,QAAM,OAAO,MAAM,SAAS,QAAQ,IAAI;AACxC,QAAM,OAAO,UAAU,SAAS,MAAM,KAAK;AAC3C,QAAM,SAAS,OAAOC,aAAW;AACjC,QAAMI,WAAUC,mBAAkB;AAAA,IAChC,GAAG,QAAQ,MAAM;AAAA,EACnB,EAAE;AAAA,IACAA,mBAAkB,YAAY,QAAQ,MAAM;AAAA,IAC5CA,mBAAkB,UAAU,gBAAgB,QAAQ,SAAS;AAAA,IAC7DA,mBAAkB,aAAa,IAAI;AAAA,EACrC;AACA,QAAM,WAAW,OAAO,OACrB,QAAQD,QAAO,EACf,KAAKL,SAAO,SAAS,eAAe,gBAAgB,QAAQ,MAAM,CAAC,CAAC;AACvE,MAAI,SAAS,SAAS,OAAO,SAAS,UAAU,KAAK;AACnD,UAAM,OAAO,OAAO,SAAS,KAAK,KAAKA,SAAO,cAAc,MAAM,EAAE,CAAC;AACrE,WAAO,OAAOA,SAAO;AAAA,MACnB,cAAc,gBAAgB,SAAS,QAAQ,IAAI;AAAA,IACrD;AAAA,EACF;AACA,SAAO,OAAOE,oBAAmB,eAAe,YAAY;AAAA,IAC1D;AAAA,EACF,EAAE;AAAA,IACAF,SAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AHxLI,IAAM,iBAAiB;AAE9B,IAAM,OAAO,CAACO,WACZC,SAAO,UAAUD,QAAO,MAAM,GAAG;AASnC,IAAM,gBAAgB,CAAC,QAAgB,aACrC;AAAA,EACE;AAAA,EACA,aAAa,SAAS,MAAM;AAAA,EAC5B,aAAa,KAAK,SAAS,KAAK,CAAC;AAAA,EACjC,aAAa,SAAS,IAAI;AAAA,EAC1B,aAAa,KAAK,SAAS,KAAK,CAAC;AACnC,EAAE,KAAK,IAAI;AAEb,IAAM,gBAAgB,CACpB,QACA,aACwBE,SAAQ,IAAI,cAAc,QAAQ,QAAQ,CAAC;AAErE,IAAM,aAAa,CAAC,aAAsB;AAAA,EACxC,GAAG;AAAA,EACH,OAAOD,SAAO,KAAK,QAAQ,KAAK;AAClC;AAGA,IAAM,eAAe,CAACE,aACpB,IAAI,WAAW,EAAE,SAASA,SAAQ,SAAS,UAAU,aAAa,CAAC;AAGrE,IAAM,gBAAgBC,SAAO,GAAG,aAAa,EAAE,WAAW,SAAkB;AAC1E,SAAO,cAAc,gBAAgB,QAAQ,KAAK,IAAI,WAAW,OAAO,CAAC;AAC3E,CAAC;AAOM,IAAM,QAAQA,SAAO,GAAG,OAAO,EAAE,WAAW,SAIhD;AACD,QAAM,UAAU,OAAO,OAAO,OAAO,EAAE,KAAKA,SAAO,SAAS,YAAY,CAAC;AACzE,SAAO,cAAc,OAAO;AAC9B,CAAC;AAUM,IAAM,oBAAoB,CAC/B,UACA,WAEAH,SAAO,cAAc,SAAS,KAAK,CAAC,YAAY,QAAQ,WAAW,MAAM,CAAC;AAMrE,IAAM,iBAAiB,CAC5B,OAIA,WAEAA,SAAO,OAAO,MAAM,IAChB,kBAAkB,MAAM,UAAU,OAAO,KAAK,IAC9CA,SAAO;AAAA,EACLA,SAAO;AAAA,IAAQ,MAAM;AAAA,IAAS,CAAC,YAC7BA,SAAO;AAAA,MACL,MAAM,SAAS;AAAA,QACb,CAAC,YACC,WAAW,QAAQ,QAAQ,QAAQ,KAAK,MAAM;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAMA,SAAO,cAAc,MAAM,SAAS,CAAC,CAAC;AAC9C;AAQC,IAAM,eAAe,CAAC,YAS3BG,SAAO,IAAI,aAAa;AACtB,QAAM,cAAc,OAAO;AAC3B,QAAM,SAAS,CAACC,SACd,YAAYA,IAAG,EAAE,KAAKD,SAAO,cAAc,MAAMH,SAAO,KAAa,CAAC,CAAC;AAGzE,QAAM,SAAS;AAAA,IACb,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,OAAO,QAAQ;AAAA,EACxB;AACA,QAAM,YAAY;AAAA,IAChB,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,OAAO,WAAW;AAAA,EAC3B;AAEA,OAAK,QAAQ,UAAU,eAAe,WAAW;AAC/C,UAAM,SAAS,OAAO,WAAW;AAGjC,UAAM,UAAU,eAAe,QAAQ,QAAQ,MAAM;AACrD,QAAIA,SAAO,OAAO,OAAO;AACvB,aAAO,OAAOK;AAAA,QACZ,kCAAkC,MAAM;AAAA,QACxC;AAAA,MACF;AACF,UAAMN,SAAQ,QAAQ;AACtB,WAAO,WAAWA,OAAM,KAAK;AAC7B,WAAO,cAAc,mCAAmCA,OAAM,KAAK,IAAI;AAAA,MACrE,QAAQA,OAAM;AAAA,MACd,OAAOC,SAAO,KAAKD,OAAM,KAAK;AAAA,MAC9B,MAAMA,OAAM;AAAA,MACZ,OAAOA,OAAM;AAAA,IACf,CAAC;AACD;AAAA,EACF;AAEA,OAAK,QAAQ,UAAU,eAAe,OAAO;AAC3C,UAAMK,OAAMJ,SAAO;AAAA,MAAO,QAAQ,UAAUA,SAAO,KAAK;AAAA,MAAG,MACzDA,SAAO,cAAc,YAAY,OAAO,gBAAgB,CAAC;AAAA,IAC3D;AACA,QAAIA,SAAO,OAAOI,IAAG;AACnB,aAAO,OAAOC;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AACF,WAAO,OAAO,OAAO;AAAA,MACnB;AAAA,MACA,KAAKD,KAAI;AAAA,MACT,OAAO,QAAQ,SAASJ,SAAO,KAAK;AAAA,MACpC,OAAOA,SAAO,KAAK;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,SAAY,WAAM,QAAQ,QAAQ;AAAA,IAChC,SAAS,MAAM,MAAM,EAAE,QAAQ,UAAU,CAAC;AAAA,IAC1C,QAAQ,MACNG,SAAO;AAAA,MACL,YAAY;AAAA,QACV;AAAA,QACA,UAAU,gBAAgB,QAAQ,UAAU,WAAW;AAAA,MACzD,CAAC;AAAA,MACD,CAAC,UACC,gBAAgB,QAAQ,KAAK,EAAE;AAAA,QAC7BA,SAAO,SAAS,YAAY;AAAA,QAC5BA,SAAO,QAAQ,aAAa;AAAA,MAC9B;AAAA,IACJ;AAAA,EACJ,CAAC;AACH,CAAC;AAUI,IAAMG,QAAOH,SAAO,GAAG,MAAM,EAAE,WAAW,SAK9C;AACD,QAAM,aAAa,OAAO,kBAAkB;AAAA,IAC1C,QAAQH,SAAO,KAAK;AAAA,IACpB,OAAOA,SAAO,KAAK;AAAA,EACrB,CAAC;AACD,MAAIA,SAAO,OAAO,UAAU,GAAG;AAC7B,WAAO,OAAOK;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAMN,SAAQ,WAAW;AACzB,QAAM,QAAQ,OAAY;AAC1B,QAAM,OAAOC,SAAO;AAAA,IAAU,QAAQ;AAAA,IAAM,MAC1C,MAAM,SAAS,QAAQ,IAAI;AAAA,EAC7B;AACA,QAAM,YAAY,OAAO,eAAe;AAAA,IACtC,QAAQD,OAAM;AAAA,IACd,QAAQA,OAAM;AAAA,IACd,MAAM,QAAQ;AAAA,EAChB,CAAC;AACD,QAAM,SAAS,OAAO,OAAO;AAAA,IAC3B,QAAQA,OAAM;AAAA,IACd,QAAQA,OAAM;AAAA,IACd;AAAA,IACA;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,MAAM,QAAQ;AAAA,EAChB,CAAC;AACD,SAAOE,SAAQ;AAAA,IACb,UAAU,IAAI,WAAM,OAAO,QAAQ,kBAAkB,OAAO,aAAa;AAAA,EAC3E;AACF,CAAC;AAGM,IAAM,SAASE,SAAO,GAAG,QAAQ,EAAE,aAAa;AACrD,QAAM,aAAa,OAAO,kBAAkB;AAAA,IAC1C,QAAQH,SAAO,KAAK;AAAA,IACpB,OAAOA,SAAO,KAAK;AAAA,EACrB,CAAC;AACD,MAAIA,SAAO,OAAO,UAAU,GAAG;AAC7B,WAAO,OAAOK;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAMN,SAAQ,WAAW;AACzB,QAAM,SAASC,SAAO,MAAMD,OAAM,OAAO;AAAA,IACvC,QAAQ,MAAM;AAAA,IACd,QAAQ,CAAC,UAAU,gBAAgB,KAAK;AAAA,EAC1C,CAAC;AACD,SAAO,cAAc,QAAQA,MAAK;AACpC,CAAC;AAGM,IAAM,SAASI,SAAO,GAAG,QAAQ,EAAE,WAAW,SAKlD;AACD,MAAI,CAAC,QAAQ,IAAI,WAAW,cAAc,GAAG;AAC3C,WAAO,OAAOE;AAAA,MACZ,2CAA2C,cAAc;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQL,SAAO,OAAO,QAAQ,KAAK,IACrC,QAAQ,MAAM,QACd,OAAOG,SAAO;AAAA,IAAQ;AAAA,IAAU,CAAC,aAC/B,SAAS,SAAS,QAAQ,QAAQ,QAAQ,GAAG;AAAA,EAC/C,EAAE;AAAA,IACAA,SAAO;AAAA,MACL,CAACD,aACC,IAAI,WAAW;AAAA,QACb,SAAS,kDAAkDA,SAAQ,OAAO;AAAA,QAC1E,UAAU;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACF;AACJ,QAAM,UAAU,OAAO;AAAA,IACrB;AAAA,MACE,QAAQ,QAAQ;AAAA,MAChB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,QAAQ;AAAA,EACV;AACA,SAAO;AAAA,IACL,0BAA0B,QAAQ,KAAK;AAAA,IACvC,WAAW,OAAO;AAAA,EACpB;AACF,CAAC;AAGM,IAAM,aAAaC,SAAO,GAAG,YAAY,EAAE,aAAa;AAC7D,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,EAAE,SAAS,QAAQ,IAAI,OAAO,gBAAgB;AACpD,QAAM,QAAQ;AAAA,IACZ,YAAY,IAAI;AAAA,IAChB,YAAYH,SAAO,UAAU,OAAO,SAAS,MAAM,QAAQ,CAAC;AAAA,IAC5D,YAAYA,SAAO,UAAU,SAAS,MAAM,SAAS,CAAC;AAAA,IACtD,YAAYA,SAAO,UAAU,SAAS,MAAM,SAAS,CAAC;AAAA,IACtD,aAAa,OAAO,SAAS,MAAM;AAAA,IACnC,GAAG,OAAO,SAAS;AAAA,MACjB,CAAC,YACC,KAAK,WAAW,QAAQ,QAAQ,QAAQ,KAAK,CAAC,KAAK,QAAQ,IAAI,KAC/DA,SAAO,MAAM,QAAQ,OAAO;AAAA,QAC1B,QAAQ,MAAM;AAAA,QACd,QAAQ,CAAC,UAAU,KAAK,KAAK;AAAA,MAC/B,CAAC;AAAA,IACL;AAAA,EACF;AACA,SAAOC,SAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AACrC,CAAC;AAGM,IAAM,YAAYE,SAAO,GAAG,WAAW,EAAE,WAAW,SAGxD;AACD,SAAO,WAAW,QAAQ,MAAMH,SAAO,KAAK,QAAQ,KAAK,CAAC;AAC1D,SAAOC,SAAQ,IAAI,GAAG,QAAQ,IAAI,KAAK,QAAQ,KAAK,EAAE;AACxD,CAAC;AAGM,IAAM,YAAYE,SAAO,GAAG,WAAW,EAAE,WAAW,OAAe;AACxE,QAAM,UAAU,OAAO,WAAW,KAAK;AACvC,SAAOF,SAAQ,IAAI,YAAY,WAAW,QAAQ,QAAQ,QAAQ,KAAK,CAAC,EAAE;AAC5E,CAAC;AAGM,IAAM,SAASE,SAAO,GAAG,QAAQ,EAAE,WACxC,OACA;AAKA,QAAM,SAAS,OAAO,iBAAiB,EAAE,QAAQH,SAAO,KAAK,GAAG,MAAM,CAAC;AACvE,QAAM,UAAU,OAAO,iBAAiB,KAAK;AAC7C,MAAIA,SAAO,OAAO,OAAO,GAAG;AAC1B,WAAO,OAAOK;AAAA,MACZL,SAAO,MAAM,OAAO;AAAA,QAClB,QAAQ,MAAM;AAAA,QACd,QAAQ,CAACD,WAAU,yBAAyBA,MAAK;AAAA,MACnD,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,QAAQ;AACxB,MAAIC,SAAO,OAAO,MAAM,KAAK,OAAO,MAAM,SAAS,WAAW;AAC5D,UAAM,WAAW,OAAO;AACxB,WAAO,SAAS,OAAO,OAAO,MAAM,QAAQ,OAAO,MAAM,MAAM,EAAE;AAAA;AAAA;AAAA,MAG/DG,SAAO;AAAA,QAAS;AAAA,QAAc,CAACD,aAC7BD,SAAQ;AAAA,UACN,YAAYC,SAAQ,OAAO;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAOD,SAAQ;AAAA,IACb,WAAW,QAAQ,KAAK,KAAK,QAAQ,IAAI,UAAU,QAAQ,MAAM;AAAA,EACnE;AACF,CAAC;;;AIvYD,SAAS,YAAAM,WAAU,WAAAC,UAAS,QAAAC,aAAY;AACxC,SAAS,UAAAC,gBAAc;;;ACCvB,SAAS,UAAU,SAAS,YAAY;AACxC,SAAS,WAAAC,UAAS,UAAAC,UAAQ,UAAAC,UAAQ,UAAAC,gBAAc;AAChD,OAA2B;AAC3B,YAAYC,WAAS;AA+BrB,IAAM,gBAAgB;AACtB,IAAMC,cAAa;AACnB,IAAM,eAAe;AAGrB,IAAM,eAAe,CAAC,KAAa,WACjC,UAAU,QAAQ,EAAE,IAAI,CAAC,EAAE;AAAA,EACzBC,SAAO,QAAQ,gBAAgB;AAAA,EAC/BA,SAAO;AAAA,IAAS,CAAC,UACf,iBAAiB,eACb,QACA,IAAI,aAAa;AAAA,MACf,MAAM;AAAA,MACN,SAAS,2CAA2C,MAAM,OAAO;AAAA,IACnE,CAAC;AAAA,EACP;AACF;AAGK,IAAM,mBAAmB,YAAY;AAAA,EAC1CA,SAAO,IAAI,CAAC,UAAU,MAAM,GAAG;AACjC;AAGO,IAAM,YAAY,CAAC,QACxBA,SAAO,IAAI,aAAa;AACtB,QAAM,QAAQ,OAAO,UAAU,GAAG;AAClC,MAAIC,SAAO,OAAO,KAAK;AACrB,WAAO,OAAOC;AAAA,MACZ;AAAA,MACAH;AAAA,IACF;AACF,SAAO,MAAM;AACf,CAAC,EAAE;AAAA,EACDC,SAAO;AAAA,IAAS;AAAA,IAAsB,CAAC,UACrCA,SAAO;AAAA,MACL,IAAI,WAAW;AAAA,QACb,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,QACxC,UAAUD;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAGK,IAAM,SAAS,CAAC,UACrBC,SAAO,IAAI,aAAa;AACtB,QAAM,aAAa,OAAO,kBAAkB;AAAA,IAC1C,QAAQC,SAAO,KAAK,MAAM,MAAM;AAAA,IAChC,OAAOA,SAAO,KAAK;AAAA,EACrB,CAAC,EAAE;AAAA,IACDD,SAAO;AAAA,MACL,CAAC,UACC,IAAI,WAAW,EAAE,SAAS,MAAM,SAAS,UAAU,aAAa,CAAC;AAAA,IACrE;AAAA,EACF;AACA,MAAIC,SAAO,OAAO,UAAU;AAC1B,WAAO,OAAOC;AAAA,MACZ,oBAAoB,MAAM,MAAM;AAAA,MAChC;AAAA,IACF;AACF,SAAO,WAAW;AAAA,IAChB,QAAQ,MAAM;AAAA,IACd,QAAQ,WAAW,MAAM;AAAA,IACzB,YAAY,MAAM;AAAA,EACpB,CAAC;AACH,CAAC;AAGI,IAAM,YAAY,CAACC,WACxBC,SAAO,aAAaA,SAAO,eAAeA,SAAO,OAAO,CAAC,EAAED,MAAK,EAAE;AAAA,EAChEH,SAAO;AAAA,EACPA,SAAO,QAAQ,CAAC,SAASK,SAAQ,IAAI,IAAI,CAAC;AAC5C;AAGF,IAAMC,WAAU,CACd,QACAH,WACYC,SAAO,WAAW,MAAM,EAAED,MAAK;AAE7C,IAAM,OAAO,CAACA,WACZ,OAAOA,WAAU,WACbA,SACA,OAAOA,WAAU,YAAY,OAAOA,WAAU,YAC5C,OAAOA,MAAK,IACZA,WAAU,OACR,SACA,WAAWA,MAAK;AAE1B,IAAM,iBAAiB,CACrB,cAEAE,SAAQ;AAAA,EACF;AAAA,IACF,UAAU;AAAA,MAAI,CAACE,cACb;AAAA,QACE,YAAYA,UAAS,IAAI,KAAKA,UAAS,IAAI;AAAA,QAC3C,YAAY,KAAKA,UAAS,IAAI,CAAC;AAAA,QAC/B,YAAY,KAAKA,UAAS,KAAK,CAAC;AAAA,QAChC,YAAY,KAAKA,UAAS,MAAM,CAAC;AAAA,QACjC,KAAKA,UAAS,IAAI;AAAA,MACpB,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;AAEF,IAAM,iBAAiB,CAAC,eAA0C;AAAA,EAChE,QAAQ;AAAA,EACR,WAAW,UAAU,IAAI,CAACA,cAAaD,SAAQ,YAAYC,SAAQ,CAAC;AACtE;AAEA,IAAM,WAAW,CAACC,WAAwB;AAAA,EACxC,YAAYA,MAAK;AAAA,EACjB,QAAQA,MAAK;AAAA,EACb,aAAaA,MAAK;AACpB;AAGO,IAAM,gBAAgB,QAAQ;AAAA,EACnC;AAAA,EACA;AAAA,IACE,QAAQ,SAAS,OAAO,QAAQ,EAAE;AAAA,MAChC,SAAS;AAAA,MACT,SAAS,YAAY,MAAM;AAAA,MAC3B,SAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACAR,SAAO,GAAG,WAAW,EAAE,OAAO,GAAG;AAC/B,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,OAAO,UAAU,GAAG,EAAE;AAAA,MAClCA,SAAO;AAAA,QAAS;AAAA,QAAsB,CAAC,UACrCA,SAAO;AAAA,UACL,IAAI,WAAW;AAAA,YACb,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,YACxC,UAAUD;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAWE,SAAO;AAAA,MAAU;AAAA,MAAQ,MACxCA,SAAO,MAAM,OAAO;AAAA,QAClB,QAAQ,MAAM;AAAA,QACd,QAAQ,CAACE,WAAUA,OAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AACA,UAAM,KAAK,OAAO,aAAa,KAAK,QAAQ;AAC5C,UAAM,YAAY,OAAO,SAAS,EAAE,EAAE,KAAKH,SAAO,KAAK;AACvD,WAAOK,SAAQ;AAAA,MACb;AAAA,QACE,aAAa,GAAG,SAAS,IAAI;AAAA,QAC7B,aAAa,GAAG,QAAQ,KAAK;AAAA,QAC7B,aAAa,GAAG,MAAM,MAAM;AAAA,QAC5B,aAAa,GAAG,MAAM,MAAM;AAAA,QAC5B,aAAa,SAAS;AAAA,MACxB,EAAE,KAAK,IAAI;AAAA,IACb;AAEA,QAAIJ,SAAO,OAAO,KAAK,GAAG;AACxB,aAAOI,SAAQ;AAAA,QACb;AAAA,MACF;AACA;AAAA,IACF;AACA,UAAM,UAAU,MAAM;AACtB,UAAM,MAAM,OAAO,OAAO,OAAO;AACjC,UAAMG,QAAO,OAAO,IAAI,KAAK,EAAE;AAAA,MAC7BR,SAAO;AAAA,QACL,CAAC,UACC,IAAI,WAAW;AAAA,UACb,SAAS,GAAG,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,UAC7C,UAAU;AAAA,QACZ,CAAC;AAAA,MACL;AAAA,IACF;AACA,UAAM,WAAWC,SAAO,MAAMO,OAAM;AAAA,MAClC,QAAQ,MAAM;AAAA,MACd,QAAQ,CAACL,WACP,cAAcA,OAAM,cAChB,YACA,QAAQ,mBAAmBA,OAAM,aAC/B,cAAc,QAAQ,kBACpB,WACA,UACF,cAAc,QAAQ,kBACpB,WACA;AAAA,IACZ,CAAC;AACD,WAAOE,SAAQ;AAAA,MACb;AAAA,QACE,aAAa,QAAQ,cAAc,IAAI,QAAQ,eAAe;AAAA,QAC9D,aAAaJ,SAAO,MAAMO,OAAM;AAAA,UAC9B,QAAQ,MAAM;AAAA,UACd,QAAQ,CAACL,WAAU,GAAGA,OAAM,UAAU,IAAIA,OAAM,WAAW;AAAA,QAC7D,CAAC,CAAC;AAAA,QACF,aAAa,cAAc,QAAQ,kBAAkB,UAAU,OAAO;AAAA,QACtE,aAAa,QAAQ;AAAA,MACvB,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF,CAAC;AACH,EAAE;AAAA,EACA,QAAQ,gBAAgB,iDAAiD;AAC3E;AAEA,IAAM,kBAAkB,CACtB,KACA,aAEA,aAAa,SACT,IAAI,KAAK,EAAE;AAAA,EACTH,SAAO;AAAA,IACL,CAAC,UACC,IAAI,WAAW;AAAA,MACb,SAAS,GAAG,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,MAC7C,UAAU;AAAA,IACZ,CAAC;AAAA,EACL;AAAA,EACAA,SAAO;AAAA,IAAQ,CAACQ,UACdP,SAAO,OAAOO,KAAI,IACdN,MAAK,2CAA2CH,WAAU,IAC1DC,SAAO,QAAQQ,MAAK,MAAM,UAAU;AAAA,EAC1C;AACF,IACAR,SAAO,QAAQ,QAAQ;AAE7B,IAAM,aAAa,CAAC,SAA+B;AACjD,QAAM,QAAuB,CAAC;AAC9B,QAAM,YAAY;AAAA,IAChB,GAAG,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,OAAO,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG;AAAA,IACjE,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC,SAAS,OAAO,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG;AAAA,IACnE,GAAG,KAAK,MAAM,QAAQ;AAAA,MACpB,CAAC,SACC,OAAO,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,IAAI,QAAQ,KAAK,GAAG,EAAE,KAAK,KAAK,GAAG,IAAI;AAAA,IAC7E;AAAA,EACF;AACA,QAAM,YAAY;AAAA,IAChB,GAAG,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,OAAO,KAAK,IAAI,OAAO,KAAK,EAAE,EAAE;AAAA,IAClE,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC,SAAS,OAAO,KAAK,IAAI,OAAO,KAAK,EAAE,EAAE;AAAA,EACtE;AACA,QAAM,YAAY,KAAK,MAAM;AAAA,IAC3B,CAAC,SACC,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,EAClG;AACA,QAAM,aAAa,KAAK,OAAO;AAAA,IAC7B,CAAC,UACC,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;AAAA,EAC1F;AACA,QAAM,eAAe,KAAK,QAAQ;AAAA,IAChC,CAACS,WAAU,KAAKA,OAAM,KAAK,KAAK,KAAKA,OAAM,IAAI,CAAC,OAAO,KAAKA,OAAM,EAAE,CAAC;AAAA,EACvE;AACA,QAAM,gBAAgB,KAAK,SAAS;AAAA,IAClC,CAACA,WAAU,KAAKA,OAAM,KAAK,KAAK,KAAKA,OAAM,IAAI,CAAC,OAAO,KAAKA,OAAM,EAAE,CAAC;AAAA,EACvE;AACA,QAAM,WAAoE;AAAA,IACxE,CAAC,SAAS,SAAS;AAAA,IACnB,CAAC,SAAS,SAAS;AAAA,IACnB,CAAC,UAAU,UAAU;AAAA,IACrB,CAAC,SAAS,SAAS;AAAA,IACnB,CAAC,WAAW,YAAY;AAAA,IACxB,CAAC,YAAY,aAAa;AAAA,EAC5B;AACA,WAAS,QAAQ,CAAC,CAAC,MAAM,OAAO,MAAM;AACpC,QAAI,QAAQ,SAAS,EAAG,OAAM,KAAK,MAAM,GAAG,OAAO;AAAA,EACrD,CAAC;AACD,SAAO,MAAM,WAAW,IAAI,eAAe,MAAM,KAAK,IAAI;AAC5D;AAEO,IAAM,cAAc,QAAQ;AAAA,EACjC;AAAA,EACA;AAAA,IACE,MAAM,KAAK,OAAO,MAAM,EAAE;AAAA,MACxB,KAAK;AAAA,MACL,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI,KAAK,OAAO,IAAI,EAAE;AAAA,MACpB,KAAK,YAAY,MAAM;AAAA,MACvB,KAAK,gBAAgB,iDAAiD;AAAA,IACxE;AAAA,IACA,MAAM,KAAK,QAAQ,MAAM,EAAE;AAAA,MACzB,KAAK,YAAY,KAAK;AAAA,MACtB,KAAK,gBAAgB,0BAA0B;AAAA,IACjD;AAAA,EACF;AAAA,EACAT,SAAO,GAAG,WAAW,EAAE,MAAM,IAAI,MAAMU,QAAO,GAAG;AAC/C,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,OAAO,UAAU,GAAG;AAClC,UAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,UAAM,SAAS,OAAOT,SAAO,MAAM,MAAM;AAAA,MACvC,QAAQ,MAAMD,SAAO,QAAQ,MAAM,cAAc;AAAA,MACjD,QAAQ,CAACG,WAAU,gBAAgB,KAAKA,MAAK;AAAA,IAC/C,CAAC;AACD,UAAM,OAAO,OAAO,gBAAgB,KAAK,EAAE;AAC3C,QAAI,WAAW,MAAM;AACnB,aAAOO,UACH,UAAU,EAAE,MAAM,QAAQ,IAAI,MAAM,MAAM,KAAK,CAAC,IAChDL,SAAQ,IAAI,eAAe,MAAM,GAAG;AACxC;AAAA,IACF;AACA,UAAM,QAAQ,CAAC,eACbL,SAAO,IAAI,aAAa;AACtB,YAAM,WAAW,OAAO,IAAI,SAAS,UAAU,EAAE;AAAA,QAC/CA,SAAO;AAAA,UACL,CAAC,UACC,IAAI,WAAW;AAAA,YACb,SAAS,GAAG,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,YAC7C,UAAU;AAAA,UACZ,CAAC;AAAA,QACL;AAAA,MACF;AACA,aAAO,OAAO,iBAAiB,SAAS,EAAE,EAAE;AAAA,QAC1CA,SAAO;AAAA,UACL,CAAC,UACC,IAAI,WAAW;AAAA,YACb,SAAS,YAAY,UAAU,mBAAmB,MAAM,OAAO;AAAA,YAC/D,UAAUD;AAAA,UACZ,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACF,CAAC;AACH,UAAM,CAAC,QAAQ,KAAK,IAAI,OAAOC,SAAO,IAAI,CAAC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG;AAAA,MACtE,aAAa;AAAA,IACf,CAAC;AACD,UAAM,OAAO,OAAO,QAAQ,KAAK;AACjC,QAAIU,SAAQ;AACV,aAAO,UAAU;AAAA,QACf,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,MAAMJ,SAAQ,cAAc,IAAI;AAAA,MAClC,CAAC;AACD;AAAA,IACF;AACA,WAAOD,SAAQ,IAAI,WAAW,IAAI,CAAC;AAAA,EACrC,CAAC;AACH,EAAE,KAAK,QAAQ,gBAAgB,wCAAwC,CAAC;AAExE,IAAM,aAAa,CAAC,YAAiC;AACnD,MAAI,QAAQ,WAAW;AACrB,WAAO,mBAAmB,QAAQ,KAAK,UAAU,cAAc,QAAQ,KAAK,MAAM;AACpF,MAAI,QAAQ,WAAW;AACrB,WAAO,uCAAuC,QAAQ,KAAK,MAAM;AACnE,MAAI,QAAQ,WAAW;AACrB,WAAO,8DAA8D,QAAQ,KAAK,MAAM;AAC1F,MAAI,QAAQ,WAAW;AACrB,WAAO;AAAA,MACL,WAAW,QAAQ,QAAQ,MAAM,gBAAgB,QAAQ,UAAU,MAAM;AAAA,MACzE,GAAG,QAAQ,QAAQ;AAAA,QACjB,CAAC,WAAW,KAAK,OAAO,IAAI,KAAK,OAAO,MAAM,OAAO,OAAO,KAAK;AAAA,MACnE;AAAA,IACF,EAAE,KAAK,IAAI;AACb,MAAI,QAAQ,WAAW;AACrB,WAAO;AAAA,MACL,QAAQ,QAAQ,WAAW,IACvB,qBACA,eAAe,QAAQ,QAAQ,MAAM,gBAAgB,QAAQ,UAAU,MAAM;AAAA,MACjF,GAAG,QAAQ,QAAQ;AAAA,QACjB,CAAC,WAAW,KAAK,OAAO,IAAI,KAAK,OAAO,MAAM,OAAO,OAAO,KAAK;AAAA,MACnE;AAAA,IACF,EAAE,KAAK,IAAI;AACb,MAAI,QAAQ,WAAW;AACrB,WAAO;AACT,MAAI,QAAQ,WAAW,WAAY,QAAO;AAC1C,SAAO;AACT;AAEO,IAAM,cAAc,QAAQ;AAAA,EACjC;AAAA,EACA;AAAA,IACE,OAAO,KAAK,QAAQ,OAAO,EAAE;AAAA,MAC3B,KAAK,YAAY,KAAK;AAAA,MACtB,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,KAAK,QAAQ,OAAO,EAAE;AAAA,MAC3B,KAAK,YAAY,KAAK;AAAA,MACtB,KAAK,gBAAgB,wCAAwC;AAAA,IAC/D;AAAA,IACA,MAAM,KAAK,QAAQ,MAAM,EAAE;AAAA,MACzB,KAAK,YAAY,KAAK;AAAA,MACtB,KAAK,gBAAgB,0BAA0B;AAAA,IACjD;AAAA,EACF;AAAA,EACAL,SAAO,GAAG,WAAW,EAAE,OAAO,OAAO,MAAMU,QAAO,GAAG;AACnD,QAAI,SAAS;AACX,aAAO,OAAOR;AAAA,QACZ;AAAA,QACAH;AAAA,MACF;AACF,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,OAAO,UAAU,GAAG;AAClC,UAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,UAAM,aAAa,OAAO,WAAW,KAAK,MAAM,MAAM;AACtD,UAAM,QAAQ,OAAO,aAAa,KAAK,MAAM,MAAM;AACnD,UAAM,UAAU,OAAO,KAAK,EAAE,KAAK,KAAK,OAAO,YAAY,MAAM,CAAC;AAElE,QAAIW,SAAQ;AACV,UAAI,QAAQ,WAAW;AACrB,eAAO,UAAU,eAAe,QAAQ,SAAS,CAAC;AACpD,UAAI,QAAQ,WAAW;AACrB,eAAO,UAAU;AAAA,UACf,QAAQ;AAAA,UACR,UAAU,QAAQ,SAAS;AAAA,YAAI,CAACC,aAC9BL,SAAQ,cAAcK,QAAO;AAAA,UAC/B;AAAA,QACF,CAAC;AACH,UAAI,QAAQ,WAAW,aAAa,QAAQ,WAAW;AACrD,eAAO,UAAU;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,MAAM,SAAS,QAAQ,IAAI;AAAA,UAC3B,WAAW,QAAQ;AAAA,UACnB,SAAS,QAAQ,QAAQ;AAAA,YAAI,CAAC,WAC5BL,SAAQ,aAAa,MAAM;AAAA,UAC7B;AAAA,QACF,CAAC;AACH,UACE,QAAQ,WAAW,gBACnB,QAAQ,WAAW,kBACnB,QAAQ,WAAW,iBACnB,QAAQ,WAAW;AAEnB,eAAO,UAAU;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,MAAM,SAAS,QAAQ,IAAI;AAAA,QAC7B,CAAC;AAAA,IACL,OAAO;AACL,aAAOD,SAAQ,IAAI,WAAW,OAAO,CAAC;AACtC,UAAI,QAAQ,WAAW;AACrB,eAAO,eAAe,QAAQ,SAAS;AACzC,UAAI,QAAQ,WAAW;AACrB,eAAOA,SAAQ;AAAA,UACb,QAAQ,SACL;AAAA,YACC,CAACM,aACC,WAAWA,SAAQ,EAAE,OAAOA,SAAQ,IAAI,KAAKA,SAAQ,MAAM,MAAMA,SAAQ,MAAM;AAAA,UACnF,EACC,KAAK,IAAI;AAAA,QACd;AAAA,IACJ;AAEA,QACE,QAAQ,WAAW,cACnB,QAAQ,WAAW,aACnB,QAAQ,WAAW;AAEnB,aAAO,OAAOT,MAAK,IAAI,aAAa;AAAA,EACxC,CAAC;AACH,EAAE;AAAA,EACA,QAAQ,gBAAgB,oDAAoD;AAC9E;AAEO,IAAM,cAAc,QAAQ;AAAA,EACjC;AAAA,EACA;AAAA,IACE,MAAM,KAAK,OAAO,MAAM,EAAE;AAAA,MACxB,KAAK;AAAA,MACL,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAY,KAAK,OAAO,aAAa,EAAE;AAAA,MACrC,KAAK;AAAA,MACL,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,KAAK,OAAO,QAAQ,EAAE;AAAA,MAC5B,KAAK;AAAA,MACL,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,KAAK,QAAQ,SAAS,EAAE;AAAA,MAC9B,KAAK,YAAY,KAAK;AAAA,MACtB,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,KAAK,QAAQ,MAAM,EAAE;AAAA,MACzB,KAAK,YAAY,KAAK;AAAA,MACtB,KAAK,gBAAgB,0BAA0B;AAAA,IACjD;AAAA,EACF;AAAA,EACAF,SAAO,GAAG,WAAW,EAAE,MAAM,YAAY,QAAQ,QAAQ,MAAMU,QAAO,GAAG;AACvE,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,OAAO,UAAU,GAAG,EAAE;AAAA,MAClCV,SAAO;AAAA,QAAS;AAAA,QAAsB,CAAC,UACrCA,SAAO;AAAA,UACL,IAAI,WAAW;AAAA,YACb,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,YACxC,UAAUD;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAa,OAAO,kBAAkB;AAAA,MAC1C,QAAQE,SAAO,IAAI,OAAO,CAACE,WAAUA,OAAM,MAAM;AAAA,MACjD,OAAOF,SAAO,KAAK;AAAA,IACrB,CAAC,EAAE;AAAA,MACDD,SAAO;AAAA,QACL,CAAC,UACC,IAAI,WAAW,EAAE,SAAS,MAAM,SAAS,UAAU,aAAa,CAAC;AAAA,MACrE;AAAA,IACF;AACA,QAAIC,SAAO,OAAO,UAAU;AAC1B,aAAO,OAAOC,MAAK,2CAAsC,YAAY;AAEvE,UAAM,qBAAqBD,SAAO;AAAA,MAAO;AAAA,MAAY,MACnDA,SAAO,IAAI,OAAO,CAACE,WAAUA,OAAM,UAAU;AAAA,IAC/C;AACA,QAAIF,SAAO,OAAO,kBAAkB;AAClC,aAAO,OAAOC;AAAA,QACZ;AAAA,QACAH;AAAA,MACF;AACF,UAAM,iBAAiBE,SAAO;AAAA,MAC5BA,SAAO,OAAO,QAAQ,MAAMA,SAAO,IAAI,OAAO,CAACE,WAAUA,OAAM,MAAM,CAAC;AAAA,MACtE,MAAM;AAAA,IACR;AACA,UAAM,SAASF,SAAO,MAAM,OAAO;AAAA,MACjC,QAAQ,MAAM,WAAW,MAAM;AAAA,MAC/B,QAAQ,CAACE,WAAUA,OAAM;AAAA,IAC3B,CAAC;AACD,UAAM,MAAM,WAAW;AAAA,MACrB;AAAA,MACA,QAAQ,WAAW,MAAM;AAAA,MACzB,YAAY,mBAAmB;AAAA,IACjC,CAAC;AACD,UAAM,QAAQ,OAAO,aAAa,KAAK,cAAc;AACrD,UAAM,iBAAiBF,SAAO;AAAA,MAAO;AAAA,MAAM,MACzCA,SAAO,IAAI,OAAO,CAACE,WAAUA,OAAM,cAAc;AAAA,IACnD;AACA,UAAM,UAAU,OAAO,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,QACR;AAAA,QACA,YAAY,mBAAmB;AAAA,QAC/B,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAIO,SAAQ;AACV,UAAI,QAAQ,WAAW;AACrB,eAAO,UAAU;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,QAAQ,QAAQ;AAAA,UAChB,UAAU;AAAA,YACR,YAAY,QAAQ,SAAS;AAAA,YAC7B,QAAQ,QAAQ,SAAS;AAAA,YACzB,aAAa,QAAQ,SAAS;AAAA,UAChC;AAAA,QACF,CAAC;AACH,UAAI,QAAQ,WAAW;AACrB,eAAO,UAAU,eAAe,QAAQ,SAAS,CAAC;AACpD,UAAI,QAAQ,WAAW;AACrB,eAAO,UAAU;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,QAAQ,QAAQ;AAAA,UAChB,QAAQ,OAAO,SAAS,QAAQ,EAAE,EAAE,KAAKV,SAAO,KAAK;AAAA,UACrD,IAAI,cAAc,QAAQ,EAAE;AAAA,QAC9B,CAAC;AACH,UACE,QAAQ,WAAW,gBACnB,QAAQ,WAAW;AAEnB,eAAO,UAAU;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,MAAM,SAAS,QAAQ,IAAI;AAAA,QAC7B,CAAC;AAAA,IACL,OAAO;AACL,UAAI,QAAQ,WAAW;AACrB,eAAOK,SAAQ;AAAA,UACb,QAAQ,SACJ,sBAAsB,QAAQ,SAAS,MAAM,aAAa,QAAQ,SAAS,WAAW,MACtF,sBAAsB,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,WAAW;AAAA,QACpF;AACF,UAAI,QAAQ,WAAW;AACrB,eAAOA,SAAQ;AAAA,UACb,mBAAmB,QAAQ,KAAK,UAAU,cAAc,QAAQ,KAAK,MAAM;AAAA,QAC7E;AACF,UAAI,QAAQ,WAAW;AACrB,eAAOA,SAAQ;AAAA,UACb,iEAAiE,QAAQ,KAAK,MAAM;AAAA,QACtF;AACF,UAAI,QAAQ,WAAW;AACrB,eAAOA,SAAQ;AAAA,UACb,iBAAiB,OAAO,SAAS,QAAQ,EAAE,EAAE,KAAKL,SAAO,KAAK,CAAC,GAAG,QAAQ,SAAS,cAAc,EAAE;AAAA,QACrG;AACF,UAAI,QAAQ,WAAW,YAAY;AACjC,eAAO,eAAe,QAAQ,SAAS;AACvC,YAAI,QAAQ,UAAU,WAAW;AAC/B,iBAAOK,SAAQ;AAAA,YACb;AAAA,UACF;AAAA,MACJ;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,WAAY,QAAO,OAAOH,MAAK,IAAI,aAAa;AAAA,EACzE,CAAC;AACH,EAAE;AAAA,EACA,QAAQ,gBAAgB,kDAAkD;AAC5E;AAEA,IAAM,eAAe,CAAC,KAAkB,eACtCF,SAAO,IAAI,aAAa;AACtB,QAAM,YAAY,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE;AAAA,IACzCA,SAAO;AAAA,MACL,CAAC,UACC,IAAI,WAAW;AAAA,QACb,SAAS,GAAG,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,QAC7C,UAAU;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACF;AACA,QAAM,QAAQ,UAAU;AAAA,IACtB,CAAC,aAA8B,SAAS,OAAO;AAAA,EACjD;AACA,MAAI,UAAU;AACZ,WAAO,OAAOE;AAAA,MACZ,eAAe,UAAU;AAAA,MACzBH;AAAA,IACF;AACF,SAAO;AACT,CAAC;AAEI,IAAM,eAAe,QAAQ;AAAA,EAClC;AAAA,EACA;AAAA,IACE,YAAY,SAAS,OAAO,aAAa,EAAE;AAAA,MACzC,SAAS,YAAY,IAAI;AAAA,MACzB,SAAS,gBAAgB,qCAAqC;AAAA,IAChE;AAAA,EACF;AAAA,EACAC,SAAO,GAAG,WAAW,EAAE,WAAW,GAAG;AACnC,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,OAAO,UAAU,GAAG;AAClC,UAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,UAAM,WAAW,OAAO,aAAa,KAAK,UAAU;AACpD,QAAI,SAAS,WAAW;AACtB,aAAO,OAAOE;AAAA,QACZ,YAAY,UAAU,OAAO,SAAS,MAAM;AAAA,QAC5CH;AAAA,MACF;AACF,UAAM,QAAQ,OAAO,aAAa,KAAK,MAAM,MAAM;AACnD,UAAM,aAAa,OAAO,WAAW,KAAK,MAAM,MAAM;AACtD,UAAM,eAAe,OAAO,IAAI,SAAS,SAAS,cAAc,EAAE;AAAA,MAChEC,SAAO;AAAA,QACL,CAAC,UACC,IAAI,WAAW;AAAA,UACb,SAAS,GAAG,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,UAC7C,UAAU;AAAA,QACZ,CAAC;AAAA,MACL;AAAA,IACF;AACA,UAAM,OAAO,OAAO,iBAAiB,aAAa,EAAE,EAAE;AAAA,MACpDA,SAAO;AAAA,QACL,CAAC,UACC,IAAI,WAAW;AAAA,UACb,SAAS,+CAA+C,MAAM,OAAO;AAAA,UACrE,UAAUD;AAAA,QACZ,CAAC;AAAA,MACL;AAAA,IACF;AACA,UAAM,SAAS,OAAO,cAAc;AAAA,MAClC;AAAA,MACA,QAAQ,MAAM;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,SAAS;AAAA,MACd,OAAO;AAAA,IACT,CAAC;AACD,QAAI,OAAO,WAAW,WAAW;AAC/B,aAAOM,SAAQ;AAAA,QACb,OAAO,SACJ;AAAA,UACC,CAACM,aACC,WAAWA,SAAQ,EAAE,OAAOA,SAAQ,IAAI,KAAKA,SAAQ,MAAM,MAAMA,SAAQ,MAAM;AAAA,QACnF,EACC,KAAK,IAAI;AAAA,MACd;AACA,aAAO,OAAOT,MAAK,IAAI,aAAa;AAAA,IACtC;AACA,WAAOG,SAAQ;AAAA,MACb;AAAA,QACE,oBAAoB,UAAU;AAAA,QAC9B,GAAG,OAAO,QAAQ;AAAA,UAChB,CAAC,WAAW,KAAK,OAAO,IAAI,KAAK,OAAO,MAAM,OAAO,OAAO,KAAK;AAAA,QACnE;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF,CAAC;AACH,EAAE;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,EACF;AACF;AAEO,IAAM,gBAAgB,QAAQ;AAAA,EACnC;AAAA,EACA;AAAA,IACE,YAAY,SAAS,OAAO,aAAa,EAAE;AAAA,MACzC,SAAS,YAAY,IAAI;AAAA,MACzB,SAAS,gBAAgB,yBAAyB;AAAA,IACpD;AAAA,EACF;AAAA,EACAL,SAAO,GAAG,WAAW,EAAE,WAAW,GAAG;AACnC,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,OAAO,UAAU,GAAG;AAClC,UAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,WAAO,IAAI,OAAO,UAAU,EAAE;AAAA,MAC5BA,SAAO;AAAA,QACL,CAAC,UACC,IAAI,WAAW;AAAA,UACb,SAAS,GAAG,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,UAC7C,UAAU;AAAA,QACZ,CAAC;AAAA,MACL;AAAA,IACF;AACA,WAAOK,SAAQ,IAAI,YAAY,UAAU,EAAE;AAAA,EAC7C,CAAC;AACH,EAAE,KAAK,QAAQ,gBAAgB,kCAAkC,CAAC;;;AC5vBlE,SAAS,YAAAO,WAAU,WAAAC,UAAS,QAAAC,aAAY;AACxC,SAAS,WAAAC,UAAS,UAAAC,UAAQ,SAAAC,QAAO,UAAAC,UAAQ,UAAAC,gBAAc;AACvD,YAAYC,WAAS;AAWrB,IAAM,UAAU,CAAC,UACfC,SAAO,MAAM,MAAM,QAAQ;AAAA,EACzB,QAAQ,MAAM;AAAA,EACd,QAAQ,CAAC,WAAY,WAAW,MAAM,IAAI,SAAS,MAAM,IAAI;AAC/D,CAAC;AAEH,IAAMC,cAAa,CAAC,UAClB,IAAI,WAAW;AAAA,EACb,SAAS,GAAG,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,EAC7C,UAAU,QAAQ,KAAK;AACzB,CAAC;AAIH,IAAM,SAAS,CAAC,SACdC,OAAM,MAAM,IAAI,EAAE;AAAA,EAChBA,OAAM,KAAK,QAAQ,MAAM,IAAI;AAAA,EAC7BA,OAAM,KAAK,SAAS,MAAM,KAAK;AAAA,EAC/BA,OAAM;AAAA,IAAO,CAACC,WACZH,SAAO;AAAA,MACLI,SAAO,oBAAoBA,SAAO,gBAAgB,EAAED,MAAK;AAAA,MACzD,MAAMA;AAAA,IACR;AAAA,EACF;AACF;AAEF,IAAM,eAAe,CACnB,aAEAH,SAAO,MAAM,UAAU;AAAA,EACrB,QAAQ,OAAO,CAAC;AAAA,EAChB,QAAQ,CAACK,YACP,OAAO;AAAA,IACL,OAAO,QAAQA,OAAM,EAAE,IAAI,CAAC,CAACC,MAAKH,MAAK,MAAM,CAACG,MAAK,OAAOH,MAAK,CAAC,CAAC;AAAA,EACnE;AACJ,CAAC;AAEH,IAAM,YAAY,CAAC,SACjBD,OAAM,MAAM,IAAI,EAAE;AAAA,EAChBA,OAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,EACR;AAAA,EACAA,OAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,EACR;AAAA,EACAA,OAAM,KAAK,UAAU,MAAM,qCAAkC;AAAA,EAC7DA,OAAM,KAAK,YAAY,MAAM,qCAAkC;AAAA,EAC/DA,OAAM,KAAK,QAAQ,MAAM,0CAAuC;AAAA,EAChEA,OAAM;AACR;AAGF,IAAM,QAAQ,CAACK,UACbA,UAAS,OAAO,WAAMA,MAAK,MAAM,GAAG,EAAE;AAExC,IAAMC,MAAK,CAAC,SACV,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AAElD,IAAM,MAAM,CAAC,OAAe,MAAc,UACxC,GAAG,MAAM,OAAO,EAAE,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC,GAAG,KAAK;AAE/C,IAAM,mBAAmB,CAAC,eAAmC;AAC3D,QAAM,cAAkB;AAAA,IACtB,WAAW;AAAA,IACX,CAAC,WACC,KAAK,OAAO,KAAK,OAAO,EAAE,CAAC,GAAG,MAAM,OAAO,MAAM,gBAAgB,IAAI,CAAC,WAAM,MAAM,OAAO,OAAO,gBAAgB,IAAI,CAAC,GAAG,OAAO,UAAU,gBAAgB,eAAe;AAAA,EAC5K;AACA,QAAM,cAAkB;AAAA,IACtB,WAAW;AAAA,IACX,CAAC,WACC,KAAK,OAAO,IAAI,OAAO,EAAE,CAAC,GAAG,OAAO,OAAO,IAAI,CAAC,WAAM,OAAO,OAAO,KAAK,CAAC,GACxE,OAAO,UAAU,OACb,KACA,MAAM,OAAO,SAAS,IAAI,MAAM,EAAE,GAAG,OAAO,MAAM,QAAQ,CAAC,CAAC,GAClE;AAAA,EACJ;AACA,SAAO;AAAA,IACL,UAAU,WAAW,IAAI;AAAA,IACzB;AAAA,IACA,IAAI,IAAI,QAAQ,OAAO;AAAA,IACvB;AAAA,MACE;AAAA,MACA,MAAM,WAAW,KAAK,aAAa;AAAA,MACnC,MAAM,WAAW,MAAM,aAAa;AAAA,IACtC;AAAA,IACA;AAAA,MACE;AAAA,MACA,MAAM,WAAW,KAAK,mBAAmB;AAAA,MACzC,MAAM,WAAW,MAAM,mBAAmB;AAAA,IAC5C;AAAA,IACA;AAAA,MACE;AAAA,MACA,MAAM,WAAW,KAAK,eAAe;AAAA,MACrC,MAAM,WAAW,MAAM,eAAe;AAAA,IACxC;AAAA,IACA;AAAA,MACE;AAAA,MACAA,IAAG,WAAW,KAAK,UAAU;AAAA,MAC7BA,IAAG,WAAW,MAAM,UAAU;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,YAAY,WAAW,IAAI,CAAC,UAAU,IAAI;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,GAAI,YAAY,WAAW,IAAI,CAAC,uBAAuB,IAAI;AAAA,IAC3D;AAAA,IACA;AAAA,IACA,gBAAgB,WAAW,KAAK,MAAM;AAAA,IACtC,gBAAgB,WAAW,MAAM,MAAM;AAAA,EACzC,EAAE,KAAK,IAAI;AACb;AAEO,IAAM,mBAAmBC,SAAQ;AAAA,EACtC;AAAA,EACA;AAAA,IACE,UAAUC,MAAK,OAAO,UAAU,EAAE;AAAA,MAChCA,MAAK,gBAAgB,4CAA4C;AAAA,IACnE;AAAA,IACA,UAAUA,MAAK,OAAO,UAAU,EAAE;AAAA,MAChCA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAOA,MAAK,aAAa,OAAO,EAAE;AAAA,MAChCA,MAAK;AAAA,MACLA,MAAK,gBAAgB,wCAAwC;AAAA,IAC/D;AAAA,IACA,MAAMA,MAAK,QAAQ,MAAM,EAAE;AAAA,MACzBA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK,gBAAgB,2BAA2B;AAAA,IAClD;AAAA,EACF;AAAA,EACAC,SAAO,GAAG,WAAW,EAAE,UAAU,UAAU,OAAO,KAAK,GAAG;AACxD,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,OAAO,UAAU,GAAG;AAClC,UAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,UAAM,UAAU,OAAO,IACpB,UAAU;AAAA,MACT,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,YAAY,aAAa,KAAK;AAAA,IAChC,CAAC,EACA,KAAKA,SAAO,SAASV,WAAU,CAAC;AAEnC,QAAI,MAAM;AACR,aAAO,UAAU;AAAA,QACf,QAAQ,QAAQ,IAAI;AAAA,QACpB,QAAQ,QAAQ,IAAI;AAAA,QACpB,aAAa,QAAQ,IAAI;AAAA,QACzB,mBAAmB,QAAQ;AAAA,QAC3B,kBAAsB;AAAA,UACpB,QAAQ;AAAA,UACR,CAAC,YAA+B;AAAA,YAC9B,IAAI,OAAO;AAAA,YACX,QAAQ,OAAO;AAAA,YACf,aAAa,OAAO;AAAA,YACpB,eAAe,OAAO;AAAA,UACxB;AAAA,QACF;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,WAAOW,SAAQ;AAAA,MACb;AAAA,QACE,cAAc,QAAQ,IAAI,EAAE,gBAAgB,QAAQ,cAAc,MAAM,QAAQ,CAAC;AAAA,QACjF;AAAA,QACI,YAAM,QAAQ,kBAAkB;AAAA,UAClC,SAAS,MAAM;AAAA,UACf,YAAY,CAAC,YACX;AAAA,YACE,GAAG,QAAQ,MAAM,kBAAkB,QAAQ,WAAW,IAAI,KAAK,GAAG;AAAA,YAClE,GAAG,QAAQ;AAAA,cACT,CAAC,WAAW,KAAK,OAAO,EAAE,KAAK,MAAM,OAAO,aAAa,CAAC;AAAA,YAC5D;AAAA,UACF,EAAE,KAAK,IAAI;AAAA,QACf,CAAC;AAAA,MACH,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF,CAAC;AACH,EAAE;AAAA,EACAH,SAAQ;AAAA,IACN;AAAA,EACF;AACF;AAEO,IAAM,iBAAiBA,SAAQ;AAAA,EACpC;AAAA,EACA;AAAA,IACE,MAAMI,UAAS,OAAO,UAAU,EAAE;AAAA,MAChCA,UAAS,YAAY,UAAU;AAAA,MAC/BA,UAAS,gBAAgB,wBAAwB;AAAA,IACnD;AAAA,IACA,OAAOA,UAAS,OAAO,UAAU,EAAE;AAAA,MACjCA,UAAS,YAAY,UAAU;AAAA,MAC/BA,UAAS,gBAAgB,kCAAkC;AAAA,IAC7D;AAAA,IACA,MAAMH,MAAK,QAAQ,MAAM,EAAE;AAAA,MACzBA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK,gBAAgB,8BAA8B;AAAA,IACrD;AAAA,EACF;AAAA,EACAC,SAAO,GAAG,WAAW,EAAE,MAAM,OAAO,KAAK,GAAG;AAC1C,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,OAAO,UAAU,GAAG;AAClC,UAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,UAAM,aAAa,OAAO,IACvB,QAAQ,MAAM,KAAK,EACnB,KAAKA,SAAO,SAASV,WAAU,CAAC;AACnC,QAAI,MAAM;AACR,aAAO,UAAU,UAAU;AAC3B;AAAA,IACF;AACA,WAAOW,SAAQ,IAAI,iBAAiB,UAAU,CAAC;AAAA,EACjD,CAAC;AACH,EAAE;AAAA,EACAH,SAAQ;AAAA,IACN;AAAA,EACF;AACF;;;AF7NA,IAAM,iBAAiBK,SAAQ;AAAA,EAC7B;AAAA,EACA;AAAA,IACE,QAAQC,UAAS,OAAO,QAAQ,EAAE;AAAA,MAChCA,UAAS,YAAY,MAAM;AAAA,MAC3BA,UAAS,gBAAgB,qCAAqC;AAAA,IAChE;AAAA,IACA,MAAMC,MAAK,QAAQ,MAAM,EAAE;AAAA,MACzBA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK,gBAAgB,kCAAkC;AAAA,IACzD;AAAA,IACA,OAAOA,MAAK,QAAQ,OAAO,EAAE;AAAA,MAC3BA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK,gBAAgB,wCAAwC;AAAA,IAC/D;AAAA,EACF;AAAA,EACAC,SAAO,GAAG,WAAW,EAAE,QAAQ,MAAM,MAAM,GAAG;AAC5C,WAAO,WAAW,WAAW,QAAQ;AAAA,MACnC,GAAI,OAAO,CAAC,QAAQ,IAAI,CAAC;AAAA,MACzB,GAAI,QAAQ,CAAC,SAAS,IAAI,CAAC;AAAA,IAC7B,CAAC;AAAA,EACH,CAAC;AACH,EAAE;AAAA,EACAH,SAAQ;AAAA,IACN;AAAA,EACF;AACF;AAEA,IAAM,kBAAkBA,SAAQ;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,QAAQC,UAAS,OAAO,QAAQ,EAAE;AAAA,MAChCA,UAAS,YAAY,QAAQ;AAAA,MAC7BA,UAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAMC,MAAK,QAAQ,MAAM,EAAE;AAAA,MACzBA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK,gBAAgB,oCAAoC;AAAA,IAC3D;AAAA,IACA,OAAOA,MAAK,QAAQ,OAAO,EAAE;AAAA,MAC3BA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK,gBAAgB,8BAA8B;AAAA,IACrD;AAAA,EACF;AAAA,EACAC,SAAO,GAAG,WAAW,EAAE,QAAQ,MAAM,MAAM,GAAG;AAC5C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,CAAC,GAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAI,GAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAE;AAAA,MAC3D,WAAW,MAAM,EAAE,OAAO,UAAU,IAAI;AAAA,IAC1C;AAAA,EACF,CAAC;AACH,EAAE,KAAKH,SAAQ,gBAAgB,8CAA8C,CAAC;AAGvE,IAAM,kBAAkBA,SAAQ,KAAK,UAAU,EAAE;AAAA,EACtDA,SAAQ;AAAA,IACN;AAAA,EACF;AAAA,EACAA,SAAQ,gBAAgB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;AGrFA,SAAS,WAAAI,UAAS,UAAAC,UAAQ,OAAO,SAAAC,SAAO,UAAAC,gBAAc;AACtD,YAAYC,WAAU;AACtB,YAAYC,kBAAgB;AAC5B,YAAYC,YAAU;AACtB,YAAYC,QAAO;AACnB,YAAYC,QAAO;AACnB,YAAYC,cAAY;AACxB,YAAYC,WAAS;AAId,IAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,IAAM,aAAqC;AAAA,EACzC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,KAAK;AAAA,EACL,QAAQ;AACV;AAEA,IAAM,cAAsC;AAAA,EAC1C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,KAAK;AAAA,EACL,QAAQ;AACV;AASA,IAAM,cAAc,CAAC,WACnBR,QAAM,MAAM,MAAM,EAAE;AAAA,EAClBA,QAAM,KAAK,UAAU,OAAO;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,KAAK;AAAA,EACd,EAAE;AAAA,EACFA,QAAM,KAAK,YAAY,OAAO;AAAA,IAC5B,MAAM;AAAA,IACN,SAAS,CAAC,UAAU,KAAK;AAAA,IACzB,SAAS;AAAA,EACX,EAAE;AAAA,EACFA,QAAM,OAAO,OAAO,EAAE,SAAS,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE;AAC3D;AAEF,IAAM,WAAW,CAACS,WACd,YAASA,MAAK;AAElB,IAAM,WAAW,CAACA,WAChBR,SAAO,cAAc,QAAQ,EAAEQ,MAAK;AAEtC,IAAMA,SAAQ,CAAC,OAAyB,SACtCR,SAAO,OAAOA,SAAO,cAAc,MAAM,OAAO,IAAI,CAAC,GAAO,gBAAU;AAExE,IAAMS,QAAO,CAAC,UAA4B,UACxC,MAAM,KAAK,MAAM,aAAa,UAAU,OAAO,GAAG;AAGpD,IAAM,eAAe,CAAC,UACpBV,QAAM,MAAM,MAAM,QAAQ,EAAE;AAAA,EAC1BA,QAAM;AAAA,IAAK;AAAA,IAAU,MACnBU,MAAK,OAAO,MAAM,MAAM,6BAA6B;AAAA,EACvD;AAAA,EACAV,QAAM;AAAA,IAAK;AAAA,IAAS,MAClBC,SAAO;AAAA,MAAUQ,OAAM,OAAO,SAAS;AAAA,MAAG,MACxCC,MAAK,OAAO,MAAM,MAAM,kBAAkB;AAAA,IAC5C;AAAA,EACF;AAAA,EACAV,QAAM;AAAA,IAAO,MACXC,SAAO;AAAA,MAAUQ,OAAM,OAAO,iBAAiB;AAAA,MAAG,MAChDC,MAAK,OAAO,MAAM,MAAM,SAAS;AAAA,IACnC;AAAA,EACF;AACF;AAGF,IAAM,aAAa,CAAC,UAClBT,SAAO;AAAA,EAAUQ,OAAM,OAAO,iBAAiB;AAAA,EAAG,MAChDC,MAAK,OAAO,MAAM,MAAM,SAAS;AACnC;AASK,IAAM,gBAAgB,CAC3B,QACA,UAEAV,QAAM,MAAM,MAAM,EAAE;AAAA,EAClBA,QAAM;AAAA,IAAK;AAAA,IAAU,MACnBU,MAAK,OAAO,aAAa,KAAK,GAAG,UAAU,4BAA4B;AAAA,EACzE;AAAA,EACAV,QAAM,KAAK,UAAU,MAAMU,MAAK,OAAO,MAAM,MAAM,WAAW,UAAU,CAAC;AAAA,EACzEV,QAAM;AAAA,IAAK;AAAA,IAAO,MAChBA,QAAM,MAAM,MAAM,QAAQ,EAAE;AAAA,MAC1BA,QAAM;AAAA,QAAK;AAAA,QAAS,MAClBU,MAAK,OAAO,aAAa,KAAK,GAAG,OAAO,eAAe;AAAA,MACzD;AAAA,MACAV,QAAM;AAAA,QAAO,MACXU,MAAK,OAAO,aAAa,KAAK,GAAG,OAAO,eAAe;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EACAV,QAAM;AAAA,IAAK;AAAA,IAAY,MACrBC,SAAO;AAAA,MAAUQ,OAAM,OAAO,iBAAiB;AAAA,MAAG,MAChDC,MAAK,OAAO,WAAW,KAAK,GAAG,YAAY,eAAe;AAAA,IAC5D;AAAA,EACF;AAAA,EACAV,QAAM,KAAK,UAAU,MAAMU,MAAK,OAAO,MAAM,KAAK,WAAW,UAAU,CAAC;AAAA,EACxEV,QAAM;AACR;AASF,IAAMW,cAAoB;AAAA,EACjB,wBAAsB,gBAAO;AACtC;AAMA,IAAM,kBAAkB,CAAC,UACvBV,SAAO,MAAM,SAAS,KAAK,GAAG;AAAA,EAC5B,QAAQ,MAAM;AAAA,EACd,QAAQ,CAACW,YACPX,SAAO,MAAMA,SAAO,QAAU,OAAIW,SAAQ,KAAK,GAAG,QAAQ,GAAG;AAAA,IAC3D,QAAQ,MAAMA;AAAA,IACd,QAAQ,CAAC,QACPZ,QAAM,MAAQ,iBAAc,GAAG,CAAC,EAAE;AAAA,MAChCA,QAAM,KAAK,MAAM,MAAQ,UAAOY,SAAQ,KAAK,CAAC;AAAA,MAC9CZ,QAAM,OAAO,MAAMY,OAAM;AAAA,IAC3B;AAAA,EACJ,CAAC;AACL,CAAC;AAEH,IAAM,aAAa,CACjB,QACAC,MACA,SACA,YACiB;AAAA,EACjB,MAAM;AAAA,EACN,QAAU,OAAI,QAAQA,MAAO,OAAI,SAAS,UAAU,YAAY,MAAM,CAAC,CAAC;AAC1E;AAEA,IAAM,UAAU,CAAC,YAAiC,EAAE,MAAM,WAAW,OAAO;AAE5E,IAAM,aAAa,CACjB,QACA,QACAA,MACA,SACA,UAEAZ,SAAO,MAAQ,OAAI,SAAS,QAAQ,GAAG;AAAA,EACrC,QAAQ,MAAM,WAAW,QAAQY,MAAK,SAAS,MAAM;AAAA,EACrD,QAAQ,CAAC,UACF;AAAA,IACH,MAAM;AAAA,MACJ,gBAAgB,KAAK;AAAA,MACrB,gBAAgB,YAAY,MAAM,CAAC;AAAA,IACrC;AAAA,IACA;AAAA,MACE,QAAQ,OAAO,EAAE,MAAM,YAAqB;AAAA,MAC5C,SAAS,MACF,YAAM,OAAO;AAAA,QAChB,QAAQ,MAAM,WAAW,QAAQA,MAAK,SAAS,MAAM;AAAA,QACrD,SAAS,OAAO,EAAE,MAAM,YAAqB,SAAS,MAAM;AAAA,MAC9D,CAAC;AAAA,IACL;AAAA,EACF;AACJ,CAAC;AAEH,IAAM,cAAc,CAClB,QACA,QACA,UACgB;AAChB,QAAMA,OAAM,WAAW,MAAM;AAC7B,SAAOZ,SAAO,MAAQ,OAAI,QAAQY,IAAG,GAAG;AAAA,IACtC,QAAQ,MAAM,WAAW,QAAQA,MAAK,CAAC,GAAG,MAAM;AAAA,IAChD,QAAQ,CAAC,YACPZ,SAAO,MAAM,SAAS,OAAO,GAAG;AAAA,MAC9B,QAAQ,MAAM,QAAQ,IAAIY,IAAG,oBAAoB;AAAA,MACjD,QAAQ,CAAC,YAAY,WAAW,QAAQ,QAAQA,MAAK,SAAS,KAAK;AAAA,IACrE,CAAC;AAAA,EACL,CAAC;AACH;AAOO,IAAM,cAAc,CACzB,QACA,UACA,UACgB;AAChB,QAAM,OAAOZ,SAAO;AAAA,IAClBA,SAAO,OAAO,UAAU,CAAC,QAAY,WAAK,GAAG,EAAE,SAAS,CAAC;AAAA,IACzD,MAAM;AAAA,EACR;AACA,SAAOA,SAAO,MAAMU,YAAW,IAAI,GAAG;AAAA,IACpC,QAAQ,MAAM,QAAQ,sBAAsB;AAAA,IAC5C,QAAQ,CAAC,WACPV,SAAO,MAAM,SAAS,MAAM,GAAG;AAAA,MAC7B,QAAQ,MAAM,QAAQ,oCAAoC;AAAA,MAC1D,QAAQ,CAAC,WAAW,YAAY,QAAQ,QAAQ,KAAK;AAAA,IACvD,CAAC;AAAA,EACL,CAAC;AACH;AAEA,IAAM,SACJ,CAAC,QAAgB,SACjB,CAAC,UACC,IAAI,WAAW;AAAA,EACb,SAAS,UAAU,MAAM,IAAI,IAAI,KAAKa,SAAQ,MAAM,OAAO,CAAC;AAAA,EAC5D,UAAU;AACZ,CAAC;AAEL,IAAM,aAAa,CAAC,UACX,6BAA2B,wBAAsB,kBAAS,EAAE,MAAM,CAAC,CAAC;AAG7E,IAAM,SAAS,CAAC,SACd,WAAW,EAAE,IAAI,EAAE;AAAA,EACjBf,SAAO;AAAA,IACL,CAAC,UACC,IAAI,WAAW;AAAA,MACb,SAAS,6BAA6Be,SAAQ,MAAM,OAAO,CAAC;AAAA,MAC5D,UAAU;AAAA,IACZ,CAAC;AAAA,EACL;AACF;AAGF,IAAM,cAAc,CAClB,MACA,MACA,SAEAf,SAAO,IAAI,aAAa;AACtB,QAAM,KAAK,OAAkB;AAC7B,QAAM,QAAQ,OAAY;AAC1B,SAAO,GACJ,cAAc,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC,EACtD,KAAKA,SAAO,SAAS,OAAO,UAAU,IAAI,CAAC,CAAC;AAC/C,QAAM,YAAY,GAAG,IAAI;AACzB,SAAO,GACJ;AAAA,IACC;AAAA,IACA;AAAA,IACAE,SAAO,MAAM,MAAM;AAAA,MACjB,QAAQ,OAAO,CAAC;AAAA,MAChB,QAAQ,CAACQ,YAAW,EAAE,MAAMA,OAAM;AAAA,IACpC,CAAC;AAAA,EACH,EACC,KAAKV,SAAO,SAAS,OAAO,SAAS,IAAI,CAAC,CAAC;AAC9C,SAAO,GACJ,OAAO,WAAW,IAAI,EACtB,KAAKA,SAAO,SAAS,OAAO,WAAW,IAAI,CAAC,CAAC;AAChD,SAAOE,SAAO,MAAM,MAAM;AAAA,IACxB,QAAQ,MAAMF,SAAO;AAAA,IACrB,QAAQ,CAACU,WACP,GAAG,MAAM,MAAMA,MAAK,EAAE,KAAKV,SAAO,SAAS,OAAO,SAAS,IAAI,CAAC,CAAC;AAAA,EACrE,CAAC;AACH,CAAC;AAEH,IAAM,UAAU,CAAC,YAMf;AAAA,EACE,cAAc,YAAY,QAAQ,MAAM,CAAC,OAAO,QAAQ,IAAI;AAAA,EAC5D,aAAa,QAAQ,KAAK;AAAA,EAC1B,aAAa,WAAW,QAAQ,MAAM,CAAC;AAAA,EACvC,GAAGE,SAAO,MAAM,QAAQ,QAAQ;AAAA,IAC9B,QAAQ,MAAM,CAAC;AAAA,IACf,QAAQ,CAAC,WAAW,CAAC,aAAa,MAAM,EAAE;AAAA,EAC5C,CAAC;AACH,EAAE,KAAK,IAAI;AAGN,IAAM,UAAUF,SAAO,GAAG,aAAa,EAAE,WAAW,SAIxD;AACD,QAAM,KAAK,OAAkB;AAC7B,QAAM,SAAS,OAAO,GACnB,OAAO,QAAQ,IAAI,EACnB,KAAKA,SAAO,SAAS,OAAO,WAAW,QAAQ,IAAI,CAAC,CAAC;AACxD,QAAM,WAAW,OAAY,YAAM,QAAQ;AAAA,IACzC,SAAS,MAAMA,SAAO,QAAQE,SAAO,KAAa,CAAC;AAAA,IACnD,QAAQ,MACN,GACG,eAAe,QAAQ,IAAI,EAC3B;AAAA,MACCF,SAAO,IAAIE,SAAO,IAAI;AAAA,MACtBF,SAAO,SAAS,OAAO,QAAQ,QAAQ,IAAI,CAAC;AAAA,IAC9C;AAAA,EACN,CAAC;AAED,SAAOC,QAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,QAAQ,KAAK,CAAC,EAAE;AAAA,IACvEA,QAAM;AAAA,MAAK,EAAE,MAAM,YAAY;AAAA,MAAG,MAChCF,SAAQ,IAAI,yBAAyB,QAAQ,IAAI,mBAAc;AAAA,IACjE;AAAA,IACAE,QAAM;AAAA,MAAK,EAAE,MAAM,UAAU;AAAA,MAAG,CAAC,EAAE,OAAO,MACxCe;AAAA,QACE,GAAG,QAAQ,IAAI,sBAAsB,MAAM;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,IACAf,QAAM;AAAA,MAAK,EAAE,MAAM,WAAW;AAAA,MAAG,CAAC,EAAE,QAAQ,MAC1CD,SAAO;AAAA,QAAQ,OAAO,OAAO;AAAA,QAAG,CAAC,UAC/BD,SAAQ;AAAA,UACN;AAAA,aAAyD,QAAQ,IAAI;AAAA,aAAgB,KAAK;AAAA,QAC5F,EAAE;AAAA,UACAC,SAAO;AAAA,YACLgB;AAAA,cACE,GAAG,QAAQ,IAAI;AAAA,cACf;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACAf,QAAM;AAAA,MAAK,EAAE,MAAM,QAAQ;AAAA,MAAG,CAAC,EAAE,OAAO,MACtCD,SAAO,IAAI,aAAa;AACtB,cAAM,SAAS,OAAY,YAAM,QAAQ;AAAA,UACvC,SAAS,MAAMA,SAAO,QAAQE,SAAO,KAAa,CAAC;AAAA,UACnD,QAAQ,MAAM;AACZ,kBAAM,OAAO,GAAG,QAAQ,IAAI;AAC5B,mBAAO,GACJ,SAAS,QAAQ,MAAM,IAAI,EAC3B;AAAA,cACCF,SAAO,SAAS,OAAO,WAAW,QAAQ,IAAI,CAAC;AAAA,cAC/CA,SAAO,GAAGE,SAAO,KAAK,IAAI,CAAC;AAAA,YAC7B;AAAA,UACJ;AAAA,QACF,CAAC;AACD,cAAM,OAAO,OAAY,YAAM,QAAQ;AAAA,UACrC,SAAS,MAAMF,SAAO,QAAQE,SAAO,KAAa,CAAC;AAAA,UACnD,QAAQ,MACN,GAAG,KAAK,QAAQ,IAAI,EAAE;AAAA,YACpBF,SAAO,IAAI,CAAC,SAASE,SAAO,KAAK,KAAK,IAAI,CAAC;AAAA,YAC3CF,SAAO,SAAS,OAAO,WAAW,QAAQ,IAAI,CAAC;AAAA,UACjD;AAAA,QACJ,CAAC;AACD,cAAM,OAAO,GAAG,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE;AAAA,UAC3CA,SAAO;AAAA,YACL,CAAC,UACC,IAAI,WAAW;AAAA,cACb,SAAS,6BAA6Be,SAAQ,MAAM,OAAO,CAAC;AAAA,cAC5D,UAAU;AAAA,YACZ,CAAC;AAAA,UACL;AAAA,QACF,CAAC;AAAA;AACD,eAAO,YAAY,QAAQ,MAAM,MAAM,IAAI;AAC3C,eAAOhB,SAAQ;AAAA,UACb,QAAQ;AAAA,YACN,QAAQ,QAAQ;AAAA,YAChB,MAAM,QAAQ;AAAA,YACd,OAAO,OAAO,OAAO,YAAY,QAAQ,MAAM,CAAC;AAAA,YAChD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACAE,QAAM;AAAA,EACR;AACF,CAAC;AAGM,IAAM,iBAAiBD,SAAO,GAAG,oBAAoB;AAAA,EAC1D,WAAW,SAIR;AACD,UAAM,cAAc,OAAO;AAC3B,UAAM,OAAOE,SAAO;AAAA,MAAU,QAAQ;AAAA,MAAM,MAC1C,cAAc,QAAQ,QAAQ,WAAW;AAAA,IAC3C;AACA,WAAO,QAAQ,EAAE,QAAQ,QAAQ,QAAQ,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,EACvE;AACF;;;AC9ZA,SAAS,WAAAe,UAAS,UAAAC,gBAAc;AAChC,SAAS,gBAAgB;AACzB,SAAS,QAAQ,YAAY,aAAa,cAAc;AACxD,SAAS,SAAS,cAAc;AAChC,SAAS,QAAAC,QAAM,eAAe;AAiB9B,IAAM,gBAAgB,CAAC,UACrB,MAAM,gBACL,MAAM,WAAW,OACd,6BACAA,OAAK,QAAQ,GAAG,gBAAgB,YAAY;AAElD,IAAM,MAAM,CAAC,KAAa,SACxBD,SAAO,WAAW;AAAA,EAChB,KAAK,MACH,IAAI,QAAgB,CAAC,gBAAgB,WAAW;AAC9C;AAAA,MAAS;AAAA,MAAK,CAAC,GAAG,IAAI;AAAA,MAAG,CAAC,OAAO,WAC/B,UAAU,OAAO,eAAe,MAAM,IAAI,OAAO,KAAK;AAAA,IACxD;AAAA,EACF,CAAC;AAAA,EACH,OAAO,CAAC,UAAU,IAAI,MAAM,GAAG,GAAG,YAAY,OAAO,KAAK,CAAC,EAAE;AAC/D,CAAC;AAEH,IAAM,UAAU,CAAC,QAAgB,gBAC/BA,SAAO,KAAK,MAAM;AAChB,MAAI,CAAC,WAAWC,OAAK,QAAQ,YAAY,YAAY,CAAC;AACpD,UAAM,IAAI,MAAM,GAAG,MAAM,sBAAsB;AACjD,SAAO,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACpD,SAAO,QAAQ,aAAa,EAAE,WAAW,KAAK,CAAC;AACjD,CAAC;AAEI,IAAM,iBAAiBD,SAAO,GAAG,iBAAiB,EAAE,WACzD,OACA;AACA,MAAI,QAAQ,aAAa,SAAS;AAChC,QAAI,MAAM,QAAQ;AAChB,aAAO,OAAOA,SAAO;AAAA,QACnB,IAAI,MAAM,0CAA0C;AAAA,MACtD;AACF,WAAO;AAAA,MACL,QAAQ,MAAM,GAAG;AAAA,MACjB,MAAM,WAAW,OACb,CAAC,WAAW,qBAAqB,YAAY,IAC7C,CAAC;AAAA,IACP;AACA,WAAOD,SAAQ;AAAA,MACb,MAAM,WAAW,OACb,uBACA;AAAA,IACN;AACA;AAAA,EACF;AACA,MAAI,QAAQ,aAAa;AACvB,WAAO,OAAOC,SAAO;AAAA,MACnB,IAAI,MAAM,sDAAsD;AAAA,IAClE;AACF,MAAI,MAAM,QAAQ,UAAa,MAAM,QAAQ;AAC3C,WAAO,OAAOA,SAAO;AAAA,MACnB,IAAI,MAAM,6CAA6C;AAAA,IACzD;AAEF,QAAM,cAAc,cAAc,KAAK;AACvC,MAAI,MAAM,QAAQ,QAAW;AAC3B,WAAO,QAAQ,QAAQ,MAAM,GAAG,GAAG,WAAW;AAAA,EAChD,OAAO;AACL,UAAM,QAAQ,YAAYC,OAAK,OAAO,GAAG,aAAa,CAAC;AACvD,WAAOD,SAAO;AAAA,MACZA,SAAO,IAAI,aAAa;AACtB,eAAO,IAAI,WAAW;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,MAAM,GAAa;AAAA,QAC7B,CAAC;AACD,eAAO,QAAQC,OAAK,OAAO,YAAY,GAAG,WAAW;AAAA,MACvD,CAAC;AAAA,MACDD,SAAO,KAAK,MAAM;AAChB,aAAK,IAAI,WAAW,CAAC,UAAU,KAAK,CAAC;AACrC,eAAO,OAAO,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAOD,SAAQ,IAAI,aAAa,WAAW,EAAE;AAC7C,SAAO,IAAI,QAAQ,CAAC,WAAW,CAAC;AAClC,CAAC;;;A9CzEM,IAAM,UACX,OAAyC,UAAqB;AAEhE,IAAM,aAAaG,MAAK,OAAO,QAAQ,EAAE;AAAA,EACvCA,MAAK;AAAA,EACLA,MAAK;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAM,YAAYA,MAAK,OAAO,OAAO,EAAE;AAAA,EACrCA,MAAK;AAAA,EACLA,MAAK,gBAAgB,qBAAqB;AAC5C;AAEA,IAAMC,SAAQC,SAAQ;AAAA,EACpB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,WAAWF,MAAK,OAAO,YAAY,EAAE;AAAA,MACnCA,MAAK;AAAA,MACLA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQA,MAAK,QAAQ,QAAQ,EAAE;AAAA,MAC7BA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAUA,MAAK,OAAO,WAAW,EAAE;AAAA,MACjCA,MAAK;AAAA,MACLA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAASA,MAAK,QAAQ,SAAS,EAAE;AAAA,MAC/BA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAKA,MAAK,QAAQ,KAAK,EAAE;AAAA,MACvBA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAKA,MAAK,OAAO,KAAK,EAAE;AAAA,MACtBA,MAAK;AAAA,MACLA,MAAK,gBAAgB,kDAAkD;AAAA,IACzE;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACAG,SAAO,GAAG,WAAW;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAAC;AAAA,IACA;AAAA,EACF,GAAG;AACD,QAAI,WAAW;AACb,aAAO,OAAOC;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AACF,WAAO,aAAa;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU,YAAY,MAAM,QAAQ;AAAA,MAC5C,QAAQD;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,EAAE;AAAA,EACAF,SAAQ;AAAA,IACN;AAAA,EACF;AACF;AAEA,IAAM,gBAAgBA,SAAQ;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,KAAKI,UAAS,OAAO,KAAK,EAAE;AAAA,MAC1BA,UAAS,YAAY,aAAa;AAAA,MAClCA,UAAS,gBAAgB,iDAA4C;AAAA,IACvE;AAAA,IACA,OAAO;AAAA,IACP,OAAON,MAAK,OAAO,OAAO,EAAE;AAAA,MAC1BA,MAAK;AAAA,MACLA,MAAK,gBAAgB,kCAAkC;AAAA,IACzD;AAAA,IACA,QAAQ;AAAA,EACV;AAAA,EACAG,SAAO,GAAG,WAAW,EAAE,KAAAC,MAAK,OAAO,OAAO,OAAO,GAAG;AAClD,UAAM,cAAc,OAAO;AAC3B,WAAO,OAAO;AAAA,MACZ,QAAQ,cAAc,QAAQ,WAAW;AAAA,MACzC,KAAAA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,EAAE,KAAKF,SAAQ,gBAAgB,gCAAgC,CAAC;AAEhE,IAAM,MAAMA,SAAQ,KAAK,KAAK,EAAE;AAAA,EAC9BA,SAAQ,gBAAgB,iBAAiB;AAAA,EACzCA,SAAQ,gBAAgB,CAAC,aAAa,CAAC;AACzC;AAEA,IAAM,gBAAgBA,SAAQ,KAAK,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE;AAAA,EAC/DA,SAAQ,gBAAgB,kCAAkC;AAC5D;AAEA,IAAMK,eAAcL,SAAQ;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,MAAMI,UAAS,KAAK,QAAQ,EAAE,WAAW,KAAK,CAAC,EAAE;AAAA,MAC/CA,UAAS,YAAY,MAAM;AAAA,MAC3BA,UAAS,gBAAgB,0BAA0B;AAAA,IACrD;AAAA,IACA,UAAUN,MAAK,QAAQ,UAAU,EAAE;AAAA,MACjCA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAMA,MAAK,OAAO,MAAM,EAAE;AAAA,MACxBA,MAAK;AAAA,MACLA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAWA,MAAK,OAAO,YAAY,EAAE;AAAA,MACnCA,MAAK;AAAA,MACLA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACAG,SAAO,GAAG,WAAW,EAAE,MAAM,UAAU,MAAM,UAAU,GAAG;AACxD,WAAOK,MAAK,EAAE,MAAM,UAAU,MAAM,UAAU,CAAC;AAAA,EACjD,CAAC;AACH,EAAE;AAAA,EACAN,SAAQ;AAAA,IACN;AAAA,EACF;AACF;AAEA,IAAM,eAAeA,SAAQ,KAAK,OAAO,EAAE;AAAA,EACzCA,SAAQ;AAAA,IACN;AAAA,EACF;AACF;AAEA,IAAM,mBAAmBA,SAAQ;AAAA,EAC/B;AAAA,EACA;AAAA,IACE,MAAMI,UAAS,SAAS,QAAQ,CAAC,WAAW,SAAS,CAAC;AAAA,IACtD,OAAOA,UAAS,OAAO,OAAO;AAAA,EAChC;AAAA,EACAH,SAAO,GAAG,WAAW,EAAE,MAAM,OAAAM,OAAM,GAAG;AACpC,WAAO,UAAU,EAAE,MAAM,OAAAA,OAAM,CAAC;AAAA,EAClC,CAAC;AACH,EAAE,KAAKP,SAAQ,gBAAgB,eAAe,CAAC;AAE/C,IAAM,mBAAmBA,SAAQ;AAAA,EAC/B;AAAA,EACA,EAAE,OAAOI,UAAS,OAAO,OAAO,EAAE;AAAA,EAClCH,SAAO,GAAG,WAAW,EAAE,MAAM,GAAG;AAC9B,WAAO,UAAU,KAAK;AAAA,EACxB,CAAC;AACH,EAAE,KAAKD,SAAQ,gBAAgB,4BAA4B,CAAC;AAE5D,IAAM,gBAAgBA,SAAQ,KAAK,UAAU,CAAC,GAAG,MAAM,WAAW,CAAC,EAAE;AAAA,EACnEA,SAAQ,gBAAgB,oCAAoC;AAAA,EAC5DA,SAAQ,gBAAgB;AAAA,IACtBA,SAAQ,KAAK,QAAQ,CAAC,GAAG,MAAM,WAAW,CAAC,EAAE;AAAA,MAC3CA,SAAQ,gBAAgB,uCAAuC;AAAA,IACjE;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,IAAM,gBAAgBA,SAAQ;AAAA,EAC5B;AAAA,EACA,EAAE,OAAO,UAAU;AAAA,EACnBC,SAAO,GAAG,WAAW,EAAE,MAAM,GAAG;AAC9B,WAAO,OAAO,KAAK;AAAA,EACrB,CAAC;AACH,EAAE;AAAA,EACAD,SAAQ;AAAA,IACN;AAAA,EACF;AACF;AAEA,IAAM,oBAAoBA,SAAQ;AAAA,EAChC;AAAA,EACA;AAAA,IACE,QAAQF,MAAK,SAAS,UAAU,OAAO,EAAE;AAAA,MACvCA,MAAK,gBAAgB,sCAAsC;AAAA,IAC7D;AAAA,IACA,OAAOA,MAAK,QAAQ,OAAO,EAAE;AAAA,MAC3BA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAMA,MAAK,OAAO,MAAM,EAAE;AAAA,MACxBA,MAAK;AAAA,MACLA,MAAK,gBAAgB,iDAAiD;AAAA,IACxE;AAAA,EACF;AAAA,EACAG,SAAO,GAAG,WAAW,EAAE,QAAQ,OAAO,KAAK,GAAG;AAC5C,WAAO,eAAe,EAAE,QAAQ,OAAO,KAAK,CAAC;AAAA,EAC/C,CAAC;AACH,EAAE;AAAA,EACAD,SAAQ;AAAA,IACN;AAAA,EACF;AACF;AAEA,IAAM,wBAAwBA,SAAQ;AAAA,EACpC;AAAA,EACA;AAAA,IACE,KAAKF,MAAK,OAAO,KAAK,EAAE;AAAA,MACtBA,MAAK;AAAA,MACLA,MAAK,gBAAgB,yBAAyB;AAAA,IAChD;AAAA,IACA,KAAKA,MAAK,OAAO,KAAK,EAAE;AAAA,MACtBA,MAAK;AAAA,MACLA,MAAK,gBAAgB,6BAA6B;AAAA,IACpD;AAAA,IACA,KAAKA,MAAK,OAAO,KAAK,EAAE;AAAA,MACtBA,MAAK;AAAA,MACLA,MAAK,gBAAgB,mCAAmC;AAAA,IAC1D;AAAA,IACA,QAAQA,MAAK,QAAQ,QAAQ,EAAE;AAAA,MAC7BA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK,gBAAgB,+CAA+C;AAAA,IACtE;AAAA,IACA,QAAQA,MAAK,QAAQ,QAAQ,EAAE;AAAA,MAC7BA,MAAK,YAAY,KAAK;AAAA,MACtBA,MAAK,gBAAgB,4BAA4B;AAAA,IACnD;AAAA,IACA,aAAaA,MAAK,OAAO,aAAa,EAAE;AAAA,MACtCA,MAAK;AAAA,MACLA,MAAK,gBAAgB,wCAAwC;AAAA,IAC/D;AAAA,EACF;AAAA,EACAG,SAAO,GAAG,WAAW,EAAE,KAAK,KAAK,KAAK,QAAQ,QAAQ,YAAY,GAAG;AACnE,WAAO,eAAe;AAAA,MACpB,KAAKO,SAAO,eAAe,GAAG;AAAA,MAC9B,KAAKA,SAAO,eAAe,GAAG;AAAA,MAC9B,KAAKA,SAAO,eAAe,GAAG;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,aAAaA,SAAO,eAAe,WAAW;AAAA,IAChD,CAAC;AAAA,EACH,CAAC;AACH,EAAE,KAAKR,SAAQ,gBAAgB,2CAA2C,CAAC;AAE3E,IAAM,iBAAiBA,SAAQ,KAAK,WAAW,CAAC,CAAC,EAAE;AAAA,EACjDA,SAAQ,gBAAgB,4BAA4B;AAAA,EACpDA,SAAQ,gBAAgB,CAAC,qBAAqB,CAAC;AACjD;AAEA,IAAM,aAAaA,SAAQ,KAAK,OAAO,CAAC,GAAG,MAAM,OAAO,OAAO,CAAC,EAAE;AAAA,EAChEA,SAAQ;AAAA,IACN;AAAA,EACF;AAAA,EACAA,SAAQ,gBAAgB,CAAC,iBAAiB,CAAC;AAC7C;AAGO,IAAM,SAASA,SAAQ,KAAK,QAAQ,EAAE;AAAA,EAC3CA,SAAQ;AAAA,IACN;AAAA,EACF;AAAA,EACAA,SAAQ,gBAAgB;AAAA,IACtBD;AAAA,IACA;AAAA,IACA;AAAA,IACAM;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAGO,IAAM,SAAS,CAAC,SACrBL,SAAQ,QAAQ,QAAQ,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,EAAE,IAAI;AAQzE,IAAM,WAAW,CAACS,aAAiC;AACjD,MAAIA,SAAQ,SAAS,QAAS,QAAO;AACrC,MAAIA,SAAQ,SAAS,WAAY,QAAO;AACxC,MAAIA,SAAQ,SAAS,UAAW,QAAO;AACvC,SAAO;AACT;AAEA,IAAM,WAAW,CACf,UAYAC,QAAM,MAAM,KAAK,EAAE;AAAA,EACjBA,QAAM,IAAI,gBAAgB,CAAC,UAAU;AAAA,IACnC,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,EAChB,EAAE;AAAA,EACFA,QAAM,IAAI,uBAAuB,CAACC,kBAAiB;AAAA,IACjD,MAAM;AAAA,IACN,SAASA,aAAY;AAAA,EACvB,EAAE;AAAA,EACFD,QAAM,IAAI,eAAe,CAACD,cAAa;AAAA,IACrC,MAAM,SAASA,QAAO;AAAA,IACtB,SAASA,SAAQ;AAAA,EACnB,EAAE;AAAA,EACFC,QAAM,IAAI,cAAc,CAACD,cAAa;AAAA,IACpC,MAAMA,SAAQ;AAAA,IACd,SAASA,SAAQ;AAAA,EACnB,EAAE;AAAA,EACFC,QAAM;AAAA,IAAI;AAAA,IAAY,CAAC,SACrB,KAAK,OAAO,WAAW,IACnB,EAAE,MAAM,GAAG,SAAS,GAAG,IACvB;AAAA,MACE,MAAM;AAAA,MACN,SAASF,SAAO;AAAA,QACV,WAAK,KAAK,MAAM,EAAE,KAAKA,SAAO,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC;AAAA,QAC7D,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACN;AAAA,EACAE,QAAM,IAAI,aAAa,CAAC,UAAU;AAAA,IAChC,MAAM;AAAA,IACN,SAAS,KAAK,eAAeE,SAAQ,KAAK,KAAK;AAAA,EACjD,EAAE;AAAA,EACFF,QAAM,OAAO,CAAC,WAAW,EAAE,MAAM,YAAY,SAAS,MAAM,QAAQ,EAAE;AACxE;AASK,IAAM,OAAOT,SAAO,GAAG,QAAQ,EAAE,WACtC,MACA;AACA,SAAO,OAAO,OAAO,IAAI,EAAE;AAAA,IACzBA,SAAO,GAAG,CAAC;AAAA,IACXA,SAAO,MAAM,CAAC,UAAU;AACtB,YAAM,YAAY,SAAS,KAAK;AAChC,UAAI,UAAU,SAAS,EAAG,QAAOA,SAAO,QAAQ,CAAC;AACjD,UAAI,UAAU,QAAQ,WAAW,EAAG,QAAOA,SAAO,QAAQ,UAAU,IAAI;AACxE,aAAOY,SAAQ,MAAM,WAAWD,SAAQ,UAAU,OAAO,CAAC,EAAE,EAAE;AAAA,QAC5DX,SAAO,GAAG,UAAU,IAAI;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;",
6
+ "names": ["Argument", "Command", "Flag", "Console", "Effect", "Match", "Option", "Tool", "Schema", "Schema", "Tool", "Effect", "Layer", "Context", "Effect", "Schema", "Schema", "value", "Schema", "Context", "Effect", "McpServer", "Context", "Effect", "Layer", "Option", "Schema", "Str", "Context", "Layer", "Option", "Str", "Option", "Effect", "Option", "Context", "layer", "Layer", "run", "Context", "Effect", "Layer", "Option", "Schema", "Arr", "P", "R", "Str", "Effect", "Match", "Arr", "Option", "Schema", "Str", "Schema", "value", "Match", "filter", "Effect", "key", "field", "digest", "values", "head", "portOf", "Schema", "Effect", "Schema", "Option", "Schema", "Effect", "filter", "Crypto", "Effect", "Match", "Option", "Arr", "FileSystem", "Path", "P", "Effect", "Match", "Schema", "Arr", "Option", "Order", "Result", "Str", "Match", "Arr", "HashMap", "Option", "Order", "P", "R", "Result", "Schema", "Match", "Arr", "Option", "P", "Schema", "Str", "segments", "at", "value", "refusal", "pointerToken", "value", "Match", "record", "key", "field", "refusal", "keys", "defaultValue", "name", "values", "Schema", "Effect", "crypto", "value", "open", "head", "match", "step", "key", "Match", "failure", "ordered", "Effect", "FileSystem", "Path", "Effect", "refusal", "Match", "value", "findStep", "findPipelineParam", "Option", "textOf", "Effect", "crypto", "Crypto", "Arr", "HashMap", "Option", "Order", "Schema", "asJson", "value", "jsonOf", "edgeKey", "field", "Effect", "Option", "Arr", "R", "Result", "Schema", "Effect", "Schema", "FileSystem", "Option", "Path", "Schema", "Effect", "Effect", "Option", "Arr", "Result", "Schema", "Effect", "Option", "at", "head", "set", "open", "Option", "Schema", "Effect", "Match", "Option", "Arr", "R", "Result", "Effect", "Arr", "Option", "matches", "Effect", "Schema", "Context", "Option", "Effect", "row", "options", "key", "matches", "value", "head", "tag", "field", "Context", "Effect", "Layer", "Option", "Effect", "Schema", "Str", "fail", "oneLine", "value", "Context", "Effect", "Layer", "Option", "Arr", "R", "FileSystem", "Path", "Schema", "Str", "Effect", "Option", "Context", "configPath", "Layer", "Effect", "read", "oneLine", "write", "all", "Option", "fail", "value", "key", "defaultOf", "Context", "layer", "Layer", "Effect", "Option", "value", "Context", "Effect", "Crypto", "FileSystem", "Path", "McpSchema", "Toolkit", "HttpClient", "Effect", "Option", "Effect", "Option", "Effect", "Schema", "refusal", "Effect", "Effect", "HttpClient", "Effect", "Option", "value", "Effect", "Option", "Path", "failure", "Effect", "Option", "Effect", "Option", "Path", "failure", "Effect", "Option", "Context", "Effect", "Layer", "Option", "Schema", "FileSystem", "Path", "HttpClient", "HttpClientRequest", "HttpClientResponse", "Schema", "request", "Effect", "Option", "Context", "read", "make", "value", "layer", "Layer", "McpSchema", "Toolkit", "Effect", "Layer", "Effect", "layer", "McpServer", "Arr", "Console", "Effect", "Option", "Path", "Console", "Context", "Duration", "Effect", "Layer", "Option", "Predicate", "Schema", "HttpClient", "HttpClientRequest", "HttpClientResponse", "Str", "Duration", "Schema", "Context", "Layer", "Effect", "oneLine", "SessionUser", "SessionBody", "HttpClient", "fail", "HttpClientResponse", "HttpClientRequest", "Option", "value", "Predicate", "Console", "failure", "Cause", "Console", "Duration", "Effect", "Match", "Option", "HttpClient", "HttpClientRequest", "HttpClientResponse", "Schema", "Duration", "Effect", "oneLine", "Option", "value", "Match", "refusal", "HttpClient", "request", "HttpClientRequest", "fail", "HttpClientResponse", "Cause", "Console", "Effect", "Option", "Arr", "FileSystem", "HttpClient", "HttpClientRequest", "HttpClientResponse", "Path", "Schema", "ErrorBody", "oneLine", "Option", "Effect", "HttpClient", "HttpClientResponse", "fail", "matches", "request", "HttpClientRequest", "value", "Option", "Console", "failure", "Effect", "key", "fail", "push", "Argument", "Command", "Flag", "Effect", "Console", "Effect", "Option", "Schema", "Arr", "EXIT_USAGE", "Effect", "Option", "fail", "value", "Schema", "Console", "encoded", "conflict", "head", "field", "asJson", "refusal", "Argument", "Command", "Flag", "Console", "Effect", "Match", "Option", "Schema", "Arr", "Option", "apiFailure", "Match", "value", "Schema", "values", "key", "hash", "at", "Command", "Flag", "Effect", "Console", "Argument", "Command", "Argument", "Flag", "Effect", "Console", "Effect", "Match", "Option", "Bool", "FileSystem", "Path", "P", "R", "Schema", "Str", "value", "join", "decodeJson", "record", "key", "oneLine", "fail", "Console", "Effect", "join", "Flag", "login", "Command", "Effect", "key", "fail", "Argument", "pushCommand", "push", "value", "Option", "failure", "Match", "unavailable", "oneLine", "Console"]
7
7
  }