knowbrain-cli 0.0.1-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -0
- package/dist/kb.js +2622 -0
- package/dist/kb.js.map +1 -0
- package/package.json +42 -0
package/dist/kb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/run.ts","../src/http/http-error.ts","../src/cli/program.ts","../src/commands/connectors/connectors.ts","../../sdk/src/omi-sdk-error.ts","../../sdk/src/error-from-response.ts","../../../packages/core/src/utils/kb-uri.ts","../../../packages/core/src/utils/logger.ts","../../../packages/core/src/metadata/field-role.ts","../../../packages/core/src/metadata/field-decorator.ts","../../../packages/core/src/metadata/space-scoped-base.ts","../../../packages/core/src/connectors/resource.ts","../../../packages/core/src/space/types.ts","../../../packages/core/src/store/types.ts","../../../packages/core/src/task/default-task.ts","../../../packages/core/src/task/resource.ts","../../sdk/src/parse-wire.ts","../../sdk/src/url.ts","../../sdk/src/create-omi-sdk.ts","../src/auth/origin.ts","../src/auth/credentials.ts","../src/auth/authenticated-fetch.ts","../src/cli/api-base.ts","../src/cli/sdk-factory.ts","../src/cli/context.ts","../src/cli/space-resolve.ts","../src/http/write-json.ts","../src/http/command-success.ts","../src/http/sdk-bridge.ts","../src/cli/task-resolve.ts","../src/commands/diff.ts","../src/commands/proposal/proposal.ts","../src/commands/search.ts","../src/commands/shell.ts","../src/commands/space/space.ts","../src/commands/store/store.ts","../src/commands/store/store-cli-output.ts","../src/commands/task/task.ts","../src/auth/constants.ts","../src/auth/device-oauth.ts","../src/auth/open-url.ts","../src/commands/login.ts","../src/commands/wait-sync.ts","../src/main.ts"],"sourcesContent":["import { CommanderError } from \"commander\";\n\nimport { writeCliError, type CliErrorJson } from \"../http/http-error.js\";\nimport { buildProgram } from \"./program.js\";\nimport { DEFAULT_BASE_URL, defaultKbCliDeps, type KbCliDeps } from \"./context.js\";\n\nexport type { KbCliDeps } from \"./context.js\";\nexport { defaultKbCliDeps } from \"./context.js\";\n\nfunction validationError(message: string): CliErrorJson {\n return { code: \"VALIDATION_ERROR\", message, details: null };\n}\n\nfunction printUsage(stderr: NodeJS.WriteStream): void {\n stderr.write(`Usage:\n kb login\n kb logout\n kb [--base-url <url>] [--log-level <level>] [--space <id>] space create ...\n kb [--base-url <url>] [--log-level <level>] [--space <id>] store create [--name <name>] ...\n kb [--base-url <url>] [--log-level <level>] [--space <id>] waitSync --store <kb://...>\n\nEnvironment:\n KB_BASE_URL Service origin (default ${DEFAULT_BASE_URL})\n KB_API_PATH_PREFIX Resource API path prefix (default /api/knowbrain; empty for direct OMI)\n KB_SPACE Default space id when --space is omitted (overrides login credentials)\n`);\n}\n\nexport async function runKbCli(\n argv: string[],\n deps: KbCliDeps = defaultKbCliDeps,\n): Promise<number> {\n if (argv.length === 0) {\n printUsage(deps.stderr);\n return 1;\n }\n\n const exitRef = { code: 0 };\n const program = buildProgram(deps, exitRef);\n program.exitOverride();\n program.showHelpAfterError(false);\n\n try {\n await program.parseAsync(argv, { from: \"user\" });\n return exitRef.code;\n } catch (e) {\n if (e instanceof CommanderError) {\n if (e.exitCode === 0) {\n return 0;\n }\n writeCliError(deps.stderr, validationError(e.message));\n return e.exitCode;\n }\n const message = e instanceof Error ? e.message : String(e);\n writeCliError(deps.stderr, { code: \"INTERNAL\", message, details: null });\n return 1;\n }\n}\n","export type CliErrorJson = {\n code: string;\n message: string;\n details: unknown;\n};\n\nexport function writeCliError(stderr: NodeJS.WriteStream, err: CliErrorJson): void {\n stderr.write(`${JSON.stringify(err)}\\n`);\n}\n\nfunction statusFallbackCode(status: number): string {\n if (status === 404) return \"NOT_FOUND\";\n if (status === 409) return \"CONFLICT\";\n if (status === 400) return \"VALIDATION_ERROR\";\n return \"INTERNAL\";\n}\n\n/**\n * Maps HTTP error bodies from the OMI server (structured or legacy `{ error }`) into CLI stderr JSON.\n */\nexport async function cliErrorFromResponse(res: Response): Promise<CliErrorJson> {\n const text = await res.text();\n try {\n const j = JSON.parse(text) as unknown;\n if (j && typeof j === \"object\" && !Array.isArray(j)) {\n const o = j as Record<string, unknown>;\n if (typeof o[\"code\"] === \"string\" && typeof o[\"message\"] === \"string\") {\n return {\n code: o[\"code\"],\n message: o[\"message\"],\n details: \"details\" in o ? (o[\"details\"] ?? null) : null,\n };\n }\n if (typeof o[\"error\"] === \"string\") {\n return {\n code: statusFallbackCode(res.status),\n message: o[\"error\"],\n details: null,\n };\n }\n }\n } catch {\n /* use fallback below */\n }\n return {\n code: statusFallbackCode(res.status),\n message: text.length > 0 ? text : res.statusText || `HTTP ${res.status}`,\n details: null,\n };\n}\n","import { Command } from \"commander\";\n\nimport { registerConnectorCommands } from \"../commands/connectors/connectors.js\";\nimport { registerDiffCommand } from \"../commands/diff.js\";\nimport { registerProposalCommands } from \"../commands/proposal/proposal.js\";\nimport { registerSearchCommand } from \"../commands/search.js\";\nimport { registerShellCommand } from \"../commands/shell.js\";\nimport { registerSpaceCommands } from \"../commands/space/space.js\";\nimport { registerStoreCommands } from \"../commands/store/store.js\";\nimport { registerTaskCommands } from \"../commands/task/task.js\";\nimport { registerLoginCommand, registerLogoutCommand } from \"../commands/login.js\";\nimport { registerWaitSyncCommand } from \"../commands/wait-sync.js\";\nimport { DEFAULT_BASE_URL, type KbCliDeps } from \"./context.js\";\n\nexport function buildProgram(deps: KbCliDeps, exitRef: { code: number }): Command {\n const program = new Command();\n program.name(\"kb\");\n program\n .option(\"--base-url <url>\", \"API base URL\", deps.env[\"KB_BASE_URL\"] ?? DEFAULT_BASE_URL)\n .option(\"--log-level <level>\", \"stderr log level (error|warn|info|debug)\", \"error\")\n .option(\n \"--space <id>\",\n \"Default space id (overrides KB_SPACE and login credentials)\",\n deps.env[\"KB_SPACE\"],\n );\n program.option(\n \"--task <id>\",\n \"Default task id for task/proposal/shell/diff commands (overrides KB_TASK)\",\n deps.env[\"KB_TASK\"],\n );\n\n registerLoginCommand(program, program, deps, exitRef);\n registerLogoutCommand(program, program, deps, exitRef);\n\n const space = program.command(\"space\").description(\"Manage spaces\");\n registerSpaceCommands(space, program, deps, exitRef);\n\n const store = program\n .command(\"store\")\n .description(\"Manage stores (space from --space, KB_SPACE, or kb login credentials)\");\n registerStoreCommands(store, program, deps, exitRef);\n\n const connectors = program\n .command(\"connectors\")\n .description(\"Manage connectors (space from --space, KB_SPACE, or kb login credentials)\");\n registerConnectorCommands(connectors, program, deps, exitRef);\n\n const task = program\n .command(\"task\")\n .description(\"Manage tasks (space from --space, KB_SPACE, or kb login credentials)\");\n registerTaskCommands(task, program, deps, exitRef);\n\n const proposal = program.command(\"proposal\").description(\"Manage proposals in the current task\");\n registerProposalCommands(proposal, program, deps, exitRef);\n\n registerWaitSyncCommand(program, program, deps, exitRef);\n registerSearchCommand(program, program, deps, exitRef);\n registerShellCommand(program, program, deps, exitRef);\n registerDiffCommand(program, program, deps, exitRef);\n return program;\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport type { ConnectorCreateInput } from \"@omi/core\";\nimport type { Command } from \"commander\";\nimport { parse as parseYaml } from \"yaml\";\n\nimport { createKbSdk } from \"../../cli/sdk-factory.js\";\n\nimport { createKbCliContext, type KbCliDeps } from \"../../cli/context.js\";\nimport { requireSpaceId } from \"../../cli/space-resolve.js\";\nimport { successJson, writeCommandSuccess } from \"../../http/command-success.js\";\nimport { writeCliError } from \"../../http/http-error.js\";\nimport { cliErrorFromUnknown } from \"../../http/sdk-bridge.js\";\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === \"object\" && x !== null && !Array.isArray(x);\n}\n\nfunction parseKvList(values: string[] | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n if (values === undefined) {\n return out;\n }\n for (const raw of values) {\n const i = raw.indexOf(\"=\");\n if (i <= 0) {\n throw new Error(`invalid --config-kv \"${raw}\": expected KEY=value`);\n }\n const k = raw.slice(0, i).trim();\n const v = raw.slice(i + 1);\n if (k.length === 0) {\n throw new Error(`invalid --config-kv \"${raw}\": empty key`);\n }\n out[k] = v;\n }\n return out;\n}\n\nfunction mergeStringMaps(\n base: Record<string, string>,\n extra: Record<string, string>,\n): Record<string, string> {\n return { ...base, ...extra };\n}\n\nasync function loadConnectorCreateInputFromFile(\n path: string,\n): Promise<Partial<ConnectorCreateInput>> {\n const text = await readFile(path, \"utf8\");\n const raw: unknown = path.endsWith(\".json\") ? JSON.parse(text) : parseYaml(text);\n if (!isRecord(raw)) {\n throw new Error(\"config file root must be an object\");\n }\n const out: Partial<ConnectorCreateInput> = {};\n if (typeof raw[\"id\"] === \"string\") {\n out.id = raw[\"id\"];\n }\n if (typeof raw[\"name\"] === \"string\") {\n out.name = raw[\"name\"];\n }\n if (typeof raw[\"description\"] === \"string\") {\n out.description = raw[\"description\"];\n }\n if (typeof raw[\"type\"] === \"string\") {\n out.type = raw[\"type\"];\n }\n if (isRecord(raw[\"config\"])) {\n const c: Record<string, string> = {};\n for (const [k, v] of Object.entries(raw[\"config\"])) {\n if (typeof v === \"string\") {\n c[k] = v;\n }\n }\n out.config = c;\n }\n if (isRecord(raw[\"secrets\"])) {\n const s: Record<string, string> = {};\n for (const [k, v] of Object.entries(raw[\"secrets\"])) {\n if (typeof v === \"string\") {\n s[k] = v;\n }\n }\n out.secrets = s;\n }\n if (Array.isArray(raw[\"targetStoreIds\"])) {\n const ids = raw[\"targetStoreIds\"].filter((x): x is string => typeof x === \"string\");\n out.targetStoreIds = ids;\n }\n return out;\n}\n\n/**\n * Registers `kb connectors …` subcommands.\n */\nexport function registerConnectorCommands(\n connectors: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n connectors\n .command(\"create\")\n .description(\"Create a connector in the current space\")\n .option(\"--id <id>\", \"Explicit connector id\")\n .option(\"--name <name>\", \"Display name\")\n .option(\"--description <text>\", \"Description\")\n .option(\"--type <type>\", \"Connector type (e.g. notion, feishu)\")\n .option(\"--target-stores <csv>\", \"Comma-separated target store ids\")\n .option(\"--config <path>\", \"YAML or JSON file with partial create fields\")\n .option(\"--config-kv <pair...>\", \"Non-secret config KEY=value (repeat for multiple keys)\")\n .option(\"--secret-kv <pair...>\", \"Secret KEY=value (repeat for multiple keys)\")\n .action(\n async (opts: {\n id?: string;\n name?: string;\n description?: string;\n type?: string;\n targetStores?: string;\n config?: string;\n configKv?: string[];\n secretKv?: string[];\n }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n let fileInput: Partial<ConnectorCreateInput> = {};\n if (opts.config !== undefined) {\n fileInput = await loadConnectorCreateInputFromFile(opts.config);\n }\n const targetFromFlag =\n opts.targetStores !== undefined\n ? opts.targetStores\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined;\n const merged: ConnectorCreateInput = {\n name: opts.name ?? fileInput.name ?? \"\",\n description: opts.description ?? fileInput.description ?? \"\",\n type: opts.type ?? fileInput.type ?? \"\",\n targetStoreIds: targetFromFlag ?? fileInput.targetStoreIds ?? [],\n config: mergeStringMaps(fileInput.config ?? {}, parseKvList(opts.configKv)),\n secrets: mergeStringMaps(fileInput.secrets ?? {}, parseKvList(opts.secretKv)),\n };\n const id = opts.id ?? fileInput.id;\n if (id !== undefined && id.trim() !== \"\") {\n merged.id = id.trim();\n }\n const created = await sdk.connectorApi.create(merged);\n writeCommandSuccess(ctx.deps.stdout, successJson(created));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n },\n );\n}\n","export type OmiSdkErrorInit = {\n code: string;\n message: string;\n details?: unknown;\n status?: number;\n};\n\n/**\n * Structured error for failed SDK HTTP calls (mirrors CLI stderr JSON shape).\n */\nexport class OmiSdkError extends Error {\n readonly code: string;\n readonly details: unknown;\n readonly status?: number;\n\n constructor(init: OmiSdkErrorInit) {\n super(init.message);\n this.name = \"OmiSdkError\";\n this.code = init.code;\n this.details = init.details ?? null;\n if (init.status !== undefined) {\n this.status = init.status;\n }\n }\n}\n\nexport function omiSdkError(init: OmiSdkErrorInit): OmiSdkError {\n return new OmiSdkError(init);\n}\n","import type { OmiSdkError } from \"./omi-sdk-error.js\";\nimport { omiSdkError } from \"./omi-sdk-error.js\";\n\nfunction statusFallbackCode(status: number): string {\n if (status === 404) return \"NOT_FOUND\";\n if (status === 409) return \"CONFLICT\";\n if (status === 400) return \"VALIDATION_ERROR\";\n return \"INTERNAL\";\n}\n\n/**\n * Maps HTTP error bodies from the OMI server into {@link OmiSdkError} fields.\n */\nexport async function omiSdkErrorFromResponse(res: Response): Promise<OmiSdkError> {\n const text = await res.text();\n try {\n const j = JSON.parse(text) as unknown;\n if (j && typeof j === \"object\" && !Array.isArray(j)) {\n const o = j as Record<string, unknown>;\n if (typeof o[\"code\"] === \"string\" && typeof o[\"message\"] === \"string\") {\n return omiSdkError({\n code: o[\"code\"],\n message: o[\"message\"],\n details: \"details\" in o ? (o[\"details\"] ?? null) : null,\n status: res.status,\n });\n }\n if (typeof o[\"error\"] === \"string\") {\n return omiSdkError({\n code: statusFallbackCode(res.status),\n message: o[\"error\"],\n details: null,\n status: res.status,\n });\n }\n }\n } catch {\n /* use fallback below */\n }\n return omiSdkError({\n code: statusFallbackCode(res.status),\n message: text.length > 0 ? text : res.statusText || `HTTP ${res.status}`,\n details: null,\n status: res.status,\n });\n}\n","export interface ParsedKbUri {\n spaceId: string;\n storeId?: string;\n path: string;\n}\n\n/**\n * Parses a KB URI:\n * - `kb://<spaceId>` — space-level (all stores)\n * - `kb://<spaceId>/<storeId>` — store-level\n * - `kb://<spaceId>/<storeId>/<relative/path>` — file-level\n */\nexport function parseKbUri(uri: string): ParsedKbUri {\n const prefix = \"kb://\";\n const t = uri.trim();\n if (!t.startsWith(prefix)) {\n throw new Error(`expected kb:// URI, got: ${uri}`);\n }\n const rest = t.slice(prefix.length).replace(/^\\/+/u, \"\").replace(/\\/+$/u, \"\");\n if (rest.length === 0) {\n throw new Error(\"kb:// URI must include at least a spaceId\");\n }\n const parts = rest.split(\"/\");\n if (parts[0]!.length === 0) {\n throw new Error(\"kb:// URI must include a spaceId\");\n }\n const spaceId = parts[0]!;\n const path = parts.slice(2).join(\"/\");\n if (parts.length >= 2 && parts[1]!.length > 0) {\n return { spaceId, storeId: parts[1]!, path };\n }\n return { spaceId, path };\n}\n\n/**\n * Formats back to a `kb://` URI string.\n */\nexport function formatKbUri(spaceId: string, storeId?: string, path?: string): string {\n if (storeId === undefined || storeId.length === 0) {\n return `kb://${spaceId}`;\n }\n if (path !== undefined && path.length > 0) {\n return `kb://${spaceId}/${storeId}/${path}`;\n }\n return `kb://${spaceId}/${storeId}`;\n}\n","import pino from \"pino\";\nimport type { Logger, LoggerOptions } from \"pino\";\n\nexport type { Logger };\n\nexport type CreateOmiLoggerOptions = {\n /** Logical service name (e.g. api, worker, infra). */\n service: string;\n /** Overrides `LOG_LEVEL` and default level resolution. */\n level?: string;\n /** Merged into pino `base` bindings for every log line. */\n bindings?: Record<string, unknown>;\n /**\n * Where log lines are written. Default `stdout` (existing behavior). Use `stderr` for CLIs\n * that reserve stdout for machine-readable JSON only.\n */\n destination?: \"stdout\" | \"stderr\";\n};\n\nfunction resolveLevel(explicit?: string): string {\n if (explicit !== undefined && explicit !== \"\") {\n return explicit;\n }\n const fromEnv = process.env[\"LOG_LEVEL\"];\n if (fromEnv !== undefined && fromEnv !== \"\") {\n return fromEnv;\n }\n return process.env[\"NODE_ENV\"] === \"production\" ? \"info\" : \"debug\";\n}\n\nfunction usePrettyTransport(): boolean {\n return process.env[\"LOG_PRETTY\"] === \"1\";\n}\n\n/**\n * Creates a root logger for an OMI process or test. JSON to stdout by default;\n * set `LOG_PRETTY=1` for human-readable lines via pino-pretty.\n * Use `destination: \"stderr\"` for processes that must keep stdout free (e.g. CLI JSON).\n */\nexport function createOmiLogger(options: CreateOmiLoggerOptions): Logger {\n const level = resolveLevel(options.level);\n const base: Record<string, unknown> = { service: options.service };\n if (options.bindings) {\n Object.assign(base, options.bindings);\n }\n\n const opts: LoggerOptions = { level, base };\n\n if (usePrettyTransport()) {\n opts.transport = {\n target: \"pino-pretty\",\n options: { colorize: true },\n };\n }\n\n const dest = options.destination ?? \"stdout\";\n if (dest === \"stderr\") {\n return pino(opts, pino.destination(2));\n }\n\n return pino(opts);\n}\n","/**\n * Field classification for resource properties (patch allowlists, validation, OpenAPI).\n * Runtime enforcement still belongs in {@link import(\"./metadata-store.js\").MetadataStore} implementations.\n */\nexport const FieldRole = {\n mutable: \"mutable\",\n immutable: \"immutable\",\n status: \"status\",\n} as const;\n\n/** String literals matching {@link FieldRole} values. */\nexport type FieldRoleKind = (typeof FieldRole)[keyof typeof FieldRole];\n","import { FieldRole, type FieldRoleKind } from \"./field-role.js\";\n\n/** A class constructor as returned along the JS `extends` chain. */\ntype ClassConstructor = abstract new (...args: never[]) => unknown;\n\n/** constructor → (property name → role) */\nconst rolesByConstructor = new Map<ClassConstructor, Map<string, FieldRoleKind>>();\n\nfunction ensureMap(ctor: ClassConstructor): Map<string, FieldRoleKind> {\n let m = rolesByConstructor.get(ctor);\n if (!m) {\n m = new Map();\n rolesByConstructor.set(ctor, m);\n }\n return m;\n}\n\n/**\n * Walk class constructors from base (nearest `Function.prototype` ancestor) to `ctor`.\n */\nfunction classHierarchy(ctor: ClassConstructor): ClassConstructor[] {\n const chain: ClassConstructor[] = [];\n let current: ClassConstructor | null = ctor;\n while (current && current !== Function.prototype) {\n chain.push(current);\n const proto = Object.getPrototypeOf(current);\n if (proto === null || proto === Function.prototype) {\n current = null;\n } else if (typeof proto === \"function\") {\n current = proto as ClassConstructor;\n } else {\n current = null;\n }\n }\n return chain.reverse();\n}\n\n/**\n * Registers {@link FieldRoleKind} for a class property. Use on a **class** field (not an `interface`).\n */\nexport function metadataField(role: FieldRoleKind): PropertyDecorator {\n return function (target: object, propertyKey: string | symbol): void {\n const ctor = target.constructor as ClassConstructor;\n const key = typeof propertyKey === \"string\" ? propertyKey : String(propertyKey);\n ensureMap(ctor).set(key, role);\n };\n}\n\nexport function mutableField(): PropertyDecorator {\n return metadataField(FieldRole.mutable);\n}\n\nexport function immutableField(): PropertyDecorator {\n return metadataField(FieldRole.immutable);\n}\n\nexport function statusField(): PropertyDecorator {\n return metadataField(FieldRole.status);\n}\n\n/**\n * Returns merged field roles for `ctor`, including inherited decorated fields (subclass wins on name collision).\n */\nexport function getFieldRoles(ctor: ClassConstructor): Readonly<Record<string, FieldRoleKind>> {\n const merged = new Map<string, FieldRoleKind>();\n for (const c of classHierarchy(ctor)) {\n const m = rolesByConstructor.get(c);\n if (m) {\n for (const [k, v] of m) {\n merged.set(k, v);\n }\n }\n }\n return Object.freeze(Object.fromEntries(merged));\n}\n","import { immutableField, mutableField } from \"./field-decorator.js\";\n\n/**\n * Base for control-plane rows keyed by `(spaceId, id)`.\n *\n * **Classes vs interfaces:** TypeScript cannot attach legacy field decorators to `interface`\n * members. OMI therefore models metadata resources as **classes** whenever field-role\n * reflection is required; use plain data (POJO) instances at runtime, or `class` instances,\n * interchangeably where APIs accept structural typing.\n */\nexport abstract class SpaceScopedResource {\n @immutableField() id!: string;\n @immutableField() spaceId!: string;\n @mutableField() name!: string;\n /** Longer label; empty string means none. */\n @mutableField() description = \"\";\n @immutableField() createdAt!: Date;\n @immutableField() updatedAt!: Date;\n}\n","import { immutableField, mutableField } from \"../metadata/field-decorator.js\";\nimport { SpaceScopedResource } from \"../metadata/space-scoped-base.js\";\n\n/**\n * Connector kind identifier (e.g. github, notion, drive, slack).\n * Treat as an open set; the runtime registry maps values to `ConnectorRuntime` factories.\n */\nexport type ConnectorType = string;\n\n/**\n * Aggregate sync status for the connector resource (not the per-chunk poll stream cursor).\n */\nexport type ConnectorSyncStatus = \"ready\" | \"syncing\" | \"failed\" | \"needs_attention\";\n\n/**\n * Control-plane metadata for a connector (not the connector runtime API).\n */\nexport class ConnectorResource extends SpaceScopedResource {\n @immutableField() type!: string;\n @mutableField() config: Record<string, string> = {};\n @mutableField() secrets: Record<string, string> = {};\n @immutableField() targetStoreIds!: string[];\n @mutableField() lastSyncAt?: Date;\n @mutableField() lastSyncStatus: ConnectorSyncStatus = \"ready\";\n}\n","import { immutableField, mutableField, statusField } from \"../metadata/field-decorator.js\";\n\n/**\n * Lifecycle for the space aggregate row. Rows are removed after successful teardown;\n * there is no persisted `\"deleted\"` value.\n */\nexport type SpaceLifecycleStatus = \"active\" | \"deleting\";\n\n/**\n * Control-plane record for a space (tenancy root).\n * Typically `id === spaceId` at the API boundary; `id` is the stable primary identifier.\n *\n * Modeled as a **class** so field roles attach via the same metadata decorators as other resources.\n */\nexport class SpaceResource {\n @immutableField() id!: string;\n @mutableField() name!: string;\n /** Longer label; empty string means none. */\n @mutableField() description = \"\";\n @statusField() status!: SpaceLifecycleStatus;\n @immutableField() createdAt!: Date;\n @immutableField() updatedAt!: Date;\n}\n","import { immutableField, mutableField, statusField } from \"../metadata/field-decorator.js\";\nimport { SpaceScopedResource } from \"../metadata/space-scoped-base.js\";\nimport type { SpaceLifecycleStatus } from \"../space/types.js\";\nimport type { ProposalStatus } from \"./proposal/types.js\";\n\n/** Alias for {@link SpaceLifecycleStatus} on store metadata (shared lifecycle literals). */\nexport type StoreLifecycleStatus = SpaceLifecycleStatus;\n\n/**\n * Control-plane metadata for a store (not the versioned filesystem API).\n */\nexport class StoreResource extends SpaceScopedResource {\n @statusField() status!: StoreLifecycleStatus;\n /** When true, durable head cannot be updated via {@link import(\"./runtime.js\").Store.mergeProposal}. */\n @immutableField() readOnly = false;\n}\n\n/**\n * Control-plane metadata for a proposal (not the versioned workspace API).\n */\nexport class ProposalResource extends SpaceScopedResource {\n @immutableField() storeId!: string;\n /** Optional task association for task-scoped proposal listing. */\n @immutableField() taskId?: string;\n @immutableField() baseRevisionId!: string;\n @mutableField() workDir!: string;\n @statusField() status!: ProposalStatus;\n}\n\n/**\n * Subset passed into {@link import(\"./runtime.js\").Store.init} to bootstrap the on-disk / Git repository.\n */\nexport type StoreInitConfig = Pick<\n StoreResource,\n \"id\" | \"spaceId\" | \"name\" | \"description\" | \"readOnly\"\n>;\n\n/**\n * Git remote mirror parameters for {@link import(\"./runtime.js\").Store.sync}.\n */\nexport interface StoreGitSyncRequest {\n /** Remote repository URL (HTTPS when `token` is set). */\n url: string;\n /** Branch or ref name to fetch from the remote. */\n branch: string;\n /** Optional HTTPS credential (e.g. PAT); embedded in URL userinfo when present. */\n token?: string;\n}\n\n/**\n * Store sync request; today only Git mirror sync is supported.\n */\nexport interface StoreSyncRequest {\n git: StoreGitSyncRequest;\n}\n\n/**\n * A single revision in the store history (commit hash and metadata).\n */\nexport interface Revision {\n /** Commit hash for this revision. */\n revisionId: string;\n /** Committer timestamp. */\n createTime: Date;\n /** Commit subject line. */\n title: string;\n /** Commit body. */\n description: string;\n authorName: string;\n authorEmail: string;\n}\n\n/**\n * Outcome of merging an approved proposal into the durable store.\n */\nexport interface MergeSuccessResult {\n /** True when the proposal merge completes and commits a new head revision. */\n ok: true;\n /** New immutable revision id produced by the successful merge commit. */\n revisionId: string;\n}\n\n/** Stable reason codes for proposal merge failures. */\nexport type MergeFailureReason =\n | \"MERGE_CONFLICT\"\n | \"TARGET_EXISTS\"\n | \"WORKTREE_MISSING\"\n | \"SNAPSHOT_FAILED\"\n | \"COMMIT_FAILED\"\n | \"STORE_READONLY\"\n | \"UNKNOWN\";\n\n/** Optional diagnostics captured from underlying git commands. */\nexport interface MergeFailureDetails {\n stderr?: string;\n stdout?: string;\n}\n\n/** Structured proposal merge failure payload. */\nexport interface MergeFailureResult {\n ok: false;\n reason: MergeFailureReason;\n message: string;\n details?: MergeFailureDetails;\n}\n\n/** Outcome of merging an approved proposal into the durable store. */\nexport type MergeResult = MergeSuccessResult | MergeFailureResult;\n","/** Virtual readonly task id used when KB_TASK / CLI task context is omitted. Not persisted as metadata. */\nexport const DEFAULT_TASK_ID = \"default\";\n\nexport function isDefaultTaskId(taskId: string): boolean {\n return taskId.trim() === DEFAULT_TASK_ID;\n}\n","import { immutableField, statusField } from \"../metadata/field-decorator.js\";\nimport { SpaceScopedResource } from \"../metadata/space-scoped-base.js\";\n\nexport type TaskLifecycleStatus = \"active\" | \"stopped\" | \"deleting\";\n\n/**\n * Control-plane metadata for a task (not the task runtime API).\n */\nexport class TaskResource extends SpaceScopedResource {\n /** Immutable store bindings used to resolve runtime stores for this task. */\n @immutableField() storeIds!: string[];\n @statusField() status!: TaskLifecycleStatus;\n}\n","import type {\n CommandResult,\n ConnectorSyncStatus,\n MatchedContext,\n ProposalDiff,\n ProposalDiffItem,\n ProposalStatus,\n TaskLifecycleStatus,\n Revision,\n SearchResult,\n SpaceLifecycleStatus,\n StoreLifecycleStatus,\n} from \"@omi/core\";\nimport {\n ConnectorResource,\n ProposalResource,\n SpaceResource,\n StoreResource,\n TaskResource,\n} from \"@omi/core\";\n\nimport { omiSdkError } from \"./omi-sdk-error.js\";\n\nfunction assertRecord(j: unknown, label: string): Record<string, unknown> {\n if (!j || typeof j !== \"object\" || Array.isArray(j)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: `invalid ${label}: expected object`,\n details: null,\n });\n }\n return j as Record<string, unknown>;\n}\n\nexport function parseSpaceResourceWire(j: unknown): SpaceResource {\n const o = assertRecord(j, \"space resource\");\n const r = new SpaceResource();\n r.id = String(o[\"id\"] ?? \"\");\n r.name = String(o[\"name\"] ?? \"\");\n r.description = String(o[\"description\"] ?? \"\");\n r.status = o[\"status\"] as SpaceLifecycleStatus;\n r.createdAt = new Date(String(o[\"createdAt\"] ?? \"\"));\n r.updatedAt = new Date(String(o[\"updatedAt\"] ?? \"\"));\n return r;\n}\n\nfunction parseStringMapWire(o: unknown, field: string): Record<string, string> {\n if (o === undefined || o === null) {\n return {};\n }\n if (typeof o !== \"object\" || Array.isArray(o)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: `invalid connector resource: expected object for ${field}`,\n details: null,\n });\n }\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(o as Record<string, unknown>)) {\n if (typeof v === \"string\") {\n out[k] = v;\n }\n }\n return out;\n}\n\nexport function parseConnectorResourceWire(j: unknown): ConnectorResource {\n const o = assertRecord(j, \"connector resource\");\n const r = new ConnectorResource();\n r.id = String(o[\"id\"] ?? \"\");\n r.spaceId = String(o[\"spaceId\"] ?? \"\");\n r.name = String(o[\"name\"] ?? \"\");\n r.description = String(o[\"description\"] ?? \"\");\n r.type = String(o[\"type\"] ?? \"\");\n r.config = parseStringMapWire(o[\"config\"], \"config\");\n r.secrets = parseStringMapWire(o[\"secrets\"], \"secrets\");\n const ids = o[\"targetStoreIds\"];\n if (!Array.isArray(ids)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid connector resource: expected targetStoreIds array\",\n details: null,\n });\n }\n if (ids.some((x) => typeof x !== \"string\")) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid connector resource: expected targetStoreIds string[]\",\n details: null,\n });\n }\n r.targetStoreIds = ids as string[];\n const lsa = o[\"lastSyncAt\"];\n if (lsa !== undefined && lsa !== null) {\n r.lastSyncAt = new Date(String(lsa));\n }\n r.lastSyncStatus = String(o[\"lastSyncStatus\"] ?? \"ready\") as ConnectorSyncStatus;\n r.createdAt = new Date(String(o[\"createdAt\"] ?? \"\"));\n r.updatedAt = new Date(String(o[\"updatedAt\"] ?? \"\"));\n return r;\n}\n\nexport function parseStoreResourceWire(j: unknown): StoreResource {\n const o = assertRecord(j, \"store resource\");\n const r = new StoreResource();\n r.id = String(o[\"id\"] ?? \"\");\n r.spaceId = String(o[\"spaceId\"] ?? \"\");\n r.name = String(o[\"name\"] ?? \"\");\n r.description = String(o[\"description\"] ?? \"\");\n r.status = o[\"status\"] as StoreLifecycleStatus;\n r.readOnly = o[\"readOnly\"] === true;\n r.createdAt = new Date(String(o[\"createdAt\"] ?? \"\"));\n r.updatedAt = new Date(String(o[\"updatedAt\"] ?? \"\"));\n return r;\n}\n\nexport function parseTaskResourceWire(j: unknown): TaskResource {\n const o = assertRecord(j, \"task resource\");\n const r = new TaskResource();\n r.id = String(o[\"id\"] ?? \"\");\n r.spaceId = String(o[\"spaceId\"] ?? \"\");\n r.name = String(o[\"name\"] ?? \"\");\n r.description = String(o[\"description\"] ?? \"\");\n r.status = o[\"status\"] as TaskLifecycleStatus;\n const storeIds = o[\"storeIds\"];\n if (!Array.isArray(storeIds)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid task resource: expected storeIds array\",\n details: null,\n });\n }\n if (storeIds.some((storeId) => typeof storeId !== \"string\")) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid task resource: expected storeIds string[]\",\n details: null,\n });\n }\n r.storeIds = storeIds as string[];\n r.createdAt = new Date(String(o[\"createdAt\"] ?? \"\"));\n r.updatedAt = new Date(String(o[\"updatedAt\"] ?? \"\"));\n return r;\n}\n\nexport function parseProposalResourceWire(j: unknown): ProposalResource {\n const o = assertRecord(j, \"proposal resource\");\n const r = new ProposalResource();\n r.id = String(o[\"id\"] ?? \"\");\n r.spaceId = String(o[\"spaceId\"] ?? \"\");\n r.storeId = String(o[\"storeId\"] ?? \"\");\n if (o[\"taskId\"] !== undefined) {\n r.taskId = String(o[\"taskId\"]);\n }\n r.name = String(o[\"name\"] ?? \"\");\n r.description = String(o[\"description\"] ?? \"\");\n r.baseRevisionId = String(o[\"baseRevisionId\"] ?? \"\");\n r.workDir = String(o[\"workDir\"] ?? \"\");\n r.status = o[\"status\"] as ProposalStatus;\n r.createdAt = new Date(String(o[\"createdAt\"] ?? \"\"));\n r.updatedAt = new Date(String(o[\"updatedAt\"] ?? \"\"));\n return r;\n}\n\nexport function parseRevisionWire(j: unknown): Revision {\n const o = assertRecord(j, \"revision\");\n return {\n revisionId: String(o[\"revisionId\"] ?? \"\"),\n createTime: new Date(String(o[\"createTime\"] ?? \"\")),\n title: String(o[\"title\"] ?? \"\"),\n description: String(o[\"description\"] ?? \"\"),\n authorName: String(o[\"authorName\"] ?? \"\"),\n authorEmail: String(o[\"authorEmail\"] ?? \"\"),\n };\n}\n\nexport function parseProposalDiffWire(j: unknown): ProposalDiff {\n const o = assertRecord(j, \"proposal diff\");\n if (o[\"format\"] !== \"unified\") {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid proposal diff: expected format unified\",\n details: null,\n });\n }\n if (typeof o[\"rawUnifiedDiff\"] !== \"string\") {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid proposal diff: expected rawUnifiedDiff string\",\n details: null,\n });\n }\n if (!Array.isArray(o[\"files\"])) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid proposal diff: expected files array\",\n details: null,\n });\n }\n return j as ProposalDiff;\n}\n\nexport function parseProposalDiffItemWire(j: unknown): ProposalDiffItem {\n const o = assertRecord(j, \"proposal diff item\");\n if (!(\"proposal\" in o) || !(\"diff\" in o)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid proposal diff item: expected proposal and diff fields\",\n details: null,\n });\n }\n return {\n proposal: parseProposalResourceWire(o[\"proposal\"]),\n diff: parseProposalDiffWire(o[\"diff\"]),\n };\n}\n\nexport function parseCommandResultWire(j: unknown): CommandResult {\n const o = assertRecord(j, \"command result\");\n if (typeof o[\"stdout\"] !== \"string\") {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid command result: expected stdout string\",\n details: null,\n });\n }\n if (typeof o[\"stderr\"] !== \"string\") {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid command result: expected stderr string\",\n details: null,\n });\n }\n if (typeof o[\"exitCode\"] !== \"number\" || !Number.isFinite(o[\"exitCode\"])) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid command result: expected exitCode number\",\n details: null,\n });\n }\n if (typeof o[\"startedAt\"] !== \"string\" || typeof o[\"finishedAt\"] !== \"string\") {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"invalid command result: expected startedAt/finishedAt strings\",\n details: null,\n });\n }\n return {\n stdout: o[\"stdout\"],\n stderr: o[\"stderr\"],\n exitCode: o[\"exitCode\"],\n startedAt: o[\"startedAt\"],\n finishedAt: o[\"finishedAt\"],\n };\n}\n\nfunction parseMatchedContextWire(j: unknown): MatchedContext {\n const o = assertRecord(j, \"matched context\");\n const out: MatchedContext = {\n contextType: String(o[\"contextType\"] ?? \"\") as MatchedContext[\"contextType\"],\n uri: String(o[\"uri\"] ?? \"\"),\n level: Number(o[\"level\"] ?? 0),\n score: Number(o[\"score\"] ?? 0),\n category: String(o[\"category\"] ?? \"\"),\n matchReason: String(o[\"matchReason\"] ?? \"\"),\n abstract: String(o[\"abstract\"] ?? \"\"),\n };\n if (o[\"overview\"] !== undefined) {\n out.overview = String(o[\"overview\"]);\n }\n return out;\n}\n\nfunction parseMatchedContextArrayWire(j: unknown, label: string): MatchedContext[] {\n if (!Array.isArray(j)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: `invalid ${label}: expected array`,\n details: null,\n });\n }\n return j.map((item) => parseMatchedContextWire(item));\n}\n\nexport function parseSearchResultWire(j: unknown): SearchResult {\n const o = assertRecord(j, \"search result\");\n return {\n memories: parseMatchedContextArrayWire(o[\"memories\"], \"search result memories\"),\n resources: parseMatchedContextArrayWire(o[\"resources\"], \"search result resources\"),\n skills: parseMatchedContextArrayWire(o[\"skills\"], \"search result skills\"),\n total: Number(o[\"total\"] ?? 0),\n };\n}\n","export function joinBaseUrl(base: string, path: string): string {\n const b = base.replace(/\\/$/, \"\");\n return `${b}${path.startsWith(\"/\") ? path : `/${path}`}`;\n}\n","import type {\n Command,\n CommandResult,\n ConnectorCreateInput,\n ConnectorResource,\n ConnectorUpdateInput,\n ProposalDiffItem,\n ProposalResource,\n Revision,\n SearchOption,\n SearchResult,\n SpaceMetadataCreateInput,\n SpaceResource,\n TaskCreateInput,\n TaskResource,\n TaskUpdateInput,\n StoreCreateInput,\n StoreResource,\n StoreUpdateInput,\n SpaceUpdateInput,\n} from \"@omi/core\";\n\nimport { omiSdkErrorFromResponse } from \"./error-from-response.js\";\nimport { omiSdkError } from \"./omi-sdk-error.js\";\nimport {\n parseRevisionWire,\n parseSearchResultWire,\n parseConnectorResourceWire,\n parseSpaceResourceWire,\n parseStoreResourceWire,\n parseTaskResourceWire,\n parseProposalDiffItemWire,\n parseProposalResourceWire,\n parseCommandResultWire,\n} from \"./parse-wire.js\";\nimport { joinBaseUrl } from \"./url.js\";\n\nexport interface OmiSdkInit {\n baseUrl: string;\n space: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface OmiSdk {\n readonly spaceApi: {\n create(input?: SpaceMetadataCreateInput): Promise<SpaceResource>;\n get(spaceId: string): Promise<SpaceResource>;\n list(): Promise<SpaceResource[]>;\n update(spaceId: string, patch: SpaceUpdateInput): Promise<SpaceResource>;\n delete(spaceId: string): Promise<void>;\n };\n readonly storeApi: {\n create(input?: StoreCreateInput): Promise<StoreResource>;\n get(storeId: string): Promise<StoreResource>;\n list(): Promise<StoreResource[]>;\n update(storeId: string, patch: StoreUpdateInput): Promise<StoreResource>;\n delete(storeId: string): Promise<void>;\n\n waitSync(storeId: string): Promise<void>;\n listRevisions(storeId: string): Promise<Revision[]>;\n restoreRevision(storeId: string, revisionId: string): Promise<void>;\n\n uploadFile(params: {\n storeId: string;\n path: string;\n body: Uint8Array;\n contentType?: string;\n }): Promise<void>;\n downloadFile(params: { storeId: string; path: string }): Promise<Uint8Array>;\n deleteFile(params: { storeId: string; path: string }): Promise<void>;\n search(query: string, searchOption?: SearchOption): Promise<SearchResult>;\n };\n readonly taskApi: {\n create(input?: TaskCreateInput): Promise<TaskResource>;\n get(taskId: string): Promise<TaskResource>;\n list(): Promise<TaskResource[]>;\n update(taskId: string, patch: TaskUpdateInput): Promise<TaskResource>;\n delete(taskId: string): Promise<void>;\n listProposals(taskId: string): Promise<ProposalResource[]>;\n executeShellCommand(taskId: string, command: Command): Promise<CommandResult>;\n diff(taskId: string): Promise<ProposalDiffItem[]>;\n submit(taskId: string, proposalIds: string[]): Promise<void>;\n approve(taskId: string, proposalIds: string[]): Promise<void>;\n reject(taskId: string, proposalIds: string[], reason: string): Promise<void>;\n merge(taskId: string, proposalIds: string[]): Promise<void>;\n stop(taskId: string): Promise<void>;\n };\n readonly connectorApi: {\n create(input?: ConnectorCreateInput): Promise<ConnectorResource>;\n get(connectorId: string): Promise<ConnectorResource>;\n list(): Promise<ConnectorResource[]>;\n update(connectorId: string, patch: ConnectorUpdateInput): Promise<ConnectorResource>;\n delete(connectorId: string): Promise<void>;\n };\n}\n\nfunction requireStoreScope(space: string): void {\n if (space.trim().length === 0) {\n throw omiSdkError({\n code: \"VALIDATION_ERROR\",\n message: \"space is required for store operations (set it when creating the SDK client)\",\n details: null,\n });\n }\n}\n\nasync function fetchOk(\n fetchFn: typeof fetch,\n absoluteUrl: string,\n init?: RequestInit,\n): Promise<Response> {\n const res = await fetchFn(absoluteUrl, init);\n if (!res.ok) {\n throw await omiSdkErrorFromResponse(res);\n }\n return res;\n}\n\nasync function readJsonBody(text: string, label: string): Promise<unknown> {\n const trimmed = text.trim();\n if (trimmed === \"\") {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: `empty JSON body (${label})`,\n details: null,\n });\n }\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: `invalid JSON (${label})`,\n details: null,\n });\n }\n}\n\nexport function createOmiSdk(init: OmiSdkInit): OmiSdk {\n const fetchFn = init.fetch ?? globalThis.fetch.bind(globalThis);\n const baseUrl = init.baseUrl.replace(/\\/$/, \"\");\n const space = init.space;\n\n function abs(path: string): string {\n return joinBaseUrl(baseUrl, path);\n }\n\n function storeBase(): string {\n requireStoreScope(space);\n return `/spaces/${encodeURIComponent(space)}/stores`;\n }\n\n function taskBase(): string {\n requireStoreScope(space);\n return `/spaces/${encodeURIComponent(space)}/tasks`;\n }\n\n function connectorBase(): string {\n requireStoreScope(space);\n return `/spaces/${encodeURIComponent(space)}/connectors`;\n }\n\n const spaceApi: OmiSdk[\"spaceApi\"] = {\n async create(input?: SpaceMetadataCreateInput) {\n const initReq: RequestInit = { method: \"POST\" };\n if (input !== undefined && Object.keys(input).length > 0) {\n initReq.headers = { \"content-type\": \"application/json\" };\n initReq.body = JSON.stringify(input);\n }\n const res = await fetchOk(fetchFn, abs(\"/spaces\"), initReq);\n const j = await readJsonBody(await res.text(), \"POST /spaces\");\n return parseSpaceResourceWire(j);\n },\n\n async get(spaceId: string) {\n const res = await fetchOk(fetchFn, abs(`/spaces/${encodeURIComponent(spaceId)}`), {\n method: \"GET\",\n });\n const j = await readJsonBody(await res.text(), \"GET /spaces/:id\");\n return parseSpaceResourceWire(j);\n },\n\n async list() {\n const res = await fetchOk(fetchFn, abs(\"/spaces\"), { method: \"GET\" });\n const j = await readJsonBody(await res.text(), \"GET /spaces\");\n const o = j as Record<string, unknown>;\n const arr = o[\"spaces\"];\n if (!Array.isArray(arr)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"list spaces: expected { spaces: [] }\",\n details: null,\n });\n }\n return arr.map((x) => parseSpaceResourceWire(x));\n },\n\n async update(spaceId: string, patch: SpaceUpdateInput) {\n const res = await fetchOk(fetchFn, abs(`/spaces/${encodeURIComponent(spaceId)}`), {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(patch),\n });\n const j = await readJsonBody(await res.text(), \"PATCH /spaces/:id\");\n return parseSpaceResourceWire(j);\n },\n\n async delete(spaceId: string) {\n await fetchOk(fetchFn, abs(`/spaces/${encodeURIComponent(spaceId)}`), {\n method: \"DELETE\",\n });\n },\n };\n\n const storeApi: OmiSdk[\"storeApi\"] = {\n async create(input?: StoreCreateInput) {\n const initReq: RequestInit = { method: \"POST\" };\n if (input !== undefined && Object.keys(input).length > 0) {\n initReq.headers = { \"content-type\": \"application/json\" };\n initReq.body = JSON.stringify(input);\n }\n const res = await fetchOk(fetchFn, abs(`${storeBase()}`), initReq);\n const j = await readJsonBody(await res.text(), \"POST .../stores\");\n return parseStoreResourceWire(j);\n },\n\n async get(storeId: string) {\n const res = await fetchOk(fetchFn, abs(`${storeBase()}/${encodeURIComponent(storeId)}`), {\n method: \"GET\",\n });\n const j = await readJsonBody(await res.text(), \"GET .../stores/:id\");\n return parseStoreResourceWire(j);\n },\n\n async list() {\n const res = await fetchOk(fetchFn, abs(storeBase()), { method: \"GET\" });\n const j = await readJsonBody(await res.text(), \"GET .../stores\");\n const o = j as Record<string, unknown>;\n const arr = o[\"stores\"];\n if (!Array.isArray(arr)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"list stores: expected { stores: [] }\",\n details: null,\n });\n }\n return arr.map((x) => parseStoreResourceWire(x));\n },\n\n async update(storeId: string, patch: StoreUpdateInput) {\n const res = await fetchOk(fetchFn, abs(`${storeBase()}/${encodeURIComponent(storeId)}`), {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(patch),\n });\n const j = await readJsonBody(await res.text(), \"PATCH .../stores/:id\");\n return parseStoreResourceWire(j);\n },\n\n async delete(storeId: string) {\n await fetchOk(fetchFn, abs(`${storeBase()}/${encodeURIComponent(storeId)}`), {\n method: \"DELETE\",\n });\n },\n\n async waitSync(storeId: string) {\n await fetchOk(fetchFn, abs(`${storeBase()}/${encodeURIComponent(storeId)}/wait-sync`), {\n method: \"POST\",\n });\n },\n\n async listRevisions(storeId: string) {\n const res = await fetchOk(\n fetchFn,\n abs(`${storeBase()}/${encodeURIComponent(storeId)}/revisions`),\n { method: \"GET\" },\n );\n const j = await readJsonBody(await res.text(), \"GET .../revisions\");\n const o = j as Record<string, unknown>;\n const arr = o[\"revisions\"];\n if (!Array.isArray(arr)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"list revisions: expected { revisions: [] }\",\n details: null,\n });\n }\n return arr.map((x) => parseRevisionWire(x));\n },\n\n async restoreRevision(storeId: string, revisionId: string) {\n await fetchOk(\n fetchFn,\n abs(\n `${storeBase()}/${encodeURIComponent(storeId)}/revisions/${encodeURIComponent(revisionId)}/restore`,\n ),\n { method: \"POST\" },\n );\n },\n\n async uploadFile(params: {\n storeId: string;\n path: string;\n body: Uint8Array;\n contentType?: string;\n }) {\n const q = `${storeBase()}/${encodeURIComponent(params.storeId)}/files?path=${encodeURIComponent(params.path)}`;\n await fetchOk(fetchFn, abs(q), {\n method: \"PUT\",\n headers: {\n \"content-type\": params.contentType ?? \"application/octet-stream\",\n },\n body: params.body,\n });\n },\n\n async downloadFile(params: { storeId: string; path: string }) {\n const q = `${storeBase()}/${encodeURIComponent(params.storeId)}/files?path=${encodeURIComponent(params.path)}`;\n const res = await fetchOk(fetchFn, abs(q), { method: \"GET\" });\n return new Uint8Array(await res.arrayBuffer());\n },\n\n async deleteFile(params: { storeId: string; path: string }) {\n const q = `${storeBase()}/${encodeURIComponent(params.storeId)}/files?path=${encodeURIComponent(params.path)}`;\n await fetchOk(fetchFn, abs(q), { method: \"DELETE\" });\n },\n\n async search(query: string, searchOption?: SearchOption) {\n const res = await fetchOk(fetchFn, abs(`${storeBase()}/search`), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ query, searchOption }),\n });\n const j = await readJsonBody(await res.text(), \"POST .../stores/search\");\n return parseSearchResultWire(j);\n },\n };\n\n const taskApi: OmiSdk[\"taskApi\"] = {\n async create(input?: TaskCreateInput) {\n const initReq: RequestInit = { method: \"POST\" };\n if (input !== undefined && Object.keys(input).length > 0) {\n initReq.headers = { \"content-type\": \"application/json\" };\n initReq.body = JSON.stringify(input);\n }\n const res = await fetchOk(fetchFn, abs(taskBase()), initReq);\n const j = await readJsonBody(await res.text(), \"POST .../tasks\");\n return parseTaskResourceWire(j);\n },\n\n async get(taskId: string) {\n const res = await fetchOk(fetchFn, abs(`${taskBase()}/${encodeURIComponent(taskId)}`), {\n method: \"GET\",\n });\n const j = await readJsonBody(await res.text(), \"GET .../tasks/:id\");\n return parseTaskResourceWire(j);\n },\n\n async list() {\n const res = await fetchOk(fetchFn, abs(taskBase()), { method: \"GET\" });\n const j = await readJsonBody(await res.text(), \"GET .../tasks\");\n const o = j as Record<string, unknown>;\n const arr = o[\"tasks\"];\n if (!Array.isArray(arr)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"list tasks: expected { tasks: [] }\",\n details: null,\n });\n }\n return arr.map((item) => parseTaskResourceWire(item));\n },\n\n async update(taskId: string, patch: TaskUpdateInput) {\n const res = await fetchOk(fetchFn, abs(`${taskBase()}/${encodeURIComponent(taskId)}`), {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(patch),\n });\n const j = await readJsonBody(await res.text(), \"PATCH .../tasks/:id\");\n return parseTaskResourceWire(j);\n },\n\n async delete(taskId: string) {\n await fetchOk(fetchFn, abs(`${taskBase()}/${encodeURIComponent(taskId)}`), {\n method: \"DELETE\",\n });\n },\n\n async listProposals(taskId: string) {\n const res = await fetchOk(\n fetchFn,\n abs(`${taskBase()}/${encodeURIComponent(taskId)}/proposals`),\n { method: \"GET\" },\n );\n const j = await readJsonBody(await res.text(), \"GET .../tasks/:id/proposals\");\n const o = j as Record<string, unknown>;\n const arr = o[\"proposals\"];\n if (!Array.isArray(arr)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"list proposals: expected { proposals: [] }\",\n details: null,\n });\n }\n return arr.map((item) => parseProposalResourceWire(item));\n },\n\n async executeShellCommand(taskId: string, command: Command) {\n const res = await fetchOk(fetchFn, abs(`${taskBase()}/${encodeURIComponent(taskId)}/shell`), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(command),\n });\n const j = await readJsonBody(await res.text(), \"POST .../tasks/:id/shell\");\n return parseCommandResultWire(j);\n },\n\n async diff(taskId: string) {\n const res = await fetchOk(fetchFn, abs(`${taskBase()}/${encodeURIComponent(taskId)}/diff`), {\n method: \"GET\",\n });\n const j = await readJsonBody(await res.text(), \"GET .../tasks/:id/diff\");\n const o = j as Record<string, unknown>;\n const arr = o[\"diffs\"];\n if (!Array.isArray(arr)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"task diff: expected { diffs: [] }\",\n details: null,\n });\n }\n return arr.map((item) => parseProposalDiffItemWire(item));\n },\n\n async submit(taskId: string, proposalIds: string[]) {\n await fetchOk(fetchFn, abs(`${taskBase()}/${encodeURIComponent(taskId)}/submit`), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ proposalIds }),\n });\n },\n\n async approve(taskId: string, proposalIds: string[]) {\n await fetchOk(fetchFn, abs(`${taskBase()}/${encodeURIComponent(taskId)}/approve`), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ proposalIds }),\n });\n },\n\n async reject(taskId: string, proposalIds: string[], reason: string) {\n await fetchOk(fetchFn, abs(`${taskBase()}/${encodeURIComponent(taskId)}/reject`), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ proposalIds, reason }),\n });\n },\n\n async merge(taskId: string, proposalIds: string[]) {\n const res = await fetchFn(abs(`${taskBase()}/${encodeURIComponent(taskId)}/merge`), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ proposalIds }),\n });\n if (res.status === 204) {\n return;\n }\n if (!res.ok) {\n throw await omiSdkErrorFromResponse(res);\n }\n throw omiSdkError({\n code: \"INTERNAL\",\n message: `unexpected merge response status ${res.status}`,\n details: null,\n status: res.status,\n });\n },\n\n async stop(taskId: string) {\n await fetchOk(fetchFn, abs(`${taskBase()}/${encodeURIComponent(taskId)}/stop`), {\n method: \"POST\",\n });\n },\n };\n\n const connectorApi: OmiSdk[\"connectorApi\"] = {\n async create(input?: ConnectorCreateInput) {\n const initReq: RequestInit = { method: \"POST\" };\n if (input !== undefined && Object.keys(input).length > 0) {\n initReq.headers = { \"content-type\": \"application/json\" };\n initReq.body = JSON.stringify(input);\n }\n const res = await fetchOk(fetchFn, abs(connectorBase()), initReq);\n const j = await readJsonBody(await res.text(), \"POST .../connectors\");\n return parseConnectorResourceWire(j);\n },\n\n async get(connectorId: string) {\n const res = await fetchOk(\n fetchFn,\n abs(`${connectorBase()}/${encodeURIComponent(connectorId)}`),\n { method: \"GET\" },\n );\n const j = await readJsonBody(await res.text(), \"GET .../connectors/:id\");\n return parseConnectorResourceWire(j);\n },\n\n async list() {\n const res = await fetchOk(fetchFn, abs(connectorBase()), { method: \"GET\" });\n const j = await readJsonBody(await res.text(), \"GET .../connectors\");\n const o = j as Record<string, unknown>;\n const arr = o[\"connectors\"];\n if (!Array.isArray(arr)) {\n throw omiSdkError({\n code: \"INTERNAL\",\n message: \"list connectors: expected { connectors: [] }\",\n details: null,\n });\n }\n return arr.map((x) => parseConnectorResourceWire(x));\n },\n\n async update(connectorId: string, patch: ConnectorUpdateInput) {\n const res = await fetchOk(\n fetchFn,\n abs(`${connectorBase()}/${encodeURIComponent(connectorId)}`),\n {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(patch),\n },\n );\n const j = await readJsonBody(await res.text(), \"PATCH .../connectors/:id\");\n return parseConnectorResourceWire(j);\n },\n\n async delete(connectorId: string) {\n await fetchOk(fetchFn, abs(`${connectorBase()}/${encodeURIComponent(connectorId)}`), {\n method: \"DELETE\",\n });\n },\n };\n\n return { spaceApi, storeApi, taskApi, connectorApi };\n}\n","export function resolveAuthOrigin(baseUrl: string): string {\n return baseUrl.replace(/\\/$/, \"\");\n}\n","import { chmod, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport type KbCredentials = {\n accessToken: string;\n expiresAt: string;\n origin: string;\n /** KnowBrain space id from get-session user.id; set by kb login. */\n spaceId: string;\n};\n\nconst CREDENTIALS_MODE = 0o600;\n\nexport type CredentialsStoreOptions = {\n /** Override path for tests. */\n filePath?: string;\n};\n\nexport function defaultCredentialsPath(): string {\n const configHome = process.env[\"XDG_CONFIG_HOME\"] ?? join(homedir(), \".config\");\n return join(configHome, \"kb\", \"credentials.json\");\n}\n\nexport function resolveCredentialsPath(options?: CredentialsStoreOptions): string {\n return options?.filePath ?? defaultCredentialsPath();\n}\n\nexport async function loadCredentials(\n options?: CredentialsStoreOptions,\n): Promise<KbCredentials | null> {\n const filePath = resolveCredentialsPath(options);\n try {\n const raw = await readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n const o = parsed as Record<string, unknown>;\n if (\n typeof o[\"accessToken\"] !== \"string\" ||\n typeof o[\"expiresAt\"] !== \"string\" ||\n typeof o[\"origin\"] !== \"string\" ||\n typeof o[\"spaceId\"] !== \"string\" ||\n o[\"spaceId\"].length === 0\n ) {\n return null;\n }\n return {\n accessToken: o[\"accessToken\"],\n expiresAt: o[\"expiresAt\"],\n origin: o[\"origin\"],\n spaceId: o[\"spaceId\"],\n };\n } catch (e) {\n if (\n e &&\n typeof e === \"object\" &&\n \"code\" in e &&\n (e as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n return null;\n }\n throw e;\n }\n}\n\nexport async function saveCredentials(\n credentials: KbCredentials,\n options?: CredentialsStoreOptions,\n): Promise<void> {\n const filePath = resolveCredentialsPath(options);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, `${JSON.stringify(credentials)}\\n`, {\n encoding: \"utf8\",\n mode: CREDENTIALS_MODE,\n });\n await chmod(filePath, CREDENTIALS_MODE);\n}\n\nexport async function clearCredentials(options?: CredentialsStoreOptions): Promise<void> {\n const filePath = resolveCredentialsPath(options);\n try {\n await unlink(filePath);\n } catch (e) {\n if (\n e &&\n typeof e === \"object\" &&\n \"code\" in e &&\n (e as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n return;\n }\n throw e;\n }\n}\n\nexport function credentialsMatchOrigin(credentials: KbCredentials, origin: string): boolean {\n return credentials.origin.replace(/\\/$/, \"\") === origin.replace(/\\/$/, \"\");\n}\n\nexport function isCredentialsExpired(credentials: KbCredentials, nowMs = Date.now()): boolean {\n const expiresAt = Date.parse(credentials.expiresAt);\n if (Number.isNaN(expiresAt)) {\n return true;\n }\n return nowMs >= expiresAt;\n}\n","import { resolveAuthOrigin } from \"./origin.js\";\nimport {\n credentialsMatchOrigin,\n isCredentialsExpired,\n loadCredentials,\n type CredentialsStoreOptions,\n} from \"./credentials.js\";\nimport type { KbCliContext } from \"../cli/context.js\";\n\nexport type AuthenticatedFetchOptions = CredentialsStoreOptions;\n\nexport function createAuthenticatedFetch(\n ctx: KbCliContext,\n options?: AuthenticatedFetchOptions,\n): typeof fetch {\n const baseFetch = ctx.deps.fetch;\n const origin = resolveAuthOrigin(ctx.baseUrl);\n\n return async (input: Parameters<typeof fetch>[0], init?: RequestInit): Promise<Response> => {\n const credentials = await loadCredentials(options);\n const headers = new Headers(init?.headers);\n\n const hasValidCreds =\n credentials !== null &&\n credentialsMatchOrigin(credentials, origin) &&\n !isCredentialsExpired(credentials);\n\n if (hasValidCreds && credentials) {\n headers.set(\"Authorization\", `Bearer ${credentials.accessToken}`);\n headers.set(\"Origin\", origin);\n }\n\n const res = await baseFetch(input, { ...init, headers });\n if (res.status === 401) {\n const expired =\n credentials !== null &&\n credentialsMatchOrigin(credentials, origin) &&\n isCredentialsExpired(credentials);\n if (expired) {\n return new Response(\n JSON.stringify({\n code: \"AUTH_EXPIRED\",\n message: \"Session expired. Run `kb login` to sign in again.\",\n details: null,\n }),\n { status: 401, headers: { \"content-type\": \"application/json\" } },\n );\n }\n if (!hasValidCreds) {\n return new Response(\n JSON.stringify({\n code: \"AUTH_REQUIRED\",\n message: \"Authentication required. Run `kb login` to sign in.\",\n details: null,\n }),\n { status: 401, headers: { \"content-type\": \"application/json\" } },\n );\n }\n }\n return res;\n };\n}\n","export const DEFAULT_API_PATH_PREFIX = \"/api/knowbrain\";\n\nfunction joinBaseUrl(base: string, path: string): string {\n const b = base.replace(/\\/$/, \"\");\n return `${b}${path.startsWith(\"/\") ? path : `/${path}`}`;\n}\n\nexport function resolveKbApiPathPrefix(env: NodeJS.ProcessEnv): string {\n const raw = env[\"KB_API_PATH_PREFIX\"];\n if (raw === undefined) {\n return DEFAULT_API_PATH_PREFIX;\n }\n return raw;\n}\n\nexport function resolveKbApiBaseUrl(origin: string, env: NodeJS.ProcessEnv): string {\n const base = origin.replace(/\\/$/, \"\");\n const prefix = resolveKbApiPathPrefix(env);\n if (prefix === \"\") {\n return base;\n }\n const normalized = prefix.startsWith(\"/\") ? prefix : `/${prefix}`;\n if (base.endsWith(normalized)) {\n return base;\n }\n return joinBaseUrl(base, normalized);\n}\n","import { createOmiSdk, type OmiSdk } from \"@omi/sdk\";\n\nimport { createAuthenticatedFetch } from \"../auth/authenticated-fetch.js\";\nimport { resolveKbApiBaseUrl } from \"./api-base.js\";\nimport type { KbCliContext } from \"./context.js\";\n\nexport function createKbSdk(ctx: KbCliContext, space: string): OmiSdk {\n const apiBaseUrl = resolveKbApiBaseUrl(ctx.baseUrl, ctx.deps.env);\n const fetchFn = createAuthenticatedFetch(ctx);\n return createOmiSdk({ baseUrl: apiBaseUrl, space, fetch: fetchFn });\n}\n","import type { Command } from \"commander\";\n\nimport { createOmiLogger, type Logger } from \"@omi/core\";\n\nexport const DEFAULT_BASE_URL = \"http://localhost:3000\";\n\nexport type KbCliDeps = {\n fetch: typeof fetch;\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n env: NodeJS.ProcessEnv;\n /** Injected for tests; when set, skips creating a logger from CLI flags. */\n logger?: Logger;\n};\n\nexport const defaultKbCliDeps: KbCliDeps = {\n fetch: globalThis.fetch.bind(globalThis),\n stdout: process.stdout,\n stderr: process.stderr,\n env: process.env,\n};\n\nexport type KbCliContext = {\n deps: KbCliDeps;\n baseUrl: string;\n logger: Logger;\n};\n\nexport function parseGlobalOpts(program: Command): { baseUrl: string; logLevel: string } {\n const o = program.opts() as { baseUrl?: string; logLevel?: string };\n return {\n baseUrl: o.baseUrl ?? DEFAULT_BASE_URL,\n logLevel: o.logLevel ?? \"error\",\n };\n}\n\nexport function createKbCliContext(deps: KbCliDeps, program: Command): KbCliContext {\n const g = parseGlobalOpts(program);\n const logger =\n deps.logger ??\n createOmiLogger({\n service: \"cli\",\n level: g.logLevel,\n destination: \"stderr\",\n bindings: { component: \"kb\" },\n });\n return { deps, baseUrl: g.baseUrl, logger };\n}\n","import type { Command } from \"commander\";\n\nimport {\n credentialsMatchOrigin,\n loadCredentials,\n type CredentialsStoreOptions,\n} from \"../auth/credentials.js\";\nimport { resolveAuthOrigin } from \"../auth/origin.js\";\nimport type { KbCliDeps } from \"./context.js\";\nimport { writeCliError } from \"../http/http-error.js\";\n\nexport function resolveExplicitSpaceId(\n program: Command,\n env: NodeJS.ProcessEnv,\n): string | undefined {\n const o = program.opts() as { space?: string };\n if (o.space !== undefined && o.space.length > 0) {\n return o.space;\n }\n const fromEnv = env[\"KB_SPACE\"];\n if (fromEnv !== undefined && fromEnv.length > 0) {\n return fromEnv;\n }\n return undefined;\n}\n\nexport async function resolveSpaceId(\n program: Command,\n deps: KbCliDeps,\n baseUrl: string,\n credentialsOptions?: CredentialsStoreOptions,\n): Promise<string | undefined> {\n const explicit = resolveExplicitSpaceId(program, deps.env);\n if (explicit !== undefined) {\n return explicit;\n }\n\n const credentials = await loadCredentials(credentialsOptions);\n const origin = resolveAuthOrigin(baseUrl);\n if (credentials !== null && credentialsMatchOrigin(credentials, origin)) {\n return credentials.spaceId;\n }\n\n return undefined;\n}\n\n/** Returns space id or writes validation error to stderr and returns null. */\nexport async function requireSpaceId(\n program: Command,\n deps: KbCliDeps,\n baseUrl: string,\n credentialsOptions?: CredentialsStoreOptions,\n): Promise<string | null> {\n const id = await resolveSpaceId(program, deps, baseUrl, credentialsOptions);\n if (id === undefined) {\n writeCliError(deps.stderr, {\n code: \"VALIDATION_ERROR\",\n message: \"Missing space id: pass --space <id>, set KB_SPACE, or run kb login\",\n details: null,\n });\n return null;\n }\n return id;\n}\n","/**\n * Writes a successful value to stdout as pretty-printed JSON (2-space indent) plus a newline.\n */\nexport function writeStdoutPrettyJson(stdout: NodeJS.WriteStream, value: unknown): void {\n stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/**\n * Writes successful HTTP response body to stdout. JSON is parsed and pretty-printed; other bodies\n * are written as-is with a trailing newline if missing.\n */\nexport function writeStdoutFromResponseText(stdout: NodeJS.WriteStream, text: string): void {\n const trimmed = text.trim();\n if (trimmed === \"\") {\n return;\n }\n try {\n const parsed = JSON.parse(text) as unknown;\n writeStdoutPrettyJson(stdout, parsed);\n } catch {\n stdout.write(text.endsWith(\"\\n\") ? text : `${text}\\n`);\n }\n}\n","import { writeStdoutPrettyJson } from \"./write-json.js\";\n\nexport type CommandSuccess =\n | {\n kind: \"json\";\n value: unknown;\n }\n | {\n kind: \"void\";\n };\n\nexport function successJson(value: unknown): CommandSuccess {\n return { kind: \"json\", value };\n}\n\nexport function successVoid(): CommandSuccess {\n return { kind: \"void\" };\n}\n\nexport function writeCommandSuccess(stdout: NodeJS.WriteStream, success: CommandSuccess): void {\n if (success.kind === \"void\") {\n return;\n }\n writeStdoutPrettyJson(stdout, success.value);\n}\n","import { OmiSdkError } from \"@omi/sdk\";\n\nimport type { CliErrorJson } from \"./http-error.js\";\n\nexport function cliErrorFromUnknown(err: unknown): CliErrorJson {\n if (err instanceof OmiSdkError) {\n return { code: err.code, message: err.message, details: err.details ?? null };\n }\n const msg = err instanceof Error ? err.message : String(err);\n return { code: \"INTERNAL\", message: msg, details: null };\n}\n","import type { Command } from \"commander\";\n\nimport { DEFAULT_TASK_ID } from \"@omi/core\";\n\nimport type { KbCliDeps } from \"./context.js\";\nimport { writeCliError } from \"../http/http-error.js\";\n\nfunction normalizeTaskId(candidate: string | undefined): string | undefined {\n if (candidate === undefined) {\n return undefined;\n }\n const trimmed = candidate.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function resolveTaskId(\n program: Command,\n env: NodeJS.ProcessEnv,\n explicitTaskId?: string,\n): string | undefined {\n const fromExplicit = normalizeTaskId(explicitTaskId);\n if (fromExplicit !== undefined) {\n return fromExplicit;\n }\n const opts = program.opts() as { task?: string };\n const fromOption = normalizeTaskId(opts.task);\n if (fromOption !== undefined) {\n return fromOption;\n }\n return normalizeTaskId(env[\"KB_TASK\"]);\n}\n\n/**\n * Task id for shell / proposal / diff when `--task`, argv, and `KB_TASK` are unset: virtual `default`.\n */\nexport function resolveTaskContextId(\n program: Command,\n env: NodeJS.ProcessEnv,\n explicitTaskId?: string,\n): string {\n return resolveTaskId(program, env, explicitTaskId) ?? DEFAULT_TASK_ID;\n}\n\n/** Returns task id or writes validation error to stderr and returns null. */\nexport function requireTaskId(\n program: Command,\n deps: KbCliDeps,\n explicitTaskId?: string,\n): string | null {\n const taskId = resolveTaskId(program, deps.env, explicitTaskId);\n if (taskId === undefined) {\n writeCliError(deps.stderr, {\n code: \"VALIDATION_ERROR\",\n message: \"Missing task id: pass --task <id> or set KB_TASK\",\n details: null,\n });\n return null;\n }\n return taskId;\n}\n\n/** Like {@link requireTaskId} but defaults to the virtual `default` task when unset. */\nexport function requireTaskContextId(\n program: Command,\n deps: KbCliDeps,\n explicitTaskId?: string,\n): string {\n return resolveTaskContextId(program, deps.env, explicitTaskId);\n}\n","import type { Command } from \"commander\";\nimport { createKbSdk } from \"../cli/sdk-factory.js\";\n\nimport type { KbCliDeps } from \"../cli/context.js\";\nimport { createKbCliContext } from \"../cli/context.js\";\nimport { requireSpaceId } from \"../cli/space-resolve.js\";\nimport { requireTaskContextId } from \"../cli/task-resolve.js\";\nimport { successJson, writeCommandSuccess } from \"../http/command-success.js\";\nimport { writeCliError } from \"../http/http-error.js\";\nimport { cliErrorFromUnknown } from \"../http/sdk-bridge.js\";\n\nexport function registerDiffCommand(\n program: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n program\n .command(\"diff\")\n .description(\"Show merged proposal diffs for the current task\")\n .option(\"--task <taskId>\", \"Override task id\")\n .action(async (opts: { task?: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskContextId(rootProgram, deps, opts.task);\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const diffs = await sdk.taskApi.diff(taskId);\n writeCommandSuccess(ctx.deps.stdout, successJson({ diffs }));\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n });\n}\n","import type { Command } from \"commander\";\nimport type { OmiSdk } from \"@omi/sdk\";\n\nimport { createKbSdk } from \"../../cli/sdk-factory.js\";\n\nimport type { KbCliDeps } from \"../../cli/context.js\";\nimport { createKbCliContext } from \"../../cli/context.js\";\nimport { requireSpaceId } from \"../../cli/space-resolve.js\";\nimport { requireTaskContextId } from \"../../cli/task-resolve.js\";\nimport { successJson, successVoid, writeCommandSuccess } from \"../../http/command-success.js\";\nimport { writeCliError } from \"../../http/http-error.js\";\nimport { cliErrorFromUnknown } from \"../../http/sdk-bridge.js\";\n\nasync function resolveProposalIds(\n sdk: OmiSdk,\n taskId: string,\n proposalIds: string[],\n all: boolean,\n): Promise<string[]> {\n if (all) {\n const proposals = await sdk.taskApi.listProposals(taskId);\n return proposals.map((proposal) => proposal.id);\n }\n return proposalIds;\n}\n\nfunction ensureProposalSelection(\n proposalIds: string[],\n deps: KbCliDeps,\n exitRef: { code: number },\n): boolean {\n if (proposalIds.length > 0) {\n return true;\n }\n writeCliError(deps.stderr, {\n code: \"VALIDATION_ERROR\",\n message: \"Missing proposal ids: pass proposal ids or use --all\",\n details: null,\n });\n exitRef.code = 1;\n return false;\n}\n\n/**\n * Registers `kb proposal ...` subcommands.\n */\nexport function registerProposalCommands(\n proposal: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n proposal\n .command(\"list\")\n .description(\"List proposals for the current task\")\n .option(\"--task <taskId>\", \"Override task id\")\n .action(async (opts: { task?: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskContextId(rootProgram, deps, opts.task);\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const proposals = await sdk.taskApi.listProposals(taskId);\n writeCommandSuccess(ctx.deps.stdout, successJson({ proposals }));\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n });\n\n proposal\n .command(\"submit\")\n .description(\"Submit one or more proposals\")\n .argument(\"[proposalIds...]\", \"Proposal ids\")\n .option(\"--all\", \"Submit all proposals in current task\", false)\n .option(\"--task <taskId>\", \"Override task id\")\n .action(async (proposalIds: string[], opts: { all?: boolean; task?: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskContextId(rootProgram, deps, opts.task);\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const resolvedIds = await resolveProposalIds(sdk, taskId, proposalIds, opts.all === true);\n if (!ensureProposalSelection(resolvedIds, deps, exitRef)) {\n return;\n }\n await sdk.taskApi.submit(taskId, resolvedIds);\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n });\n\n proposal\n .command(\"approve\")\n .description(\"Approve one or more proposals\")\n .argument(\"[proposalIds...]\", \"Proposal ids\")\n .option(\"--all\", \"Approve all proposals in current task\", false)\n .option(\"--task <taskId>\", \"Override task id\")\n .action(async (proposalIds: string[], opts: { all?: boolean; task?: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskContextId(rootProgram, deps, opts.task);\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const resolvedIds = await resolveProposalIds(sdk, taskId, proposalIds, opts.all === true);\n if (!ensureProposalSelection(resolvedIds, deps, exitRef)) {\n return;\n }\n await sdk.taskApi.approve(taskId, resolvedIds);\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n });\n\n proposal\n .command(\"reject\")\n .description(\"Reject one or more proposals\")\n .argument(\"[proposalIds...]\", \"Proposal ids\")\n .option(\"--reason <reason>\", \"Optional reject reason\")\n .option(\"--all\", \"Reject all proposals in current task\", false)\n .option(\"--task <taskId>\", \"Override task id\")\n .action(\n async (proposalIds: string[], opts: { all?: boolean; task?: string; reason?: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskContextId(rootProgram, deps, opts.task);\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const resolvedIds = await resolveProposalIds(sdk, taskId, proposalIds, opts.all === true);\n if (!ensureProposalSelection(resolvedIds, deps, exitRef)) {\n return;\n }\n await sdk.taskApi.reject(taskId, resolvedIds, opts.reason ?? \"\");\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n },\n );\n\n proposal\n .command(\"merge\")\n .description(\"Merge one or more proposals\")\n .argument(\"[proposalIds...]\", \"Proposal ids\")\n .option(\"--all\", \"Merge all proposals in current task\", false)\n .option(\"--task <taskId>\", \"Override task id\")\n .action(async (proposalIds: string[], opts: { all?: boolean; task?: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskContextId(rootProgram, deps, opts.task);\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const resolvedIds = await resolveProposalIds(sdk, taskId, proposalIds, opts.all === true);\n if (!ensureProposalSelection(resolvedIds, deps, exitRef)) {\n return;\n }\n await sdk.taskApi.merge(taskId, resolvedIds);\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n });\n}\n","import type { SearchOption } from \"@omi/core\";\nimport { createKbSdk } from \"../cli/sdk-factory.js\";\nimport type { Command } from \"commander\";\n\nimport { createKbCliContext, type KbCliDeps } from \"../cli/context.js\";\nimport { requireSpaceId } from \"../cli/space-resolve.js\";\nimport { successJson, writeCommandSuccess } from \"../http/command-success.js\";\nimport { writeCliError } from \"../http/http-error.js\";\nimport { cliErrorFromUnknown } from \"../http/sdk-bridge.js\";\n\ntype SearchCliOptions = {\n targetUri?: string;\n limit?: string;\n scoreThreshold?: string;\n};\n\nfunction parseLimit(raw: string | undefined): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"invalid option --limit: expected a positive integer\");\n }\n return parsed;\n}\n\nfunction parseScoreThreshold(raw: string | undefined): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const parsed = Number(raw);\n if (!Number.isFinite(parsed)) {\n throw new Error(\"invalid option --score-threshold: expected a finite number\");\n }\n return parsed;\n}\n\nfunction toSearchOption(opts: SearchCliOptions): SearchOption | undefined {\n const option: SearchOption = {};\n if (opts.targetUri !== undefined) {\n option.targetUri = opts.targetUri;\n }\n const limit = parseLimit(opts.limit);\n if (limit !== undefined) {\n option.limit = limit;\n }\n const scoreThreshold = parseScoreThreshold(opts.scoreThreshold);\n if (scoreThreshold !== undefined) {\n option.scoreThreshold = scoreThreshold;\n }\n return Object.keys(option).length === 0 ? undefined : option;\n}\n\nexport function registerSearchCommand(\n program: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n program\n .command(\"search\")\n .description(\"Search synced knowledge within the current space\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--target-uri <uri>\", \"SearchOption.targetUri\")\n .option(\"--limit <n>\", \"SearchOption.limit\")\n .option(\"--score-threshold <n>\", \"SearchOption.scoreThreshold\")\n .action(async (query: string, opts: SearchCliOptions) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n let searchOption: SearchOption | undefined;\n try {\n searchOption = toSearchOption(opts);\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const result = await sdk.storeApi.search(query, searchOption);\n writeCommandSuccess(ctx.deps.stdout, successJson(result));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { createKbSdk } from \"../cli/sdk-factory.js\";\n\nimport type { KbCliDeps } from \"../cli/context.js\";\nimport { createKbCliContext } from \"../cli/context.js\";\nimport { requireSpaceId } from \"../cli/space-resolve.js\";\nimport { requireTaskContextId } from \"../cli/task-resolve.js\";\nimport { successJson, writeCommandSuccess } from \"../http/command-success.js\";\nimport { writeCliError } from \"../http/http-error.js\";\nimport { cliErrorFromUnknown } from \"../http/sdk-bridge.js\";\n\nfunction parseTimeoutMs(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(\"invalid option --timeout-ms: expected a positive integer\");\n }\n return parsed;\n}\n\nfunction parseEnvList(values: string[] | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n for (const entry of values ?? []) {\n const idx = entry.indexOf(\"=\");\n if (idx <= 0 || idx === entry.length - 1) {\n throw new Error(`invalid --env entry \"${entry}\": expected KEY=VALUE`);\n }\n const key = entry.slice(0, idx);\n const val = entry.slice(idx + 1);\n out[key] = val;\n }\n return out;\n}\n\nexport function registerShellCommand(\n program: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n program\n .command(\"shell\")\n .description(\"Execute a shell command in task context\")\n .argument(\"<command>\", \"Command to run\")\n .option(\"--task <taskId>\", \"Override task id\")\n .option(\"--cwd <cwd>\", \"Relative working directory\", \".\")\n .option(\"--timeout-ms <ms>\", \"Timeout in milliseconds\", parseTimeoutMs, 30000)\n .option(\"--env <pair...>\", \"Environment entries in KEY=VALUE form\")\n .action(\n async (\n command: string,\n opts: {\n task?: string;\n cwd?: string;\n timeoutMs: number;\n env?: string[];\n },\n ) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskContextId(rootProgram, deps, opts.task);\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const env = parseEnvList(opts.env);\n const result = await sdk.taskApi.executeShellCommand(taskId, {\n command,\n cwd: opts.cwd ?? \".\",\n timeoutMs: opts.timeoutMs,\n env,\n });\n if (result.exitCode === 0) {\n if (result.stdout.length > 0) {\n ctx.deps.stdout.write(result.stdout);\n }\n exitRef.code = 0;\n return;\n }\n\n writeCommandSuccess(ctx.deps.stdout, successJson(result));\n exitRef.code = 1;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n },\n );\n}\n","import type { SpaceMetadataCreateInput, SpaceUpdateInput } from \"@omi/core\";\nimport type { Command } from \"commander\";\nimport { createKbSdk } from \"../../cli/sdk-factory.js\";\n\nimport { createKbCliContext, type KbCliDeps } from \"../../cli/context.js\";\nimport { successJson, successVoid, writeCommandSuccess } from \"../../http/command-success.js\";\nimport { writeCliError } from \"../../http/http-error.js\";\nimport { cliErrorFromUnknown } from \"../../http/sdk-bridge.js\";\n\n/**\n * Registers `kb space …` subcommands. Each action maps CLI args to the SDK `spaceApi`.\n */\nexport function registerSpaceCommands(\n space: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n space\n .command(\"create\")\n .description(\"Create a space\")\n .option(\"--id <id>\", \"Explicit id\")\n .option(\"--name <name>\", \"Display name\")\n .option(\"--description <text>\", \"Description\")\n .action(async (opts: { id?: string; name?: string; description?: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n ctx.logger.debug({ baseUrl: ctx.baseUrl }, \"cli\");\n const sdk = createKbSdk(ctx, \"\");\n const input: SpaceMetadataCreateInput = {};\n if (opts.id !== undefined) {\n input.id = opts.id;\n }\n if (opts.name !== undefined) {\n input.name = opts.name;\n }\n if (opts.description !== undefined) {\n input.description = opts.description;\n }\n try {\n const created = await sdk.spaceApi.create(\n Object.keys(input).length > 0 ? input : undefined,\n );\n writeCommandSuccess(ctx.deps.stdout, successJson(created));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n space\n .command(\"update\")\n .description(\"Update a space\")\n .argument(\"<id>\", \"Space id\")\n .option(\"--name <name>\", \"Display name\")\n .option(\"--description <text>\", \"Description\")\n .action(async (id: string, opts: { name?: string; description?: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n ctx.logger.debug({ baseUrl: ctx.baseUrl }, \"cli\");\n const sdk = createKbSdk(ctx, \"\");\n const patch: SpaceUpdateInput = {};\n if (opts.name !== undefined) {\n patch.name = opts.name;\n }\n if (opts.description !== undefined) {\n patch.description = opts.description;\n }\n try {\n const updated = await sdk.spaceApi.update(id, patch);\n writeCommandSuccess(ctx.deps.stdout, successJson(updated));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n space\n .command(\"get\")\n .description(\"Get a space by id\")\n .argument(\"<id>\", \"Space id\")\n .action(async (id: string) => {\n const ctx = createKbCliContext(deps, rootProgram);\n ctx.logger.debug({ baseUrl: ctx.baseUrl }, \"cli\");\n const sdk = createKbSdk(ctx, \"\");\n try {\n const row = await sdk.spaceApi.get(id);\n writeCommandSuccess(ctx.deps.stdout, successJson(row));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n space\n .command(\"delete\")\n .description(\"Delete a space\")\n .argument(\"<id>\", \"Space id\")\n .action(async (id: string) => {\n const ctx = createKbCliContext(deps, rootProgram);\n ctx.logger.debug({ baseUrl: ctx.baseUrl }, \"cli\");\n const sdk = createKbSdk(ctx, \"\");\n try {\n await sdk.spaceApi.delete(id);\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n space\n .command(\"list\")\n .description(\"List spaces\")\n .action(async () => {\n const ctx = createKbCliContext(deps, rootProgram);\n ctx.logger.debug({ baseUrl: ctx.baseUrl }, \"cli\");\n const sdk = createKbSdk(ctx, \"\");\n try {\n const spaces = await sdk.spaceApi.list();\n writeCommandSuccess(ctx.deps.stdout, successJson({ spaces }));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport type { StoreCreateInput, StoreResource, StoreUpdateInput } from \"@omi/core\";\nimport type { Command } from \"commander\";\nimport { createKbSdk } from \"../../cli/sdk-factory.js\";\n\nimport { createKbCliContext, type KbCliDeps } from \"../../cli/context.js\";\nimport { parseKbUri } from \"@omi/core\";\nimport { requireSpaceId } from \"../../cli/space-resolve.js\";\nimport { writeCliError } from \"../../http/http-error.js\";\nimport { cliErrorFromUnknown } from \"../../http/sdk-bridge.js\";\nimport { writeStdoutPrettyJson } from \"../../http/write-json.js\";\nimport { storeResourceToCliOutput } from \"./store-cli-output.js\";\n\n/**\n * Registers `kb store …` subcommands.\n */\nexport function registerStoreCommands(\n store: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n store\n .command(\"create\")\n .description(\"Create a store in the current space\")\n .option(\"--id <id>\", \"Explicit store id\")\n .option(\"--name <name>\", \"Display name\")\n .option(\"--description <text>\", \"Description\")\n .option(\"--read-only\", \"Create store in read-only mode\", false)\n .action(\n async (opts: { id?: string; name?: string; description?: string; readOnly?: boolean }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n const input: StoreCreateInput = {};\n if (opts.id !== undefined) {\n input.id = opts.id;\n }\n if (opts.name !== undefined) {\n input.name = opts.name;\n }\n if (opts.description !== undefined) {\n input.description = opts.description;\n }\n if (opts.readOnly === true) {\n input.readOnly = true;\n }\n try {\n const created = await sdk.storeApi.create(\n Object.keys(input).length > 0 ? input : undefined,\n );\n writeStdoutPrettyJson(ctx.deps.stdout, storeResourceToCliOutput(created, spaceId));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n },\n );\n\n store\n .command(\"update\")\n .description(\"Update a store\")\n .argument(\"<storeId>\", \"Store id\")\n .option(\"--name <name>\", \"Display name\")\n .option(\"--description <text>\", \"Description\")\n .action(async (storeId: string, opts: { name?: string; description?: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n const patch: StoreUpdateInput = {};\n if (opts.name !== undefined) {\n patch.name = opts.name;\n }\n if (opts.description !== undefined) {\n patch.description = opts.description;\n }\n try {\n const updated = await sdk.storeApi.update(storeId, patch);\n writeStdoutPrettyJson(ctx.deps.stdout, storeResourceToCliOutput(updated, spaceId));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n store\n .command(\"get\")\n .description(\"Get a store by id\")\n .argument(\"<storeId>\", \"Store id\")\n .action(async (storeId: string) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const row = await sdk.storeApi.get(storeId);\n writeStdoutPrettyJson(ctx.deps.stdout, storeResourceToCliOutput(row, spaceId));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n store\n .command(\"delete\")\n .description(\"Delete a store\")\n .argument(\"<storeId>\", \"Store id\")\n .action(async (storeId: string) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n await sdk.storeApi.delete(storeId);\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n store\n .command(\"list\")\n .description(\"List stores in the current space\")\n .action(async () => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const rows = await sdk.storeApi.list();\n const out = {\n stores: rows.map((r: StoreResource) => storeResourceToCliOutput(r, spaceId)),\n };\n writeStdoutPrettyJson(ctx.deps.stdout, out);\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n store\n .command(\"upload\")\n .description(\"Upload a local file into a store path (kb://spaceId/storeId/path)\")\n .requiredOption(\"--file <path>\", \"Local file path\")\n .requiredOption(\"--to <uri>\", \"Destination kb://… URI\")\n .action(async (opts: { file: string; to: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n let storeId: string;\n let destPath: string;\n try {\n const u = parseKbUri(opts.to);\n if (u.storeId === undefined) {\n deps.stderr.write(\n `${JSON.stringify({\n code: \"VALIDATION_ERROR\",\n message: \"upload --to must include a storeId (kb://<spaceId>/<storeId>/<path>)\",\n details: null,\n })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n storeId = u.storeId;\n destPath = u.path;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n deps.stderr.write(\n `${JSON.stringify({ code: \"VALIDATION_ERROR\", message: msg, details: null })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n if (destPath.length === 0) {\n deps.stderr.write(\n `${JSON.stringify({\n code: \"VALIDATION_ERROR\",\n message:\n \"upload --to must include a path after the store id (e.g. kb://spaceId/storeId/file.txt)\",\n details: null,\n })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const buf = await readFile(opts.file);\n await sdk.storeApi.uploadFile({\n storeId,\n path: destPath,\n body: new Uint8Array(buf),\n });\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n store\n .command(\"download\")\n .description(\"Download a store file to a local path\")\n .requiredOption(\"--from <uri>\", \"Source kb://… URI\")\n .requiredOption(\"--to <path>\", \"Local file path\")\n .action(async (opts: { from: string; to: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n let storeId: string;\n let sourcePath: string;\n try {\n const u = parseKbUri(opts.from);\n if (u.storeId === undefined) {\n deps.stderr.write(\n `${JSON.stringify({\n code: \"VALIDATION_ERROR\",\n message: \"download --from must include a storeId (kb://<spaceId>/<storeId>/<path>)\",\n details: null,\n })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n storeId = u.storeId;\n sourcePath = u.path;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n deps.stderr.write(\n `${JSON.stringify({ code: \"VALIDATION_ERROR\", message: msg, details: null })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n if (sourcePath.length === 0) {\n deps.stderr.write(\n `${JSON.stringify({\n code: \"VALIDATION_ERROR\",\n message: \"download --from must include a path after the store id\",\n details: null,\n })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const bytes = await sdk.storeApi.downloadFile({ storeId, path: sourcePath });\n await writeFile(opts.to, Buffer.from(bytes));\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n\n store\n .command(\"remove\")\n .description(\"Remove a file from a store (kb://spaceId/storeId/path)\")\n .requiredOption(\"--from <uri>\", \"kb://… URI of the file to remove\")\n .action(async (opts: { from: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n let storeId: string;\n let filePath: string;\n try {\n const u = parseKbUri(opts.from);\n if (u.storeId === undefined) {\n deps.stderr.write(\n `${JSON.stringify({\n code: \"VALIDATION_ERROR\",\n message: \"remove --from must include a storeId (kb://<spaceId>/<storeId>/<path>)\",\n details: null,\n })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n storeId = u.storeId;\n filePath = u.path;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n deps.stderr.write(\n `${JSON.stringify({ code: \"VALIDATION_ERROR\", message: msg, details: null })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n if (filePath.length === 0) {\n deps.stderr.write(\n `${JSON.stringify({\n code: \"VALIDATION_ERROR\",\n message: \"remove --from must include a path after the store id\",\n details: null,\n })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n await sdk.storeApi.deleteFile({ storeId, path: filePath });\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n}\n","import { formatKbUri, type StoreResource } from \"@omi/core\";\n\nexport function storeResourceToCliOutput(\n row: StoreResource,\n spaceId: string,\n): Record<string, unknown> {\n const id = row.id;\n return {\n storeId: id,\n storeName: row.name,\n storeDescription: row.description,\n storeReadOnly: row.readOnly,\n storeCreatedAt: row.createdAt,\n storeUpdatedAt: row.updatedAt,\n path: formatKbUri(spaceId, id),\n };\n}\n","import type { TaskCreateInput, TaskUpdateInput } from \"@omi/core\";\nimport { createKbSdk } from \"../../cli/sdk-factory.js\";\nimport type { Command } from \"commander\";\n\nimport type { KbCliDeps } from \"../../cli/context.js\";\nimport { createKbCliContext } from \"../../cli/context.js\";\nimport { requireSpaceId } from \"../../cli/space-resolve.js\";\nimport { requireTaskId } from \"../../cli/task-resolve.js\";\nimport { writeCommandSuccess, successJson, successVoid } from \"../../http/command-success.js\";\nimport { writeCliError } from \"../../http/http-error.js\";\nimport { cliErrorFromUnknown } from \"../../http/sdk-bridge.js\";\n\nfunction appendStoreId(value: string, current: string[]): string[] {\n return [...current, value];\n}\n\n/**\n * Registers `kb task ...` subcommands.\n */\nexport function registerTaskCommands(\n task: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n task\n .command(\"start\")\n .description(\"Start a task in the current space\")\n .option(\"--id <id>\", \"Explicit task id\")\n .option(\"--name <name>\", \"Display name\")\n .option(\"--description <text>\", \"Description\")\n .option(\"--readonly\", \"Start in readonly mode\", false)\n .option(\"--store <storeId>\", \"Bind store id to task runtime\", appendStoreId, [])\n .action(\n async (opts: {\n id?: string;\n name?: string;\n description?: string;\n readonly?: boolean;\n store: string[];\n }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n const storeIds = opts.store ?? [];\n const input: TaskCreateInput = storeIds.length > 0 ? { storeIds } : { all: true };\n if (opts.id !== undefined) {\n input.id = opts.id;\n }\n if (opts.name !== undefined) {\n input.name = opts.name;\n }\n if (opts.description !== undefined) {\n input.description = opts.description;\n }\n if (opts.readonly === true) {\n input.readonly = true;\n }\n try {\n const created = await sdk.taskApi.create(input);\n writeCommandSuccess(ctx.deps.stdout, successJson(created));\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n },\n );\n\n task\n .command(\"get\")\n .description(\"Get a task by id\")\n .argument(\"[taskId]\", \"Task id (optional when --task or KB_TASK is set)\")\n .action(async (taskIdArg?: string) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskId(rootProgram, deps, taskIdArg);\n if (taskId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const row = await sdk.taskApi.get(taskId);\n writeCommandSuccess(ctx.deps.stdout, successJson(row));\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n });\n\n task\n .command(\"list\")\n .description(\"List tasks in the current space\")\n .action(async () => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const tasks = await sdk.taskApi.list();\n writeCommandSuccess(ctx.deps.stdout, successJson({ tasks }));\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n });\n\n task\n .command(\"update\")\n .description(\"Update a task\")\n .argument(\"[taskId]\", \"Task id (optional when --task or KB_TASK is set)\")\n .option(\"--name <name>\", \"Display name\")\n .option(\"--description <text>\", \"Description\")\n .option(\"--clear-description\", \"Clear description\", false)\n .action(\n async (\n taskIdArg: string | undefined,\n opts: { name?: string; description?: string; clearDescription?: boolean },\n ) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskId(rootProgram, deps, taskIdArg);\n if (taskId === null) {\n exitRef.code = 1;\n return;\n }\n const patch: TaskUpdateInput = {};\n if (opts.name !== undefined) {\n patch.name = opts.name;\n }\n if (opts.clearDescription === true) {\n patch.description = null;\n } else if (opts.description !== undefined) {\n patch.description = opts.description;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n const row = await sdk.taskApi.update(taskId, patch);\n writeCommandSuccess(ctx.deps.stdout, successJson(row));\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n },\n );\n\n task\n .command(\"delete\")\n .description(\"Delete a task\")\n .argument(\"[taskId]\", \"Task id (optional when --task or KB_TASK is set)\")\n .action(async (taskIdArg?: string) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskId(rootProgram, deps, taskIdArg);\n if (taskId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n await sdk.taskApi.delete(taskId);\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n });\n\n task\n .command(\"stop\")\n .description(\"Stop a task\")\n .argument(\"[taskId]\", \"Task id (optional when --task or KB_TASK is set)\")\n .action(async (taskIdArg?: string) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n const taskId = requireTaskId(rootProgram, deps, taskIdArg);\n if (taskId === null) {\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n await sdk.taskApi.stop(taskId);\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (error) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(error));\n exitRef.code = 1;\n }\n });\n}\n","/** OAuth device-flow client id for the KnowBrain (`kb`) CLI — not configurable. */\nexport const KB_DEVICE_CLIENT_ID = \"knowbrain\";\n\nexport const DEVICE_GRANT_TYPE = \"urn:ietf:params:oauth:grant-type:device_code\";\n","import type { Logger } from \"@omi/core\";\n\nimport type { CliErrorJson } from \"../http/http-error.js\";\nimport { DEVICE_GRANT_TYPE, KB_DEVICE_CLIENT_ID } from \"./constants.js\";\nimport {\n credentialsMatchOrigin,\n saveCredentials,\n type CredentialsStoreOptions,\n type KbCredentials,\n} from \"./credentials.js\";\nimport { resolveAuthOrigin } from \"./origin.js\";\n\nexport type DeviceCodeResponse = {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n};\n\nexport type DeviceTokenSuccess = {\n access_token: string;\n token_type: string;\n expires_in: number;\n scope?: string | undefined;\n};\n\nexport type DeviceTokenError = {\n error: string;\n error_description?: string;\n};\n\nexport type DeviceLoginResult = {\n credentials: KbCredentials;\n userEmail?: string | undefined;\n spaceId: string;\n};\n\nexport type DeviceLoginOptions = CredentialsStoreOptions & {\n fetch?: typeof fetch;\n stderr?: NodeJS.WriteStream;\n logger?: Logger;\n openBrowser?: (url: string) => Promise<void>;\n sleep?: (ms: number) => Promise<void>;\n now?: () => number;\n};\n\nfunction sleepDefault(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction authJsonHeaders(origin: string): Record<string, string> {\n return {\n \"content-type\": \"application/json\",\n Origin: origin,\n };\n}\n\nfunction deviceOAuthError(code: string, message: string): CliErrorJson {\n return { code, message, details: null };\n}\n\nfunction mapTokenError(error: string, description?: string): CliErrorJson {\n switch (error) {\n case \"expired_token\":\n return deviceOAuthError(\n \"AUTH_EXPIRED\",\n description ?? \"Device authorization expired. Run `kb login` again.\",\n );\n case \"access_denied\":\n return deviceOAuthError(\"AUTH_DENIED\", description ?? \"Sign-in was denied.\");\n case \"invalid_grant\":\n case \"invalid_client\":\n return deviceOAuthError(\n \"AUTH_FAILED\",\n description ?? \"Device authorization failed. Run `kb login` again.\",\n );\n default:\n return deviceOAuthError(\"AUTH_FAILED\", description ?? error);\n }\n}\n\nasync function parseJsonBody(res: Response): Promise<unknown> {\n const text = await res.text();\n if (text.trim() === \"\") {\n return null;\n }\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return null;\n }\n}\n\nexport async function requestDeviceCode(\n fetchFn: typeof fetch,\n origin: string,\n): Promise<DeviceCodeResponse> {\n const res = await fetchFn(`${origin}/api/auth/device/code`, {\n method: \"POST\",\n headers: authJsonHeaders(origin),\n body: JSON.stringify({ client_id: KB_DEVICE_CLIENT_ID }),\n });\n const body = await parseJsonBody(res);\n if (!res.ok) {\n const o =\n body && typeof body === \"object\" && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const err = typeof o[\"error\"] === \"string\" ? o[\"error\"] : undefined;\n if (err === \"invalid_client\") {\n throw mapTokenError(\"invalid_client\");\n }\n throw deviceOAuthError(\"AUTH_FAILED\", `Device code request failed (HTTP ${res.status})`);\n }\n const o = body as Record<string, unknown>;\n if (\n typeof o[\"device_code\"] !== \"string\" ||\n typeof o[\"user_code\"] !== \"string\" ||\n typeof o[\"verification_uri_complete\"] !== \"string\" ||\n typeof o[\"expires_in\"] !== \"number\" ||\n typeof o[\"interval\"] !== \"number\"\n ) {\n throw deviceOAuthError(\"INTERNAL\", \"Invalid device code response\");\n }\n if (!Number.isFinite(o[\"expires_in\"]) || o[\"expires_in\"] <= 0) {\n throw deviceOAuthError(\"INTERNAL\", \"Invalid device code response\");\n }\n if (!Number.isFinite(o[\"interval\"]) || o[\"interval\"] < 0) {\n throw deviceOAuthError(\"INTERNAL\", \"Invalid device code response\");\n }\n return {\n device_code: o[\"device_code\"],\n user_code: o[\"user_code\"],\n verification_uri: typeof o[\"verification_uri\"] === \"string\" ? o[\"verification_uri\"] : \"\",\n verification_uri_complete: o[\"verification_uri_complete\"],\n expires_in: o[\"expires_in\"],\n interval: o[\"interval\"],\n };\n}\n\nexport async function pollDeviceToken(\n fetchFn: typeof fetch,\n origin: string,\n deviceCode: string,\n options: {\n intervalSec: number;\n expiresInSec: number;\n stderr?: NodeJS.WriteStream;\n sleep?: (ms: number) => Promise<void>;\n now?: () => number;\n },\n): Promise<DeviceTokenSuccess> {\n const sleepFn = options.sleep ?? sleepDefault;\n const nowFn = options.now ?? (() => Date.now());\n if (!Number.isFinite(options.expiresInSec) || options.expiresInSec <= 0) {\n throw deviceOAuthError(\"INTERNAL\", \"Invalid device token poll expiry\");\n }\n if (!Number.isFinite(options.intervalSec) || options.intervalSec < 0) {\n throw deviceOAuthError(\"INTERNAL\", \"Invalid device token poll interval\");\n }\n const deadline = nowFn() + options.expiresInSec * 1000;\n let intervalSec = options.intervalSec;\n\n while (true) {\n const nowBeforeSleep = nowFn();\n if (nowBeforeSleep >= deadline) {\n throw mapTokenError(\"expired_token\");\n }\n const intervalMs = intervalSec * 1000;\n const sleepMs = Number.isFinite(intervalMs)\n ? Math.min(Math.max(intervalMs, 0), deadline - nowBeforeSleep)\n : deadline - nowBeforeSleep;\n await sleepFn(sleepMs);\n\n const res = await fetchFn(`${origin}/api/auth/device/token`, {\n method: \"POST\",\n headers: authJsonHeaders(origin),\n body: JSON.stringify({\n grant_type: DEVICE_GRANT_TYPE,\n device_code: deviceCode,\n client_id: KB_DEVICE_CLIENT_ID,\n }),\n });\n const body = await parseJsonBody(res);\n\n if (body && typeof body === \"object\" && !Array.isArray(body)) {\n const o = body as Record<string, unknown>;\n if (typeof o[\"access_token\"] === \"string\" && typeof o[\"expires_in\"] === \"number\") {\n const success: DeviceTokenSuccess = {\n access_token: o[\"access_token\"],\n token_type: typeof o[\"token_type\"] === \"string\" ? o[\"token_type\"] : \"Bearer\",\n expires_in: o[\"expires_in\"],\n };\n if (typeof o[\"scope\"] === \"string\") {\n success.scope = o[\"scope\"];\n }\n return success;\n }\n if (typeof o[\"error\"] === \"string\") {\n if (o[\"error\"] === \"authorization_pending\") {\n continue;\n }\n if (o[\"error\"] === \"slow_down\") {\n intervalSec += 5;\n continue;\n }\n throw mapTokenError(\n o[\"error\"],\n typeof o[\"error_description\"] === \"string\" ? o[\"error_description\"] : undefined,\n );\n }\n }\n\n if (!res.ok && res.status !== 400) {\n throw deviceOAuthError(\"AUTH_FAILED\", `Token poll failed (HTTP ${res.status})`);\n }\n }\n}\n\nexport type SessionProfile = {\n email?: string | undefined;\n spaceId?: string | undefined;\n};\n\nexport async function fetchSessionProfile(\n fetchFn: typeof fetch,\n origin: string,\n accessToken: string,\n): Promise<SessionProfile> {\n const res = await fetchFn(`${origin}/api/auth/get-session`, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Origin: origin,\n },\n });\n if (!res.ok) {\n return {};\n }\n const body = await parseJsonBody(res);\n if (!body || typeof body !== \"object\" || Array.isArray(body)) {\n return {};\n }\n const user = (body as Record<string, unknown>)[\"user\"];\n if (!user || typeof user !== \"object\" || Array.isArray(user)) {\n return {};\n }\n const profile: SessionProfile = {};\n const email = (user as Record<string, unknown>)[\"email\"];\n if (typeof email === \"string\") {\n profile.email = email;\n }\n const spaceId = (user as Record<string, unknown>)[\"id\"];\n if (typeof spaceId === \"string\" && spaceId.length > 0) {\n profile.spaceId = spaceId;\n }\n return profile;\n}\n\nexport async function runDeviceLogin(\n baseUrl: string,\n options: DeviceLoginOptions = {},\n): Promise<DeviceLoginResult> {\n const fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n const stderr = options.stderr ?? process.stderr;\n const origin = resolveAuthOrigin(baseUrl);\n const logger = options.logger;\n\n logger?.debug({ origin }, \"device login start\");\n\n const codeResponse = await requestDeviceCode(fetchFn, origin);\n\n stderr.write(`Open this link to sign in:\\n ${codeResponse.verification_uri_complete}\\n\\n`);\n stderr.write(`Or enter code: ${codeResponse.user_code}\\n\\n`);\n stderr.write(\"Waiting for approval…\\n\");\n\n if (options.openBrowser) {\n try {\n await options.openBrowser(codeResponse.verification_uri_complete);\n } catch (cause) {\n logger?.warn({ cause }, \"could not open browser\");\n }\n }\n\n const pollOptions: {\n intervalSec: number;\n expiresInSec: number;\n stderr?: NodeJS.WriteStream;\n sleep?: (ms: number) => Promise<void>;\n now?: () => number;\n } = {\n intervalSec: codeResponse.interval,\n expiresInSec: codeResponse.expires_in,\n stderr,\n };\n if (options.sleep !== undefined) {\n pollOptions.sleep = options.sleep;\n }\n if (options.now !== undefined) {\n pollOptions.now = options.now;\n }\n const token = await pollDeviceToken(fetchFn, origin, codeResponse.device_code, pollOptions);\n\n const nowFn = options.now ?? (() => Date.now());\n const profile = await fetchSessionProfile(fetchFn, origin, token.access_token);\n if (profile.spaceId === undefined) {\n throw deviceOAuthError(\"INTERNAL\", \"Invalid get-session response: missing user id\");\n }\n\n const credentials: KbCredentials = {\n accessToken: token.access_token,\n expiresAt: new Date(nowFn() + token.expires_in * 1000).toISOString(),\n origin,\n spaceId: profile.spaceId,\n };\n\n await saveCredentials(credentials, options);\n\n if (profile.email) {\n stderr.write(`Signed in as ${profile.email}\\n`);\n } else {\n stderr.write(\"Signed in.\\n\");\n }\n\n logger?.info({ origin }, \"device login ok\");\n\n const result: DeviceLoginResult = { credentials, spaceId: profile.spaceId };\n if (profile.email !== undefined) {\n result.userEmail = profile.email;\n }\n return result;\n}\n\nexport function assertCredentialsForOrigin(\n credentials: KbCredentials | null,\n origin: string,\n): asserts credentials is KbCredentials {\n if (!credentials || !credentialsMatchOrigin(credentials, origin)) {\n throw deviceOAuthError(\"AUTH_REQUIRED\", \"Not signed in. Run `kb login` first.\");\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function openUrlInBrowser(url: string): Promise<void> {\n const platform = process.platform;\n if (platform === \"darwin\") {\n await execFileAsync(\"open\", [url]);\n return;\n }\n if (platform === \"win32\") {\n await execFileAsync(\"cmd\", [\"/c\", \"start\", \"\", url]);\n return;\n }\n await execFileAsync(\"xdg-open\", [url]);\n}\n","import type { Command } from \"commander\";\n\nimport { clearCredentials } from \"../auth/credentials.js\";\nimport { runDeviceLogin } from \"../auth/device-oauth.js\";\nimport { openUrlInBrowser } from \"../auth/open-url.js\";\nimport { createKbCliContext, type KbCliDeps } from \"../cli/context.js\";\nimport { successVoid, writeCommandSuccess } from \"../http/command-success.js\";\nimport { writeCliError, type CliErrorJson } from \"../http/http-error.js\";\n\nfunction isCliErrorJson(err: unknown): err is CliErrorJson {\n return (\n err !== null &&\n typeof err === \"object\" &&\n \"code\" in err &&\n typeof (err as CliErrorJson).code === \"string\" &&\n \"message\" in err &&\n typeof (err as CliErrorJson).message === \"string\"\n );\n}\n\nexport function registerLoginCommand(\n program: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n program\n .command(\"login\")\n .description(\"Sign in via device authorization (browser)\")\n .action(async () => {\n const ctx = createKbCliContext(deps, rootProgram);\n ctx.logger.debug({ baseUrl: ctx.baseUrl }, \"cli login start\");\n try {\n await runDeviceLogin(ctx.baseUrl, {\n fetch: ctx.deps.fetch,\n stderr: ctx.deps.stderr,\n logger: ctx.logger,\n openBrowser: openUrlInBrowser,\n });\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (e) {\n ctx.logger.error({ err: e }, \"cli login failed\");\n if (isCliErrorJson(e)) {\n writeCliError(ctx.deps.stderr, e);\n } else {\n const message = e instanceof Error ? e.message : String(e);\n writeCliError(ctx.deps.stderr, { code: \"INTERNAL\", message, details: null });\n }\n exitRef.code = 1;\n }\n });\n}\n\nexport function registerLogoutCommand(\n program: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n program\n .command(\"logout\")\n .description(\"Remove stored sign-in credentials\")\n .action(async () => {\n const ctx = createKbCliContext(deps, rootProgram);\n ctx.logger.debug(\"cli logout start\");\n try {\n await clearCredentials();\n ctx.logger.info(\"cli logout ok\");\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (e) {\n ctx.logger.error({ err: e }, \"cli logout failed\");\n const message = e instanceof Error ? e.message : String(e);\n writeCliError(ctx.deps.stderr, { code: \"INTERNAL\", message, details: null });\n exitRef.code = 1;\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { createKbSdk } from \"../cli/sdk-factory.js\";\n\nimport { createKbCliContext, type KbCliDeps } from \"../cli/context.js\";\nimport { parseKbUri } from \"@omi/core\";\nimport { requireSpaceId } from \"../cli/space-resolve.js\";\nimport { successVoid, writeCommandSuccess } from \"../http/command-success.js\";\nimport { writeCliError } from \"../http/http-error.js\";\nimport { cliErrorFromUnknown } from \"../http/sdk-bridge.js\";\n\nexport function registerWaitSyncCommand(\n program: Command,\n rootProgram: Command,\n deps: KbCliDeps,\n exitRef: { code: number },\n): void {\n program\n .command(\"waitSync\")\n .description(\"Wait for memory sync for a store (OpenViking)\")\n .requiredOption(\"--store <uri>\", \"kb://<spaceId>/<storeId> (path segment optional)\")\n .action(async (opts: { store: string }) => {\n const ctx = createKbCliContext(deps, rootProgram);\n const spaceId = await requireSpaceId(rootProgram, deps, ctx.baseUrl);\n if (spaceId === null) {\n exitRef.code = 1;\n return;\n }\n let storeId: string;\n try {\n const u = parseKbUri(opts.store);\n if (u.storeId === undefined) {\n deps.stderr.write(\n `${JSON.stringify({\n code: \"VALIDATION_ERROR\",\n message: \"--store must include a storeId (kb://<spaceId>/<storeId>)\",\n details: null,\n })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n storeId = u.storeId;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n deps.stderr.write(\n `${JSON.stringify({ code: \"VALIDATION_ERROR\", message: msg, details: null })}\\n`,\n );\n exitRef.code = 1;\n return;\n }\n const sdk = createKbSdk(ctx, spaceId);\n try {\n await sdk.storeApi.waitSync(storeId);\n writeCommandSuccess(ctx.deps.stdout, successVoid());\n exitRef.code = 0;\n } catch (e) {\n writeCliError(ctx.deps.stderr, cliErrorFromUnknown(e));\n exitRef.code = 1;\n }\n });\n}\n","#!/usr/bin/env node\nimport { runKbCli } from \"./cli/run.js\";\n\nconst code = await runKbCli(process.argv.slice(2));\nprocess.exit(code);\n"],"mappings":";;;AAAA,SAAS,sBAAsB;;;ACMxB,SAAS,cAAc,QAA4B,KAAyB;AACjF,SAAO,MAAM,GAAG,KAAK,UAAU,GAAG,CAAC;AAAA,CAAI;AACzC;;;ACRA,SAAS,eAAe;;;ACAxB,SAAS,YAAAA,iBAAgB;AAIzB,SAAS,SAAS,iBAAiB;;;ACM7B,IAAO,cAAP,cAA2B,MAAK;EAC3B;EACA;EACA;EAET,YAAY,MAAqB;AAC/B,UAAM,KAAK,OAAO;AAClB,SAAK,OAAO;AACZ,SAAK,OAAO,KAAK;AACjB,SAAK,UAAU,KAAK,WAAW;AAC/B,QAAI,KAAK,WAAW,QAAW;AAC7B,WAAK,SAAS,KAAK;IACrB;EACF;;AAGI,SAAU,YAAY,MAAqB;AAC/C,SAAO,IAAI,YAAY,IAAI;AAC7B;;;ACzBA,SAAS,mBAAmB,QAAc;AACxC,MAAI,WAAW;AAAK,WAAO;AAC3B,MAAI,WAAW;AAAK,WAAO;AAC3B,MAAI,WAAW;AAAK,WAAO;AAC3B,SAAO;AACT;AAKA,eAAsB,wBAAwB,KAAa;AACzD,QAAM,OAAO,MAAM,IAAI,KAAI;AAC3B,MAAI;AACF,UAAM,IAAI,KAAK,MAAM,IAAI;AACzB,QAAI,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC,GAAG;AACnD,YAAM,IAAI;AACV,UAAI,OAAO,EAAE,MAAM,MAAM,YAAY,OAAO,EAAE,SAAS,MAAM,UAAU;AACrE,eAAO,YAAY;UACjB,MAAM,EAAE,MAAM;UACd,SAAS,EAAE,SAAS;UACpB,SAAS,aAAa,IAAK,EAAE,SAAS,KAAK,OAAQ;UACnD,QAAQ,IAAI;SACb;MACH;AACA,UAAI,OAAO,EAAE,OAAO,MAAM,UAAU;AAClC,eAAO,YAAY;UACjB,MAAM,mBAAmB,IAAI,MAAM;UACnC,SAAS,EAAE,OAAO;UAClB,SAAS;UACT,QAAQ,IAAI;SACb;MACH;IACF;EACF,QAAQ;EAER;AACA,SAAO,YAAY;IACjB,MAAM,mBAAmB,IAAI,MAAM;IACnC,SAAS,KAAK,SAAS,IAAI,OAAO,IAAI,cAAc,QAAQ,IAAI,MAAM;IACtE,SAAS;IACT,QAAQ,IAAI;GACb;AACH;;;ACjCM,SAAU,WAAW,KAAW;AACpC,QAAM,SAAS;AACf,QAAM,IAAI,IAAI,KAAI;AAClB,MAAI,CAAC,EAAE,WAAW,MAAM,GAAG;AACzB,UAAM,IAAI,MAAM,4BAA4B,GAAG,EAAE;EACnD;AACA,QAAM,OAAO,EAAE,MAAM,OAAO,MAAM,EAAE,QAAQ,SAAS,EAAE,EAAE,QAAQ,SAAS,EAAE;AAC5E,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,MAAM,2CAA2C;EAC7D;AACA,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM,CAAC,EAAG,WAAW,GAAG;AAC1B,UAAM,IAAI,MAAM,kCAAkC;EACpD;AACA,QAAM,UAAU,MAAM,CAAC;AACvB,QAAM,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AACpC,MAAI,MAAM,UAAU,KAAK,MAAM,CAAC,EAAG,SAAS,GAAG;AAC7C,WAAO,EAAE,SAAS,SAAS,MAAM,CAAC,GAAI,KAAI;EAC5C;AACA,SAAO,EAAE,SAAS,KAAI;AACxB;AAKM,SAAU,YAAY,SAAiB,SAAkB,MAAa;AAC1E,MAAI,YAAY,UAAa,QAAQ,WAAW,GAAG;AACjD,WAAO,QAAQ,OAAO;EACxB;AACA,MAAI,SAAS,UAAa,KAAK,SAAS,GAAG;AACzC,WAAO,QAAQ,OAAO,IAAI,OAAO,IAAI,IAAI;EAC3C;AACA,SAAO,QAAQ,OAAO,IAAI,OAAO;AACnC;;;AC7CA,OAAO,UAAU;AAmBjB,SAAS,aAAa,UAAiB;AACrC,MAAI,aAAa,UAAa,aAAa,IAAI;AAC7C,WAAO;EACT;AACA,QAAM,UAAU,QAAQ,IAAI,WAAW;AACvC,MAAI,YAAY,UAAa,YAAY,IAAI;AAC3C,WAAO;EACT;AACA,SAAO,QAAQ,IAAI,UAAU,MAAM,eAAe,SAAS;AAC7D;AAEA,SAAS,qBAAkB;AACzB,SAAO,QAAQ,IAAI,YAAY,MAAM;AACvC;AAOM,SAAU,gBAAgB,SAA+B;AAC7D,QAAM,QAAQ,aAAa,QAAQ,KAAK;AACxC,QAAM,OAAgC,EAAE,SAAS,QAAQ,QAAO;AAChE,MAAI,QAAQ,UAAU;AACpB,WAAO,OAAO,MAAM,QAAQ,QAAQ;EACtC;AAEA,QAAM,OAAsB,EAAE,OAAO,KAAI;AAEzC,MAAI,mBAAkB,GAAI;AACxB,SAAK,YAAY;MACf,QAAQ;MACR,SAAS,EAAE,UAAU,KAAI;;EAE7B;AAEA,QAAM,OAAO,QAAQ,eAAe;AACpC,MAAI,SAAS,UAAU;AACrB,WAAO,KAAK,MAAM,KAAK,YAAY,CAAC,CAAC;EACvC;AAEA,SAAO,KAAK,IAAI;AAClB;;;ACzDO,IAAM,YAAY;EACvB,SAAS;EACT,WAAW;EACX,QAAQ;;;;ACDV,IAAM,qBAAqB,oBAAI,IAAG;AAElC,SAAS,UAAU,MAAsB;AACvC,MAAI,IAAI,mBAAmB,IAAI,IAAI;AACnC,MAAI,CAAC,GAAG;AACN,QAAI,oBAAI,IAAG;AACX,uBAAmB,IAAI,MAAM,CAAC;EAChC;AACA,SAAO;AACT;AAyBM,SAAU,cAAc,MAAmB;AAC/C,SAAO,SAAU,QAAgB,aAA4B;AAC3D,UAAM,OAAO,OAAO;AACpB,UAAM,MAAM,OAAO,gBAAgB,WAAW,cAAc,OAAO,WAAW;AAC9E,cAAU,IAAI,EAAE,IAAI,KAAK,IAAI;EAC/B;AACF;AAEM,SAAU,eAAY;AAC1B,SAAO,cAAc,UAAU,OAAO;AACxC;AAEM,SAAU,iBAAc;AAC5B,SAAO,cAAc,UAAU,SAAS;AAC1C;AAEM,SAAU,cAAW;AACzB,SAAO,cAAc,UAAU,MAAM;AACvC;;;;;;;;;AChDM,IAAgB,sBAAhB,MAAmC;EACrB;EACA;EACF;;EAEA,cAAc;EACZ;EACA;;AANA,WAAA;EAAjB,eAAc;;AACG,WAAA;EAAjB,eAAc;;AACC,WAAA;EAAf,aAAY;;AAEG,WAAA;EAAf,aAAY;;AACK,WAAA;EAAjB,eAAc;;AACG,WAAA;EAAjB,eAAc;;;;;;;;;;ACAX,IAAO,oBAAP,cAAiC,oBAAmB;EACtC;EACF,SAAiC,CAAA;EACjC,UAAkC,CAAA;EAChC;EACF;EACA,iBAAsC;;AALpCC,YAAA;EAAjB,eAAc;;AACCA,YAAA;EAAf,aAAY;;AACGA,YAAA;EAAf,aAAY;;AACKA,YAAA;EAAjB,eAAc;;AACCA,YAAA;EAAf,aAAY;;AACGA,YAAA;EAAf,aAAY;;;;;;;;;;ACTT,IAAO,gBAAP,MAAoB;EACN;EACF;;EAEA,cAAc;EACf;EACG;EACA;;AANAC,YAAA;EAAjB,eAAc;;AACCA,YAAA;EAAf,aAAY;;AAEGA,YAAA;EAAf,aAAY;;AACEA,YAAA;EAAd,YAAW;;AACMA,YAAA;EAAjB,eAAc;;AACGA,YAAA;EAAjB,eAAc;;;;;;;;;;ACVX,IAAO,gBAAP,cAA6B,oBAAmB;EACrC;;EAEG,WAAW;;AAFdC,YAAA;EAAd,YAAW;;AAEMA,YAAA;EAAjB,eAAc;;AAMX,IAAO,mBAAP,cAAgC,oBAAmB;EACrC;;EAEA;EACA;EACF;EACD;;AALGA,YAAA;EAAjB,eAAc;;AAEGA,YAAA;EAAjB,eAAc;;AACGA,YAAA;EAAjB,eAAc;;AACCA,YAAA;EAAf,aAAY;;AACEA,YAAA;EAAd,YAAW;;;;ACzBP,IAAM,kBAAkB;;;;;;;;;ACOzB,IAAO,eAAP,cAA4B,oBAAmB;;EAEjC;EACH;;AADGC,YAAA;EAAjB,eAAc;;AACAA,YAAA;EAAd,YAAW;;;;ACYd,SAAS,aAAa,GAAY,OAAa;AAC7C,MAAI,CAAC,KAAK,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,GAAG;AACnD,UAAM,YAAY;MAChB,MAAM;MACN,SAAS,WAAW,KAAK;MACzB,SAAS;KACV;EACH;AACA,SAAO;AACT;AAEM,SAAU,uBAAuB,GAAU;AAC/C,QAAM,IAAI,aAAa,GAAG,gBAAgB;AAC1C,QAAM,IAAI,IAAI,cAAa;AAC3B,IAAE,KAAK,OAAO,EAAE,IAAI,KAAK,EAAE;AAC3B,IAAE,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE;AAC/B,IAAE,cAAc,OAAO,EAAE,aAAa,KAAK,EAAE;AAC7C,IAAE,SAAS,EAAE,QAAQ;AACrB,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,SAAO;AACT;AAEA,SAAS,mBAAmB,GAAY,OAAa;AACnD,MAAI,MAAM,UAAa,MAAM,MAAM;AACjC,WAAO,CAAA;EACT;AACA,MAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,GAAG;AAC7C,UAAM,YAAY;MAChB,MAAM;MACN,SAAS,mDAAmD,KAAK;MACjE,SAAS;KACV;EACH;AACA,QAAM,MAA8B,CAAA;AACpC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,CAA4B,GAAG;AACjE,QAAI,OAAO,MAAM,UAAU;AACzB,UAAI,CAAC,IAAI;IACX;EACF;AACA,SAAO;AACT;AAEM,SAAU,2BAA2B,GAAU;AACnD,QAAM,IAAI,aAAa,GAAG,oBAAoB;AAC9C,QAAM,IAAI,IAAI,kBAAiB;AAC/B,IAAE,KAAK,OAAO,EAAE,IAAI,KAAK,EAAE;AAC3B,IAAE,UAAU,OAAO,EAAE,SAAS,KAAK,EAAE;AACrC,IAAE,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE;AAC/B,IAAE,cAAc,OAAO,EAAE,aAAa,KAAK,EAAE;AAC7C,IAAE,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE;AAC/B,IAAE,SAAS,mBAAmB,EAAE,QAAQ,GAAG,QAAQ;AACnD,IAAE,UAAU,mBAAmB,EAAE,SAAS,GAAG,SAAS;AACtD,QAAM,MAAM,EAAE,gBAAgB;AAC9B,MAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,MAAI,IAAI,KAAK,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AAC1C,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,IAAE,iBAAiB;AACnB,QAAM,MAAM,EAAE,YAAY;AAC1B,MAAI,QAAQ,UAAa,QAAQ,MAAM;AACrC,MAAE,aAAa,IAAI,KAAK,OAAO,GAAG,CAAC;EACrC;AACA,IAAE,iBAAiB,OAAO,EAAE,gBAAgB,KAAK,OAAO;AACxD,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,SAAO;AACT;AAEM,SAAU,uBAAuB,GAAU;AAC/C,QAAM,IAAI,aAAa,GAAG,gBAAgB;AAC1C,QAAM,IAAI,IAAI,cAAa;AAC3B,IAAE,KAAK,OAAO,EAAE,IAAI,KAAK,EAAE;AAC3B,IAAE,UAAU,OAAO,EAAE,SAAS,KAAK,EAAE;AACrC,IAAE,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE;AAC/B,IAAE,cAAc,OAAO,EAAE,aAAa,KAAK,EAAE;AAC7C,IAAE,SAAS,EAAE,QAAQ;AACrB,IAAE,WAAW,EAAE,UAAU,MAAM;AAC/B,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,SAAO;AACT;AAEM,SAAU,sBAAsB,GAAU;AAC9C,QAAM,IAAI,aAAa,GAAG,eAAe;AACzC,QAAM,IAAI,IAAI,aAAY;AAC1B,IAAE,KAAK,OAAO,EAAE,IAAI,KAAK,EAAE;AAC3B,IAAE,UAAU,OAAO,EAAE,SAAS,KAAK,EAAE;AACrC,IAAE,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE;AAC/B,IAAE,cAAc,OAAO,EAAE,aAAa,KAAK,EAAE;AAC7C,IAAE,SAAS,EAAE,QAAQ;AACrB,QAAM,WAAW,EAAE,UAAU;AAC7B,MAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,MAAI,SAAS,KAAK,CAAC,YAAY,OAAO,YAAY,QAAQ,GAAG;AAC3D,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,IAAE,WAAW;AACb,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,SAAO;AACT;AAEM,SAAU,0BAA0B,GAAU;AAClD,QAAM,IAAI,aAAa,GAAG,mBAAmB;AAC7C,QAAM,IAAI,IAAI,iBAAgB;AAC9B,IAAE,KAAK,OAAO,EAAE,IAAI,KAAK,EAAE;AAC3B,IAAE,UAAU,OAAO,EAAE,SAAS,KAAK,EAAE;AACrC,IAAE,UAAU,OAAO,EAAE,SAAS,KAAK,EAAE;AACrC,MAAI,EAAE,QAAQ,MAAM,QAAW;AAC7B,MAAE,SAAS,OAAO,EAAE,QAAQ,CAAC;EAC/B;AACA,IAAE,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE;AAC/B,IAAE,cAAc,OAAO,EAAE,aAAa,KAAK,EAAE;AAC7C,IAAE,iBAAiB,OAAO,EAAE,gBAAgB,KAAK,EAAE;AACnD,IAAE,UAAU,OAAO,EAAE,SAAS,KAAK,EAAE;AACrC,IAAE,SAAS,EAAE,QAAQ;AACrB,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,IAAE,YAAY,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC;AACnD,SAAO;AACT;AAEM,SAAU,kBAAkB,GAAU;AAC1C,QAAM,IAAI,aAAa,GAAG,UAAU;AACpC,SAAO;IACL,YAAY,OAAO,EAAE,YAAY,KAAK,EAAE;IACxC,YAAY,IAAI,KAAK,OAAO,EAAE,YAAY,KAAK,EAAE,CAAC;IAClD,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE;IAC9B,aAAa,OAAO,EAAE,aAAa,KAAK,EAAE;IAC1C,YAAY,OAAO,EAAE,YAAY,KAAK,EAAE;IACxC,aAAa,OAAO,EAAE,aAAa,KAAK,EAAE;;AAE9C;AAEM,SAAU,sBAAsB,GAAU;AAC9C,QAAM,IAAI,aAAa,GAAG,eAAe;AACzC,MAAI,EAAE,QAAQ,MAAM,WAAW;AAC7B,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,MAAI,OAAO,EAAE,gBAAgB,MAAM,UAAU;AAC3C,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,MAAI,CAAC,MAAM,QAAQ,EAAE,OAAO,CAAC,GAAG;AAC9B,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,SAAO;AACT;AAEM,SAAU,0BAA0B,GAAU;AAClD,QAAM,IAAI,aAAa,GAAG,oBAAoB;AAC9C,MAAI,EAAE,cAAc,MAAM,EAAE,UAAU,IAAI;AACxC,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,SAAO;IACL,UAAU,0BAA0B,EAAE,UAAU,CAAC;IACjD,MAAM,sBAAsB,EAAE,MAAM,CAAC;;AAEzC;AAEM,SAAU,uBAAuB,GAAU;AAC/C,QAAM,IAAI,aAAa,GAAG,gBAAgB;AAC1C,MAAI,OAAO,EAAE,QAAQ,MAAM,UAAU;AACnC,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,MAAI,OAAO,EAAE,QAAQ,MAAM,UAAU;AACnC,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,MAAI,OAAO,EAAE,UAAU,MAAM,YAAY,CAAC,OAAO,SAAS,EAAE,UAAU,CAAC,GAAG;AACxE,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,MAAI,OAAO,EAAE,WAAW,MAAM,YAAY,OAAO,EAAE,YAAY,MAAM,UAAU;AAC7E,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACA,SAAO;IACL,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,QAAQ;IAClB,UAAU,EAAE,UAAU;IACtB,WAAW,EAAE,WAAW;IACxB,YAAY,EAAE,YAAY;;AAE9B;AAEA,SAAS,wBAAwB,GAAU;AACzC,QAAM,IAAI,aAAa,GAAG,iBAAiB;AAC3C,QAAM,MAAsB;IAC1B,aAAa,OAAO,EAAE,aAAa,KAAK,EAAE;IAC1C,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE;IAC1B,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;IAC7B,UAAU,OAAO,EAAE,UAAU,KAAK,EAAE;IACpC,aAAa,OAAO,EAAE,aAAa,KAAK,EAAE;IAC1C,UAAU,OAAO,EAAE,UAAU,KAAK,EAAE;;AAEtC,MAAI,EAAE,UAAU,MAAM,QAAW;AAC/B,QAAI,WAAW,OAAO,EAAE,UAAU,CAAC;EACrC;AACA,SAAO;AACT;AAEA,SAAS,6BAA6B,GAAY,OAAa;AAC7D,MAAI,CAAC,MAAM,QAAQ,CAAC,GAAG;AACrB,UAAM,YAAY;MAChB,MAAM;MACN,SAAS,WAAW,KAAK;MACzB,SAAS;KACV;EACH;AACA,SAAO,EAAE,IAAI,CAAC,SAAS,wBAAwB,IAAI,CAAC;AACtD;AAEM,SAAU,sBAAsB,GAAU;AAC9C,QAAM,IAAI,aAAa,GAAG,eAAe;AACzC,SAAO;IACL,UAAU,6BAA6B,EAAE,UAAU,GAAG,wBAAwB;IAC9E,WAAW,6BAA6B,EAAE,WAAW,GAAG,yBAAyB;IACjF,QAAQ,6BAA6B,EAAE,QAAQ,GAAG,sBAAsB;IACxE,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;;AAEjC;;;ACpSM,SAAU,YAAY,MAAc,MAAY;AACpD,QAAM,IAAI,KAAK,QAAQ,OAAO,EAAE;AAChC,SAAO,GAAG,CAAC,GAAG,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AACxD;;;AC6FA,SAAS,kBAAkB,OAAa;AACtC,MAAI,MAAM,KAAI,EAAG,WAAW,GAAG;AAC7B,UAAM,YAAY;MAChB,MAAM;MACN,SAAS;MACT,SAAS;KACV;EACH;AACF;AAEA,eAAe,QACb,SACA,aACA,MAAkB;AAElB,QAAM,MAAM,MAAM,QAAQ,aAAa,IAAI;AAC3C,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MAAM,wBAAwB,GAAG;EACzC;AACA,SAAO;AACT;AAEA,eAAe,aAAa,MAAc,OAAa;AACrD,QAAM,UAAU,KAAK,KAAI;AACzB,MAAI,YAAY,IAAI;AAClB,UAAM,YAAY;MAChB,MAAM;MACN,SAAS,oBAAoB,KAAK;MAClC,SAAS;KACV;EACH;AACA,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;EAC3B,QAAQ;AACN,UAAM,YAAY;MAChB,MAAM;MACN,SAAS,iBAAiB,KAAK;MAC/B,SAAS;KACV;EACH;AACF;AAEM,SAAU,aAAa,MAAgB;AAC3C,QAAM,UAAU,KAAK,SAAS,WAAW,MAAM,KAAK,UAAU;AAC9D,QAAM,UAAU,KAAK,QAAQ,QAAQ,OAAO,EAAE;AAC9C,QAAM,QAAQ,KAAK;AAEnB,WAAS,IAAI,MAAY;AACvB,WAAO,YAAY,SAAS,IAAI;EAClC;AAEA,WAAS,YAAS;AAChB,sBAAkB,KAAK;AACvB,WAAO,WAAW,mBAAmB,KAAK,CAAC;EAC7C;AAEA,WAAS,WAAQ;AACf,sBAAkB,KAAK;AACvB,WAAO,WAAW,mBAAmB,KAAK,CAAC;EAC7C;AAEA,WAAS,gBAAa;AACpB,sBAAkB,KAAK;AACvB,WAAO,WAAW,mBAAmB,KAAK,CAAC;EAC7C;AAEA,QAAM,WAA+B;IACnC,MAAM,OAAO,OAAgC;AAC3C,YAAM,UAAuB,EAAE,QAAQ,OAAM;AAC7C,UAAI,UAAU,UAAa,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACxD,gBAAQ,UAAU,EAAE,gBAAgB,mBAAkB;AACtD,gBAAQ,OAAO,KAAK,UAAU,KAAK;MACrC;AACA,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,SAAS,GAAG,OAAO;AAC1D,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,cAAc;AAC7D,aAAO,uBAAuB,CAAC;IACjC;IAEA,MAAM,IAAI,SAAe;AACvB,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,WAAW,mBAAmB,OAAO,CAAC,EAAE,GAAG;QAChF,QAAQ;OACT;AACD,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,iBAAiB;AAChE,aAAO,uBAAuB,CAAC;IACjC;IAEA,MAAM,OAAI;AACR,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,SAAS,GAAG,EAAE,QAAQ,MAAK,CAAE;AACpE,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,aAAa;AAC5D,YAAM,IAAI;AACV,YAAM,MAAM,EAAE,QAAQ;AACtB,UAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,cAAM,YAAY;UAChB,MAAM;UACN,SAAS;UACT,SAAS;SACV;MACH;AACA,aAAO,IAAI,IAAI,CAAC,MAAM,uBAAuB,CAAC,CAAC;IACjD;IAEA,MAAM,OAAO,SAAiB,OAAuB;AACnD,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,WAAW,mBAAmB,OAAO,CAAC,EAAE,GAAG;QAChF,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,KAAK;OAC3B;AACD,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,mBAAmB;AAClE,aAAO,uBAAuB,CAAC;IACjC;IAEA,MAAM,OAAO,SAAe;AAC1B,YAAM,QAAQ,SAAS,IAAI,WAAW,mBAAmB,OAAO,CAAC,EAAE,GAAG;QACpE,QAAQ;OACT;IACH;;AAGF,QAAM,WAA+B;IACnC,MAAM,OAAO,OAAwB;AACnC,YAAM,UAAuB,EAAE,QAAQ,OAAM;AAC7C,UAAI,UAAU,UAAa,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACxD,gBAAQ,UAAU,EAAE,gBAAgB,mBAAkB;AACtD,gBAAQ,OAAO,KAAK,UAAU,KAAK;MACrC;AACA,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,GAAG,UAAS,CAAE,EAAE,GAAG,OAAO;AACjE,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,iBAAiB;AAChE,aAAO,uBAAuB,CAAC;IACjC;IAEA,MAAM,IAAI,SAAe;AACvB,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,GAAG,UAAS,CAAE,IAAI,mBAAmB,OAAO,CAAC,EAAE,GAAG;QACvF,QAAQ;OACT;AACD,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,oBAAoB;AACnE,aAAO,uBAAuB,CAAC;IACjC;IAEA,MAAM,OAAI;AACR,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,UAAS,CAAE,GAAG,EAAE,QAAQ,MAAK,CAAE;AACtE,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,gBAAgB;AAC/D,YAAM,IAAI;AACV,YAAM,MAAM,EAAE,QAAQ;AACtB,UAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,cAAM,YAAY;UAChB,MAAM;UACN,SAAS;UACT,SAAS;SACV;MACH;AACA,aAAO,IAAI,IAAI,CAAC,MAAM,uBAAuB,CAAC,CAAC;IACjD;IAEA,MAAM,OAAO,SAAiB,OAAuB;AACnD,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,GAAG,UAAS,CAAE,IAAI,mBAAmB,OAAO,CAAC,EAAE,GAAG;QACvF,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,KAAK;OAC3B;AACD,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,sBAAsB;AACrE,aAAO,uBAAuB,CAAC;IACjC;IAEA,MAAM,OAAO,SAAe;AAC1B,YAAM,QAAQ,SAAS,IAAI,GAAG,UAAS,CAAE,IAAI,mBAAmB,OAAO,CAAC,EAAE,GAAG;QAC3E,QAAQ;OACT;IACH;IAEA,MAAM,SAAS,SAAe;AAC5B,YAAM,QAAQ,SAAS,IAAI,GAAG,UAAS,CAAE,IAAI,mBAAmB,OAAO,CAAC,YAAY,GAAG;QACrF,QAAQ;OACT;IACH;IAEA,MAAM,cAAc,SAAe;AACjC,YAAM,MAAM,MAAM,QAChB,SACA,IAAI,GAAG,UAAS,CAAE,IAAI,mBAAmB,OAAO,CAAC,YAAY,GAC7D,EAAE,QAAQ,MAAK,CAAE;AAEnB,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,mBAAmB;AAClE,YAAM,IAAI;AACV,YAAM,MAAM,EAAE,WAAW;AACzB,UAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,cAAM,YAAY;UAChB,MAAM;UACN,SAAS;UACT,SAAS;SACV;MACH;AACA,aAAO,IAAI,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAC5C;IAEA,MAAM,gBAAgB,SAAiB,YAAkB;AACvD,YAAM,QACJ,SACA,IACE,GAAG,UAAS,CAAE,IAAI,mBAAmB,OAAO,CAAC,cAAc,mBAAmB,UAAU,CAAC,UAAU,GAErG,EAAE,QAAQ,OAAM,CAAE;IAEtB;IAEA,MAAM,WAAW,QAKhB;AACC,YAAM,IAAI,GAAG,UAAS,CAAE,IAAI,mBAAmB,OAAO,OAAO,CAAC,eAAe,mBAAmB,OAAO,IAAI,CAAC;AAC5G,YAAM,QAAQ,SAAS,IAAI,CAAC,GAAG;QAC7B,QAAQ;QACR,SAAS;UACP,gBAAgB,OAAO,eAAe;;QAExC,MAAM,OAAO;OACd;IACH;IAEA,MAAM,aAAa,QAAyC;AAC1D,YAAM,IAAI,GAAG,UAAS,CAAE,IAAI,mBAAmB,OAAO,OAAO,CAAC,eAAe,mBAAmB,OAAO,IAAI,CAAC;AAC5G,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,CAAC,GAAG,EAAE,QAAQ,MAAK,CAAE;AAC5D,aAAO,IAAI,WAAW,MAAM,IAAI,YAAW,CAAE;IAC/C;IAEA,MAAM,WAAW,QAAyC;AACxD,YAAM,IAAI,GAAG,UAAS,CAAE,IAAI,mBAAmB,OAAO,OAAO,CAAC,eAAe,mBAAmB,OAAO,IAAI,CAAC;AAC5G,YAAM,QAAQ,SAAS,IAAI,CAAC,GAAG,EAAE,QAAQ,SAAQ,CAAE;IACrD;IAEA,MAAM,OAAO,OAAe,cAA2B;AACrD,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,GAAG,UAAS,CAAE,SAAS,GAAG;QAC/D,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,EAAE,OAAO,aAAY,CAAE;OAC7C;AACD,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,wBAAwB;AACvE,aAAO,sBAAsB,CAAC;IAChC;;AAGF,QAAM,UAA6B;IACjC,MAAM,OAAO,OAAuB;AAClC,YAAM,UAAuB,EAAE,QAAQ,OAAM;AAC7C,UAAI,UAAU,UAAa,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACxD,gBAAQ,UAAU,EAAE,gBAAgB,mBAAkB;AACtD,gBAAQ,OAAO,KAAK,UAAU,KAAK;MACrC;AACA,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,SAAQ,CAAE,GAAG,OAAO;AAC3D,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,gBAAgB;AAC/D,aAAO,sBAAsB,CAAC;IAChC;IAEA,MAAM,IAAI,QAAc;AACtB,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,EAAE,GAAG;QACrF,QAAQ;OACT;AACD,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,mBAAmB;AAClE,aAAO,sBAAsB,CAAC;IAChC;IAEA,MAAM,OAAI;AACR,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,SAAQ,CAAE,GAAG,EAAE,QAAQ,MAAK,CAAE;AACrE,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,eAAe;AAC9D,YAAM,IAAI;AACV,YAAM,MAAM,EAAE,OAAO;AACrB,UAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,cAAM,YAAY;UAChB,MAAM;UACN,SAAS;UACT,SAAS;SACV;MACH;AACA,aAAO,IAAI,IAAI,CAAC,SAAS,sBAAsB,IAAI,CAAC;IACtD;IAEA,MAAM,OAAO,QAAgB,OAAsB;AACjD,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,EAAE,GAAG;QACrF,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,KAAK;OAC3B;AACD,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,qBAAqB;AACpE,aAAO,sBAAsB,CAAC;IAChC;IAEA,MAAM,OAAO,QAAc;AACzB,YAAM,QAAQ,SAAS,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,EAAE,GAAG;QACzE,QAAQ;OACT;IACH;IAEA,MAAM,cAAc,QAAc;AAChC,YAAM,MAAM,MAAM,QAChB,SACA,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,YAAY,GAC3D,EAAE,QAAQ,MAAK,CAAE;AAEnB,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,6BAA6B;AAC5E,YAAM,IAAI;AACV,YAAM,MAAM,EAAE,WAAW;AACzB,UAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,cAAM,YAAY;UAChB,MAAM;UACN,SAAS;UACT,SAAS;SACV;MACH;AACA,aAAO,IAAI,IAAI,CAAC,SAAS,0BAA0B,IAAI,CAAC;IAC1D;IAEA,MAAM,oBAAoB,QAAgB,SAAgB;AACxD,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,QAAQ,GAAG;QAC3F,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,OAAO;OAC7B;AACD,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,0BAA0B;AACzE,aAAO,uBAAuB,CAAC;IACjC;IAEA,MAAM,KAAK,QAAc;AACvB,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,OAAO,GAAG;QAC1F,QAAQ;OACT;AACD,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,wBAAwB;AACvE,YAAM,IAAI;AACV,YAAM,MAAM,EAAE,OAAO;AACrB,UAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,cAAM,YAAY;UAChB,MAAM;UACN,SAAS;UACT,SAAS;SACV;MACH;AACA,aAAO,IAAI,IAAI,CAAC,SAAS,0BAA0B,IAAI,CAAC;IAC1D;IAEA,MAAM,OAAO,QAAgB,aAAqB;AAChD,YAAM,QAAQ,SAAS,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,SAAS,GAAG;QAChF,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,EAAE,YAAW,CAAE;OACrC;IACH;IAEA,MAAM,QAAQ,QAAgB,aAAqB;AACjD,YAAM,QAAQ,SAAS,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,UAAU,GAAG;QACjF,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,EAAE,YAAW,CAAE;OACrC;IACH;IAEA,MAAM,OAAO,QAAgB,aAAuB,QAAc;AAChE,YAAM,QAAQ,SAAS,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,SAAS,GAAG;QAChF,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,EAAE,aAAa,OAAM,CAAE;OAC7C;IACH;IAEA,MAAM,MAAM,QAAgB,aAAqB;AAC/C,YAAM,MAAM,MAAM,QAAQ,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,QAAQ,GAAG;QAClF,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,EAAE,YAAW,CAAE;OACrC;AACD,UAAI,IAAI,WAAW,KAAK;AACtB;MACF;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,MAAM,wBAAwB,GAAG;MACzC;AACA,YAAM,YAAY;QAChB,MAAM;QACN,SAAS,oCAAoC,IAAI,MAAM;QACvD,SAAS;QACT,QAAQ,IAAI;OACb;IACH;IAEA,MAAM,KAAK,QAAc;AACvB,YAAM,QAAQ,SAAS,IAAI,GAAG,SAAQ,CAAE,IAAI,mBAAmB,MAAM,CAAC,OAAO,GAAG;QAC9E,QAAQ;OACT;IACH;;AAGF,QAAM,eAAuC;IAC3C,MAAM,OAAO,OAA4B;AACvC,YAAM,UAAuB,EAAE,QAAQ,OAAM;AAC7C,UAAI,UAAU,UAAa,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACxD,gBAAQ,UAAU,EAAE,gBAAgB,mBAAkB;AACtD,gBAAQ,OAAO,KAAK,UAAU,KAAK;MACrC;AACA,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,cAAa,CAAE,GAAG,OAAO;AAChE,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,qBAAqB;AACpE,aAAO,2BAA2B,CAAC;IACrC;IAEA,MAAM,IAAI,aAAmB;AAC3B,YAAM,MAAM,MAAM,QAChB,SACA,IAAI,GAAG,cAAa,CAAE,IAAI,mBAAmB,WAAW,CAAC,EAAE,GAC3D,EAAE,QAAQ,MAAK,CAAE;AAEnB,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,wBAAwB;AACvE,aAAO,2BAA2B,CAAC;IACrC;IAEA,MAAM,OAAI;AACR,YAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,cAAa,CAAE,GAAG,EAAE,QAAQ,MAAK,CAAE;AAC1E,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,oBAAoB;AACnE,YAAM,IAAI;AACV,YAAM,MAAM,EAAE,YAAY;AAC1B,UAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,cAAM,YAAY;UAChB,MAAM;UACN,SAAS;UACT,SAAS;SACV;MACH;AACA,aAAO,IAAI,IAAI,CAAC,MAAM,2BAA2B,CAAC,CAAC;IACrD;IAEA,MAAM,OAAO,aAAqB,OAA2B;AAC3D,YAAM,MAAM,MAAM,QAChB,SACA,IAAI,GAAG,cAAa,CAAE,IAAI,mBAAmB,WAAW,CAAC,EAAE,GAC3D;QACE,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAkB;QAC7C,MAAM,KAAK,UAAU,KAAK;OAC3B;AAEH,YAAM,IAAI,MAAM,aAAa,MAAM,IAAI,KAAI,GAAI,0BAA0B;AACzE,aAAO,2BAA2B,CAAC;IACrC;IAEA,MAAM,OAAO,aAAmB;AAC9B,YAAM,QAAQ,SAAS,IAAI,GAAG,cAAa,CAAE,IAAI,mBAAmB,WAAW,CAAC,EAAE,GAAG;QACnF,QAAQ;OACT;IACH;;AAGF,SAAO,EAAE,UAAU,UAAU,SAAS,aAAY;AACpD;;;ACjiBO,SAAS,kBAAkB,SAAyB;AACzD,SAAO,QAAQ,QAAQ,OAAO,EAAE;AAClC;;;ACFA,SAAS,OAAO,OAAO,UAAU,QAAQ,iBAAiB;AAC1D,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;AAU9B,IAAM,mBAAmB;AAOlB,SAAS,yBAAiC;AAC/C,QAAM,aAAa,QAAQ,IAAI,iBAAiB,KAAK,KAAK,QAAQ,GAAG,SAAS;AAC9E,SAAO,KAAK,YAAY,MAAM,kBAAkB;AAClD;AAEO,SAAS,uBAAuB,SAA2C;AAChF,SAAO,SAAS,YAAY,uBAAuB;AACrD;AAEA,eAAsB,gBACpB,SAC+B;AAC/B,QAAM,WAAW,uBAAuB,OAAO;AAC/C,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,UAAU,MAAM;AAC3C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,aAAO;AAAA,IACT;AACA,UAAM,IAAI;AACV,QACE,OAAO,EAAE,aAAa,MAAM,YAC5B,OAAO,EAAE,WAAW,MAAM,YAC1B,OAAO,EAAE,QAAQ,MAAM,YACvB,OAAO,EAAE,SAAS,MAAM,YACxB,EAAE,SAAS,EAAE,WAAW,GACxB;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,aAAa,EAAE,aAAa;AAAA,MAC5B,WAAW,EAAE,WAAW;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,SAAS,EAAE,SAAS;AAAA,IACtB;AAAA,EACF,SAAS,GAAG;AACV,QACE,KACA,OAAO,MAAM,YACb,UAAU,KACT,EAA4B,SAAS,UACtC;AACA,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,gBACpB,aACA,SACe;AACf,QAAM,WAAW,uBAAuB,OAAO;AAC/C,QAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,QAAM,UAAU,UAAU,GAAG,KAAK,UAAU,WAAW,CAAC;AAAA,GAAM;AAAA,IAC5D,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC;AACD,QAAM,MAAM,UAAU,gBAAgB;AACxC;AAEA,eAAsB,iBAAiB,SAAkD;AACvF,QAAM,WAAW,uBAAuB,OAAO;AAC/C,MAAI;AACF,UAAM,OAAO,QAAQ;AAAA,EACvB,SAAS,GAAG;AACV,QACE,KACA,OAAO,MAAM,YACb,UAAU,KACT,EAA4B,SAAS,UACtC;AACA;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,uBAAuB,aAA4B,QAAyB;AAC1F,SAAO,YAAY,OAAO,QAAQ,OAAO,EAAE,MAAM,OAAO,QAAQ,OAAO,EAAE;AAC3E;AAEO,SAAS,qBAAqB,aAA4B,QAAQ,KAAK,IAAI,GAAY;AAC5F,QAAM,YAAY,KAAK,MAAM,YAAY,SAAS;AAClD,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAClB;;;AChGO,SAAS,yBACd,KACA,SACc;AACd,QAAM,YAAY,IAAI,KAAK;AAC3B,QAAM,SAAS,kBAAkB,IAAI,OAAO;AAE5C,SAAO,OAAO,OAAoC,SAA0C;AAC1F,UAAM,cAAc,MAAM,gBAAgB,OAAO;AACjD,UAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AAEzC,UAAM,gBACJ,gBAAgB,QAChB,uBAAuB,aAAa,MAAM,KAC1C,CAAC,qBAAqB,WAAW;AAEnC,QAAI,iBAAiB,aAAa;AAChC,cAAQ,IAAI,iBAAiB,UAAU,YAAY,WAAW,EAAE;AAChE,cAAQ,IAAI,UAAU,MAAM;AAAA,IAC9B;AAEA,UAAM,MAAM,MAAM,UAAU,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC;AACvD,QAAI,IAAI,WAAW,KAAK;AACtB,YAAM,UACJ,gBAAgB,QAChB,uBAAuB,aAAa,MAAM,KAC1C,qBAAqB,WAAW;AAClC,UAAI,SAAS;AACX,eAAO,IAAI;AAAA,UACT,KAAK,UAAU;AAAA,YACb,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AAAA,UACD,EAAE,QAAQ,KAAK,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,QACjE;AAAA,MACF;AACA,UAAI,CAAC,eAAe;AAClB,eAAO,IAAI;AAAA,UACT,KAAK,UAAU;AAAA,YACb,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AAAA,UACD,EAAE,QAAQ,KAAK,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AC7DO,IAAM,0BAA0B;AAEvC,SAASC,aAAY,MAAc,MAAsB;AACvD,QAAM,IAAI,KAAK,QAAQ,OAAO,EAAE;AAChC,SAAO,GAAG,CAAC,GAAG,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AACxD;AAEO,SAAS,uBAAuB,KAAgC;AACrE,QAAM,MAAM,IAAI,oBAAoB;AACpC,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,QAAgB,KAAgC;AAClF,QAAM,OAAO,OAAO,QAAQ,OAAO,EAAE;AACrC,QAAM,SAAS,uBAAuB,GAAG;AACzC,MAAI,WAAW,IAAI;AACjB,WAAO;AAAA,EACT;AACA,QAAM,aAAa,OAAO,WAAW,GAAG,IAAI,SAAS,IAAI,MAAM;AAC/D,MAAI,KAAK,SAAS,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAOA,aAAY,MAAM,UAAU;AACrC;;;ACpBO,SAAS,YAAY,KAAmB,OAAuB;AACpE,QAAM,aAAa,oBAAoB,IAAI,SAAS,IAAI,KAAK,GAAG;AAChE,QAAM,UAAU,yBAAyB,GAAG;AAC5C,SAAO,aAAa,EAAE,SAAS,YAAY,OAAO,OAAO,QAAQ,CAAC;AACpE;;;ACNO,IAAM,mBAAmB;AAWzB,IAAM,mBAA8B;AAAA,EACzC,OAAO,WAAW,MAAM,KAAK,UAAU;AAAA,EACvC,QAAQ,QAAQ;AAAA,EAChB,QAAQ,QAAQ;AAAA,EAChB,KAAK,QAAQ;AACf;AAQO,SAAS,gBAAgB,SAAyD;AACvF,QAAM,IAAI,QAAQ,KAAK;AACvB,SAAO;AAAA,IACL,SAAS,EAAE,WAAW;AAAA,IACtB,UAAU,EAAE,YAAY;AAAA,EAC1B;AACF;AAEO,SAAS,mBAAmB,MAAiB,SAAgC;AAClF,QAAM,IAAI,gBAAgB,OAAO;AACjC,QAAM,SACJ,KAAK,UACL,gBAAgB;AAAA,IACd,SAAS;AAAA,IACT,OAAO,EAAE;AAAA,IACT,aAAa;AAAA,IACb,UAAU,EAAE,WAAW,KAAK;AAAA,EAC9B,CAAC;AACH,SAAO,EAAE,MAAM,SAAS,EAAE,SAAS,OAAO;AAC5C;;;ACpCO,SAAS,uBACd,SACA,KACoB;AACpB,QAAM,IAAI,QAAQ,KAAK;AACvB,MAAI,EAAE,UAAU,UAAa,EAAE,MAAM,SAAS,GAAG;AAC/C,WAAO,EAAE;AAAA,EACX;AACA,QAAM,UAAU,IAAI,UAAU;AAC9B,MAAI,YAAY,UAAa,QAAQ,SAAS,GAAG;AAC/C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAsB,eACpB,SACA,MACA,SACA,oBAC6B;AAC7B,QAAM,WAAW,uBAAuB,SAAS,KAAK,GAAG;AACzD,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,MAAM,gBAAgB,kBAAkB;AAC5D,QAAM,SAAS,kBAAkB,OAAO;AACxC,MAAI,gBAAgB,QAAQ,uBAAuB,aAAa,MAAM,GAAG;AACvE,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO;AACT;AAGA,eAAsB,eACpB,SACA,MACA,SACA,oBACwB;AACxB,QAAM,KAAK,MAAM,eAAe,SAAS,MAAM,SAAS,kBAAkB;AAC1E,MAAI,OAAO,QAAW;AACpB,kBAAc,KAAK,QAAQ;AAAA,MACzB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC5DO,SAAS,sBAAsB,QAA4B,OAAsB;AACtF,SAAO,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AACpD;;;ACMO,SAAS,YAAY,OAAgC;AAC1D,SAAO,EAAE,MAAM,QAAQ,MAAM;AAC/B;AAEO,SAAS,cAA8B;AAC5C,SAAO,EAAE,MAAM,OAAO;AACxB;AAEO,SAAS,oBAAoB,QAA4B,SAA+B;AAC7F,MAAI,QAAQ,SAAS,QAAQ;AAC3B;AAAA,EACF;AACA,wBAAsB,QAAQ,QAAQ,KAAK;AAC7C;;;ACpBO,SAAS,oBAAoB,KAA4B;AAC9D,MAAI,eAAe,aAAa;AAC9B,WAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,SAAS,SAAS,IAAI,WAAW,KAAK;AAAA,EAC9E;AACA,QAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,SAAO,EAAE,MAAM,YAAY,SAAS,KAAK,SAAS,KAAK;AACzD;;;AzBIA,SAAS,SAAS,GAA0C;AAC1D,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAAS,YAAY,QAAsD;AACzE,QAAM,MAA8B,CAAC;AACrC,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AACA,aAAW,OAAO,QAAQ;AACxB,UAAM,IAAI,IAAI,QAAQ,GAAG;AACzB,QAAI,KAAK,GAAG;AACV,YAAM,IAAI,MAAM,wBAAwB,GAAG,uBAAuB;AAAA,IACpE;AACA,UAAM,IAAI,IAAI,MAAM,GAAG,CAAC,EAAE,KAAK;AAC/B,UAAM,IAAI,IAAI,MAAM,IAAI,CAAC;AACzB,QAAI,EAAE,WAAW,GAAG;AAClB,YAAM,IAAI,MAAM,wBAAwB,GAAG,cAAc;AAAA,IAC3D;AACA,QAAI,CAAC,IAAI;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,gBACP,MACA,OACwB;AACxB,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM;AAC7B;AAEA,eAAe,iCACb,MACwC;AACxC,QAAM,OAAO,MAAMC,UAAS,MAAM,MAAM;AACxC,QAAM,MAAe,KAAK,SAAS,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,UAAU,IAAI;AAC/E,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,QAAM,MAAqC,CAAC;AAC5C,MAAI,OAAO,IAAI,IAAI,MAAM,UAAU;AACjC,QAAI,KAAK,IAAI,IAAI;AAAA,EACnB;AACA,MAAI,OAAO,IAAI,MAAM,MAAM,UAAU;AACnC,QAAI,OAAO,IAAI,MAAM;AAAA,EACvB;AACA,MAAI,OAAO,IAAI,aAAa,MAAM,UAAU;AAC1C,QAAI,cAAc,IAAI,aAAa;AAAA,EACrC;AACA,MAAI,OAAO,IAAI,MAAM,MAAM,UAAU;AACnC,QAAI,OAAO,IAAI,MAAM;AAAA,EACvB;AACA,MAAI,SAAS,IAAI,QAAQ,CAAC,GAAG;AAC3B,UAAM,IAA4B,CAAC;AACnC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,QAAQ,CAAC,GAAG;AAClD,UAAI,OAAO,MAAM,UAAU;AACzB,UAAE,CAAC,IAAI;AAAA,MACT;AAAA,IACF;AACA,QAAI,SAAS;AAAA,EACf;AACA,MAAI,SAAS,IAAI,SAAS,CAAC,GAAG;AAC5B,UAAM,IAA4B,CAAC;AACnC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,SAAS,CAAC,GAAG;AACnD,UAAI,OAAO,MAAM,UAAU;AACzB,UAAE,CAAC,IAAI;AAAA,MACT;AAAA,IACF;AACA,QAAI,UAAU;AAAA,EAChB;AACA,MAAI,MAAM,QAAQ,IAAI,gBAAgB,CAAC,GAAG;AACxC,UAAM,MAAM,IAAI,gBAAgB,EAAE,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAClF,QAAI,iBAAiB;AAAA,EACvB;AACA,SAAO;AACT;AAKO,SAAS,0BACd,YACA,aACA,MACA,SACM;AACN,aACG,QAAQ,QAAQ,EAChB,YAAY,yCAAyC,EACrD,OAAO,aAAa,uBAAuB,EAC3C,OAAO,iBAAiB,cAAc,EACtC,OAAO,wBAAwB,aAAa,EAC5C,OAAO,iBAAiB,sCAAsC,EAC9D,OAAO,yBAAyB,kCAAkC,EAClE,OAAO,mBAAmB,8CAA8C,EACxE,OAAO,yBAAyB,wDAAwD,EACxF,OAAO,yBAAyB,6CAA6C,EAC7E;AAAA,IACC,OAAO,SASD;AACJ,YAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,YAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,UAAI,YAAY,MAAM;AACpB,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,YAAM,MAAM,YAAY,KAAK,OAAO;AACpC,UAAI;AACF,YAAI,YAA2C,CAAC;AAChD,YAAI,KAAK,WAAW,QAAW;AAC7B,sBAAY,MAAM,iCAAiC,KAAK,MAAM;AAAA,QAChE;AACA,cAAM,iBACJ,KAAK,iBAAiB,SAClB,KAAK,aACF,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,IACjB;AACN,cAAM,SAA+B;AAAA,UACnC,MAAM,KAAK,QAAQ,UAAU,QAAQ;AAAA,UACrC,aAAa,KAAK,eAAe,UAAU,eAAe;AAAA,UAC1D,MAAM,KAAK,QAAQ,UAAU,QAAQ;AAAA,UACrC,gBAAgB,kBAAkB,UAAU,kBAAkB,CAAC;AAAA,UAC/D,QAAQ,gBAAgB,UAAU,UAAU,CAAC,GAAG,YAAY,KAAK,QAAQ,CAAC;AAAA,UAC1E,SAAS,gBAAgB,UAAU,WAAW,CAAC,GAAG,YAAY,KAAK,QAAQ,CAAC;AAAA,QAC9E;AACA,cAAM,KAAK,KAAK,MAAM,UAAU;AAChC,YAAI,OAAO,UAAa,GAAG,KAAK,MAAM,IAAI;AACxC,iBAAO,KAAK,GAAG,KAAK;AAAA,QACtB;AACA,cAAM,UAAU,MAAM,IAAI,aAAa,OAAO,MAAM;AACpD,4BAAoB,IAAI,KAAK,QAAQ,YAAY,OAAO,CAAC;AACzD,gBAAQ,OAAO;AAAA,MACjB,SAAS,GAAG;AACV,sBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACJ;;;A0B3JA,SAAS,gBAAgB,WAAmD;AAC1E,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,UAAU,KAAK;AAC/B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEO,SAAS,cACd,SACA,KACA,gBACoB;AACpB,QAAM,eAAe,gBAAgB,cAAc;AACnD,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,KAAK;AAC1B,QAAM,aAAa,gBAAgB,KAAK,IAAI;AAC5C,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AACA,SAAO,gBAAgB,IAAI,SAAS,CAAC;AACvC;AAKO,SAAS,qBACd,SACA,KACA,gBACQ;AACR,SAAO,cAAc,SAAS,KAAK,cAAc,KAAK;AACxD;AAGO,SAAS,cACd,SACA,MACA,gBACe;AACf,QAAM,SAAS,cAAc,SAAS,KAAK,KAAK,cAAc;AAC9D,MAAI,WAAW,QAAW;AACxB,kBAAc,KAAK,QAAQ;AAAA,MACzB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,qBACd,SACA,MACA,gBACQ;AACR,SAAO,qBAAqB,SAAS,KAAK,KAAK,cAAc;AAC/D;;;ACzDO,SAAS,oBACd,SACA,aACA,MACA,SACM;AACN,UACG,QAAQ,MAAM,EACd,YAAY,iDAAiD,EAC7D,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,OAAO,SAA4B;AACzC,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,SAAS,qBAAqB,aAAa,MAAM,KAAK,IAAI;AAChE,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,QAAQ,MAAM,IAAI,QAAQ,KAAK,MAAM;AAC3C,0BAAoB,IAAI,KAAK,QAAQ,YAAY,EAAE,MAAM,CAAC,CAAC;AAC3D,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;AC1BA,eAAe,mBACb,KACA,QACA,aACA,KACmB;AACnB,MAAI,KAAK;AACP,UAAM,YAAY,MAAM,IAAI,QAAQ,cAAc,MAAM;AACxD,WAAO,UAAU,IAAI,CAAC,aAAa,SAAS,EAAE;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,wBACP,aACA,MACA,SACS;AACT,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,gBAAc,KAAK,QAAQ;AAAA,IACzB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AACD,UAAQ,OAAO;AACf,SAAO;AACT;AAKO,SAAS,yBACd,UACA,aACA,MACA,SACM;AACN,WACG,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,OAAO,SAA4B;AACzC,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,SAAS,qBAAqB,aAAa,MAAM,KAAK,IAAI;AAChE,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,YAAY,MAAM,IAAI,QAAQ,cAAc,MAAM;AACxD,0BAAoB,IAAI,KAAK,QAAQ,YAAY,EAAE,UAAU,CAAC,CAAC;AAC/D,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,SAAS,oBAAoB,cAAc,EAC3C,OAAO,SAAS,wCAAwC,KAAK,EAC7D,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,OAAO,aAAuB,SAA2C;AAC/E,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,SAAS,qBAAqB,aAAa,MAAM,KAAK,IAAI;AAChE,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,cAAc,MAAM,mBAAmB,KAAK,QAAQ,aAAa,KAAK,QAAQ,IAAI;AACxF,UAAI,CAAC,wBAAwB,aAAa,MAAM,OAAO,GAAG;AACxD;AAAA,MACF;AACA,YAAM,IAAI,QAAQ,OAAO,QAAQ,WAAW;AAC5C,0BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,WACG,QAAQ,SAAS,EACjB,YAAY,+BAA+B,EAC3C,SAAS,oBAAoB,cAAc,EAC3C,OAAO,SAAS,yCAAyC,KAAK,EAC9D,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,OAAO,aAAuB,SAA2C;AAC/E,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,SAAS,qBAAqB,aAAa,MAAM,KAAK,IAAI;AAChE,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,cAAc,MAAM,mBAAmB,KAAK,QAAQ,aAAa,KAAK,QAAQ,IAAI;AACxF,UAAI,CAAC,wBAAwB,aAAa,MAAM,OAAO,GAAG;AACxD;AAAA,MACF;AACA,YAAM,IAAI,QAAQ,QAAQ,QAAQ,WAAW;AAC7C,0BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,SAAS,oBAAoB,cAAc,EAC3C,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,SAAS,wCAAwC,KAAK,EAC7D,OAAO,mBAAmB,kBAAkB,EAC5C;AAAA,IACC,OAAO,aAAuB,SAA4D;AACxF,YAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,YAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,UAAI,YAAY,MAAM;AACpB,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,YAAM,SAAS,qBAAqB,aAAa,MAAM,KAAK,IAAI;AAChE,YAAM,MAAM,YAAY,KAAK,OAAO;AACpC,UAAI;AACF,cAAM,cAAc,MAAM,mBAAmB,KAAK,QAAQ,aAAa,KAAK,QAAQ,IAAI;AACxF,YAAI,CAAC,wBAAwB,aAAa,MAAM,OAAO,GAAG;AACxD;AAAA,QACF;AACA,cAAM,IAAI,QAAQ,OAAO,QAAQ,aAAa,KAAK,UAAU,EAAE;AAC/D,4BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,gBAAQ,OAAO;AAAA,MACjB,SAAS,OAAO;AACd,sBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEF,WACG,QAAQ,OAAO,EACf,YAAY,6BAA6B,EACzC,SAAS,oBAAoB,cAAc,EAC3C,OAAO,SAAS,uCAAuC,KAAK,EAC5D,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,OAAO,aAAuB,SAA2C;AAC/E,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,SAAS,qBAAqB,aAAa,MAAM,KAAK,IAAI;AAChE,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,cAAc,MAAM,mBAAmB,KAAK,QAAQ,aAAa,KAAK,QAAQ,IAAI;AACxF,UAAI,CAAC,wBAAwB,aAAa,MAAM,OAAO,GAAG;AACxD;AAAA,MACF;AACA,YAAM,IAAI,QAAQ,MAAM,QAAQ,WAAW;AAC3C,0BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;ACjLA,SAAS,WAAW,KAA6C;AAC/D,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,GAAG;AACzB,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AAC5C,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,KAA6C;AACxE,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,GAAG;AACzB,MAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAkD;AACxE,QAAM,SAAuB,CAAC;AAC9B,MAAI,KAAK,cAAc,QAAW;AAChC,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,QAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,MAAI,UAAU,QAAW;AACvB,WAAO,QAAQ;AAAA,EACjB;AACA,QAAM,iBAAiB,oBAAoB,KAAK,cAAc;AAC9D,MAAI,mBAAmB,QAAW;AAChC,WAAO,iBAAiB;AAAA,EAC1B;AACA,SAAO,OAAO,KAAK,MAAM,EAAE,WAAW,IAAI,SAAY;AACxD;AAEO,SAAS,sBACd,SACA,aACA,MACA,SACM;AACN,UACG,QAAQ,QAAQ,EAChB,YAAY,kDAAkD,EAC9D,SAAS,WAAW,cAAc,EAClC,OAAO,sBAAsB,wBAAwB,EACrD,OAAO,eAAe,oBAAoB,EAC1C,OAAO,yBAAyB,6BAA6B,EAC7D,OAAO,OAAO,OAAe,SAA2B;AACvD,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,qBAAe,eAAe,IAAI;AAAA,IACpC,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,SAAS,OAAO,OAAO,YAAY;AAC5D,0BAAoB,IAAI,KAAK,QAAQ,YAAY,MAAM,CAAC;AACxD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;ACjFA,SAAS,eAAe,OAAuB;AAC7C,QAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,aAAa,QAAsD;AAC1E,QAAM,MAA8B,CAAC;AACrC,aAAW,SAAS,UAAU,CAAC,GAAG;AAChC,UAAM,MAAM,MAAM,QAAQ,GAAG;AAC7B,QAAI,OAAO,KAAK,QAAQ,MAAM,SAAS,GAAG;AACxC,YAAM,IAAI,MAAM,wBAAwB,KAAK,uBAAuB;AAAA,IACtE;AACA,UAAM,MAAM,MAAM,MAAM,GAAG,GAAG;AAC9B,UAAM,MAAM,MAAM,MAAM,MAAM,CAAC;AAC/B,QAAI,GAAG,IAAI;AAAA,EACb;AACA,SAAO;AACT;AAEO,SAAS,qBACd,SACA,aACA,MACA,SACM;AACN,UACG,QAAQ,OAAO,EACf,YAAY,yCAAyC,EACrD,SAAS,aAAa,gBAAgB,EACtC,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,eAAe,8BAA8B,GAAG,EACvD,OAAO,qBAAqB,2BAA2B,gBAAgB,GAAK,EAC5E,OAAO,mBAAmB,uCAAuC,EACjE;AAAA,IACC,OACE,SACA,SAMG;AACH,YAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,YAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,UAAI,YAAY,MAAM;AACpB,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,YAAM,SAAS,qBAAqB,aAAa,MAAM,KAAK,IAAI;AAChE,YAAM,MAAM,YAAY,KAAK,OAAO;AACpC,UAAI;AACF,cAAM,MAAM,aAAa,KAAK,GAAG;AACjC,cAAM,SAAS,MAAM,IAAI,QAAQ,oBAAoB,QAAQ;AAAA,UAC3D;AAAA,UACA,KAAK,KAAK,OAAO;AAAA,UACjB,WAAW,KAAK;AAAA,UAChB;AAAA,QACF,CAAC;AACD,YAAI,OAAO,aAAa,GAAG;AACzB,cAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAI,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,UACrC;AACA,kBAAQ,OAAO;AACf;AAAA,QACF;AAEA,4BAAoB,IAAI,KAAK,QAAQ,YAAY,MAAM,CAAC;AACxD,gBAAQ,OAAO;AAAA,MACjB,SAAS,OAAO;AACd,sBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACJ;;;AC7EO,SAAS,sBACd,OACA,aACA,MACA,SACM;AACN,QACG,QAAQ,QAAQ,EAChB,YAAY,gBAAgB,EAC5B,OAAO,aAAa,aAAa,EACjC,OAAO,iBAAiB,cAAc,EACtC,OAAO,wBAAwB,aAAa,EAC5C,OAAO,OAAO,SAA+D;AAC5E,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,QAAI,OAAO,MAAM,EAAE,SAAS,IAAI,QAAQ,GAAG,KAAK;AAChD,UAAM,MAAM,YAAY,KAAK,EAAE;AAC/B,UAAM,QAAkC,CAAC;AACzC,QAAI,KAAK,OAAO,QAAW;AACzB,YAAM,KAAK,KAAK;AAAA,IAClB;AACA,QAAI,KAAK,SAAS,QAAW;AAC3B,YAAM,OAAO,KAAK;AAAA,IACpB;AACA,QAAI,KAAK,gBAAgB,QAAW;AAClC,YAAM,cAAc,KAAK;AAAA,IAC3B;AACA,QAAI;AACF,YAAM,UAAU,MAAM,IAAI,SAAS;AAAA,QACjC,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AAAA,MAC1C;AACA,0BAAoB,IAAI,KAAK,QAAQ,YAAY,OAAO,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,gBAAgB,EAC5B,SAAS,QAAQ,UAAU,EAC3B,OAAO,iBAAiB,cAAc,EACtC,OAAO,wBAAwB,aAAa,EAC5C,OAAO,OAAO,IAAY,SAAkD;AAC3E,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,QAAI,OAAO,MAAM,EAAE,SAAS,IAAI,QAAQ,GAAG,KAAK;AAChD,UAAM,MAAM,YAAY,KAAK,EAAE;AAC/B,UAAM,QAA0B,CAAC;AACjC,QAAI,KAAK,SAAS,QAAW;AAC3B,YAAM,OAAO,KAAK;AAAA,IACpB;AACA,QAAI,KAAK,gBAAgB,QAAW;AAClC,YAAM,cAAc,KAAK;AAAA,IAC3B;AACA,QAAI;AACF,YAAM,UAAU,MAAM,IAAI,SAAS,OAAO,IAAI,KAAK;AACnD,0BAAoB,IAAI,KAAK,QAAQ,YAAY,OAAO,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,mBAAmB,EAC/B,SAAS,QAAQ,UAAU,EAC3B,OAAO,OAAO,OAAe;AAC5B,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,QAAI,OAAO,MAAM,EAAE,SAAS,IAAI,QAAQ,GAAG,KAAK;AAChD,UAAM,MAAM,YAAY,KAAK,EAAE;AAC/B,QAAI;AACF,YAAM,MAAM,MAAM,IAAI,SAAS,IAAI,EAAE;AACrC,0BAAoB,IAAI,KAAK,QAAQ,YAAY,GAAG,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,gBAAgB,EAC5B,SAAS,QAAQ,UAAU,EAC3B,OAAO,OAAO,OAAe;AAC5B,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,QAAI,OAAO,MAAM,EAAE,SAAS,IAAI,QAAQ,GAAG,KAAK;AAChD,UAAM,MAAM,YAAY,KAAK,EAAE;AAC/B,QAAI;AACF,YAAM,IAAI,SAAS,OAAO,EAAE;AAC5B,0BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,aAAa,EACzB,OAAO,YAAY;AAClB,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,QAAI,OAAO,MAAM,EAAE,SAAS,IAAI,QAAQ,GAAG,KAAK;AAChD,UAAM,MAAM,YAAY,KAAK,EAAE;AAC/B,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,SAAS,KAAK;AACvC,0BAAoB,IAAI,KAAK,QAAQ,YAAY,EAAE,OAAO,CAAC,CAAC;AAC5D,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;ACjIA,SAAS,YAAAC,WAAU,aAAAC,kBAAiB;;;ACE7B,SAAS,yBACd,KACA,SACyB;AACzB,QAAM,KAAK,IAAI;AACf,SAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW,IAAI;AAAA,IACf,kBAAkB,IAAI;AAAA,IACtB,eAAe,IAAI;AAAA,IACnB,gBAAgB,IAAI;AAAA,IACpB,gBAAgB,IAAI;AAAA,IACpB,MAAM,YAAY,SAAS,EAAE;AAAA,EAC/B;AACF;;;ADAO,SAAS,sBACd,OACA,aACA,MACA,SACM;AACN,QACG,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,OAAO,aAAa,mBAAmB,EACvC,OAAO,iBAAiB,cAAc,EACtC,OAAO,wBAAwB,aAAa,EAC5C,OAAO,eAAe,kCAAkC,KAAK,EAC7D;AAAA,IACC,OAAO,SAAmF;AACxF,YAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,YAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,UAAI,YAAY,MAAM;AACpB,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,YAAM,MAAM,YAAY,KAAK,OAAO;AACpC,YAAM,QAA0B,CAAC;AACjC,UAAI,KAAK,OAAO,QAAW;AACzB,cAAM,KAAK,KAAK;AAAA,MAClB;AACA,UAAI,KAAK,SAAS,QAAW;AAC3B,cAAM,OAAO,KAAK;AAAA,MACpB;AACA,UAAI,KAAK,gBAAgB,QAAW;AAClC,cAAM,cAAc,KAAK;AAAA,MAC3B;AACA,UAAI,KAAK,aAAa,MAAM;AAC1B,cAAM,WAAW;AAAA,MACnB;AACA,UAAI;AACF,cAAM,UAAU,MAAM,IAAI,SAAS;AAAA,UACjC,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AAAA,QAC1C;AACA,8BAAsB,IAAI,KAAK,QAAQ,yBAAyB,SAAS,OAAO,CAAC;AACjF,gBAAQ,OAAO;AAAA,MACjB,SAAS,GAAG;AACV,sBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEF,QACG,QAAQ,QAAQ,EAChB,YAAY,gBAAgB,EAC5B,SAAS,aAAa,UAAU,EAChC,OAAO,iBAAiB,cAAc,EACtC,OAAO,wBAAwB,aAAa,EAC5C,OAAO,OAAO,SAAiB,SAAkD;AAChF,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,UAAM,QAA0B,CAAC;AACjC,QAAI,KAAK,SAAS,QAAW;AAC3B,YAAM,OAAO,KAAK;AAAA,IACpB;AACA,QAAI,KAAK,gBAAgB,QAAW;AAClC,YAAM,cAAc,KAAK;AAAA,IAC3B;AACA,QAAI;AACF,YAAM,UAAU,MAAM,IAAI,SAAS,OAAO,SAAS,KAAK;AACxD,4BAAsB,IAAI,KAAK,QAAQ,yBAAyB,SAAS,OAAO,CAAC;AACjF,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,mBAAmB,EAC/B,SAAS,aAAa,UAAU,EAChC,OAAO,OAAO,YAAoB;AACjC,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,MAAM,MAAM,IAAI,SAAS,IAAI,OAAO;AAC1C,4BAAsB,IAAI,KAAK,QAAQ,yBAAyB,KAAK,OAAO,CAAC;AAC7E,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,gBAAgB,EAC5B,SAAS,aAAa,UAAU,EAChC,OAAO,OAAO,YAAoB;AACjC,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,IAAI,SAAS,OAAO,OAAO;AACjC,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,kCAAkC,EAC9C,OAAO,YAAY;AAClB,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,OAAO,MAAM,IAAI,SAAS,KAAK;AACrC,YAAM,MAAM;AAAA,QACV,QAAQ,KAAK,IAAI,CAAC,MAAqB,yBAAyB,GAAG,OAAO,CAAC;AAAA,MAC7E;AACA,4BAAsB,IAAI,KAAK,QAAQ,GAAG;AAC1C,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,mEAAmE,EAC/E,eAAe,iBAAiB,iBAAiB,EACjD,eAAe,cAAc,6BAAwB,EACrD,OAAO,OAAO,SAAuC;AACpD,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,YAAM,IAAI,WAAW,KAAK,EAAE;AAC5B,UAAI,EAAE,YAAY,QAAW;AAC3B,aAAK,OAAO;AAAA,UACV,GAAG,KAAK,UAAU;AAAA,YAChB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC,CAAC;AAAA;AAAA,QACJ;AACA,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,gBAAU,EAAE;AACZ,iBAAW,EAAE;AAAA,IACf,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,WAAK,OAAO;AAAA,QACV,GAAG,KAAK,UAAU,EAAE,MAAM,oBAAoB,SAAS,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA;AAAA,MAC9E;AACA,cAAQ,OAAO;AACf;AAAA,IACF;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,OAAO;AAAA,QACV,GAAG,KAAK,UAAU;AAAA,UAChB,MAAM;AAAA,UACN,SACE;AAAA,UACF,SAAS;AAAA,QACX,CAAC,CAAC;AAAA;AAAA,MACJ;AACA,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,MAAM,MAAMC,UAAS,KAAK,IAAI;AACpC,YAAM,IAAI,SAAS,WAAW;AAAA,QAC5B;AAAA,QACA,MAAM;AAAA,QACN,MAAM,IAAI,WAAW,GAAG;AAAA,MAC1B,CAAC;AACD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,uCAAuC,EACnD,eAAe,gBAAgB,wBAAmB,EAClD,eAAe,eAAe,iBAAiB,EAC/C,OAAO,OAAO,SAAuC;AACpD,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,YAAM,IAAI,WAAW,KAAK,IAAI;AAC9B,UAAI,EAAE,YAAY,QAAW;AAC3B,aAAK,OAAO;AAAA,UACV,GAAG,KAAK,UAAU;AAAA,YAChB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC,CAAC;AAAA;AAAA,QACJ;AACA,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,gBAAU,EAAE;AACZ,mBAAa,EAAE;AAAA,IACjB,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,WAAK,OAAO;AAAA,QACV,GAAG,KAAK,UAAU,EAAE,MAAM,oBAAoB,SAAS,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA;AAAA,MAC9E;AACA,cAAQ,OAAO;AACf;AAAA,IACF;AACA,QAAI,WAAW,WAAW,GAAG;AAC3B,WAAK,OAAO;AAAA,QACV,GAAG,KAAK,UAAU;AAAA,UAChB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACX,CAAC,CAAC;AAAA;AAAA,MACJ;AACA,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,QAAQ,MAAM,IAAI,SAAS,aAAa,EAAE,SAAS,MAAM,WAAW,CAAC;AAC3E,YAAMC,WAAU,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC;AAC3C,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,wDAAwD,EACpE,eAAe,gBAAgB,uCAAkC,EACjE,OAAO,OAAO,SAA2B;AACxC,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,YAAM,IAAI,WAAW,KAAK,IAAI;AAC9B,UAAI,EAAE,YAAY,QAAW;AAC3B,aAAK,OAAO;AAAA,UACV,GAAG,KAAK,UAAU;AAAA,YAChB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC,CAAC;AAAA;AAAA,QACJ;AACA,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,gBAAU,EAAE;AACZ,iBAAW,EAAE;AAAA,IACf,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,WAAK,OAAO;AAAA,QACV,GAAG,KAAK,UAAU,EAAE,MAAM,oBAAoB,SAAS,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA;AAAA,MAC9E;AACA,cAAQ,OAAO;AACf;AAAA,IACF;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,OAAO;AAAA,QACV,GAAG,KAAK,UAAU;AAAA,UAChB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACX,CAAC,CAAC;AAAA;AAAA,MACJ;AACA,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,IAAI,SAAS,WAAW,EAAE,SAAS,MAAM,SAAS,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;AEzUA,SAAS,cAAc,OAAe,SAA6B;AACjE,SAAO,CAAC,GAAG,SAAS,KAAK;AAC3B;AAKO,SAAS,qBACd,MACA,aACA,MACA,SACM;AACN,OACG,QAAQ,OAAO,EACf,YAAY,mCAAmC,EAC/C,OAAO,aAAa,kBAAkB,EACtC,OAAO,iBAAiB,cAAc,EACtC,OAAO,wBAAwB,aAAa,EAC5C,OAAO,cAAc,0BAA0B,KAAK,EACpD,OAAO,qBAAqB,iCAAiC,eAAe,CAAC,CAAC,EAC9E;AAAA,IACC,OAAO,SAMD;AACJ,YAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,YAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,UAAI,YAAY,MAAM;AACpB,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,YAAM,MAAM,YAAY,KAAK,OAAO;AACpC,YAAM,WAAW,KAAK,SAAS,CAAC;AAChC,YAAM,QAAyB,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,EAAE,KAAK,KAAK;AAChF,UAAI,KAAK,OAAO,QAAW;AACzB,cAAM,KAAK,KAAK;AAAA,MAClB;AACA,UAAI,KAAK,SAAS,QAAW;AAC3B,cAAM,OAAO,KAAK;AAAA,MACpB;AACA,UAAI,KAAK,gBAAgB,QAAW;AAClC,cAAM,cAAc,KAAK;AAAA,MAC3B;AACA,UAAI,KAAK,aAAa,MAAM;AAC1B,cAAM,WAAW;AAAA,MACnB;AACA,UAAI;AACF,cAAM,UAAU,MAAM,IAAI,QAAQ,OAAO,KAAK;AAC9C,4BAAoB,IAAI,KAAK,QAAQ,YAAY,OAAO,CAAC;AACzD,gBAAQ,OAAO;AAAA,MACjB,SAAS,OAAO;AACd,sBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEF,OACG,QAAQ,KAAK,EACb,YAAY,kBAAkB,EAC9B,SAAS,YAAY,kDAAkD,EACvE,OAAO,OAAO,cAAuB;AACpC,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,SAAS,cAAc,aAAa,MAAM,SAAS;AACzD,QAAI,WAAW,MAAM;AACnB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,MAAM,MAAM,IAAI,QAAQ,IAAI,MAAM;AACxC,0BAAoB,IAAI,KAAK,QAAQ,YAAY,GAAG,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,YAAY;AAClB,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,QAAQ,MAAM,IAAI,QAAQ,KAAK;AACrC,0BAAoB,IAAI,KAAK,QAAQ,YAAY,EAAE,MAAM,CAAC,CAAC;AAC3D,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,eAAe,EAC3B,SAAS,YAAY,kDAAkD,EACvE,OAAO,iBAAiB,cAAc,EACtC,OAAO,wBAAwB,aAAa,EAC5C,OAAO,uBAAuB,qBAAqB,KAAK,EACxD;AAAA,IACC,OACE,WACA,SACG;AACH,YAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,YAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,UAAI,YAAY,MAAM;AACpB,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,YAAM,SAAS,cAAc,aAAa,MAAM,SAAS;AACzD,UAAI,WAAW,MAAM;AACnB,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,YAAM,QAAyB,CAAC;AAChC,UAAI,KAAK,SAAS,QAAW;AAC3B,cAAM,OAAO,KAAK;AAAA,MACpB;AACA,UAAI,KAAK,qBAAqB,MAAM;AAClC,cAAM,cAAc;AAAA,MACtB,WAAW,KAAK,gBAAgB,QAAW;AACzC,cAAM,cAAc,KAAK;AAAA,MAC3B;AACA,YAAM,MAAM,YAAY,KAAK,OAAO;AACpC,UAAI;AACF,cAAM,MAAM,MAAM,IAAI,QAAQ,OAAO,QAAQ,KAAK;AAClD,4BAAoB,IAAI,KAAK,QAAQ,YAAY,GAAG,CAAC;AACrD,gBAAQ,OAAO;AAAA,MACjB,SAAS,OAAO;AACd,sBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEF,OACG,QAAQ,QAAQ,EAChB,YAAY,eAAe,EAC3B,SAAS,YAAY,kDAAkD,EACvE,OAAO,OAAO,cAAuB;AACpC,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,SAAS,cAAc,aAAa,MAAM,SAAS;AACzD,QAAI,WAAW,MAAM;AACnB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,IAAI,QAAQ,OAAO,MAAM;AAC/B,0BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,YAAY,aAAa,EACzB,SAAS,YAAY,kDAAkD,EACvE,OAAO,OAAO,cAAuB;AACpC,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,SAAS,cAAc,aAAa,MAAM,SAAS;AACzD,QAAI,WAAW,MAAM;AACnB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,IAAI,QAAQ,KAAK,MAAM;AAC7B,0BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,KAAK,CAAC;AACzD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;ACzNO,IAAM,sBAAsB;AAE5B,IAAM,oBAAoB;;;AC6CjC,SAAS,aAAa,IAA2B;AAC/C,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAAS,gBAAgB,QAAwC;AAC/D,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,iBAAiBC,OAAc,SAA+B;AACrE,SAAO,EAAE,MAAAA,OAAM,SAAS,SAAS,KAAK;AACxC;AAEA,SAAS,cAAc,OAAe,aAAoC;AACxE,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF,KAAK;AACH,aAAO,iBAAiB,eAAe,eAAe,qBAAqB;AAAA,IAC7E,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF;AACE,aAAO,iBAAiB,eAAe,eAAe,KAAK;AAAA,EAC/D;AACF;AAEA,eAAe,cAAc,KAAiC;AAC5D,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,KAAK,KAAK,MAAM,IAAI;AACtB,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,SACA,QAC6B;AAC7B,QAAM,MAAM,MAAM,QAAQ,GAAG,MAAM,yBAAyB;AAAA,IAC1D,QAAQ;AAAA,IACR,SAAS,gBAAgB,MAAM;AAAA,IAC/B,MAAM,KAAK,UAAU,EAAE,WAAW,oBAAoB,CAAC;AAAA,EACzD,CAAC;AACD,QAAM,OAAO,MAAM,cAAc,GAAG;AACpC,MAAI,CAAC,IAAI,IAAI;AACX,UAAMC,KACJ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,IAClD,OACD,CAAC;AACP,UAAM,MAAM,OAAOA,GAAE,OAAO,MAAM,WAAWA,GAAE,OAAO,IAAI;AAC1D,QAAI,QAAQ,kBAAkB;AAC5B,YAAM,cAAc,gBAAgB;AAAA,IACtC;AACA,UAAM,iBAAiB,eAAe,oCAAoC,IAAI,MAAM,GAAG;AAAA,EACzF;AACA,QAAM,IAAI;AACV,MACE,OAAO,EAAE,aAAa,MAAM,YAC5B,OAAO,EAAE,WAAW,MAAM,YAC1B,OAAO,EAAE,2BAA2B,MAAM,YAC1C,OAAO,EAAE,YAAY,MAAM,YAC3B,OAAO,EAAE,UAAU,MAAM,UACzB;AACA,UAAM,iBAAiB,YAAY,8BAA8B;AAAA,EACnE;AACA,MAAI,CAAC,OAAO,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,KAAK,GAAG;AAC7D,UAAM,iBAAiB,YAAY,8BAA8B;AAAA,EACnE;AACA,MAAI,CAAC,OAAO,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,IAAI,GAAG;AACxD,UAAM,iBAAiB,YAAY,8BAA8B;AAAA,EACnE;AACA,SAAO;AAAA,IACL,aAAa,EAAE,aAAa;AAAA,IAC5B,WAAW,EAAE,WAAW;AAAA,IACxB,kBAAkB,OAAO,EAAE,kBAAkB,MAAM,WAAW,EAAE,kBAAkB,IAAI;AAAA,IACtF,2BAA2B,EAAE,2BAA2B;AAAA,IACxD,YAAY,EAAE,YAAY;AAAA,IAC1B,UAAU,EAAE,UAAU;AAAA,EACxB;AACF;AAEA,eAAsB,gBACpB,SACA,QACA,YACA,SAO6B;AAC7B,QAAM,UAAU,QAAQ,SAAS;AACjC,QAAM,QAAQ,QAAQ,QAAQ,MAAM,KAAK,IAAI;AAC7C,MAAI,CAAC,OAAO,SAAS,QAAQ,YAAY,KAAK,QAAQ,gBAAgB,GAAG;AACvE,UAAM,iBAAiB,YAAY,kCAAkC;AAAA,EACvE;AACA,MAAI,CAAC,OAAO,SAAS,QAAQ,WAAW,KAAK,QAAQ,cAAc,GAAG;AACpE,UAAM,iBAAiB,YAAY,oCAAoC;AAAA,EACzE;AACA,QAAM,WAAW,MAAM,IAAI,QAAQ,eAAe;AAClD,MAAI,cAAc,QAAQ;AAE1B,SAAO,MAAM;AACX,UAAM,iBAAiB,MAAM;AAC7B,QAAI,kBAAkB,UAAU;AAC9B,YAAM,cAAc,eAAe;AAAA,IACrC;AACA,UAAM,aAAa,cAAc;AACjC,UAAM,UAAU,OAAO,SAAS,UAAU,IACtC,KAAK,IAAI,KAAK,IAAI,YAAY,CAAC,GAAG,WAAW,cAAc,IAC3D,WAAW;AACf,UAAM,QAAQ,OAAO;AAErB,UAAM,MAAM,MAAM,QAAQ,GAAG,MAAM,0BAA0B;AAAA,MAC3D,QAAQ;AAAA,MACR,SAAS,gBAAgB,MAAM;AAAA,MAC/B,MAAM,KAAK,UAAU;AAAA,QACnB,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AACD,UAAM,OAAO,MAAM,cAAc,GAAG;AAEpC,QAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC5D,YAAM,IAAI;AACV,UAAI,OAAO,EAAE,cAAc,MAAM,YAAY,OAAO,EAAE,YAAY,MAAM,UAAU;AAChF,cAAM,UAA8B;AAAA,UAClC,cAAc,EAAE,cAAc;AAAA,UAC9B,YAAY,OAAO,EAAE,YAAY,MAAM,WAAW,EAAE,YAAY,IAAI;AAAA,UACpE,YAAY,EAAE,YAAY;AAAA,QAC5B;AACA,YAAI,OAAO,EAAE,OAAO,MAAM,UAAU;AAClC,kBAAQ,QAAQ,EAAE,OAAO;AAAA,QAC3B;AACA,eAAO;AAAA,MACT;AACA,UAAI,OAAO,EAAE,OAAO,MAAM,UAAU;AAClC,YAAI,EAAE,OAAO,MAAM,yBAAyB;AAC1C;AAAA,QACF;AACA,YAAI,EAAE,OAAO,MAAM,aAAa;AAC9B,yBAAe;AACf;AAAA,QACF;AACA,cAAM;AAAA,UACJ,EAAE,OAAO;AAAA,UACT,OAAO,EAAE,mBAAmB,MAAM,WAAW,EAAE,mBAAmB,IAAI;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,IAAI,MAAM,IAAI,WAAW,KAAK;AACjC,YAAM,iBAAiB,eAAe,2BAA2B,IAAI,MAAM,GAAG;AAAA,IAChF;AAAA,EACF;AACF;AAOA,eAAsB,oBACpB,SACA,QACA,aACyB;AACzB,QAAM,MAAM,MAAM,QAAQ,GAAG,MAAM,yBAAyB;AAAA,IAC1D,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,WAAW;AAAA,MACpC,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OAAO,MAAM,cAAc,GAAG;AACpC,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG;AAC5D,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OAAQ,KAAiC,MAAM;AACrD,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG;AAC5D,WAAO,CAAC;AAAA,EACV;AACA,QAAM,UAA0B,CAAC;AACjC,QAAM,QAAS,KAAiC,OAAO;AACvD,MAAI,OAAO,UAAU,UAAU;AAC7B,YAAQ,QAAQ;AAAA,EAClB;AACA,QAAM,UAAW,KAAiC,IAAI;AACtD,MAAI,OAAO,YAAY,YAAY,QAAQ,SAAS,GAAG;AACrD,YAAQ,UAAU;AAAA,EACpB;AACA,SAAO;AACT;AAEA,eAAsB,eACpB,SACA,UAA8B,CAAC,GACH;AAC5B,QAAM,UAAU,QAAQ,SAAS,WAAW,MAAM,KAAK,UAAU;AACjE,QAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,QAAM,SAAS,kBAAkB,OAAO;AACxC,QAAM,SAAS,QAAQ;AAEvB,UAAQ,MAAM,EAAE,OAAO,GAAG,oBAAoB;AAE9C,QAAM,eAAe,MAAM,kBAAkB,SAAS,MAAM;AAE5D,SAAO,MAAM;AAAA,IAAiC,aAAa,yBAAyB;AAAA;AAAA,CAAM;AAC1F,SAAO,MAAM,kBAAkB,aAAa,SAAS;AAAA;AAAA,CAAM;AAC3D,SAAO,MAAM,8BAAyB;AAEtC,MAAI,QAAQ,aAAa;AACvB,QAAI;AACF,YAAM,QAAQ,YAAY,aAAa,yBAAyB;AAAA,IAClE,SAAS,OAAO;AACd,cAAQ,KAAK,EAAE,MAAM,GAAG,wBAAwB;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,cAMF;AAAA,IACF,aAAa,aAAa;AAAA,IAC1B,cAAc,aAAa;AAAA,IAC3B;AAAA,EACF;AACA,MAAI,QAAQ,UAAU,QAAW;AAC/B,gBAAY,QAAQ,QAAQ;AAAA,EAC9B;AACA,MAAI,QAAQ,QAAQ,QAAW;AAC7B,gBAAY,MAAM,QAAQ;AAAA,EAC5B;AACA,QAAM,QAAQ,MAAM,gBAAgB,SAAS,QAAQ,aAAa,aAAa,WAAW;AAE1F,QAAM,QAAQ,QAAQ,QAAQ,MAAM,KAAK,IAAI;AAC7C,QAAM,UAAU,MAAM,oBAAoB,SAAS,QAAQ,MAAM,YAAY;AAC7E,MAAI,QAAQ,YAAY,QAAW;AACjC,UAAM,iBAAiB,YAAY,+CAA+C;AAAA,EACpF;AAEA,QAAM,cAA6B;AAAA,IACjC,aAAa,MAAM;AAAA,IACnB,WAAW,IAAI,KAAK,MAAM,IAAI,MAAM,aAAa,GAAI,EAAE,YAAY;AAAA,IACnE;AAAA,IACA,SAAS,QAAQ;AAAA,EACnB;AAEA,QAAM,gBAAgB,aAAa,OAAO;AAE1C,MAAI,QAAQ,OAAO;AACjB,WAAO,MAAM,gBAAgB,QAAQ,KAAK;AAAA,CAAI;AAAA,EAChD,OAAO;AACL,WAAO,MAAM,cAAc;AAAA,EAC7B;AAEA,UAAQ,KAAK,EAAE,OAAO,GAAG,iBAAiB;AAE1C,QAAM,SAA4B,EAAE,aAAa,SAAS,QAAQ,QAAQ;AAC1E,MAAI,QAAQ,UAAU,QAAW;AAC/B,WAAO,YAAY,QAAQ;AAAA,EAC7B;AACA,SAAO;AACT;;;AC7UA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAE1B,IAAM,gBAAgB,UAAU,QAAQ;AAExC,eAAsB,iBAAiB,KAA4B;AACjE,QAAM,WAAW,QAAQ;AACzB,MAAI,aAAa,UAAU;AACzB,UAAM,cAAc,QAAQ,CAAC,GAAG,CAAC;AACjC;AAAA,EACF;AACA,MAAI,aAAa,SAAS;AACxB,UAAM,cAAc,OAAO,CAAC,MAAM,SAAS,IAAI,GAAG,CAAC;AACnD;AAAA,EACF;AACA,QAAM,cAAc,YAAY,CAAC,GAAG,CAAC;AACvC;;;ACPA,SAAS,eAAe,KAAmC;AACzD,SACE,QAAQ,QACR,OAAO,QAAQ,YACf,UAAU,OACV,OAAQ,IAAqB,SAAS,YACtC,aAAa,OACb,OAAQ,IAAqB,YAAY;AAE7C;AAEO,SAAS,qBACd,SACA,aACA,MACA,SACM;AACN,UACG,QAAQ,OAAO,EACf,YAAY,4CAA4C,EACxD,OAAO,YAAY;AAClB,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,QAAI,OAAO,MAAM,EAAE,SAAS,IAAI,QAAQ,GAAG,iBAAiB;AAC5D,QAAI;AACF,YAAM,eAAe,IAAI,SAAS;AAAA,QAChC,OAAO,IAAI,KAAK;AAAA,QAChB,QAAQ,IAAI,KAAK;AAAA,QACjB,QAAQ,IAAI;AAAA,QACZ,aAAa;AAAA,MACf,CAAC;AACD,0BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,UAAI,OAAO,MAAM,EAAE,KAAK,EAAE,GAAG,kBAAkB;AAC/C,UAAI,eAAe,CAAC,GAAG;AACrB,sBAAc,IAAI,KAAK,QAAQ,CAAC;AAAA,MAClC,OAAO;AACL,cAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,sBAAc,IAAI,KAAK,QAAQ,EAAE,MAAM,YAAY,SAAS,SAAS,KAAK,CAAC;AAAA,MAC7E;AACA,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACL;AAEO,SAAS,sBACd,SACA,aACA,MACA,SACM;AACN,UACG,QAAQ,QAAQ,EAChB,YAAY,mCAAmC,EAC/C,OAAO,YAAY;AAClB,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,QAAI,OAAO,MAAM,kBAAkB;AACnC,QAAI;AACF,YAAM,iBAAiB;AACvB,UAAI,OAAO,KAAK,eAAe;AAC/B,0BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,UAAI,OAAO,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAmB;AAChD,YAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,oBAAc,IAAI,KAAK,QAAQ,EAAE,MAAM,YAAY,SAAS,SAAS,KAAK,CAAC;AAC3E,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;ACpEO,SAAS,wBACd,SACA,aACA,MACA,SACM;AACN,UACG,QAAQ,UAAU,EAClB,YAAY,+CAA+C,EAC3D,eAAe,iBAAiB,kDAAkD,EAClF,OAAO,OAAO,SAA4B;AACzC,UAAM,MAAM,mBAAmB,MAAM,WAAW;AAChD,UAAM,UAAU,MAAM,eAAe,aAAa,MAAM,IAAI,OAAO;AACnE,QAAI,YAAY,MAAM;AACpB,cAAQ,OAAO;AACf;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,YAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAI,EAAE,YAAY,QAAW;AAC3B,aAAK,OAAO;AAAA,UACV,GAAG,KAAK,UAAU;AAAA,YAChB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC,CAAC;AAAA;AAAA,QACJ;AACA,gBAAQ,OAAO;AACf;AAAA,MACF;AACA,gBAAU,EAAE;AAAA,IACd,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,WAAK,OAAO;AAAA,QACV,GAAG,KAAK,UAAU,EAAE,MAAM,oBAAoB,SAAS,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA;AAAA,MAC9E;AACA,cAAQ,OAAO;AACf;AAAA,IACF;AACA,UAAM,MAAM,YAAY,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,IAAI,SAAS,SAAS,OAAO;AACnC,0BAAoB,IAAI,KAAK,QAAQ,YAAY,CAAC;AAClD,cAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AACV,oBAAc,IAAI,KAAK,QAAQ,oBAAoB,CAAC,CAAC;AACrD,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;AxC9CO,SAAS,aAAa,MAAiB,SAAoC;AAChF,QAAM,UAAU,IAAI,QAAQ;AAC5B,UAAQ,KAAK,IAAI;AACjB,UACG,OAAO,oBAAoB,gBAAgB,KAAK,IAAI,aAAa,KAAK,gBAAgB,EACtF,OAAO,uBAAuB,4CAA4C,OAAO,EACjF;AAAA,IACC;AAAA,IACA;AAAA,IACA,KAAK,IAAI,UAAU;AAAA,EACrB;AACF,UAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA,KAAK,IAAI,SAAS;AAAA,EACpB;AAEA,uBAAqB,SAAS,SAAS,MAAM,OAAO;AACpD,wBAAsB,SAAS,SAAS,MAAM,OAAO;AAErD,QAAM,QAAQ,QAAQ,QAAQ,OAAO,EAAE,YAAY,eAAe;AAClE,wBAAsB,OAAO,SAAS,MAAM,OAAO;AAEnD,QAAM,QAAQ,QACX,QAAQ,OAAO,EACf,YAAY,uEAAuE;AACtF,wBAAsB,OAAO,SAAS,MAAM,OAAO;AAEnD,QAAM,aAAa,QAChB,QAAQ,YAAY,EACpB,YAAY,2EAA2E;AAC1F,4BAA0B,YAAY,SAAS,MAAM,OAAO;AAE5D,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,sEAAsE;AACrF,uBAAqB,MAAM,SAAS,MAAM,OAAO;AAEjD,QAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,sCAAsC;AAC/F,2BAAyB,UAAU,SAAS,MAAM,OAAO;AAEzD,0BAAwB,SAAS,SAAS,MAAM,OAAO;AACvD,wBAAsB,SAAS,SAAS,MAAM,OAAO;AACrD,uBAAqB,SAAS,SAAS,MAAM,OAAO;AACpD,sBAAoB,SAAS,SAAS,MAAM,OAAO;AACnD,SAAO;AACT;;;AFnDA,SAAS,gBAAgB,SAA+B;AACtD,SAAO,EAAE,MAAM,oBAAoB,SAAS,SAAS,KAAK;AAC5D;AAEA,SAAS,WAAW,QAAkC;AACpD,SAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAQkC,gBAAgB;AAAA;AAAA;AAAA,CAGhE;AACD;AAEA,eAAsB,SACpB,MACA,OAAkB,kBACD;AACjB,MAAI,KAAK,WAAW,GAAG;AACrB,eAAW,KAAK,MAAM;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,EAAE,MAAM,EAAE;AAC1B,QAAM,UAAU,aAAa,MAAM,OAAO;AAC1C,UAAQ,aAAa;AACrB,UAAQ,mBAAmB,KAAK;AAEhC,MAAI;AACF,UAAM,QAAQ,WAAW,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/C,WAAO,QAAQ;AAAA,EACjB,SAAS,GAAG;AACV,QAAI,aAAa,gBAAgB;AAC/B,UAAI,EAAE,aAAa,GAAG;AACpB,eAAO;AAAA,MACT;AACA,oBAAc,KAAK,QAAQ,gBAAgB,EAAE,OAAO,CAAC;AACrD,aAAO,EAAE;AAAA,IACX;AACA,UAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,kBAAc,KAAK,QAAQ,EAAE,MAAM,YAAY,SAAS,SAAS,KAAK,CAAC;AACvE,WAAO;AAAA,EACT;AACF;;;A2CtDA,IAAM,OAAO,MAAM,SAAS,QAAQ,KAAK,MAAM,CAAC,CAAC;AACjD,QAAQ,KAAK,IAAI;","names":["readFile","__decorate","__decorate","__decorate","__decorate","joinBaseUrl","readFile","readFile","writeFile","readFile","writeFile","code","o"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "knowbrain-cli",
|
|
3
|
+
"version": "0.0.1-rc.0",
|
|
4
|
+
"description": "KnowBrain CLI (kb) for spaces, stores, tasks, and knowledge operations",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"kb": "./dist/kb.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/kb.js",
|
|
11
|
+
"dist/kb.js.map",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"prebuild": "pnpm --filter @omi/core build && pnpm --filter @omi/sdk build",
|
|
19
|
+
"build": "tsc -p tsconfig.json && tsup",
|
|
20
|
+
"build:release": "tsup",
|
|
21
|
+
"prepublishOnly": "pnpm run build:release",
|
|
22
|
+
"dev": "tsx watch src/main.ts",
|
|
23
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
24
|
+
"lint": "eslint .",
|
|
25
|
+
"test": "vitest run -c vitest.config.ts",
|
|
26
|
+
"test:unit": "vitest run -c vitest.config.ts test",
|
|
27
|
+
"test:integration": "vitest run --passWithNoTests",
|
|
28
|
+
"test:e2e": "vitest run --passWithNoTests"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"commander": "^14.0.3",
|
|
32
|
+
"pino": "^9.6.0",
|
|
33
|
+
"pino-pretty": "^13.0.0",
|
|
34
|
+
"yaml": "^2.7.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@omi/core": "workspace:^",
|
|
38
|
+
"@omi/sdk": "workspace:^",
|
|
39
|
+
"tsup": "^8.4.0",
|
|
40
|
+
"vitest": "^2.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|