codealmanac 0.2.5 → 0.2.7
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 +25 -20
- package/dist/{agents-RVTQYE6A.js → agents-V2ZOIACP.js} +6 -5
- package/dist/{chunk-P5WGG4FJ.js → chunk-5BWUMAOX.js} +2 -2
- package/dist/chunk-5BWUMAOX.js.map +1 -0
- package/dist/{chunk-KQUVMF27.js → chunk-BFIG2CXM.js} +2 -516
- package/dist/chunk-BFIG2CXM.js.map +1 -0
- package/dist/{chunk-DL5BXZCX.js → chunk-BQY5L3DL.js} +3 -53
- package/dist/chunk-BQY5L3DL.js.map +1 -0
- package/dist/{chunk-F53U6JQG.js → chunk-CQJVM34R.js} +2 -2
- package/dist/chunk-FUBE6KCO.js +124 -0
- package/dist/chunk-FUBE6KCO.js.map +1 -0
- package/dist/chunk-IZBXXAVL.js +524 -0
- package/dist/chunk-IZBXXAVL.js.map +1 -0
- package/dist/{chunk-7JUX4ADQ.js → chunk-IZT6RBHS.js} +1 -1
- package/dist/{chunk-SMIK2YLU.js → chunk-JLQZELHQ.js} +82 -88
- package/dist/chunk-JLQZELHQ.js.map +1 -0
- package/dist/{chunk-TT6ZP4GS.js → chunk-KZXWPG4P.js} +2 -2
- package/dist/{chunk-6BJUYZ43.js → chunk-QIA22IAM.js} +8 -16
- package/dist/chunk-QIA22IAM.js.map +1 -0
- package/dist/{chunk-BGUID5BS.js → chunk-RALBM6HZ.js} +20 -139
- package/dist/chunk-RALBM6HZ.js.map +1 -0
- package/dist/{chunk-TILAKDN6.js → chunk-U5DLLWIC.js} +3 -3
- package/dist/chunk-WL4UE7Q6.js +1386 -0
- package/dist/chunk-WL4UE7Q6.js.map +1 -0
- package/dist/{chunk-GFUB57IT.js → chunk-ZUQN5Y3K.js} +48 -124
- package/dist/chunk-ZUQN5Y3K.js.map +1 -0
- package/dist/{chunk-MRRX4UQB.js → chunk-ZZLLOAI6.js} +3 -3
- package/dist/{cli-CL4ID7EO.js → cli-XWPNARA6.js} +35 -18
- package/dist/cli-XWPNARA6.js.map +1 -0
- package/dist/codealmanac.js +1 -1
- package/dist/{config-ML2RCR7J.js → config-KH3JUMG6.js} +4 -4
- package/dist/doctor-ENJT665Z.js +18 -0
- package/dist/paths-O5CZADP2.js +14 -0
- package/dist/process-KFSLENL3.js +61 -0
- package/dist/{register-commands-FBJ6XQ3L.js → register-commands-LULZUSPO.js} +993 -1015
- package/dist/register-commands-LULZUSPO.js.map +1 -0
- package/dist/uninstall-BD4MMQ7M.js +16 -0
- package/dist/uninstall-BD4MMQ7M.js.map +1 -0
- package/dist/update-XSKPDFMJ.js +11 -0
- package/dist/update-XSKPDFMJ.js.map +1 -0
- package/dist/{wiki-IGNRNLUZ.js → wiki-O4RWMAE6.js} +8 -6
- package/dist/wiki-O4RWMAE6.js.map +1 -0
- package/guides/mini.md +11 -9
- package/guides/reference.md +96 -39
- package/hooks/almanac-capture.sh +7 -8
- package/package.json +1 -1
- package/prompts/agents/.gitkeep +1 -0
- package/prompts/base/notability.md +139 -0
- package/prompts/base/purpose.md +85 -0
- package/prompts/base/syntax.md +114 -0
- package/prompts/operations/absorb.md +43 -0
- package/prompts/operations/build.md +49 -0
- package/prompts/operations/garden.md +51 -0
- package/dist/chunk-6BJUYZ43.js.map +0 -1
- package/dist/chunk-BGUID5BS.js.map +0 -1
- package/dist/chunk-DL5BXZCX.js.map +0 -1
- package/dist/chunk-GFUB57IT.js.map +0 -1
- package/dist/chunk-KQUVMF27.js.map +0 -1
- package/dist/chunk-P5WGG4FJ.js.map +0 -1
- package/dist/chunk-SMIK2YLU.js.map +0 -1
- package/dist/cli-CL4ID7EO.js.map +0 -1
- package/dist/doctor-DOLJRGS4.js +0 -17
- package/dist/register-commands-FBJ6XQ3L.js.map +0 -1
- package/dist/uninstall-DX6LFKMX.js +0 -15
- package/dist/update-P2IPG7RO.js +0 -11
- package/dist/wiki-IGNRNLUZ.js.map +0 -1
- package/prompts/bootstrap.md +0 -176
- package/prompts/reviewer.md +0 -129
- package/prompts/writer.md +0 -134
- /package/dist/{agents-RVTQYE6A.js.map → agents-V2ZOIACP.js.map} +0 -0
- /package/dist/{chunk-F53U6JQG.js.map → chunk-CQJVM34R.js.map} +0 -0
- /package/dist/{chunk-7JUX4ADQ.js.map → chunk-IZT6RBHS.js.map} +0 -0
- /package/dist/{chunk-TT6ZP4GS.js.map → chunk-KZXWPG4P.js.map} +0 -0
- /package/dist/{chunk-TILAKDN6.js.map → chunk-U5DLLWIC.js.map} +0 -0
- /package/dist/{chunk-MRRX4UQB.js.map → chunk-ZZLLOAI6.js.map} +0 -0
- /package/dist/{config-ML2RCR7J.js.map → config-KH3JUMG6.js.map} +0 -0
- /package/dist/{doctor-DOLJRGS4.js.map → doctor-ENJT665Z.js.map} +0 -0
- /package/dist/{uninstall-DX6LFKMX.js.map → paths-O5CZADP2.js.map} +0 -0
- /package/dist/{update-P2IPG7RO.js.map → process-KFSLENL3.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/process/ids.ts","../src/process/background.ts","../src/process/logs.ts","../src/process/manager.ts","../src/harness/providers/claude.ts","../src/harness/providers/metadata.ts","../src/harness/providers/codex.ts","../src/harness/providers/not-implemented.ts","../src/harness/providers/cursor.ts","../src/harness/providers/index.ts","../src/process/records.ts","../src/process/snapshots.ts","../src/process/spec.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\n\nexport function createRunId(now: Date = new Date()): string {\n const stamp = now\n .toISOString()\n .replace(/\\D/g, \"\")\n .slice(0, 14);\n const suffix = randomBytes(4).toString(\"hex\");\n return `run_${stamp}_${suffix}`;\n}\n","import { spawn } from \"node:child_process\";\nimport type { ChildProcess } from \"node:child_process\";\n\nimport type { AgentRunSpec, HarnessRunHooks } from \"../harness/types.js\";\nimport type { HarnessResult } from \"../harness/events.js\";\nimport { createRunId } from \"./ids.js\";\nimport { initializeRunLog } from \"./logs.js\";\nimport { startForegroundProcess, type StartProcessResult } from \"./manager.js\";\nimport {\n buildQueuedRunRecord,\n finishRunRecord,\n readRunRecord,\n runRecordPath,\n writeRunRecord,\n} from \"./records.js\";\nimport { readRunSpec, writeRunSpec } from \"./spec.js\";\nimport type { RunRecord } from \"./types.js\";\n\nexport interface BackgroundChild {\n pid?: number;\n unref?: () => void;\n}\n\nexport type SpawnBackgroundFn = (args: {\n command: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n}) => BackgroundChild;\n\nexport interface StartBackgroundProcessOptions {\n repoRoot: string;\n spec: AgentRunSpec;\n runId?: string;\n now?: () => Date;\n spawnBackground?: SpawnBackgroundFn;\n entrypoint?: string;\n}\n\nexport interface StartBackgroundProcessResult {\n runId: string;\n record: RunRecord;\n childPid: number;\n}\n\nexport async function startBackgroundProcess(\n options: StartBackgroundProcessOptions,\n): Promise<StartBackgroundProcessResult> {\n const now = options.now ?? (() => new Date());\n const runId = options.runId ?? createRunId(now());\n await writeRunSpec(options.repoRoot, runId, options.spec);\n const recordPath = runRecordPath(options.repoRoot, runId);\n const queued = buildQueuedRunRecord({\n runId,\n repoRoot: options.repoRoot,\n spec: options.spec,\n queuedAt: now(),\n });\n await writeRunRecord(recordPath, queued);\n await initializeRunLog(queued.logPath);\n\n const entrypoint = options.entrypoint ?? process.argv[1];\n if (entrypoint === undefined || entrypoint.length === 0) {\n const error = \"cannot start background process without an entrypoint\";\n await writeRunRecord(\n recordPath,\n finishRunRecord({\n record: queued,\n status: \"failed\",\n finishedAt: now(),\n error,\n }),\n );\n throw new Error(error);\n }\n\n const spawnFn = options.spawnBackground ?? defaultSpawnBackground;\n let child: BackgroundChild;\n try {\n child = spawnFn({\n command: process.execPath,\n args: [entrypoint, \"__run-job\", runId],\n cwd: options.repoRoot,\n env: {\n ...process.env,\n CODEALMANAC_INTERNAL_SESSION: \"1\",\n },\n });\n } catch (err: unknown) {\n await writeRunRecord(\n recordPath,\n finishRunRecord({\n record: queued,\n status: \"failed\",\n finishedAt: now(),\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n throw err;\n }\n child.unref?.();\n const childPid = child.pid ?? 0;\n return { runId, record: queued, childPid };\n}\n\nexport interface RunBackgroundChildOptions {\n repoRoot: string;\n runId: string;\n now?: () => Date;\n pid?: number;\n onEvent?: (event: import(\"../harness/events.js\").HarnessEvent) => void | Promise<void>;\n harnessRun?: (\n spec: AgentRunSpec,\n hooks?: HarnessRunHooks,\n ) => Promise<HarnessResult>;\n}\n\nexport async function runBackgroundChild(\n options: RunBackgroundChildOptions,\n): Promise<StartProcessResult> {\n const existing = await readRunRecord(runRecordPath(options.repoRoot, options.runId));\n if (existing?.status === \"cancelled\") {\n return {\n runId: options.runId,\n record: existing,\n result: {\n success: false,\n result: \"\",\n error: \"run cancelled before start\",\n },\n };\n }\n const spec = await readRunSpec(options.repoRoot, options.runId);\n return startForegroundProcess({\n repoRoot: options.repoRoot,\n spec,\n runId: options.runId,\n now: options.now,\n pid: options.pid,\n onEvent: options.onEvent,\n harnessRun: options.harnessRun,\n });\n}\n\nfunction defaultSpawnBackground(args: {\n command: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n}): ChildProcess {\n return spawn(args.command, args.args, {\n cwd: args.cwd,\n env: args.env,\n detached: true,\n stdio: \"ignore\",\n });\n}\n","import { mkdir, writeFile, appendFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport type { HarnessEvent } from \"../harness/events.js\";\n\nexport interface RunLogEntry {\n timestamp: string;\n event: HarnessEvent;\n}\n\nexport async function initializeRunLog(path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, \"\", \"utf8\");\n}\n\nexport async function appendRunEvent(\n path: string,\n event: HarnessEvent,\n now: Date = new Date(),\n): Promise<void> {\n const entry: RunLogEntry = {\n timestamp: now.toISOString(),\n event,\n };\n await appendFile(path, `${JSON.stringify(entry)}\\n`, \"utf8\");\n}\n","import { join } from \"node:path\";\n\nimport type { HarnessEvent, HarnessResult } from \"../harness/events.js\";\nimport type { AgentRunSpec, HarnessRunHooks } from \"../harness/types.js\";\nimport { getHarnessProvider } from \"../harness/providers/index.js\";\nimport { runIndexer } from \"../indexer/index.js\";\nimport { createRunId } from \"./ids.js\";\nimport { appendRunEvent, initializeRunLog } from \"./logs.js\";\nimport {\n buildStartedRunRecord,\n finishRunRecord,\n isRunCancellationRequested,\n readRunRecord,\n runRecordPath,\n writeRunRecord,\n} from \"./records.js\";\nimport { diffPageSnapshots, snapshotPages } from \"./snapshots.js\";\nimport type { RunRecord, RunSummary } from \"./types.js\";\n\nexport interface StartProcessOptions {\n repoRoot: string;\n spec: AgentRunSpec;\n runId?: string;\n now?: () => Date;\n pid?: number;\n onEvent?: (event: HarnessEvent) => void | Promise<void>;\n harnessRun?: (\n spec: AgentRunSpec,\n hooks?: HarnessRunHooks,\n ) => Promise<HarnessResult>;\n}\n\nexport interface StartProcessResult {\n runId: string;\n record: RunRecord;\n result: HarnessResult;\n}\n\nexport async function startForegroundProcess(\n options: StartProcessOptions,\n): Promise<StartProcessResult> {\n const now = options.now ?? (() => new Date());\n const runId = options.runId ?? createRunId(now());\n const startedAt = now();\n const recordPath = runRecordPath(options.repoRoot, runId);\n const started = buildStartedRunRecord({\n runId,\n repoRoot: options.repoRoot,\n spec: options.spec,\n startedAt,\n pid: options.pid,\n });\n\n const preStart = await cancelledRecordIfRequested({\n recordPath,\n repoRoot: options.repoRoot,\n runId,\n fallback: started,\n finishedAt: now(),\n });\n if (preStart !== null) {\n return {\n runId,\n record: preStart,\n result: {\n success: false,\n result: \"\",\n error: \"run cancelled before start\",\n },\n };\n }\n\n await writeRunRecord(recordPath, started);\n await initializeRunLog(started.logPath);\n const afterStart = await cancelledRecordIfRequested({\n recordPath,\n repoRoot: options.repoRoot,\n runId,\n fallback: started,\n finishedAt: now(),\n });\n if (afterStart !== null) {\n return {\n runId,\n record: afterStart,\n result: {\n success: false,\n result: \"\",\n error: \"run cancelled before start\",\n },\n };\n }\n\n const harnessRun =\n options.harnessRun ??\n ((spec, hooks) => getHarnessProvider(spec.provider.id).run(spec, hooks));\n const eventWrites: Promise<void>[] = [];\n\n let result: HarnessResult;\n let finalRecord: RunRecord;\n try {\n const pagesDir = join(options.repoRoot, \".almanac\", \"pages\");\n const before = await snapshotPages(pagesDir);\n try {\n result = await harnessRun(options.spec, {\n onEvent: eventLogger(started.logPath, now, eventWrites, options.onEvent),\n });\n } catch (err: unknown) {\n result = {\n success: false,\n result: \"\",\n error: err instanceof Error ? err.message : String(err),\n };\n await appendRunEvent(started.logPath, {\n type: \"error\",\n error: result.error ?? \"unknown error\",\n }, now());\n }\n await Promise.allSettled(eventWrites);\n\n const after = await snapshotPages(pagesDir);\n const delta = diffPageSnapshots(before, after);\n if (result.success) {\n await runIndexer({ repoRoot: options.repoRoot });\n }\n\n const summary: RunSummary = {\n created: delta.created,\n updated: delta.updated,\n archived: delta.archived,\n costUsd: result.costUsd,\n turns: result.turns,\n usage: result.usage,\n };\n finalRecord = await finishUnlessCancelled({\n recordPath,\n fallback: started,\n status: result.success ? \"done\" : \"failed\",\n finishedAt: now(),\n providerSessionId: result.providerSessionId,\n summary,\n error: result.error,\n failure: result.failure,\n });\n } catch (err: unknown) {\n result = {\n success: false,\n result: \"\",\n error: err instanceof Error ? err.message : String(err),\n };\n try {\n await appendRunEvent(started.logPath, {\n type: \"error\",\n error: result.error ?? \"unknown error\",\n }, now());\n } catch {\n // The run record is the source of truth; do not let a broken log write\n // prevent terminal status recording.\n }\n await Promise.allSettled(eventWrites);\n finalRecord = await finishUnlessCancelled({\n recordPath,\n fallback: started,\n status: \"failed\",\n finishedAt: now(),\n error: result.error,\n failure: result.failure,\n });\n }\n\n if (finalRecord.status === \"cancelled\" && result.success) {\n result = {\n success: false,\n result: \"\",\n error: \"run cancelled before final status\",\n };\n }\n return { runId, record: finalRecord, result };\n}\n\nasync function finishUnlessCancelled(args: {\n recordPath: string;\n fallback: RunRecord;\n status: \"done\" | \"failed\";\n finishedAt: Date;\n providerSessionId?: string;\n summary?: RunSummary;\n error?: string;\n failure?: import(\"../harness/events.js\").HarnessFailure;\n}): Promise<RunRecord> {\n const current = await readRunRecord(args.recordPath);\n if (\n current?.status === \"cancelled\" ||\n isRunCancellationRequested(args.fallback.repoRoot, args.fallback.id)\n ) {\n return finishCancelled({\n recordPath: args.recordPath,\n fallback: current ?? args.fallback,\n finishedAt: args.finishedAt,\n });\n }\n const base = current ?? args.fallback;\n const finished = finishRunRecord({\n record: base,\n status: args.status,\n finishedAt: args.finishedAt,\n providerSessionId: args.providerSessionId,\n summary: args.summary,\n error: args.error,\n failure: args.failure,\n });\n await writeRunRecord(args.recordPath, finished);\n return finished;\n}\n\nasync function cancelledRecordIfRequested(args: {\n recordPath: string;\n repoRoot: string;\n runId: string;\n fallback: RunRecord;\n finishedAt: Date;\n}): Promise<RunRecord | null> {\n const current = await readRunRecord(args.recordPath);\n if (\n current?.status !== \"cancelled\" &&\n !isRunCancellationRequested(args.repoRoot, args.runId)\n ) {\n return null;\n }\n return finishCancelled({\n recordPath: args.recordPath,\n fallback: current ?? args.fallback,\n finishedAt: args.finishedAt,\n });\n}\n\nasync function finishCancelled(args: {\n recordPath: string;\n fallback: RunRecord;\n finishedAt: Date;\n}): Promise<RunRecord> {\n const cancelled =\n args.fallback.status === \"cancelled\"\n ? args.fallback\n : finishRunRecord({\n record: args.fallback,\n status: \"cancelled\",\n finishedAt: args.finishedAt,\n });\n await writeRunRecord(args.recordPath, cancelled);\n return cancelled;\n}\n\nfunction eventLogger(\n path: string,\n now: () => Date,\n writes: Promise<void>[],\n observer?: (event: HarnessEvent) => void | Promise<void>,\n): (event: HarnessEvent) => void {\n return (event) => {\n writes.push(appendRunEvent(path, event, now()));\n if (observer !== undefined) {\n writes.push(Promise.resolve(observer(event)));\n }\n };\n}\n","import {\n query,\n type AgentDefinition,\n type Options as ClaudeOptions,\n type SDKMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\n\nimport type { HarnessEvent, HarnessFailure, HarnessResult } from \"../events.js\";\nimport type { ToolRequest } from \"../tools.js\";\nimport type {\n AgentRunSpec,\n AgentSpec,\n HarnessProvider,\n HarnessRunHooks,\n ProviderStatus,\n} from \"../types.js\";\nimport { HARNESS_PROVIDER_METADATA } from \"./metadata.js\";\nimport {\n checkClaudeAuth,\n resolveClaudeExecutable,\n type ClaudeAuthStatus,\n} from \"../../agent/providers/claude/auth.js\";\n\ntype ClaudeQuery = AsyncIterable<SDKMessage>;\ntype ClaudeQueryFn = (params: {\n prompt: string;\n options?: ClaudeOptions;\n}) => ClaudeQuery;\n\nexport interface ClaudeHarnessProviderDeps {\n query?: ClaudeQueryFn;\n checkAuth?: () => Promise<ClaudeAuthStatus>;\n resolveExecutable?: () => string | undefined;\n}\n\nexport function createClaudeHarnessProvider(\n deps: ClaudeHarnessProviderDeps = {},\n): HarnessProvider {\n const queryFn = deps.query ?? query;\n const checkAuthFn = deps.checkAuth ?? (() => checkClaudeAuth());\n const resolveExecutable = deps.resolveExecutable ?? resolveClaudeExecutable;\n const metadata = HARNESS_PROVIDER_METADATA.claude;\n\n return {\n metadata,\n checkStatus: async (): Promise<ProviderStatus> => {\n let auth: ClaudeAuthStatus = { loggedIn: false };\n try {\n auth = await checkAuthFn();\n } catch {\n auth = { loggedIn: false };\n }\n const hasApiKey =\n process.env.ANTHROPIC_API_KEY !== undefined &&\n process.env.ANTHROPIC_API_KEY.length > 0;\n const installed = resolveExecutable() !== undefined;\n const authenticated = auth.loggedIn || hasApiKey;\n const detail = authenticated\n ? auth.email ?? (hasApiKey ? \"ANTHROPIC_API_KEY set\" : \"logged in\")\n : installed\n ? \"not logged in\"\n : \"claude not found on PATH\";\n return { id: metadata.id, installed, authenticated, detail };\n },\n run: async (spec, hooks): Promise<HarnessResult> =>\n runClaudeHarness(spec, hooks, queryFn, resolveExecutable),\n };\n}\n\nexport const claudeHarnessProvider = createClaudeHarnessProvider();\n\nasync function runClaudeHarness(\n spec: AgentRunSpec,\n hooks: HarnessRunHooks | undefined,\n queryFn: ClaudeQueryFn,\n resolveExecutable: () => string | undefined,\n): Promise<HarnessResult> {\n const options = buildClaudeOptions(spec, resolveExecutable);\n const stream = queryFn({\n prompt: spec.prompt,\n options,\n });\n\n let costUsd: number | undefined;\n let turns: number | undefined;\n let result = \"\";\n let providerSessionId: string | undefined;\n let success = false;\n let error: string | undefined;\n let failure: HarnessFailure | undefined;\n let usage: HarnessResult[\"usage\"];\n\n try {\n for await (const message of stream) {\n providerSessionId = providerSessionId ?? getSessionId(message);\n for (const event of toHarnessEvents(message)) {\n await hooks?.onEvent?.(event);\n }\n\n if (message.type === \"result\") {\n costUsd = message.total_cost_usd;\n turns = message.num_turns;\n usage = mapUsage(message.usage);\n providerSessionId = providerSessionId ?? message.session_id;\n if (message.subtype === \"success\") {\n success = true;\n result = message.result;\n } else {\n success = false;\n error =\n message.errors.length > 0\n ? message.errors.join(\"; \")\n : `agent error: ${message.subtype}`;\n failure = classifyClaudeFailure(error, message.subtype);\n }\n }\n }\n } catch (err: unknown) {\n success = false;\n error = err instanceof Error ? err.message : String(err);\n failure = classifyClaudeFailure(error);\n await hooks?.onEvent?.({ type: \"error\", error, failure });\n }\n\n await hooks?.onEvent?.({\n type: \"done\",\n result,\n providerSessionId,\n costUsd,\n turns,\n usage,\n error,\n failure,\n });\n\n return {\n success,\n result,\n providerSessionId,\n costUsd,\n turns,\n usage,\n error,\n failure,\n };\n}\n\nfunction classifyClaudeFailure(\n raw: string,\n subtype?: string,\n): HarnessFailure {\n if (raw.includes(\"Not logged in\") || raw.includes(\"authentication\")) {\n return {\n provider: \"claude\",\n code: \"claude.not_authenticated\",\n message: \"Claude is not authenticated in this environment.\",\n fix: \"Run `claude` and log in, or configure ANTHROPIC_API_KEY for this process.\",\n raw,\n details: subtype !== undefined ? { subtype } : undefined,\n };\n }\n\n if (subtype === \"error_max_budget_usd\") {\n return {\n provider: \"claude\",\n code: \"claude.max_budget_exceeded\",\n message: \"Claude stopped because the run exceeded its maximum budget.\",\n fix: \"Raise the budget for this run or use a cheaper model.\",\n raw,\n details: { subtype },\n };\n }\n\n return {\n provider: \"claude\",\n code: subtype !== undefined ? `claude.${subtype}` : \"claude.process_failed\",\n message: raw,\n raw,\n details: subtype !== undefined ? { subtype } : undefined,\n };\n}\n\nfunction buildClaudeOptions(\n spec: AgentRunSpec,\n resolveExecutable: () => string | undefined,\n): ClaudeOptions {\n const tools = toClaudeTools(spec.tools ?? []);\n const agents = toClaudeAgents(spec.agents ?? {});\n if (Object.keys(agents).length > 0 && !tools.includes(\"Agent\")) {\n tools.push(\"Agent\");\n }\n\n const claudeExecutable = resolveExecutable();\n return pruneUndefined({\n systemPrompt: spec.systemPrompt,\n cwd: spec.cwd,\n model: spec.provider.model ?? HARNESS_PROVIDER_METADATA.claude.defaultModel ?? undefined,\n effort: toClaudeEffort(spec.provider.effort),\n tools,\n allowedTools: tools,\n agents,\n mcpServers: spec.mcpServers as ClaudeOptions[\"mcpServers\"],\n maxTurns: spec.limits?.maxTurns ?? 100,\n maxBudgetUsd: spec.limits?.maxCostUsd,\n permissionMode: \"dontAsk\",\n includePartialMessages: true,\n env: {\n ...process.env,\n CODEALMANAC_INTERNAL_SESSION: \"1\",\n },\n ...(claudeExecutable !== undefined\n ? { pathToClaudeCodeExecutable: claudeExecutable }\n : {}),\n });\n}\n\nfunction toClaudeAgents(\n agents: Record<string, AgentSpec>,\n): Record<string, AgentDefinition> {\n const out: Record<string, AgentDefinition> = {};\n for (const [name, agent] of Object.entries(agents)) {\n out[name] = pruneUndefined({\n description: agent.description,\n prompt: agent.prompt,\n tools: agent.tools !== undefined ? toClaudeTools(agent.tools) : undefined,\n model: agent.model,\n maxTurns: agent.maxTurns,\n mcpServers: agent.mcpServers as AgentDefinition[\"mcpServers\"],\n skills: agent.skills,\n });\n }\n return out;\n}\n\nfunction toClaudeTools(tools: readonly ToolRequest[]): string[] {\n const out = new Set<string>();\n for (const tool of tools) {\n switch (tool.id) {\n case \"read\":\n out.add(\"Read\");\n break;\n case \"write\":\n out.add(\"Write\");\n break;\n case \"edit\":\n out.add(\"Edit\");\n break;\n case \"search\":\n out.add(\"Glob\");\n out.add(\"Grep\");\n break;\n case \"shell\":\n out.add(\"Bash\");\n break;\n case \"web\":\n out.add(\"WebSearch\");\n out.add(\"WebFetch\");\n break;\n case \"mcp\":\n break;\n }\n }\n return [...out];\n}\n\nfunction toClaudeEffort(effort: string | undefined): ClaudeOptions[\"effort\"] {\n if (\n effort === \"low\" ||\n effort === \"medium\" ||\n effort === \"high\" ||\n effort === \"max\"\n ) {\n return effort;\n }\n return undefined;\n}\n\nfunction toHarnessEvents(message: SDKMessage): HarnessEvent[] {\n if (message.type === \"stream_event\") {\n const text = getTextDelta(message.event);\n return text !== undefined ? [{ type: \"text_delta\", content: text }] : [];\n }\n\n if (message.type === \"assistant\") {\n const content = message.message.content;\n if (!Array.isArray(content)) return [];\n const events: HarnessEvent[] = [];\n for (const block of content) {\n if (block.type === \"text\") {\n events.push({ type: \"text\", content: block.text });\n continue;\n }\n if (block.type === \"tool_use\") {\n events.push({\n type: \"tool_use\",\n id: block.id,\n tool: block.name,\n input: stringifyInput(block.input),\n });\n }\n }\n return events;\n }\n\n if (message.type === \"user\") {\n const content = message.message.content;\n if (!Array.isArray(content)) return [];\n return content.flatMap((block) => {\n if (block.type !== \"tool_result\") return [];\n return [\n {\n type: \"tool_result\",\n id: block.tool_use_id,\n content: block.content,\n isError: block.is_error,\n } satisfies HarnessEvent,\n ];\n });\n }\n\n if (message.type === \"tool_use_summary\") {\n return [{ type: \"tool_summary\", summary: message.summary }];\n }\n\n if (message.type === \"result\" && message.subtype !== \"success\") {\n return message.errors.map((err) => ({ type: \"error\", error: err }));\n }\n\n return [];\n}\n\nfunction getTextDelta(event: unknown): string | undefined {\n if (event === null || typeof event !== \"object\") return undefined;\n const raw = event as {\n type?: unknown;\n delta?: { type?: unknown; text?: unknown };\n };\n return raw.type === \"content_block_delta\" &&\n raw.delta?.type === \"text_delta\" &&\n typeof raw.delta.text === \"string\"\n ? raw.delta.text\n : undefined;\n}\n\nfunction getSessionId(message: SDKMessage): string | undefined {\n return \"session_id\" in message && typeof message.session_id === \"string\"\n ? message.session_id\n : undefined;\n}\n\nfunction stringifyInput(input: unknown): string | undefined {\n if (input === undefined) return undefined;\n if (typeof input === \"string\") return input;\n try {\n return JSON.stringify(input);\n } catch {\n return String(input);\n }\n}\n\nfunction mapUsage(value: unknown): HarnessResult[\"usage\"] {\n if (value === null || typeof value !== \"object\") return undefined;\n const usage = value as Record<string, unknown>;\n const inputTokens = numberField(usage, \"input_tokens\");\n const cachedInputTokens = numberField(usage, \"cache_read_input_tokens\");\n const outputTokens = numberField(usage, \"output_tokens\");\n return pruneUndefined({\n inputTokens,\n cachedInputTokens,\n outputTokens,\n totalTokens:\n inputTokens !== undefined || outputTokens !== undefined\n ? (inputTokens ?? 0) + (outputTokens ?? 0)\n : undefined,\n });\n}\n\nfunction numberField(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = record[field];\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction pruneUndefined<T extends Record<string, unknown>>(value: T): T {\n for (const key of Object.keys(value)) {\n if (value[key] === undefined) {\n delete value[key];\n }\n }\n return value;\n}\n","import type {\n HarnessCapabilities,\n HarnessProviderId,\n ProviderMetadata,\n} from \"../types.js\";\n\nconst BASE_CAPABILITIES: Omit<\n HarnessCapabilities,\n | \"reasoningEffort\"\n | \"sessionPersistence\"\n | \"threadResume\"\n | \"interrupt\"\n | \"mcp\"\n | \"skills\"\n | \"usage\"\n | \"cost\"\n | \"contextUsage\"\n | \"structuredOutput\"\n | \"subagents\"\n | \"policy\"\n> = {\n nonInteractive: true,\n streaming: true,\n modelOverride: true,\n modelOptions: false,\n fileRead: true,\n fileWrite: true,\n shell: true,\n};\n\nexport const HARNESS_PROVIDER_METADATA: Record<HarnessProviderId, ProviderMetadata> = {\n claude: {\n id: \"claude\",\n displayName: \"Claude\",\n defaultModel: \"claude-sonnet-4-6\",\n capabilities: {\n ...BASE_CAPABILITIES,\n reasoningEffort: false,\n sessionPersistence: true,\n threadResume: true,\n interrupt: true,\n mcp: true,\n skills: true,\n usage: true,\n cost: true,\n contextUsage: false,\n structuredOutput: false,\n subagents: {\n supported: true,\n programmaticPerRun: true,\n enforcedToolScopes: true,\n },\n policy: {\n sandbox: true,\n strictToolAllowlist: true,\n commandApproval: true,\n toolHook: true,\n },\n },\n },\n codex: {\n id: \"codex\",\n displayName: \"Codex\",\n defaultModel: null,\n capabilities: {\n ...BASE_CAPABILITIES,\n modelOptions: true,\n reasoningEffort: false,\n sessionPersistence: false,\n threadResume: false,\n interrupt: false,\n mcp: false,\n skills: false,\n usage: true,\n cost: false,\n contextUsage: false,\n structuredOutput: true,\n subagents: {\n supported: false,\n programmaticPerRun: false,\n enforcedToolScopes: false,\n },\n policy: {\n sandbox: true,\n strictToolAllowlist: false,\n commandApproval: false,\n toolHook: false,\n },\n },\n },\n cursor: {\n id: \"cursor\",\n displayName: \"Cursor\",\n defaultModel: null,\n capabilities: {\n nonInteractive: false,\n streaming: false,\n modelOverride: false,\n modelOptions: false,\n fileRead: false,\n fileWrite: false,\n shell: false,\n reasoningEffort: false,\n sessionPersistence: false,\n threadResume: false,\n interrupt: false,\n mcp: false,\n skills: false,\n usage: false,\n cost: false,\n contextUsage: false,\n structuredOutput: false,\n subagents: {\n supported: false,\n programmaticPerRun: false,\n enforcedToolScopes: false,\n },\n policy: {\n sandbox: false,\n strictToolAllowlist: false,\n commandApproval: false,\n toolHook: false,\n },\n },\n },\n};\n","import { spawn, spawnSync, type ChildProcess } from \"node:child_process\";\n\nimport type { AgentUsage, HarnessFailure, HarnessResult } from \"../events.js\";\nimport type {\n AgentRunSpec,\n HarnessProvider,\n HarnessRunHooks,\n ProviderStatus,\n} from \"../types.js\";\nimport { HARNESS_PROVIDER_METADATA } from \"./metadata.js\";\n\nexport interface CodexExecRequest {\n command: \"codex\";\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n}\n\nexport type CodexCliRunFn = (\n request: CodexExecRequest,\n hooks?: HarnessRunHooks,\n) => Promise<HarnessResult>;\n\nexport interface CodexHarnessProviderDeps {\n commandExists?: (command: string) => boolean;\n runStatus?: (command: string, args: string[]) => Promise<{\n ok: boolean;\n detail: string;\n }>;\n runCli?: CodexCliRunFn;\n}\n\ninterface CodexRunState {\n success: boolean;\n result: string;\n providerSessionId?: string;\n turns?: number;\n usage?: AgentUsage;\n error?: string;\n failure?: HarnessFailure;\n}\n\nexport function createCodexHarnessProvider(\n deps: CodexHarnessProviderDeps = {},\n): HarnessProvider {\n const metadata = HARNESS_PROVIDER_METADATA.codex;\n const commandExists = deps.commandExists ?? defaultCommandExists;\n const runStatus = deps.runStatus ?? defaultRunStatus;\n const runCli = deps.runCli ?? runCodexCli;\n\n return {\n metadata,\n checkStatus: async (): Promise<ProviderStatus> => {\n if (!commandExists(\"codex\")) {\n return {\n id: metadata.id,\n installed: false,\n authenticated: false,\n detail: \"codex not found on PATH\",\n };\n }\n\n const auth = await runStatus(\"codex\", [\"login\", \"status\"]);\n return {\n id: metadata.id,\n installed: true,\n authenticated: auth.ok,\n detail: auth.detail,\n };\n },\n run: async (spec, hooks): Promise<HarnessResult> => {\n if (spec.agents !== undefined && Object.keys(spec.agents).length > 0) {\n return {\n success: false,\n result: \"\",\n error:\n \"Codex exec adapter does not support per-run programmatic agents\",\n failure: {\n provider: \"codex\",\n code: \"codex.unsupported_feature\",\n message:\n \"Codex exec adapter does not support per-run programmatic agents.\",\n fix: \"Run this operation with a provider that supports per-run subagents.\",\n },\n };\n }\n return runCli(buildCodexExecRequest(spec), hooks);\n },\n };\n}\n\nexport const codexHarnessProvider = createCodexHarnessProvider();\n\nexport function buildCodexExecRequest(spec: AgentRunSpec): CodexExecRequest {\n const unsupported = unsupportedCodexSpecFields(spec);\n if (unsupported.length > 0) {\n throw new Error(\n `Codex exec adapter does not support: ${unsupported.join(\", \")}`,\n );\n }\n const args = [\n \"exec\",\n \"--json\",\n \"--sandbox\",\n \"workspace-write\",\n \"--skip-git-repo-check\",\n \"-C\",\n spec.cwd,\n ];\n if (spec.provider.model !== undefined && spec.provider.model.length > 0) {\n args.push(\"--model\", spec.provider.model);\n }\n if (spec.output?.schemaPath !== undefined) {\n args.push(\"--output-schema\", spec.output.schemaPath);\n }\n args.push(combineCodexPrompt(spec));\n return {\n command: \"codex\",\n args,\n cwd: spec.cwd,\n env: {\n ...process.env,\n CODEALMANAC_INTERNAL_SESSION: \"1\",\n },\n };\n}\n\nfunction unsupportedCodexSpecFields(spec: AgentRunSpec): string[] {\n const unsupported: string[] = [];\n if (spec.provider.effort !== undefined) unsupported.push(\"provider.effort\");\n if (spec.skills !== undefined && spec.skills.length > 0) unsupported.push(\"skills\");\n if (spec.mcpServers !== undefined && Object.keys(spec.mcpServers).length > 0) {\n unsupported.push(\"mcpServers\");\n }\n if (spec.limits?.maxCostUsd !== undefined) unsupported.push(\"limits.maxCostUsd\");\n return unsupported;\n}\n\nexport function combineCodexPrompt(spec: AgentRunSpec): string {\n const blocks = [spec.systemPrompt, spec.prompt].filter(\n (block): block is string => block !== undefined && block.trim().length > 0,\n );\n return blocks.join(\"\\n\\n---\\n\\n\");\n}\n\nexport function runCodexCli(\n request: CodexExecRequest,\n hooks?: HarnessRunHooks,\n): Promise<HarnessResult> {\n return new Promise((resolve) => {\n const child = spawn(request.command, request.args, {\n cwd: request.cwd,\n env: request.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdoutBuf = \"\";\n let stderr = \"\";\n const state: CodexRunState = {\n success: false,\n result: \"\",\n };\n const eventWrites: Promise<void>[] = [];\n\n const observe = (msg: Record<string, unknown>): void => {\n eventWrites.push(applyCodexJsonlEvent(state, msg, hooks));\n };\n\n const flushLines = (): void => {\n let idx = stdoutBuf.indexOf(\"\\n\");\n while (idx !== -1) {\n const rawLine = stdoutBuf.slice(0, idx);\n stdoutBuf = stdoutBuf.slice(idx + 1);\n const line = rawLine.trim();\n if (line.length > 0) {\n try {\n observe(JSON.parse(line) as Record<string, unknown>);\n } catch {\n // Ignore non-JSON chatter; stderr is captured for failures.\n }\n }\n idx = stdoutBuf.indexOf(\"\\n\");\n }\n };\n\n child.stdout.on(\"data\", (chunk) => {\n stdoutBuf += chunk.toString(\"utf8\");\n flushLines();\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n resolve({\n success: false,\n result: state.result,\n providerSessionId: state.providerSessionId,\n turns: state.turns,\n usage: state.usage,\n error:\n err.code === \"ENOENT\"\n ? `${request.command} not found on PATH`\n : err.message,\n });\n });\n child.on(\"close\", async (code) => {\n flushLines();\n if (stdoutBuf.trim().length > 0) {\n try {\n observe(JSON.parse(stdoutBuf.trim()) as Record<string, unknown>);\n } catch {\n // Ignore trailing non-JSON.\n }\n }\n await Promise.allSettled(eventWrites);\n\n if (code === 0 && state.success) {\n resolve(toHarnessResult(state));\n return;\n }\n\n const firstStderr = stderr.trim().split(\"\\n\")[0];\n const fallbackError =\n firstStderr !== undefined && firstStderr.length > 0\n ? firstStderr\n : `${request.command} exited ${code ?? 1}`;\n const failure = state.failure ?? classifyCodexFailure(fallbackError);\n resolve({\n ...toHarnessResult(state),\n success: false,\n error: state.error ?? failure.message,\n failure,\n });\n });\n });\n}\n\nexport async function applyCodexJsonlEvent(\n state: CodexRunState,\n input: Record<string, unknown>,\n hooks?: HarnessRunHooks,\n): Promise<void> {\n const msg = unwrapCodexJsonlEvent(input);\n const sessionId = stringField(msg, \"session_id\") ?? stringField(msg, \"thread_id\");\n if (state.providerSessionId === undefined && sessionId !== undefined) {\n state.providerSessionId = sessionId;\n }\n\n if (msg.type === \"item.completed\") {\n const item = objectField(msg, \"item\");\n if (item?.type === \"agent_message\") {\n const text = stringField(item, \"text\");\n if (text !== undefined) {\n state.result = text;\n await hooks?.onEvent?.({ type: \"text\", content: text });\n }\n }\n if (item?.type === \"tool_call\") {\n await emitToolUse(item, hooks);\n }\n return;\n }\n\n if (msg.type === \"turn.completed\") {\n state.success = true;\n state.turns = 1;\n state.usage = parseCodexUsage(msg.usage);\n await hooks?.onEvent?.({\n type: \"done\",\n result: state.result,\n providerSessionId: state.providerSessionId,\n turns: state.turns,\n usage: state.usage,\n });\n return;\n }\n\n if (msg.type === \"turn.failed\" || msg.type === \"error\") {\n state.success = false;\n const raw =\n stringField(msg, \"message\") ??\n stringField(msg, \"error\") ??\n \"codex turn failed\";\n const failure = classifyCodexFailure(raw);\n state.error = failure.message;\n state.failure = failure;\n await hooks?.onEvent?.({\n type: \"error\",\n error: state.error,\n failure,\n });\n }\n}\n\nfunction toHarnessResult(state: CodexRunState): HarnessResult {\n return {\n success: state.success,\n result: state.result,\n providerSessionId: state.providerSessionId,\n turns: state.turns,\n usage: state.usage,\n error: state.error,\n failure: state.failure,\n };\n}\n\nfunction unwrapCodexJsonlEvent(\n input: Record<string, unknown>,\n): Record<string, unknown> {\n const msg = objectField(input, \"msg\");\n return msg ?? input;\n}\n\nfunction classifyCodexFailure(raw: string): HarnessFailure {\n const detail = extractJsonDetail(raw);\n const text = detail ?? raw;\n const statusCode = extractStatusCode(raw);\n const model =\n matchFirst(text, /The '([^']+)' model requires a newer version of Codex/) ??\n matchFirst(text, /The '([^']+)' model is not supported/);\n\n if (text.includes(\"requires a newer version of Codex\") && model !== undefined) {\n return {\n provider: \"codex\",\n code: \"codex.model_requires_newer_cli\",\n message: `Codex model ${model} requires a newer Codex CLI.`,\n fix: \"Upgrade Codex, or run with --using codex/<supported-model>.\",\n raw,\n details: codexFailureDetails({ model, statusCode }),\n };\n }\n\n if (text.includes(\"model is not supported\") && model !== undefined) {\n return {\n provider: \"codex\",\n code: \"codex.model_unavailable\",\n message: `Codex model ${model} is not available for this account.`,\n fix: \"Choose a supported model with --using codex/<model>, or update the configured Codex model.\",\n raw,\n details: codexFailureDetails({ model, statusCode }),\n };\n }\n\n if (text.includes(\"401 Unauthorized\") || text.includes(\"Unauthorized\")) {\n return {\n provider: \"codex\",\n code: \"codex.not_authenticated\",\n message: \"Codex is not authenticated in this environment.\",\n fix: \"Run `codex login` in the same environment, or make the existing Codex auth available to this process.\",\n raw,\n details: codexFailureDetails({ statusCode: statusCode ?? 401 }),\n };\n }\n\n if (text.includes(\"not found on PATH\")) {\n return {\n provider: \"codex\",\n code: \"codex.not_installed\",\n message: \"Codex was not found on PATH.\",\n fix: \"Install Codex or update PATH so the `codex` command is available.\",\n raw,\n };\n }\n\n return {\n provider: \"codex\",\n code: \"codex.process_failed\",\n message: text,\n raw,\n details: codexFailureDetails({ statusCode }),\n };\n}\n\nfunction codexFailureDetails(\n details: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const pruned = pruneUndefined(details);\n return Object.keys(pruned).length > 0 ? pruned : undefined;\n}\n\nfunction extractJsonDetail(raw: string): string | undefined {\n const start = raw.indexOf(\"{\");\n const end = raw.lastIndexOf(\"}\");\n if (start === -1 || end <= start) return undefined;\n try {\n const parsed = JSON.parse(raw.slice(start, end + 1)) as unknown;\n if (parsed !== null && typeof parsed === \"object\") {\n const detail = (parsed as Record<string, unknown>).detail;\n return typeof detail === \"string\" && detail.length > 0 ? detail : undefined;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nfunction extractStatusCode(raw: string): number | undefined {\n const match = raw.match(/status\\s+(\\d{3})|(\\d{3})\\s+(?:Bad Request|Unauthorized)/);\n if (match === null) return undefined;\n const value = match[1] ?? match[2];\n return value !== undefined ? Number.parseInt(value, 10) : undefined;\n}\n\nfunction matchFirst(text: string, pattern: RegExp): string | undefined {\n const match = text.match(pattern);\n return match?.[1];\n}\n\nasync function emitToolUse(\n item: Record<string, unknown>,\n hooks: HarnessRunHooks | undefined,\n): Promise<void> {\n const tool = stringField(item, \"name\") ?? stringField(item, \"tool_name\");\n if (tool === undefined) return;\n await hooks?.onEvent?.({\n type: \"tool_use\",\n id: stringField(item, \"id\"),\n tool,\n input: stringifyInput(item.input ?? item.arguments),\n });\n}\n\nexport function parseCodexUsage(value: unknown): AgentUsage | undefined {\n if (value === null || typeof value !== \"object\") return undefined;\n const obj = value as Record<string, unknown>;\n const inputTokens =\n numberField(obj, \"input_tokens\") ?? numberField(obj, \"inputTokens\");\n const cachedInputTokens =\n numberField(obj, \"cached_input_tokens\") ??\n numberField(obj, \"cachedInputTokens\") ??\n numberField(obj, \"cacheReadTokens\");\n const outputTokens =\n numberField(obj, \"output_tokens\") ?? numberField(obj, \"outputTokens\");\n const reasoningOutputTokens =\n numberField(obj, \"reasoning_output_tokens\") ??\n numberField(obj, \"reasoningOutputTokens\");\n return pruneUndefined({\n inputTokens,\n cachedInputTokens,\n outputTokens,\n reasoningOutputTokens,\n totalTokens:\n inputTokens !== undefined || outputTokens !== undefined\n ? (inputTokens ?? 0) + (outputTokens ?? 0)\n : undefined,\n });\n}\n\nfunction objectField(\n record: Record<string, unknown>,\n field: string,\n): Record<string, unknown> | undefined {\n const value = record[field];\n return value !== null && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction stringField(\n record: Record<string, unknown>,\n field: string,\n): string | undefined {\n const value = record[field];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction numberField(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = record[field];\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction stringifyInput(input: unknown): string | undefined {\n if (input === undefined) return undefined;\n if (typeof input === \"string\") return input;\n try {\n return JSON.stringify(input);\n } catch {\n return String(input);\n }\n}\n\nfunction pruneUndefined<T extends Record<string, unknown>>(value: T): T {\n for (const key of Object.keys(value)) {\n if (value[key] === undefined) {\n delete value[key];\n }\n }\n return value;\n}\n\nfunction defaultCommandExists(command: string): boolean {\n const result = spawnSync(\"sh\", [\"-lc\", `command -v ${command}`], {\n encoding: \"utf8\",\n });\n return result.status === 0 && result.stdout.trim().length > 0;\n}\n\nfunction defaultRunStatus(\n command: string,\n args: string[],\n): Promise<{ ok: boolean; detail: string }> {\n return new Promise((resolve) => {\n let child: ChildProcess;\n let stdout = \"\";\n let stderr = \"\";\n try {\n child = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n } catch (err: unknown) {\n resolve({\n ok: false,\n detail: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n\n child.stdout?.on(\"data\", (chunk) => {\n stdout += chunk.toString(\"utf8\");\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString(\"utf8\");\n });\n child.on(\"error\", (err) => {\n resolve({ ok: false, detail: err.message });\n });\n child.on(\"close\", (code) => {\n const text = `${stdout}\\n${stderr}`.trim();\n resolve({\n ok: code === 0,\n detail:\n text\n .split(\"\\n\")\n .find((line) => line.trim().length > 0)\n ?.trim() ?? (code === 0 ? \"ready\" : `${command} exited ${code ?? 1}`),\n });\n });\n });\n}\n","import type {\n AgentRunSpec,\n HarnessProvider,\n ProviderMetadata,\n ProviderStatus,\n} from \"../types.js\";\n\nexport function createNotImplementedProvider(\n metadata: ProviderMetadata,\n): HarnessProvider {\n return {\n metadata,\n checkStatus: async (): Promise<ProviderStatus> => ({\n id: metadata.id,\n installed: false,\n authenticated: false,\n detail: `${metadata.displayName} harness adapter is not implemented yet`,\n }),\n run: async (spec: AgentRunSpec) => ({\n success: false,\n result: \"\",\n error:\n `${metadata.displayName} harness adapter is not implemented yet ` +\n `for ${spec.metadata?.operation ?? \"unknown\"} runs`,\n }),\n };\n}\n","import type { HarnessProvider } from \"../types.js\";\nimport { HARNESS_PROVIDER_METADATA } from \"./metadata.js\";\nimport { createNotImplementedProvider } from \"./not-implemented.js\";\n\nexport const cursorHarnessProvider: HarnessProvider = createNotImplementedProvider(\n HARNESS_PROVIDER_METADATA.cursor,\n);\n","import type { HarnessProvider, HarnessProviderId } from \"../types.js\";\nimport { claudeHarnessProvider } from \"./claude.js\";\nimport { codexHarnessProvider } from \"./codex.js\";\nimport { cursorHarnessProvider } from \"./cursor.js\";\nimport { HARNESS_PROVIDER_METADATA } from \"./metadata.js\";\n\nconst HARNESS_PROVIDERS = {\n claude: claudeHarnessProvider,\n codex: codexHarnessProvider,\n cursor: cursorHarnessProvider,\n} satisfies Record<HarnessProviderId, HarnessProvider>;\n\nexport function getHarnessProvider(id: HarnessProviderId): HarnessProvider {\n return HARNESS_PROVIDERS[id];\n}\n\nexport function listHarnessProviders(): HarnessProvider[] {\n return Object.values(HARNESS_PROVIDERS);\n}\n\nexport { HARNESS_PROVIDER_METADATA };\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, readdir, rename, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport type { AgentRunSpec } from \"../harness/types.js\";\nimport type { HarnessFailure } from \"../harness/events.js\";\nimport { getRepoAlmanacDir } from \"../paths.js\";\nimport type { RunRecord, RunStatus, RunSummary, RunView } from \"./types.js\";\n\nexport function runsDir(repoRoot: string): string {\n return join(getRepoAlmanacDir(repoRoot), \"runs\");\n}\n\nexport function runRecordPath(repoRoot: string, runId: string): string {\n return join(runsDir(repoRoot), `${runId}.json`);\n}\n\nexport function runLogPath(repoRoot: string, runId: string): string {\n return join(runsDir(repoRoot), `${runId}.jsonl`);\n}\n\nexport function runCancelPath(repoRoot: string, runId: string): string {\n return join(runsDir(repoRoot), `${runId}.cancel`);\n}\n\nexport async function markRunCancelled(\n repoRoot: string,\n runId: string,\n): Promise<void> {\n const path = runCancelPath(repoRoot, runId);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, \"cancelled\\n\", \"utf8\");\n}\n\nexport function isRunCancellationRequested(\n repoRoot: string,\n runId: string,\n): boolean {\n return existsSync(runCancelPath(repoRoot, runId));\n}\n\nexport async function writeRunRecord(\n path: string,\n record: RunRecord,\n): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const tmp = `${path}.tmp-${process.pid}`;\n await writeFile(tmp, `${JSON.stringify(record, null, 2)}\\n`, \"utf8\");\n await rename(tmp, path);\n}\n\nexport function buildStartedRunRecord(args: {\n runId: string;\n repoRoot: string;\n spec: AgentRunSpec;\n startedAt: Date;\n pid?: number;\n}): RunRecord {\n return {\n version: 1,\n id: args.runId,\n operation: args.spec.metadata?.operation ?? \"absorb\",\n status: \"running\",\n repoRoot: args.repoRoot,\n pid: args.pid ?? process.pid,\n provider: args.spec.provider.id,\n model: args.spec.provider.model,\n startedAt: args.startedAt.toISOString(),\n logPath: runLogPath(args.repoRoot, args.runId),\n targetKind: args.spec.metadata?.targetKind,\n targetPaths: args.spec.metadata?.targetPaths,\n };\n}\n\nexport function buildQueuedRunRecord(args: {\n runId: string;\n repoRoot: string;\n spec: AgentRunSpec;\n queuedAt: Date;\n}): RunRecord {\n return {\n ...buildStartedRunRecord({\n runId: args.runId,\n repoRoot: args.repoRoot,\n spec: args.spec,\n startedAt: args.queuedAt,\n pid: 0,\n }),\n status: \"queued\",\n };\n}\n\nexport function finishRunRecord(args: {\n record: RunRecord;\n status: Extract<RunStatus, \"done\" | \"failed\" | \"cancelled\">;\n finishedAt: Date;\n providerSessionId?: string;\n summary?: RunSummary;\n error?: string;\n failure?: HarnessFailure;\n}): RunRecord {\n const started = Date.parse(args.record.startedAt);\n const finished = args.finishedAt.getTime();\n return {\n ...args.record,\n status: args.status,\n providerSessionId: args.providerSessionId ?? args.record.providerSessionId,\n finishedAt: args.finishedAt.toISOString(),\n durationMs: Number.isFinite(started)\n ? Math.max(0, finished - started)\n : undefined,\n summary: args.summary,\n error: args.error,\n failure: args.failure,\n };\n}\n\nexport async function readRunRecord(path: string): Promise<RunRecord | null> {\n try {\n const parsed = JSON.parse(await readFile(path, \"utf8\")) as unknown;\n return isRunRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport async function listRunRecords(repoRoot: string): Promise<RunRecord[]> {\n const dir = runsDir(repoRoot);\n if (!existsSync(dir)) return [];\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n const records: RunRecord[] = [];\n for (const entry of entries) {\n if (!entry.startsWith(\"run_\") || !entry.endsWith(\".json\")) continue;\n const record = await readRunRecord(join(dir, entry));\n if (record !== null) records.push(record);\n }\n return records.sort((a, b) => b.startedAt.localeCompare(a.startedAt));\n}\n\nexport function toRunView(args: {\n record: RunRecord;\n now: Date;\n isPidAlive: (pid: number) => boolean;\n}): RunView {\n const started = Date.parse(args.record.startedAt);\n const finished =\n args.record.finishedAt !== undefined\n ? Date.parse(args.record.finishedAt)\n : undefined;\n const elapsedMs =\n args.record.durationMs ??\n (Number.isFinite(started)\n ? Math.max(0, (finished ?? args.now.getTime()) - started)\n : 0);\n const displayStatus =\n args.record.status === \"running\" && !args.isPidAlive(args.record.pid)\n ? \"stale\"\n : args.record.status;\n return {\n ...args.record,\n displayStatus,\n elapsedMs,\n error:\n displayStatus === \"stale\"\n ? \"process ended without a final status\"\n : args.record.error,\n };\n}\n\nexport function isRunRecord(value: unknown): value is RunRecord {\n if (value === null || typeof value !== \"object\") return false;\n const v = value as Partial<RunRecord>;\n return (\n v.version === 1 &&\n typeof v.id === \"string\" &&\n v.id.startsWith(\"run_\") &&\n (v.operation === \"build\" || v.operation === \"absorb\" || v.operation === \"garden\") &&\n (v.status === \"queued\" ||\n v.status === \"running\" ||\n v.status === \"done\" ||\n v.status === \"failed\" ||\n v.status === \"cancelled\") &&\n typeof v.repoRoot === \"string\" &&\n typeof v.pid === \"number\" &&\n (v.provider === \"claude\" || v.provider === \"codex\" || v.provider === \"cursor\") &&\n typeof v.startedAt === \"string\" &&\n typeof v.logPath === \"string\"\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { parseFrontmatter } from \"../indexer/frontmatter.js\";\n\nexport interface PageSnapshotEntry {\n slug: string;\n hash: string;\n archived: boolean;\n}\n\nexport type PageSnapshot = Map<string, PageSnapshotEntry>;\n\nexport interface PageSnapshotDelta {\n created: number;\n updated: number;\n archived: number;\n deleted: number;\n}\n\nexport async function snapshotPages(pagesDir: string): Promise<PageSnapshot> {\n const out: PageSnapshot = new Map();\n if (!existsSync(pagesDir)) return out;\n\n let entries: string[];\n try {\n entries = await readdir(pagesDir);\n } catch {\n return out;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith(\".md\")) continue;\n const slug = entry.slice(0, -3);\n const full = join(pagesDir, entry);\n try {\n const st = statSync(full);\n if (!st.isFile()) continue;\n const content = await readFile(full, \"utf8\");\n out.set(slug, {\n slug,\n hash: createHash(\"sha256\").update(content).digest(\"hex\"),\n archived: parseFrontmatter(content).archived_at !== null,\n });\n } catch {\n continue;\n }\n }\n\n return out;\n}\n\nexport function diffPageSnapshots(\n before: PageSnapshot,\n after: PageSnapshot,\n): PageSnapshotDelta {\n let created = 0;\n let updated = 0;\n let archived = 0;\n let deleted = 0;\n\n for (const [slug, entry] of after) {\n const prev = before.get(slug);\n if (prev === undefined) {\n created += 1;\n continue;\n }\n if (prev.hash === entry.hash) continue;\n if (!prev.archived && entry.archived) {\n archived += 1;\n } else {\n updated += 1;\n }\n }\n\n for (const slug of before.keys()) {\n if (!after.has(slug)) deleted += 1;\n }\n\n return { created, updated, archived, deleted };\n}\n\nexport function isNoopPageDelta(delta: PageSnapshotDelta): boolean {\n return (\n delta.created === 0 &&\n delta.updated === 0 &&\n delta.archived === 0 &&\n delta.deleted === 0\n );\n}\n","import { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport type {\n AgentRunSpec,\n HarnessProviderId,\n OperationKind,\n} from \"../harness/types.js\";\nimport { runsDir } from \"./records.js\";\n\nexport function runSpecPath(repoRoot: string, runId: string): string {\n return join(runsDir(repoRoot), `${runId}.spec.json`);\n}\n\nexport async function writeRunSpec(\n repoRoot: string,\n runId: string,\n spec: AgentRunSpec,\n): Promise<void> {\n const path = runSpecPath(repoRoot, runId);\n await mkdir(dirname(path), { recursive: true });\n const tmp = `${path}.tmp-${process.pid}`;\n await writeFile(tmp, `${JSON.stringify(spec, null, 2)}\\n`, \"utf8\");\n await rename(tmp, path);\n}\n\nexport async function readRunSpec(\n repoRoot: string,\n runId: string,\n): Promise<AgentRunSpec> {\n const parsed = JSON.parse(\n await readFile(runSpecPath(repoRoot, runId), \"utf8\"),\n ) as unknown;\n if (!isAgentRunSpec(parsed)) {\n throw new Error(`invalid run spec for ${runId}`);\n }\n return parsed;\n}\n\nfunction isAgentRunSpec(value: unknown): value is AgentRunSpec {\n if (value === null || typeof value !== \"object\") return false;\n const spec = value as Partial<AgentRunSpec>;\n return (\n spec.provider !== undefined &&\n typeof spec.provider === \"object\" &&\n spec.provider !== null &&\n isProviderId((spec.provider as { id?: unknown }).id) &&\n typeof spec.cwd === \"string\" &&\n typeof spec.prompt === \"string\" &&\n (spec.metadata === undefined ||\n (typeof spec.metadata === \"object\" &&\n spec.metadata !== null &&\n ((spec.metadata as { operation?: unknown }).operation === undefined ||\n isOperationKind((spec.metadata as { operation?: unknown }).operation))))\n );\n}\n\nfunction isProviderId(value: unknown): value is HarnessProviderId {\n return value === \"claude\" || value === \"codex\" || value === \"cursor\";\n}\n\nfunction isOperationKind(value: unknown): value is OperationKind {\n return value === \"build\" || value === \"absorb\" || value === \"garden\";\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,mBAAmB;AAErB,SAAS,YAAY,MAAY,oBAAI,KAAK,GAAW;AAC1D,QAAM,QAAQ,IACX,YAAY,EACZ,QAAQ,OAAO,EAAE,EACjB,MAAM,GAAG,EAAE;AACd,QAAM,SAAS,YAAY,CAAC,EAAE,SAAS,KAAK;AAC5C,SAAO,OAAO,KAAK,IAAI,MAAM;AAC/B;;;ACTA,SAAS,SAAAA,cAAa;;;ACAtB,SAAS,OAAO,WAAW,kBAAkB;AAC7C,SAAS,eAAe;AASxB,eAAsB,iBAAiB,MAA6B;AAClE,QAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,UAAU,MAAM,IAAI,MAAM;AAClC;AAEA,eAAsB,eACpB,MACA,OACA,MAAY,oBAAI,KAAK,GACN;AACf,QAAM,QAAqB;AAAA,IACzB,WAAW,IAAI,YAAY;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,WAAW,MAAM,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,GAAM,MAAM;AAC7D;;;ACzBA,SAAS,QAAAC,aAAY;;;ACArB;AAAA,EACE;AAAA,OAIK;;;ACCP,IAAM,oBAcF;AAAA,EACF,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,UAAU;AAAA,EACV,WAAW;AAAA,EACX,OAAO;AACT;AAEO,IAAM,4BAAyE;AAAA,EACpF,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,MACZ,GAAG;AAAA,MACH,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,WAAW;AAAA,QACT,WAAW;AAAA,QACX,oBAAoB;AAAA,QACpB,oBAAoB;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB,iBAAiB;AAAA,QACjB,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,MACZ,GAAG;AAAA,MACH,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,WAAW;AAAA,QACT,WAAW;AAAA,QACX,oBAAoB;AAAA,QACpB,oBAAoB;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB,iBAAiB;AAAA,QACjB,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,eAAe;AAAA,MACf,cAAc;AAAA,MACd,UAAU;AAAA,MACV,WAAW;AAAA,MACX,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,WAAW;AAAA,QACT,WAAW;AAAA,QACX,oBAAoB;AAAA,QACpB,oBAAoB;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB,iBAAiB;AAAA,QACjB,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;;;AD1FO,SAAS,4BACd,OAAkC,CAAC,GAClB;AACjB,QAAM,UAAU,KAAK,SAAS;AAC9B,QAAM,cAAc,KAAK,cAAc,MAAM,gBAAgB;AAC7D,QAAM,oBAAoB,KAAK,qBAAqB;AACpD,QAAM,WAAW,0BAA0B;AAE3C,SAAO;AAAA,IACL;AAAA,IACA,aAAa,YAAqC;AAChD,UAAI,OAAyB,EAAE,UAAU,MAAM;AAC/C,UAAI;AACF,eAAO,MAAM,YAAY;AAAA,MAC3B,QAAQ;AACN,eAAO,EAAE,UAAU,MAAM;AAAA,MAC3B;AACA,YAAM,YACJ,QAAQ,IAAI,sBAAsB,UAClC,QAAQ,IAAI,kBAAkB,SAAS;AACzC,YAAM,YAAY,kBAAkB,MAAM;AAC1C,YAAM,gBAAgB,KAAK,YAAY;AACvC,YAAM,SAAS,gBACX,KAAK,UAAU,YAAY,0BAA0B,eACrD,YACE,kBACA;AACN,aAAO,EAAE,IAAI,SAAS,IAAI,WAAW,eAAe,OAAO;AAAA,IAC7D;AAAA,IACA,KAAK,OAAO,MAAM,UAChB,iBAAiB,MAAM,OAAO,SAAS,iBAAiB;AAAA,EAC5D;AACF;AAEO,IAAM,wBAAwB,4BAA4B;AAEjE,eAAe,iBACb,MACA,OACA,SACA,mBACwB;AACxB,QAAM,UAAU,mBAAmB,MAAM,iBAAiB;AAC1D,QAAM,SAAS,QAAQ;AAAA,IACrB,QAAQ,KAAK;AAAA,IACb;AAAA,EACF,CAAC;AAED,MAAI;AACJ,MAAI;AACJ,MAAI,SAAS;AACb,MAAI;AACJ,MAAI,UAAU;AACd,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI;AACF,qBAAiB,WAAW,QAAQ;AAClC,0BAAoB,qBAAqB,aAAa,OAAO;AAC7D,iBAAW,SAAS,gBAAgB,OAAO,GAAG;AAC5C,cAAM,OAAO,UAAU,KAAK;AAAA,MAC9B;AAEA,UAAI,QAAQ,SAAS,UAAU;AAC7B,kBAAU,QAAQ;AAClB,gBAAQ,QAAQ;AAChB,gBAAQ,SAAS,QAAQ,KAAK;AAC9B,4BAAoB,qBAAqB,QAAQ;AACjD,YAAI,QAAQ,YAAY,WAAW;AACjC,oBAAU;AACV,mBAAS,QAAQ;AAAA,QACnB,OAAO;AACL,oBAAU;AACV,kBACE,QAAQ,OAAO,SAAS,IACpB,QAAQ,OAAO,KAAK,IAAI,IACxB,gBAAgB,QAAQ,OAAO;AACrC,oBAAU,sBAAsB,OAAO,QAAQ,OAAO;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAc;AACrB,cAAU;AACV,YAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACvD,cAAU,sBAAsB,KAAK;AACrC,UAAM,OAAO,UAAU,EAAE,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,EAC1D;AAEA,QAAM,OAAO,UAAU;AAAA,IACrB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBACP,KACA,SACgB;AAChB,MAAI,IAAI,SAAS,eAAe,KAAK,IAAI,SAAS,gBAAgB,GAAG;AACnE,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA,SAAS,YAAY,SAAY,EAAE,QAAQ,IAAI;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,YAAY,wBAAwB;AACtC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA,SAAS,EAAE,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM,YAAY,SAAY,UAAU,OAAO,KAAK;AAAA,IACpD,SAAS;AAAA,IACT;AAAA,IACA,SAAS,YAAY,SAAY,EAAE,QAAQ,IAAI;AAAA,EACjD;AACF;AAEA,SAAS,mBACP,MACA,mBACe;AACf,QAAM,QAAQ,cAAc,KAAK,SAAS,CAAC,CAAC;AAC5C,QAAM,SAAS,eAAe,KAAK,UAAU,CAAC,CAAC;AAC/C,MAAI,OAAO,KAAK,MAAM,EAAE,SAAS,KAAK,CAAC,MAAM,SAAS,OAAO,GAAG;AAC9D,UAAM,KAAK,OAAO;AAAA,EACpB;AAEA,QAAM,mBAAmB,kBAAkB;AAC3C,SAAO,eAAe;AAAA,IACpB,cAAc,KAAK;AAAA,IACnB,KAAK,KAAK;AAAA,IACV,OAAO,KAAK,SAAS,SAAS,0BAA0B,OAAO,gBAAgB;AAAA,IAC/E,QAAQ,eAAe,KAAK,SAAS,MAAM;AAAA,IAC3C;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK,QAAQ,YAAY;AAAA,IACnC,cAAc,KAAK,QAAQ;AAAA,IAC3B,gBAAgB;AAAA,IAChB,wBAAwB;AAAA,IACxB,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,8BAA8B;AAAA,IAChC;AAAA,IACA,GAAI,qBAAqB,SACrB,EAAE,4BAA4B,iBAAiB,IAC/C,CAAC;AAAA,EACP,CAAC;AACH;AAEA,SAAS,eACP,QACiC;AACjC,QAAM,MAAuC,CAAC;AAC9C,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,QAAI,IAAI,IAAI,eAAe;AAAA,MACzB,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM,UAAU,SAAY,cAAc,MAAM,KAAK,IAAI;AAAA,MAChE,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,QAAQ,MAAM;AAAA,IAChB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAyC;AAC9D,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,IAAI;AAAA,MACf,KAAK;AACH,YAAI,IAAI,MAAM;AACd;AAAA,MACF,KAAK;AACH,YAAI,IAAI,OAAO;AACf;AAAA,MACF,KAAK;AACH,YAAI,IAAI,MAAM;AACd;AAAA,MACF,KAAK;AACH,YAAI,IAAI,MAAM;AACd,YAAI,IAAI,MAAM;AACd;AAAA,MACF,KAAK;AACH,YAAI,IAAI,MAAM;AACd;AAAA,MACF,KAAK;AACH,YAAI,IAAI,WAAW;AACnB,YAAI,IAAI,UAAU;AAClB;AAAA,MACF,KAAK;AACH;AAAA,IACJ;AAAA,EACF;AACA,SAAO,CAAC,GAAG,GAAG;AAChB;AAEA,SAAS,eAAe,QAAqD;AAC3E,MACE,WAAW,SACX,WAAW,YACX,WAAW,UACX,WAAW,OACX;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAqC;AAC5D,MAAI,QAAQ,SAAS,gBAAgB;AACnC,UAAM,OAAO,aAAa,QAAQ,KAAK;AACvC,WAAO,SAAS,SAAY,CAAC,EAAE,MAAM,cAAc,SAAS,KAAK,CAAC,IAAI,CAAC;AAAA,EACzE;AAEA,MAAI,QAAQ,SAAS,aAAa;AAChC,UAAM,UAAU,QAAQ,QAAQ;AAChC,QAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO,CAAC;AACrC,UAAM,SAAyB,CAAC;AAChC,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,SAAS,QAAQ;AACzB,eAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK,CAAC;AACjD;AAAA,MACF;AACA,UAAI,MAAM,SAAS,YAAY;AAC7B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,MAAM;AAAA,UACV,MAAM,MAAM;AAAA,UACZ,OAAO,eAAe,MAAM,KAAK;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,QAAQ;AAC3B,UAAM,UAAU,QAAQ,QAAQ;AAChC,QAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO,CAAC;AACrC,WAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAI,MAAM,SAAS,cAAe,QAAO,CAAC;AAC1C,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,IAAI,MAAM;AAAA,UACV,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,QACjB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,SAAS,oBAAoB;AACvC,WAAO,CAAC,EAAE,MAAM,gBAAgB,SAAS,QAAQ,QAAQ,CAAC;AAAA,EAC5D;AAEA,MAAI,QAAQ,SAAS,YAAY,QAAQ,YAAY,WAAW;AAC9D,WAAO,QAAQ,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,SAAS,OAAO,IAAI,EAAE;AAAA,EACpE;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,aAAa,OAAoC;AACxD,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,MAAM;AAIZ,SAAO,IAAI,SAAS,yBAClB,IAAI,OAAO,SAAS,gBACpB,OAAO,IAAI,MAAM,SAAS,WACxB,IAAI,MAAM,OACV;AACN;AAEA,SAAS,aAAa,SAAyC;AAC7D,SAAO,gBAAgB,WAAW,OAAO,QAAQ,eAAe,WAC5D,QAAQ,aACR;AACN;AAEA,SAAS,eAAe,OAAoC;AAC1D,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,SAAS,OAAwC;AACxD,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,QAAQ;AACd,QAAM,cAAc,YAAY,OAAO,cAAc;AACrD,QAAM,oBAAoB,YAAY,OAAO,yBAAyB;AACtE,QAAM,eAAe,YAAY,OAAO,eAAe;AACvD,SAAO,eAAe;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA,aACE,gBAAgB,UAAa,iBAAiB,UACzC,eAAe,MAAM,gBAAgB,KACtC;AAAA,EACR,CAAC;AACH;AAEA,SAAS,YACP,QACA,OACoB;AACpB,QAAM,QAAQ,OAAO,KAAK;AAC1B,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,eAAkD,OAAa;AACtE,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,QAAI,MAAM,GAAG,MAAM,QAAW;AAC5B,aAAO,MAAM,GAAG;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;;;AExYA,SAAS,OAAO,iBAAoC;AA0C7C,SAAS,2BACd,OAAiC,CAAC,GACjB;AACjB,QAAM,WAAW,0BAA0B;AAC3C,QAAM,gBAAgB,KAAK,iBAAiB;AAC5C,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,SAAS,KAAK,UAAU;AAE9B,SAAO;AAAA,IACL;AAAA,IACA,aAAa,YAAqC;AAChD,UAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,eAAO;AAAA,UACL,IAAI,SAAS;AAAA,UACb,WAAW;AAAA,UACX,eAAe;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,UAAU,SAAS,CAAC,SAAS,QAAQ,CAAC;AACzD,aAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,WAAW;AAAA,QACX,eAAe,KAAK;AAAA,QACpB,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,IACA,KAAK,OAAO,MAAM,UAAkC;AAClD,UAAI,KAAK,WAAW,UAAa,OAAO,KAAK,KAAK,MAAM,EAAE,SAAS,GAAG;AACpE,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,OACE;AAAA,UACF,SAAS;AAAA,YACP,UAAU;AAAA,YACV,MAAM;AAAA,YACN,SACE;AAAA,YACF,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF;AACA,aAAO,OAAO,sBAAsB,IAAI,GAAG,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAEO,IAAM,uBAAuB,2BAA2B;AAExD,SAAS,sBAAsB,MAAsC;AAC1E,QAAM,cAAc,2BAA2B,IAAI;AACnD,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,wCAAwC,YAAY,KAAK,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AACA,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AACA,MAAI,KAAK,SAAS,UAAU,UAAa,KAAK,SAAS,MAAM,SAAS,GAAG;AACvE,SAAK,KAAK,WAAW,KAAK,SAAS,KAAK;AAAA,EAC1C;AACA,MAAI,KAAK,QAAQ,eAAe,QAAW;AACzC,SAAK,KAAK,mBAAmB,KAAK,OAAO,UAAU;AAAA,EACrD;AACA,OAAK,KAAK,mBAAmB,IAAI,CAAC;AAClC,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,KAAK,KAAK;AAAA,IACV,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,8BAA8B;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,MAA8B;AAChE,QAAM,cAAwB,CAAC;AAC/B,MAAI,KAAK,SAAS,WAAW,OAAW,aAAY,KAAK,iBAAiB;AAC1E,MAAI,KAAK,WAAW,UAAa,KAAK,OAAO,SAAS,EAAG,aAAY,KAAK,QAAQ;AAClF,MAAI,KAAK,eAAe,UAAa,OAAO,KAAK,KAAK,UAAU,EAAE,SAAS,GAAG;AAC5E,gBAAY,KAAK,YAAY;AAAA,EAC/B;AACA,MAAI,KAAK,QAAQ,eAAe,OAAW,aAAY,KAAK,mBAAmB;AAC/E,SAAO;AACT;AAEO,SAAS,mBAAmB,MAA4B;AAC7D,QAAM,SAAS,CAAC,KAAK,cAAc,KAAK,MAAM,EAAE;AAAA,IAC9C,CAAC,UAA2B,UAAU,UAAa,MAAM,KAAK,EAAE,SAAS;AAAA,EAC3E;AACA,SAAO,OAAO,KAAK,aAAa;AAClC;AAEO,SAAS,YACd,SACA,OACwB;AACxB,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,MAAM;AAAA,MACjD,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AAED,QAAI,YAAY;AAChB,QAAI,SAAS;AACb,UAAM,QAAuB;AAAA,MAC3B,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AACA,UAAM,cAA+B,CAAC;AAEtC,UAAM,UAAU,CAAC,QAAuC;AACtD,kBAAY,KAAK,qBAAqB,OAAO,KAAK,KAAK,CAAC;AAAA,IAC1D;AAEA,UAAM,aAAa,MAAY;AAC7B,UAAI,MAAM,UAAU,QAAQ,IAAI;AAChC,aAAO,QAAQ,IAAI;AACjB,cAAM,UAAU,UAAU,MAAM,GAAG,GAAG;AACtC,oBAAY,UAAU,MAAM,MAAM,CAAC;AACnC,cAAM,OAAO,QAAQ,KAAK;AAC1B,YAAI,KAAK,SAAS,GAAG;AACnB,cAAI;AACF,oBAAQ,KAAK,MAAM,IAAI,CAA4B;AAAA,UACrD,QAAQ;AAAA,UAER;AAAA,QACF;AACA,cAAM,UAAU,QAAQ,IAAI;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,mBAAa,MAAM,SAAS,MAAM;AAClC,iBAAW;AAAA,IACb,CAAC;AACD,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU,MAAM,SAAS,MAAM;AAAA,IACjC,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,QAA+B;AAChD,cAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ,MAAM;AAAA,QACd,mBAAmB,MAAM;AAAA,QACzB,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,QACb,OACE,IAAI,SAAS,WACT,GAAG,QAAQ,OAAO,uBAClB,IAAI;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AACD,UAAM,GAAG,SAAS,OAAO,SAAS;AAChC,iBAAW;AACX,UAAI,UAAU,KAAK,EAAE,SAAS,GAAG;AAC/B,YAAI;AACF,kBAAQ,KAAK,MAAM,UAAU,KAAK,CAAC,CAA4B;AAAA,QACjE,QAAQ;AAAA,QAER;AAAA,MACF;AACA,YAAM,QAAQ,WAAW,WAAW;AAEpC,UAAI,SAAS,KAAK,MAAM,SAAS;AAC/B,gBAAQ,gBAAgB,KAAK,CAAC;AAC9B;AAAA,MACF;AAEA,YAAM,cAAc,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;AAC/C,YAAM,gBACJ,gBAAgB,UAAa,YAAY,SAAS,IAC9C,cACA,GAAG,QAAQ,OAAO,WAAW,QAAQ,CAAC;AAC5C,YAAM,UAAU,MAAM,WAAW,qBAAqB,aAAa;AACnE,cAAQ;AAAA,QACN,GAAG,gBAAgB,KAAK;AAAA,QACxB,SAAS;AAAA,QACT,OAAO,MAAM,SAAS,QAAQ;AAAA,QAC9B;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,qBACpB,OACA,OACA,OACe;AACf,QAAM,MAAM,sBAAsB,KAAK;AACvC,QAAM,YAAY,YAAY,KAAK,YAAY,KAAK,YAAY,KAAK,WAAW;AAChF,MAAI,MAAM,sBAAsB,UAAa,cAAc,QAAW;AACpE,UAAM,oBAAoB;AAAA,EAC5B;AAEA,MAAI,IAAI,SAAS,kBAAkB;AACjC,UAAM,OAAO,YAAY,KAAK,MAAM;AACpC,QAAI,MAAM,SAAS,iBAAiB;AAClC,YAAM,OAAO,YAAY,MAAM,MAAM;AACrC,UAAI,SAAS,QAAW;AACtB,cAAM,SAAS;AACf,cAAM,OAAO,UAAU,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,MACxD;AAAA,IACF;AACA,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,YAAY,MAAM,KAAK;AAAA,IAC/B;AACA;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,kBAAkB;AACjC,UAAM,UAAU;AAChB,UAAM,QAAQ;AACd,UAAM,QAAQ,gBAAgB,IAAI,KAAK;AACvC,UAAM,OAAO,UAAU;AAAA,MACrB,MAAM;AAAA,MACN,QAAQ,MAAM;AAAA,MACd,mBAAmB,MAAM;AAAA,MACzB,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,IACf,CAAC;AACD;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,iBAAiB,IAAI,SAAS,SAAS;AACtD,UAAM,UAAU;AAChB,UAAM,MACJ,YAAY,KAAK,SAAS,KAC1B,YAAY,KAAK,OAAO,KACxB;AACF,UAAM,UAAU,qBAAqB,GAAG;AACxC,UAAM,QAAQ,QAAQ;AACtB,UAAM,UAAU;AAChB,UAAM,OAAO,UAAU;AAAA,MACrB,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,OAAqC;AAC5D,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,mBAAmB,MAAM;AAAA,IACzB,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,sBACP,OACyB;AACzB,QAAM,MAAM,YAAY,OAAO,KAAK;AACpC,SAAO,OAAO;AAChB;AAEA,SAAS,qBAAqB,KAA6B;AACzD,QAAM,SAAS,kBAAkB,GAAG;AACpC,QAAM,OAAO,UAAU;AACvB,QAAM,aAAa,kBAAkB,GAAG;AACxC,QAAM,QACJ,WAAW,MAAM,uDAAuD,KACxE,WAAW,MAAM,sCAAsC;AAEzD,MAAI,KAAK,SAAS,mCAAmC,KAAK,UAAU,QAAW;AAC7E,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,eAAe,KAAK;AAAA,MAC7B,KAAK;AAAA,MACL;AAAA,MACA,SAAS,oBAAoB,EAAE,OAAO,WAAW,CAAC;AAAA,IACpD;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,wBAAwB,KAAK,UAAU,QAAW;AAClE,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,eAAe,KAAK;AAAA,MAC7B,KAAK;AAAA,MACL;AAAA,MACA,SAAS,oBAAoB,EAAE,OAAO,WAAW,CAAC;AAAA,IACpD;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,kBAAkB,KAAK,KAAK,SAAS,cAAc,GAAG;AACtE,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA,SAAS,oBAAoB,EAAE,YAAY,cAAc,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,mBAAmB,GAAG;AACtC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA,SAAS,oBAAoB,EAAE,WAAW,CAAC;AAAA,EAC7C;AACF;AAEA,SAAS,oBACP,SACqC;AACrC,QAAM,SAASC,gBAAe,OAAO;AACrC,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,kBAAkB,KAAiC;AAC1D,QAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,QAAM,MAAM,IAAI,YAAY,GAAG;AAC/B,MAAI,UAAU,MAAM,OAAO,MAAO,QAAO;AACzC,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;AACnD,QAAI,WAAW,QAAQ,OAAO,WAAW,UAAU;AACjD,YAAM,SAAU,OAAmC;AACnD,aAAO,OAAO,WAAW,YAAY,OAAO,SAAS,IAAI,SAAS;AAAA,IACpE;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAiC;AAC1D,QAAM,QAAQ,IAAI,MAAM,yDAAyD;AACjF,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC;AACjC,SAAO,UAAU,SAAY,OAAO,SAAS,OAAO,EAAE,IAAI;AAC5D;AAEA,SAAS,WAAW,MAAc,SAAqC;AACrE,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,SAAO,QAAQ,CAAC;AAClB;AAEA,eAAe,YACb,MACA,OACe;AACf,QAAM,OAAO,YAAY,MAAM,MAAM,KAAK,YAAY,MAAM,WAAW;AACvE,MAAI,SAAS,OAAW;AACxB,QAAM,OAAO,UAAU;AAAA,IACrB,MAAM;AAAA,IACN,IAAI,YAAY,MAAM,IAAI;AAAA,IAC1B;AAAA,IACA,OAAOC,gBAAe,KAAK,SAAS,KAAK,SAAS;AAAA,EACpD,CAAC;AACH;AAEO,SAAS,gBAAgB,OAAwC;AACtE,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,MAAM;AACZ,QAAM,cACJC,aAAY,KAAK,cAAc,KAAKA,aAAY,KAAK,aAAa;AACpE,QAAM,oBACJA,aAAY,KAAK,qBAAqB,KACtCA,aAAY,KAAK,mBAAmB,KACpCA,aAAY,KAAK,iBAAiB;AACpC,QAAM,eACJA,aAAY,KAAK,eAAe,KAAKA,aAAY,KAAK,cAAc;AACtE,QAAM,wBACJA,aAAY,KAAK,yBAAyB,KAC1CA,aAAY,KAAK,uBAAuB;AAC1C,SAAOF,gBAAe;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aACE,gBAAgB,UAAa,iBAAiB,UACzC,eAAe,MAAM,gBAAgB,KACtC;AAAA,EACR,CAAC;AACH;AAEA,SAAS,YACP,QACA,OACqC;AACrC,QAAM,QAAQ,OAAO,KAAK;AAC1B,SAAO,UAAU,QAAQ,OAAO,UAAU,WACrC,QACD;AACN;AAEA,SAAS,YACP,QACA,OACoB;AACpB,QAAM,QAAQ,OAAO,KAAK;AAC1B,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAASE,aACP,QACA,OACoB;AACpB,QAAM,QAAQ,OAAO,KAAK;AAC1B,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAASD,gBAAe,OAAoC;AAC1D,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,SAASD,gBAAkD,OAAa;AACtE,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,QAAI,MAAM,GAAG,MAAM,QAAW;AAC5B,aAAO,MAAM,GAAG;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAA0B;AACtD,QAAM,SAAS,UAAU,MAAM,CAAC,OAAO,cAAc,OAAO,EAAE,GAAG;AAAA,IAC/D,UAAU;AAAA,EACZ,CAAC;AACD,SAAO,OAAO,WAAW,KAAK,OAAO,OAAO,KAAK,EAAE,SAAS;AAC9D;AAEA,SAAS,iBACP,SACA,MAC0C;AAC1C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI;AACJ,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI;AACF,cAAQ,MAAM,SAAS,MAAM,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AAAA,IACpE,SAAS,KAAc;AACrB,cAAQ;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACzD,CAAC;AACD;AAAA,IACF;AAEA,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,gBAAU,MAAM,SAAS,MAAM;AAAA,IACjC,CAAC;AACD,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,gBAAU,MAAM,SAAS,MAAM;AAAA,IACjC,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,cAAQ,EAAE,IAAI,OAAO,QAAQ,IAAI,QAAQ,CAAC;AAAA,IAC5C,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,YAAM,OAAO,GAAG,MAAM;AAAA,EAAK,MAAM,GAAG,KAAK;AACzC,cAAQ;AAAA,QACN,IAAI,SAAS;AAAA,QACb,QACE,KACG,MAAM,IAAI,EACV,KAAK,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC,GACpC,KAAK,MAAM,SAAS,IAAI,UAAU,GAAG,OAAO,WAAW,QAAQ,CAAC;AAAA,MACxE,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;ACphBO,SAAS,6BACd,UACiB;AACjB,SAAO;AAAA,IACL;AAAA,IACA,aAAa,aAAsC;AAAA,MACjD,IAAI,SAAS;AAAA,MACb,WAAW;AAAA,MACX,eAAe;AAAA,MACf,QAAQ,GAAG,SAAS,WAAW;AAAA,IACjC;AAAA,IACA,KAAK,OAAO,UAAwB;AAAA,MAClC,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OACE,GAAG,SAAS,WAAW,+CAChB,KAAK,UAAU,aAAa,SAAS;AAAA,IAChD;AAAA,EACF;AACF;;;ACtBO,IAAM,wBAAyC;AAAA,EACpD,0BAA0B;AAC5B;;;ACAA,IAAM,oBAAoB;AAAA,EACxB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,SAAS,mBAAmB,IAAwC;AACzE,SAAO,kBAAkB,EAAE;AAC7B;;;ACdA,SAAS,kBAAkB;AAC3B,SAAS,SAAAG,QAAO,UAAU,SAAS,QAAQ,aAAAC,kBAAiB;AAC5D,SAAS,WAAAC,UAAS,YAAY;AAOvB,SAAS,QAAQ,UAA0B;AAChD,SAAO,KAAK,kBAAkB,QAAQ,GAAG,MAAM;AACjD;AAEO,SAAS,cAAc,UAAkB,OAAuB;AACrE,SAAO,KAAK,QAAQ,QAAQ,GAAG,GAAG,KAAK,OAAO;AAChD;AAEO,SAAS,WAAW,UAAkB,OAAuB;AAClE,SAAO,KAAK,QAAQ,QAAQ,GAAG,GAAG,KAAK,QAAQ;AACjD;AAEO,SAAS,cAAc,UAAkB,OAAuB;AACrE,SAAO,KAAK,QAAQ,QAAQ,GAAG,GAAG,KAAK,SAAS;AAClD;AAEA,eAAsB,iBACpB,UACA,OACe;AACf,QAAM,OAAO,cAAc,UAAU,KAAK;AAC1C,QAAMC,OAAMC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAMC,WAAU,MAAM,eAAe,MAAM;AAC7C;AAEO,SAAS,2BACd,UACA,OACS;AACT,SAAO,WAAW,cAAc,UAAU,KAAK,CAAC;AAClD;AAEA,eAAsB,eACpB,MACA,QACe;AACf,QAAMF,OAAMC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,MAAM,GAAG,IAAI,QAAQ,QAAQ,GAAG;AACtC,QAAMC,WAAU,KAAK,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACnE,QAAM,OAAO,KAAK,IAAI;AACxB;AAEO,SAAS,sBAAsB,MAMxB;AACZ,SAAO;AAAA,IACL,SAAS;AAAA,IACT,IAAI,KAAK;AAAA,IACT,WAAW,KAAK,KAAK,UAAU,aAAa;AAAA,IAC5C,QAAQ;AAAA,IACR,UAAU,KAAK;AAAA,IACf,KAAK,KAAK,OAAO,QAAQ;AAAA,IACzB,UAAU,KAAK,KAAK,SAAS;AAAA,IAC7B,OAAO,KAAK,KAAK,SAAS;AAAA,IAC1B,WAAW,KAAK,UAAU,YAAY;AAAA,IACtC,SAAS,WAAW,KAAK,UAAU,KAAK,KAAK;AAAA,IAC7C,YAAY,KAAK,KAAK,UAAU;AAAA,IAChC,aAAa,KAAK,KAAK,UAAU;AAAA,EACnC;AACF;AAEO,SAAS,qBAAqB,MAKvB;AACZ,SAAO;AAAA,IACL,GAAG,sBAAsB;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,KAAK;AAAA,IACP,CAAC;AAAA,IACD,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,gBAAgB,MAQlB;AACZ,QAAM,UAAU,KAAK,MAAM,KAAK,OAAO,SAAS;AAChD,QAAM,WAAW,KAAK,WAAW,QAAQ;AACzC,SAAO;AAAA,IACL,GAAG,KAAK;AAAA,IACR,QAAQ,KAAK;AAAA,IACb,mBAAmB,KAAK,qBAAqB,KAAK,OAAO;AAAA,IACzD,YAAY,KAAK,WAAW,YAAY;AAAA,IACxC,YAAY,OAAO,SAAS,OAAO,IAC/B,KAAK,IAAI,GAAG,WAAW,OAAO,IAC9B;AAAA,IACJ,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,EAChB;AACF;AAEA,eAAsB,cAAc,MAAyC;AAC3E,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM,SAAS,MAAM,MAAM,CAAC;AACtD,WAAO,YAAY,MAAM,IAAI,SAAS;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,eAAe,UAAwC;AAC3E,QAAM,MAAM,QAAQ,QAAQ;AAC5B,MAAI,CAAC,WAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,GAAG;AAAA,EAC7B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,QAAM,UAAuB,CAAC;AAC9B,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,WAAW,MAAM,KAAK,CAAC,MAAM,SAAS,OAAO,EAAG;AAC3D,UAAM,SAAS,MAAM,cAAc,KAAK,KAAK,KAAK,CAAC;AACnD,QAAI,WAAW,KAAM,SAAQ,KAAK,MAAM;AAAA,EAC1C;AACA,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC;AACtE;AAEO,SAAS,UAAU,MAId;AACV,QAAM,UAAU,KAAK,MAAM,KAAK,OAAO,SAAS;AAChD,QAAM,WACJ,KAAK,OAAO,eAAe,SACvB,KAAK,MAAM,KAAK,OAAO,UAAU,IACjC;AACN,QAAM,YACJ,KAAK,OAAO,eACX,OAAO,SAAS,OAAO,IACpB,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,QAAQ,KAAK,OAAO,IACtD;AACN,QAAM,gBACJ,KAAK,OAAO,WAAW,aAAa,CAAC,KAAK,WAAW,KAAK,OAAO,GAAG,IAChE,UACA,KAAK,OAAO;AAClB,SAAO;AAAA,IACL,GAAG,KAAK;AAAA,IACR;AAAA,IACA;AAAA,IACA,OACE,kBAAkB,UACd,yCACA,KAAK,OAAO;AAAA,EACpB;AACF;AAEO,SAAS,YAAY,OAAoC;AAC9D,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,IAAI;AACV,SACE,EAAE,YAAY,KACd,OAAO,EAAE,OAAO,YAChB,EAAE,GAAG,WAAW,MAAM,MACrB,EAAE,cAAc,WAAW,EAAE,cAAc,YAAY,EAAE,cAAc,cACvE,EAAE,WAAW,YACZ,EAAE,WAAW,aACb,EAAE,WAAW,UACb,EAAE,WAAW,YACb,EAAE,WAAW,gBACf,OAAO,EAAE,aAAa,YACtB,OAAO,EAAE,QAAQ,aAChB,EAAE,aAAa,YAAY,EAAE,aAAa,WAAW,EAAE,aAAa,aACrE,OAAO,EAAE,cAAc,YACvB,OAAO,EAAE,YAAY;AAEzB;;;ACjMA,SAAS,kBAAkB;AAC3B,SAAS,cAAAC,aAAY,gBAAgB;AACrC,SAAS,YAAAC,WAAU,WAAAC,gBAAe;AAClC,SAAS,QAAAC,aAAY;AAmBrB,eAAsB,cAAc,UAAyC;AAC3E,QAAM,MAAoB,oBAAI,IAAI;AAClC,MAAI,CAACC,YAAW,QAAQ,EAAG,QAAO;AAElC,MAAI;AACJ,MAAI;AACF,cAAU,MAAMC,SAAQ,QAAQ;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,SAAS,KAAK,EAAG;AAC5B,UAAM,OAAO,MAAM,MAAM,GAAG,EAAE;AAC9B,UAAM,OAAOC,MAAK,UAAU,KAAK;AACjC,QAAI;AACF,YAAM,KAAK,SAAS,IAAI;AACxB,UAAI,CAAC,GAAG,OAAO,EAAG;AAClB,YAAM,UAAU,MAAMC,UAAS,MAAM,MAAM;AAC3C,UAAI,IAAI,MAAM;AAAA,QACZ;AAAA,QACA,MAAM,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAAA,QACvD,UAAU,iBAAiB,OAAO,EAAE,gBAAgB;AAAA,MACtD,CAAC;AAAA,IACH,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,kBACd,QACA,OACmB;AACnB,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,UAAU;AAEd,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AACjC,UAAM,OAAO,OAAO,IAAI,IAAI;AAC5B,QAAI,SAAS,QAAW;AACtB,iBAAW;AACX;AAAA,IACF;AACA,QAAI,KAAK,SAAS,MAAM,KAAM;AAC9B,QAAI,CAAC,KAAK,YAAY,MAAM,UAAU;AACpC,kBAAY;AAAA,IACd,OAAO;AACL,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO,KAAK,GAAG;AAChC,QAAI,CAAC,MAAM,IAAI,IAAI,EAAG,YAAW;AAAA,EACnC;AAEA,SAAO,EAAE,SAAS,SAAS,UAAU,QAAQ;AAC/C;AAEO,SAAS,gBAAgB,OAAmC;AACjE,SACE,MAAM,YAAY,KAClB,MAAM,YAAY,KAClB,MAAM,aAAa,KACnB,MAAM,YAAY;AAEtB;;;ARrDA,eAAsB,uBACpB,SAC6B;AAC7B,QAAM,MAAM,QAAQ,QAAQ,MAAM,oBAAI,KAAK;AAC3C,QAAM,QAAQ,QAAQ,SAAS,YAAY,IAAI,CAAC;AAChD,QAAM,YAAY,IAAI;AACtB,QAAM,aAAa,cAAc,QAAQ,UAAU,KAAK;AACxD,QAAM,UAAU,sBAAsB;AAAA,IACpC;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,MAAM,QAAQ;AAAA,IACd;AAAA,IACA,KAAK,QAAQ;AAAA,EACf,CAAC;AAED,QAAM,WAAW,MAAM,2BAA2B;AAAA,IAChD;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,UAAU;AAAA,IACV,YAAY,IAAI;AAAA,EAClB,CAAC;AACD,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,YAAY,OAAO;AACxC,QAAM,iBAAiB,QAAQ,OAAO;AACtC,QAAM,aAAa,MAAM,2BAA2B;AAAA,IAClD;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,UAAU;AAAA,IACV,YAAY,IAAI;AAAA,EAClB,CAAC;AACD,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aACJ,QAAQ,eACP,CAAC,MAAM,UAAU,mBAAmB,KAAK,SAAS,EAAE,EAAE,IAAI,MAAM,KAAK;AACxE,QAAM,cAA+B,CAAC;AAEtC,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,UAAM,WAAWC,MAAK,QAAQ,UAAU,YAAY,OAAO;AAC3D,UAAM,SAAS,MAAM,cAAc,QAAQ;AAC3C,QAAI;AACF,eAAS,MAAM,WAAW,QAAQ,MAAM;AAAA,QACtC,SAAS,YAAY,QAAQ,SAAS,KAAK,aAAa,QAAQ,OAAO;AAAA,MACzE,CAAC;AAAA,IACH,SAAS,KAAc;AACrB,eAAS;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD;AACA,YAAM,eAAe,QAAQ,SAAS;AAAA,QACpC,MAAM;AAAA,QACN,OAAO,OAAO,SAAS;AAAA,MACzB,GAAG,IAAI,CAAC;AAAA,IACV;AACA,UAAM,QAAQ,WAAW,WAAW;AAEpC,UAAM,QAAQ,MAAM,cAAc,QAAQ;AAC1C,UAAM,QAAQ,kBAAkB,QAAQ,KAAK;AAC7C,QAAI,OAAO,SAAS;AAClB,YAAM,WAAW,EAAE,UAAU,QAAQ,SAAS,CAAC;AAAA,IACjD;AAEA,UAAM,UAAsB;AAAA,MAC1B,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,IAChB;AACA,kBAAc,MAAM,sBAAsB;AAAA,MACxC;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,OAAO,UAAU,SAAS;AAAA,MAClC,YAAY,IAAI;AAAA,MAChB,mBAAmB,OAAO;AAAA,MAC1B;AAAA,MACA,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH,SAAS,KAAc;AACrB,aAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACxD;AACA,QAAI;AACF,YAAM,eAAe,QAAQ,SAAS;AAAA,QACpC,MAAM;AAAA,QACN,OAAO,OAAO,SAAS;AAAA,MACzB,GAAG,IAAI,CAAC;AAAA,IACV,QAAQ;AAAA,IAGR;AACA,UAAM,QAAQ,WAAW,WAAW;AACpC,kBAAc,MAAM,sBAAsB;AAAA,MACxC;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,IAAI;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,MAAI,YAAY,WAAW,eAAe,OAAO,SAAS;AACxD,aAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,OAAO,QAAQ,aAAa,OAAO;AAC9C;AAEA,eAAe,sBAAsB,MASd;AACrB,QAAM,UAAU,MAAM,cAAc,KAAK,UAAU;AACnD,MACE,SAAS,WAAW,eACpB,2BAA2B,KAAK,SAAS,UAAU,KAAK,SAAS,EAAE,GACnE;AACA,WAAO,gBAAgB;AAAA,MACrB,YAAY,KAAK;AAAA,MACjB,UAAU,WAAW,KAAK;AAAA,MAC1B,YAAY,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AACA,QAAM,OAAO,WAAW,KAAK;AAC7B,QAAM,WAAW,gBAAgB;AAAA,IAC/B,QAAQ;AAAA,IACR,QAAQ,KAAK;AAAA,IACb,YAAY,KAAK;AAAA,IACjB,mBAAmB,KAAK;AAAA,IACxB,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,eAAe,KAAK,YAAY,QAAQ;AAC9C,SAAO;AACT;AAEA,eAAe,2BAA2B,MAMZ;AAC5B,QAAM,UAAU,MAAM,cAAc,KAAK,UAAU;AACnD,MACE,SAAS,WAAW,eACpB,CAAC,2BAA2B,KAAK,UAAU,KAAK,KAAK,GACrD;AACA,WAAO;AAAA,EACT;AACA,SAAO,gBAAgB;AAAA,IACrB,YAAY,KAAK;AAAA,IACjB,UAAU,WAAW,KAAK;AAAA,IAC1B,YAAY,KAAK;AAAA,EACnB,CAAC;AACH;AAEA,eAAe,gBAAgB,MAIR;AACrB,QAAM,YACJ,KAAK,SAAS,WAAW,cACrB,KAAK,WACL,gBAAgB;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,QAAQ;AAAA,IACR,YAAY,KAAK;AAAA,EACnB,CAAC;AACP,QAAM,eAAe,KAAK,YAAY,SAAS;AAC/C,SAAO;AACT;AAEA,SAAS,YACP,MACA,KACA,QACA,UAC+B;AAC/B,SAAO,CAAC,UAAU;AAChB,WAAO,KAAK,eAAe,MAAM,OAAO,IAAI,CAAC,CAAC;AAC9C,QAAI,aAAa,QAAW;AAC1B,aAAO,KAAK,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC;AAAA,IAC9C;AAAA,EACF;AACF;;;ASzQA,SAAS,SAAAC,QAAO,YAAAC,WAAU,UAAAC,SAAQ,aAAAC,kBAAiB;AACnD,SAAS,WAAAC,UAAS,QAAAC,aAAY;AASvB,SAAS,YAAY,UAAkB,OAAuB;AACnE,SAAOC,MAAK,QAAQ,QAAQ,GAAG,GAAG,KAAK,YAAY;AACrD;AAEA,eAAsB,aACpB,UACA,OACA,MACe;AACf,QAAM,OAAO,YAAY,UAAU,KAAK;AACxC,QAAMC,OAAMC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,MAAM,GAAG,IAAI,QAAQ,QAAQ,GAAG;AACtC,QAAMC,WAAU,KAAK,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACjE,QAAMC,QAAO,KAAK,IAAI;AACxB;AAEA,eAAsB,YACpB,UACA,OACuB;AACvB,QAAM,SAAS,KAAK;AAAA,IAClB,MAAMC,UAAS,YAAY,UAAU,KAAK,GAAG,MAAM;AAAA,EACrD;AACA,MAAI,CAAC,eAAe,MAAM,GAAG;AAC3B,UAAM,IAAI,MAAM,wBAAwB,KAAK,EAAE;AAAA,EACjD;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAuC;AAC7D,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,OAAO;AACb,SACE,KAAK,aAAa,UAClB,OAAO,KAAK,aAAa,YACzB,KAAK,aAAa,QAClB,aAAc,KAAK,SAA8B,EAAE,KACnD,OAAO,KAAK,QAAQ,YACpB,OAAO,KAAK,WAAW,aACtB,KAAK,aAAa,UAChB,OAAO,KAAK,aAAa,YACxB,KAAK,aAAa,SAChB,KAAK,SAAqC,cAAc,UACxD,gBAAiB,KAAK,SAAqC,SAAS;AAE9E;AAEA,SAAS,aAAa,OAA4C;AAChE,SAAO,UAAU,YAAY,UAAU,WAAW,UAAU;AAC9D;AAEA,SAAS,gBAAgB,OAAwC;AAC/D,SAAO,UAAU,WAAW,UAAU,YAAY,UAAU;AAC9D;;;AXlBA,eAAsB,uBACpB,SACuC;AACvC,QAAM,MAAM,QAAQ,QAAQ,MAAM,oBAAI,KAAK;AAC3C,QAAM,QAAQ,QAAQ,SAAS,YAAY,IAAI,CAAC;AAChD,QAAM,aAAa,QAAQ,UAAU,OAAO,QAAQ,IAAI;AACxD,QAAM,aAAa,cAAc,QAAQ,UAAU,KAAK;AACxD,QAAM,SAAS,qBAAqB;AAAA,IAClC;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,MAAM,QAAQ;AAAA,IACd,UAAU,IAAI;AAAA,EAChB,CAAC;AACD,QAAM,eAAe,YAAY,MAAM;AACvC,QAAM,iBAAiB,OAAO,OAAO;AAErC,QAAM,aAAa,QAAQ,cAAc,QAAQ,KAAK,CAAC;AACvD,MAAI,eAAe,UAAa,WAAW,WAAW,GAAG;AACvD,UAAM,QAAQ;AACd,UAAM;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,QACd,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,IAAI;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,IAAI,MAAM,KAAK;AAAA,EACvB;AAEA,QAAM,UAAU,QAAQ,mBAAmB;AAC3C,MAAI;AACJ,MAAI;AACF,YAAQ,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB,MAAM,CAAC,YAAY,aAAa,KAAK;AAAA,MACrC,KAAK,QAAQ;AAAA,MACb,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,8BAA8B;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAc;AACrB,UAAM;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,QACd,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,IAAI;AAAA,QAChB,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD,CAAC;AAAA,IACH;AACA,UAAM;AAAA,EACR;AACA,QAAM,QAAQ;AACd,QAAM,WAAW,MAAM,OAAO;AAC9B,SAAO,EAAE,OAAO,QAAQ,QAAQ,SAAS;AAC3C;AAcA,eAAsB,mBACpB,SAC6B;AAC7B,QAAM,WAAW,MAAM,cAAc,cAAc,QAAQ,UAAU,QAAQ,KAAK,CAAC;AACnF,MAAI,UAAU,WAAW,aAAa;AACpC,WAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,MAAM,YAAY,QAAQ,UAAU,QAAQ,KAAK;AAC9D,SAAO,uBAAuB;AAAA,IAC5B,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,KAAK,QAAQ;AAAA,IACb,KAAK,QAAQ;AAAA,IACb,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,uBAAuB,MAKf;AACf,SAAOC,OAAM,KAAK,SAAS,KAAK,MAAM;AAAA,IACpC,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACH;","names":["spawn","join","pruneUndefined","stringifyInput","numberField","mkdir","writeFile","dirname","mkdir","dirname","writeFile","existsSync","readFile","readdir","join","existsSync","readdir","join","readFile","join","mkdir","readFile","rename","writeFile","dirname","join","join","mkdir","dirname","writeFile","rename","readFile","spawn"]}
|
|
@@ -5,14 +5,17 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
buildProviderModelChoices,
|
|
7
7
|
buildProviderSetupView,
|
|
8
|
-
getProviderLabel,
|
|
9
8
|
parseAgentSelection
|
|
10
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-RALBM6HZ.js";
|
|
10
|
+
import {
|
|
11
|
+
UNAUTHENTICATED_MESSAGE,
|
|
12
|
+
checkClaudeAuth
|
|
13
|
+
} from "./chunk-FUBE6KCO.js";
|
|
11
14
|
import {
|
|
12
15
|
isAgentProviderId,
|
|
13
16
|
readConfig,
|
|
14
17
|
writeConfig
|
|
15
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-5BWUMAOX.js";
|
|
16
19
|
|
|
17
20
|
// src/commands/setup.ts
|
|
18
21
|
import { existsSync as existsSync2 } from "fs";
|
|
@@ -126,7 +129,7 @@ function printNextSteps(out, existingPageCount) {
|
|
|
126
129
|
);
|
|
127
130
|
out.write(
|
|
128
131
|
row(
|
|
129
|
-
` ${BLUE}2.${RST} ${BOLD}almanac
|
|
132
|
+
` ${BLUE}2.${RST} ${BOLD}almanac init${RST} ${DIM}# build the wiki${RST}`
|
|
130
133
|
)
|
|
131
134
|
);
|
|
132
135
|
out.write(
|
|
@@ -191,7 +194,7 @@ function printBanner(out) {
|
|
|
191
194
|
`);
|
|
192
195
|
}
|
|
193
196
|
out.write(`
|
|
194
|
-
${WHITE_BOLD2} Install
|
|
197
|
+
${WHITE_BOLD2} Install the hook + agent guides${RST2}
|
|
195
198
|
`);
|
|
196
199
|
}
|
|
197
200
|
function printBadge(out) {
|
|
@@ -224,6 +227,9 @@ async function runSetup(options = {}) {
|
|
|
224
227
|
}
|
|
225
228
|
printBanner(out);
|
|
226
229
|
printBadge(out);
|
|
230
|
+
const auth = await safeCheckAuth(options.spawnCli);
|
|
231
|
+
reportAuth(out, auth);
|
|
232
|
+
out.write(BAR + "\n");
|
|
227
233
|
const agentChoice = await chooseDefaultAgent({
|
|
228
234
|
out,
|
|
229
235
|
interactive,
|
|
@@ -241,7 +247,7 @@ async function runSetup(options = {}) {
|
|
|
241
247
|
}
|
|
242
248
|
stepDone(
|
|
243
249
|
out,
|
|
244
|
-
`Default
|
|
250
|
+
`Default agent: ${WHITE_BOLD2}${agentChoice.provider}${RST2} (${agentChoice.model ?? "provider default"})`
|
|
245
251
|
);
|
|
246
252
|
out.write(BAR + "\n");
|
|
247
253
|
const ephem = options.installPath !== void 0 ? options.installPath !== null ? detectEphemeral(options.installPath) : false : detectEphemeral(detectCurrentInstallPath());
|
|
@@ -281,7 +287,7 @@ async function runSetup(options = {}) {
|
|
|
281
287
|
} else if (interactive) {
|
|
282
288
|
hookAction = await confirm(
|
|
283
289
|
out,
|
|
284
|
-
"Install auto-capture hooks for
|
|
290
|
+
"Install auto-capture hooks for Claude, Codex, and Cursor?",
|
|
285
291
|
true
|
|
286
292
|
);
|
|
287
293
|
}
|
|
@@ -294,7 +300,7 @@ async function runSetup(options = {}) {
|
|
|
294
300
|
stableHooksDir: options.stableHooksDir
|
|
295
301
|
});
|
|
296
302
|
if (res.exitCode !== 0) {
|
|
297
|
-
stepActive(out, `
|
|
303
|
+
stepActive(out, `SessionEnd hook: ${res.stderr.trim()}`);
|
|
298
304
|
return {
|
|
299
305
|
stdout: "",
|
|
300
306
|
stderr: res.stderr,
|
|
@@ -304,17 +310,16 @@ async function runSetup(options = {}) {
|
|
|
304
310
|
hookResultLine = res.stdout.includes("already installed") ? `Auto-capture hooks ${DIM2}already installed${RST2}` : `Auto-capture hooks installed`;
|
|
305
311
|
stepDone(out, hookResultLine);
|
|
306
312
|
} else {
|
|
307
|
-
stepSkipped(out, `
|
|
313
|
+
stepSkipped(out, `SessionEnd hook ${DIM2}skipped${RST2}`);
|
|
308
314
|
}
|
|
309
315
|
out.write(BAR + "\n");
|
|
310
316
|
let guidesAction = "install";
|
|
311
|
-
const providerLabel = getProviderLabel(agentChoice.provider);
|
|
312
317
|
if (options.skipGuides === true) {
|
|
313
318
|
guidesAction = "skip";
|
|
314
319
|
} else if (interactive) {
|
|
315
320
|
guidesAction = await confirm(
|
|
316
321
|
out,
|
|
317
|
-
|
|
322
|
+
"Install the codealmanac usage guides into ~/.claude/ and import them from CLAUDE.md?",
|
|
318
323
|
true
|
|
319
324
|
);
|
|
320
325
|
}
|
|
@@ -322,12 +327,10 @@ async function runSetup(options = {}) {
|
|
|
322
327
|
if (guidesAction === "install") {
|
|
323
328
|
try {
|
|
324
329
|
const summary = await installGuides({
|
|
325
|
-
provider: agentChoice.provider,
|
|
326
330
|
claudeDir: options.claudeDir ?? path3.join(homedir2(), ".claude"),
|
|
327
|
-
guidesDir: options.guidesDir ?? resolveGuidesDir()
|
|
328
|
-
cwd: process.cwd()
|
|
331
|
+
guidesDir: options.guidesDir ?? resolveGuidesDir()
|
|
329
332
|
});
|
|
330
|
-
guidesSummary = summary.anyChanges ? `
|
|
333
|
+
guidesSummary = summary.anyChanges ? `Guides installed (${summary.filesWritten.join(", ")})` : `Guides ${DIM2}already installed${RST2}`;
|
|
331
334
|
stepDone(out, guidesSummary);
|
|
332
335
|
} catch (err) {
|
|
333
336
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -346,9 +349,15 @@ async function runSetup(options = {}) {
|
|
|
346
349
|
out.write("\n");
|
|
347
350
|
const existingPageCount = countExistingPages(process.cwd());
|
|
348
351
|
printNextSteps(out, existingPageCount);
|
|
349
|
-
printProviderNextSteps(out);
|
|
350
352
|
return { stdout: "", stderr: "", exitCode: 0 };
|
|
351
353
|
}
|
|
354
|
+
async function safeCheckAuth(spawnCli) {
|
|
355
|
+
try {
|
|
356
|
+
return await checkClaudeAuth(spawnCli);
|
|
357
|
+
} catch {
|
|
358
|
+
return { loggedIn: false };
|
|
359
|
+
}
|
|
360
|
+
}
|
|
352
361
|
async function chooseDefaultAgent(args) {
|
|
353
362
|
const config = await readConfig();
|
|
354
363
|
let view = null;
|
|
@@ -357,7 +366,7 @@ async function chooseDefaultAgent(args) {
|
|
|
357
366
|
view = await buildProviderSetupView({ config, spawnCli: args.spawnCli });
|
|
358
367
|
}
|
|
359
368
|
if (args.interactive && args.requested === void 0 && view !== null) {
|
|
360
|
-
args.out.write(" Choose default
|
|
369
|
+
args.out.write(" Choose default agent:\n");
|
|
361
370
|
view.choices.forEach((choice, index) => {
|
|
362
371
|
const tag = choice.recommended ? " recommended" : "";
|
|
363
372
|
const status = choice.ready ? "ready" : "not ready";
|
|
@@ -369,7 +378,7 @@ async function chooseDefaultAgent(args) {
|
|
|
369
378
|
});
|
|
370
379
|
selected = (await promptText(
|
|
371
380
|
args.out,
|
|
372
|
-
"Default
|
|
381
|
+
"Default agent",
|
|
373
382
|
view.recommendedProvider
|
|
374
383
|
)).toLowerCase();
|
|
375
384
|
const number = Number.parseInt(selected, 10);
|
|
@@ -434,7 +443,7 @@ async function chooseProviderModel(args) {
|
|
|
434
443
|
if (!args.interactive) {
|
|
435
444
|
return args.configuredModel ?? recommended?.value ?? null;
|
|
436
445
|
}
|
|
437
|
-
args.out.write(` Choose
|
|
446
|
+
args.out.write(` Choose ${args.provider} model:
|
|
438
447
|
`);
|
|
439
448
|
choices.forEach((choice, index) => {
|
|
440
449
|
const marker = choice.recommended ? " recommended" : "";
|
|
@@ -481,9 +490,25 @@ async function runLoginCommand(command) {
|
|
|
481
490
|
});
|
|
482
491
|
});
|
|
483
492
|
}
|
|
484
|
-
|
|
485
|
-
|
|
493
|
+
function reportAuth(out, auth) {
|
|
494
|
+
if (auth.loggedIn) {
|
|
495
|
+
const who = auth.email ?? "Claude account";
|
|
496
|
+
const plan = auth.subscriptionType !== void 0 ? ` ${DIM2}(${auth.subscriptionType})${RST2}` : "";
|
|
497
|
+
stepDone(out, `Claude auth: ${WHITE_BOLD2}${who}${RST2}${plan}`);
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
if (process.env.ANTHROPIC_API_KEY !== void 0 && process.env.ANTHROPIC_API_KEY.length > 0) {
|
|
501
|
+
stepDone(out, `Claude auth: ${WHITE_BOLD2}ANTHROPIC_API_KEY${RST2} set`);
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
stepActive(out, `Claude auth: ${DIM2}not signed in${RST2}`);
|
|
505
|
+
for (const line of UNAUTHENTICATED_MESSAGE.split("\n")) {
|
|
506
|
+
out.write(` ${DIM2}\u2502 ${line}${RST2}
|
|
507
|
+
`);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
486
510
|
async function installGuides(options) {
|
|
511
|
+
await mkdir(options.claudeDir, { recursive: true });
|
|
487
512
|
const srcMini = path3.join(options.guidesDir, "mini.md");
|
|
488
513
|
const srcRef = path3.join(options.guidesDir, "reference.md");
|
|
489
514
|
if (!existsSync2(srcMini)) {
|
|
@@ -492,17 +517,6 @@ async function installGuides(options) {
|
|
|
492
517
|
if (!existsSync2(srcRef)) {
|
|
493
518
|
throw new Error(`missing bundled guide: ${srcRef}`);
|
|
494
519
|
}
|
|
495
|
-
switch (options.provider) {
|
|
496
|
-
case "claude":
|
|
497
|
-
return await installClaudeGuides(options, srcMini, srcRef);
|
|
498
|
-
case "codex":
|
|
499
|
-
return await installCodexGuides(srcMini, srcRef);
|
|
500
|
-
case "cursor":
|
|
501
|
-
return await installCursorGuides(options.cwd, srcMini);
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
async function installClaudeGuides(options, srcMini, srcRef) {
|
|
505
|
-
await mkdir(options.claudeDir, { recursive: true });
|
|
506
520
|
const destMini = path3.join(options.claudeDir, "codealmanac.md");
|
|
507
521
|
const destRef = path3.join(options.claudeDir, "codealmanac-reference.md");
|
|
508
522
|
const miniChanged = await copyIfChanged(srcMini, destMini);
|
|
@@ -513,45 +527,7 @@ async function installClaudeGuides(options, srcMini, srcRef) {
|
|
|
513
527
|
if (miniChanged) filesWritten.push("codealmanac.md");
|
|
514
528
|
if (refChanged) filesWritten.push("codealmanac-reference.md");
|
|
515
529
|
if (importChanged) filesWritten.push("CLAUDE.md");
|
|
516
|
-
return {
|
|
517
|
-
providerLabel: "Claude",
|
|
518
|
-
anyChanges: filesWritten.length > 0,
|
|
519
|
-
filesWritten
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
|
-
async function installCodexGuides(srcMini, srcRef) {
|
|
523
|
-
const codexDir = path3.join(homedir2(), ".codex");
|
|
524
|
-
await mkdir(codexDir, { recursive: true });
|
|
525
|
-
const destMini = path3.join(codexDir, "codealmanac.md");
|
|
526
|
-
const destRef = path3.join(codexDir, "codealmanac-reference.md");
|
|
527
|
-
const miniChanged = await copyIfChanged(srcMini, destMini);
|
|
528
|
-
const refChanged = await copyIfChanged(srcRef, destRef);
|
|
529
|
-
const agentsChanged = await ensureManagedBlock(
|
|
530
|
-
path3.join(codexDir, "AGENTS.md"),
|
|
531
|
-
codexGuideBlock()
|
|
532
|
-
);
|
|
533
|
-
const filesWritten = [];
|
|
534
|
-
if (miniChanged) filesWritten.push("codealmanac.md");
|
|
535
|
-
if (refChanged) filesWritten.push("codealmanac-reference.md");
|
|
536
|
-
if (agentsChanged) filesWritten.push("AGENTS.md");
|
|
537
|
-
return {
|
|
538
|
-
providerLabel: "Codex",
|
|
539
|
-
anyChanges: filesWritten.length > 0,
|
|
540
|
-
filesWritten
|
|
541
|
-
};
|
|
542
|
-
}
|
|
543
|
-
async function installCursorGuides(cwd, srcMini) {
|
|
544
|
-
const rulesDir = path3.join(cwd, ".cursor", "rules");
|
|
545
|
-
await mkdir(rulesDir, { recursive: true });
|
|
546
|
-
const mini = await readFile(srcMini, "utf8");
|
|
547
|
-
const dest = path3.join(rulesDir, "codealmanac.mdc");
|
|
548
|
-
const body = "---\ndescription: Use codealmanac wiki context during coding work\nalwaysApply: true\n---\n\n" + mini;
|
|
549
|
-
const changed = await writeIfChanged(dest, body);
|
|
550
|
-
return {
|
|
551
|
-
providerLabel: "Cursor",
|
|
552
|
-
anyChanges: changed,
|
|
553
|
-
filesWritten: changed ? [".cursor/rules/codealmanac.mdc"] : []
|
|
554
|
-
};
|
|
530
|
+
return { anyChanges: filesWritten.length > 0, filesWritten };
|
|
555
531
|
}
|
|
556
532
|
async function copyIfChanged(src, dest) {
|
|
557
533
|
const srcBytes = await readFile(src);
|
|
@@ -565,45 +541,6 @@ async function copyIfChanged(src, dest) {
|
|
|
565
541
|
await copyFile(src, dest);
|
|
566
542
|
return true;
|
|
567
543
|
}
|
|
568
|
-
async function writeIfChanged(dest, body) {
|
|
569
|
-
if (existsSync2(dest)) {
|
|
570
|
-
try {
|
|
571
|
-
if (await readFile(dest, "utf8") === body) return false;
|
|
572
|
-
} catch {
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
await writeFile(dest, body, "utf8");
|
|
576
|
-
return true;
|
|
577
|
-
}
|
|
578
|
-
async function ensureManagedBlock(file, block) {
|
|
579
|
-
let existing = "";
|
|
580
|
-
if (existsSync2(file)) existing = await readFile(file, "utf8");
|
|
581
|
-
const pattern = new RegExp(
|
|
582
|
-
`${escapeRegex(CODEX_BLOCK_START)}[\\s\\S]*?${escapeRegex(CODEX_BLOCK_END)}`
|
|
583
|
-
);
|
|
584
|
-
const next = pattern.test(existing) ? existing.replace(pattern, block.trimEnd()) : `${existing.trimEnd()}${existing.trim().length > 0 ? "\n\n" : ""}${block.trimEnd()}
|
|
585
|
-
`;
|
|
586
|
-
const normalized = next.endsWith("\n") ? next : `${next}
|
|
587
|
-
`;
|
|
588
|
-
if (normalized === existing) return false;
|
|
589
|
-
await writeFile(file, normalized, "utf8");
|
|
590
|
-
return true;
|
|
591
|
-
}
|
|
592
|
-
function codexGuideBlock() {
|
|
593
|
-
return [
|
|
594
|
-
CODEX_BLOCK_START,
|
|
595
|
-
"# codealmanac",
|
|
596
|
-
"",
|
|
597
|
-
"This machine has codealmanac installed: a local wiki for codebases.",
|
|
598
|
-
"Before codealmanac/wiki-related work, read `~/.codex/codealmanac.md`.",
|
|
599
|
-
"For the full command reference, read `~/.codex/codealmanac-reference.md` on demand.",
|
|
600
|
-
CODEX_BLOCK_END,
|
|
601
|
-
""
|
|
602
|
-
].join("\n");
|
|
603
|
-
}
|
|
604
|
-
function escapeRegex(value) {
|
|
605
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
606
|
-
}
|
|
607
544
|
var IMPORT_LINE = "@~/.claude/codealmanac.md";
|
|
608
545
|
async function ensureImport(claudeMdPath) {
|
|
609
546
|
let existing = "";
|
|
@@ -690,22 +627,9 @@ function resolveGuidesDir() {
|
|
|
690
627
|
function looksLikeGuidesDir(dir) {
|
|
691
628
|
return existsSync2(path3.join(dir, "mini.md"));
|
|
692
629
|
}
|
|
693
|
-
function printProviderNextSteps(out) {
|
|
694
|
-
out.write(` ${DIM2}Change provider/model later:${RST2}
|
|
695
|
-
`);
|
|
696
|
-
out.write(` ${DIM2} almanac agents list${RST2}
|
|
697
|
-
`);
|
|
698
|
-
out.write(` ${DIM2} almanac agents use <claude|codex|cursor>${RST2}
|
|
699
|
-
`);
|
|
700
|
-
out.write(
|
|
701
|
-
` ${DIM2} almanac agents model <provider> <model|--default>${RST2}
|
|
702
|
-
|
|
703
|
-
`
|
|
704
|
-
);
|
|
705
|
-
}
|
|
706
630
|
|
|
707
631
|
export {
|
|
708
632
|
runSetup,
|
|
709
633
|
IMPORT_LINE
|
|
710
634
|
};
|
|
711
|
-
//# sourceMappingURL=chunk-
|
|
635
|
+
//# sourceMappingURL=chunk-ZUQN5Y3K.js.map
|