@narumitw/pi-btw 0.59.0 → 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/dist/index.ts +209 -23
- package/dist/index.ts.map +4 -4
- package/package.json +1 -1
- package/src/btw.ts +1 -12
- package/src/menu.ts +244 -15
- package/src/settings.ts +5 -0
package/dist/index.ts.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/btw.ts", "../src/bring-to-main.ts", "../src/fullscreen-ui.ts", "../src/keybindings.ts", "../src/text.ts", "../src/main-tree-picker.ts", "../src/
|
|
4
|
-
"sourcesContent": ["import {\n type Api,\n clampThinkingLevel,\n getSupportedThinkingLevels,\n type Model,\n type ProviderHeaders,\n} from \"@earendil-works/pi-ai\";\nimport { BorderedLoader, type ExtensionAPI, type ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { MenuContext, RunMenuResult } from \"@narumitw/pi-tui-kit\";\nimport {\n type BtwBringToMainSegment,\n type BtwBringToMainSummary,\n BtwTextRangeSelector,\n type BtwTextRangeSelectorState,\n buildQuickBringToMainSegments,\n estimateBringToMainTokens,\n formatBtwBringToMain,\n getAnsweredTurns,\n summarizeBringToMain,\n} from \"./bring-to-main.js\";\nimport { type RunBtwFullscreen, runBtwFullscreen } from \"./fullscreen-ui.js\";\nimport { pickMainEntry } from \"./main-tree-picker.js\";\nimport {\n type BtwCommandMenuResult,\n type BtwResumeThreadSummary,\n runBtwMenuPreservingEditor,\n showBtwCommandMenu,\n showBtwCustomPreservingEditor,\n} from \"./menu.js\";\nimport {\n type BtwSettings,\n effectiveFullscreenCopyOnSelect,\n effectiveRememberThinkingLevelChanges,\n parseBtwModelReference,\n readBtwSettings,\n updateBtwSettings,\n} from \"./settings.js\";\nimport {\n BTW_THINKING_LEVELS,\n type BtwThinkingLevel,\n type CompleteSimpleFunction,\n completeSideThreadTurn,\n createSideThread,\n type SideQuestionAuth,\n type SideThread,\n} from \"./side-thread.js\";\nimport { sanitizeSingleLine } from \"./text.js\";\nimport { type BtwMarkdownTransformers, prepareBtwTranscriptMarkdown } from \"./transcript-markdown.js\";\nimport {\n BtwAnsweringView,\n type BtwThinkingControl,\n BtwTranscriptPager,\n type TranscriptPagerAction,\n} from \"./transcript-pager.js\";\n\nexport {\n BTW_SETTINGS_FILE,\n type BtwSettings,\n type BtwSettingsLoadResult,\n normalizeBtwSettings,\n parseBtwModelReference,\n readBtwSettings,\n} from \"./settings.js\";\nexport {\n BTW_THINKING_LEVELS,\n type BtwThinkingLevel,\n buildUserPrompt,\n completeSideQuestion,\n} from \"./side-thread.js\";\nexport { sanitizeSingleLine } from \"./text.js\";\n\nconst MAX_CONTEXT_CHARS = 40_000;\n\ninterface LoadBtwThinkingLevelOptions {\n settingsPath?: string;\n warn?: (message: string) => void;\n}\n\ntype BtwModelRegistry = Pick<ExtensionCommandContext[\"modelRegistry\"], \"find\" | \"getApiKeyAndHeaders\">;\n\ntype BtwProviderRegistry = Pick<ExtensionCommandContext[\"modelRegistry\"], \"getProvider\">;\n\nexport function createModelRegistryCompleteSimple(modelRegistry: BtwProviderRegistry): CompleteSimpleFunction {\n return async (model, context, options) => {\n const provider = modelRegistry.getProvider(model.provider);\n if (!provider) throw new Error(`No provider registered for model provider: ${model.provider}`);\n return provider.streamSimple(model, context, options).result();\n };\n}\n\ninterface ResolveBtwModelOptions {\n settings: BtwSettings;\n currentModel: Model<Api> | undefined;\n modelRegistry: BtwModelRegistry;\n warn?: (message: string) => void;\n}\n\nexport interface ResolvedBtwModel {\n model: Model<Api>;\n auth: SideQuestionAuth;\n}\n\nexport interface BtwThreadState {\n id: string;\n title?: string;\n thread: SideThread;\n thinkingLevel: BtwThinkingLevel;\n createdAt: number;\n updatedAt: number;\n}\n\nexport async function resolveBtwModel({\n settings,\n currentModel,\n modelRegistry,\n warn,\n}: ResolveBtwModelOptions): Promise<ResolvedBtwModel | undefined> {\n const reportWarning = (message: string) => warn?.(sanitizeSingleLine(message));\n if (settings.model) {\n const fallback = currentModel ? `${currentModel.provider}/${currentModel.id}` : \"the current model\";\n const reference = parseBtwModelReference(settings.model);\n if (!reference) {\n reportWarning(`pi-btw model ${settings.model} is invalid; falling back to ${fallback}.`);\n return resolveBtwModel({ settings: {}, currentModel, modelRegistry, warn: reportWarning });\n }\n const configuredModel = modelRegistry.find(reference.provider, reference.modelId);\n if (!configuredModel) {\n reportWarning(`pi-btw model ${settings.model} was not found; falling back to ${fallback}.`);\n } else {\n const sameAsCurrent =\n configuredModel === currentModel ||\n (configuredModel.provider === currentModel?.provider && configuredModel.id === currentModel.id);\n const fallbackAction = sameAsCurrent ? \"no distinct current model is available\" : `falling back to ${fallback}`;\n try {\n const auth = await modelRegistry.getApiKeyAndHeaders(configuredModel);\n if (auth.ok && hasRequestAuth(auth)) {\n return {\n model: auth.baseUrl ? { ...configuredModel, baseUrl: auth.baseUrl } : configuredModel,\n auth,\n };\n }\n const reason = auth.ok ? \"has no request credentials\" : auth.error;\n reportWarning(`pi-btw model ${settings.model} is unavailable (${reason}); ${fallbackAction}.`);\n } catch (error: unknown) {\n reportWarning(`pi-btw model ${settings.model} credentials failed (${formatError(error)}); ${fallbackAction}.`);\n }\n if (sameAsCurrent) return undefined;\n }\n }\n\n if (!currentModel) return undefined;\n try {\n const auth = await modelRegistry.getApiKeyAndHeaders(currentModel);\n if (auth.ok && hasRequestAuth(auth)) {\n // Direct provider streams bypass Pi's request preparation, including OAuth routing.\n return {\n model: auth.baseUrl ? { ...currentModel, baseUrl: auth.baseUrl } : currentModel,\n auth,\n };\n }\n } catch {\n // The caller reports the final lack of an available model.\n }\n return undefined;\n}\n\nfunction hasRequestAuth(auth: SideQuestionAuth): boolean {\n return Boolean(\n auth.apiKey || providerHeadersHaveValue(auth.headers) || (auth.env && Object.keys(auth.env).length > 0),\n );\n}\n\nfunction providerHeadersHaveValue(headers: ProviderHeaders | undefined): boolean {\n return headers !== undefined && Object.values(headers).some((value) => value !== null);\n}\n\nexport async function loadBtwThinkingLevel(\n currentThinkingLevel: BtwThinkingLevel,\n options: LoadBtwThinkingLevelOptions = {},\n): Promise<BtwThinkingLevel> {\n const settings = await readBtwSettings(options.settingsPath);\n if (settings.kind === \"missing\") return currentThinkingLevel;\n if (settings.kind === \"loaded\") {\n return settings.settings.thinkingLevel ?? currentThinkingLevel;\n }\n\n options.warn?.(\n sanitizeSingleLine(\n `pi-btw settings ignored: ${settings.reason}; expected optional model \"provider/model-id\", omitted thinkingLevel for Same as main thread or thinkingLevel \"${BTW_THINKING_LEVELS.join('\" | \"')}\", boolean rememberThinkingLevelChanges, and boolean fullscreenCopyOnSelect. Using current Pi thinking level.`,\n ),\n );\n return currentThinkingLevel;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction readBtwSessionId(ctx: ExtensionCommandContext): string | undefined {\n const getSessionId = ctx.sessionManager.getSessionId;\n if (typeof getSessionId !== \"function\") return undefined;\n const sessionId = getSessionId.call(ctx.sessionManager);\n return sessionId.length > 0 ? sessionId : undefined;\n}\n\nfunction notifySafely(\n ctx: ExtensionCommandContext,\n message: string,\n level: Parameters<ExtensionCommandContext[\"ui\"][\"notify\"]>[1],\n): void {\n try {\n ctx.ui.notify(sanitizeSingleLine(message), level);\n } catch {\n // Async command continuations may finish after their ExtensionContext is replaced.\n }\n}\n\n// Keep this slightly-over-1,000-line command coordinator intact: its injectable menu,\n// request, resume, and delivery flows share the same thread-state and test seams;\n// settings, keybinding policy, terminal ownership, and rendering live in separate modules.\nexport interface BtwExtensionDependencies {\n showCommandMenu?: (\n pi: ExtensionAPI,\n ctx: ExtensionCommandContext,\n resumeThreads: readonly BtwResumeThreadSummary[],\n ) => Promise<BtwCommandMenuResult>;\n pickMainEntry?: typeof pickMainEntry;\n loadSettings?: typeof loadSettingsForCommand;\n resolveModel?: typeof resolveBtwModelWithLoader;\n runThread?: typeof runBtwThread;\n runFullscreen?: RunBtwFullscreen;\n}\n\nexport default function btw(pi: ExtensionAPI, dependencies: BtwExtensionDependencies = {}) {\n const showCommandMenu = dependencies.showCommandMenu ?? showCommandMenuForBtw;\n const pickEntry = dependencies.pickMainEntry ?? pickMainEntry;\n const loadSettings = dependencies.loadSettings ?? loadSettingsForCommand;\n const resolveModel = dependencies.resolveModel ?? resolveBtwModelWithLoader;\n const runThread = dependencies.runThread ?? runBtwThread;\n const runFullscreen = dependencies.runFullscreen ?? runBtwFullscreen;\n // Pi creates a fresh extension instance after session replacement or reload.\n const resumableThreads = new Map<string, BtwThreadState>();\n let nextThreadNumber = 1;\n const listResumeThreads = (): BtwResumeThreadSummary[] =>\n [...resumableThreads.values()]\n .reverse()\n .filter((state) => state.thread.turns.length > 0 && state.title)\n .sort((first, second) => second.updatedAt - first.updatedAt || second.createdAt - first.createdAt)\n .map((state) => ({\n id: state.id,\n title: state.title ?? \"Untitled side thread\",\n questionCount: state.thread.turns.length,\n }));\n pi.registerCommand(\"btw\", {\n description: \"Ask a quick side question without adding it to the main conversation\",\n handler: async (args, ctx) => {\n const question = args.trim();\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(\"/btw requires interactive TUI mode\", \"error\");\n return;\n }\n\n let menuResult: BtwCommandMenuResult = \"start\";\n let selectedConversationContext: string | undefined;\n if (!question) {\n while (true) {\n menuResult = await showCommandMenu(pi, ctx, listResumeThreads());\n if (menuResult === \"closed\") return;\n if (menuResult !== \"tree\") break;\n\n const treeResult = await pickEntry(pi, ctx);\n if (treeResult.kind === \"closed\") return;\n if (treeResult.kind === \"back\") continue;\n try {\n if (!ctx.sessionManager.getEntry(treeResult.entryId)) {\n notifySafely(ctx, \"The selected main-thread entry is no longer available\", \"warning\");\n continue;\n }\n const branch = ctx.sessionManager.getBranch(treeResult.entryId);\n if (branch.at(-1)?.id !== treeResult.entryId) {\n notifySafely(ctx, \"The selected main-thread branch is no longer available\", \"warning\");\n continue;\n }\n selectedConversationContext = buildConversationContext(branch);\n menuResult = \"start\";\n break;\n } catch {\n return;\n }\n }\n }\n\n const settings = await loadSettings(ctx);\n const sameAsMainThinkingLevel = settings.thinkingLevel === undefined;\n const resolution = await resolveModel(settings, ctx);\n if (resolution.kind === \"cancelled\") {\n notifySafely(ctx, \"Cancelled\", \"info\");\n return;\n }\n if (resolution.kind === \"unavailable\") {\n notifySafely(ctx, \"No available model for /btw\", \"error\");\n return;\n }\n\n let state = typeof menuResult === \"object\" ? resumableThreads.get(menuResult.threadId) : undefined;\n if (typeof menuResult === \"object\" && !state) {\n notifySafely(ctx, \"The selected /btw side thread is no longer available\", \"warning\");\n return;\n }\n const startingTurnCount = state?.thread.turns.length ?? 0;\n\n try {\n await runFullscreen(\n ctx,\n (fullscreenCtx) => {\n if (!state) {\n const createdAt = Date.now();\n state = {\n id: `btw-${nextThreadNumber}`,\n thread: createSideThread(\n selectedConversationContext ?? buildConversationContext(fullscreenCtx.sessionManager.getBranch()),\n ),\n thinkingLevel: settings.thinkingLevel ?? pi.getThinkingLevel(),\n createdAt,\n updatedAt: createdAt,\n };\n nextThreadNumber += 1;\n }\n return runThread({\n initialQuestion: question || undefined,\n selected: resolution.selected,\n thinkingLevel: state.thinkingLevel,\n rememberThinkingLevelChanges: !sameAsMainThinkingLevel && effectiveRememberThinkingLevelChanges(settings),\n state,\n ctx: fullscreenCtx,\n });\n },\n {\n copyOnSelect: effectiveFullscreenCopyOnSelect(settings),\n ...(settings.keybindings ? { keybindings: settings.keybindings } : {}),\n },\n );\n } finally {\n if (state?.title && state.thread.turns.length > 0) {\n if (state.thread.turns.length > startingTurnCount) {\n resumableThreads.delete(state.id);\n }\n resumableThreads.set(state.id, state);\n }\n }\n },\n });\n}\n\nasync function showCommandMenuForBtw(\n pi: ExtensionAPI,\n ctx: ExtensionCommandContext,\n resumeThreads: readonly BtwResumeThreadSummary[],\n): Promise<BtwCommandMenuResult> {\n const currentModel = ctx.model;\n const availableModels = ctx.modelRegistry.getAll();\n const currentThinkingLevel = pi.getThinkingLevel();\n const loaded = await readBtwSettings();\n const settings = loaded.kind === \"loaded\" ? loaded.settings : {};\n const configured = settings.model ? parseBtwModelReference(settings.model) : undefined;\n const configuredModel = configured\n ? availableModels.find((model) => model.provider === configured.provider && model.id === configured.modelId)\n : undefined;\n const model = configuredModel ?? currentModel;\n return showBtwCommandMenu(ctx, {\n currentThinkingLevel,\n availableThinkingLevels: model ? getSupportedThinkingLevels(model) : BTW_THINKING_LEVELS,\n resumeThreads,\n });\n}\n\nasync function loadSettingsForCommand(ctx: ExtensionCommandContext): Promise<BtwSettings> {\n const settingsResult = await readBtwSettings();\n if (settingsResult.kind === \"loaded\") return settingsResult.settings;\n if (settingsResult.kind === \"invalid\") {\n notifySafely(ctx, `pi-btw settings ignored: ${settingsResult.reason}`, \"warning\");\n }\n return {};\n}\n\ntype ModelResolutionOutcome =\n | { kind: \"cancelled\" }\n | { kind: \"unavailable\" }\n | { kind: \"selected\"; selected: ResolvedBtwModel };\n\nasync function resolveBtwModelWithLoader(\n settings: BtwSettings,\n ctx: ExtensionCommandContext,\n): Promise<ModelResolutionOutcome> {\n return ctx.ui.custom<ModelResolutionOutcome>((tui, theme, _keybindings, done) => {\n const loader = new BorderedLoader(tui, theme, \"Resolving /btw model credentials...\");\n let settled = false;\n loader.onAbort = () => {\n if (settled) return;\n settled = true;\n done({ kind: \"cancelled\" });\n };\n\n resolveBtwModel({\n settings,\n currentModel: ctx.model,\n modelRegistry: ctx.modelRegistry,\n warn: (message) => {\n if (!settled) notifySafely(ctx, message, \"warning\");\n },\n })\n .then((selected) => {\n if (settled) return;\n settled = true;\n done(selected ? { kind: \"selected\", selected } : { kind: \"unavailable\" });\n })\n .catch(() => {\n if (settled) return;\n settled = true;\n done({ kind: \"unavailable\" });\n });\n\n return loader;\n });\n}\n\ninterface RunBtwThreadDependencies {\n ask?: typeof askThreadQuestion;\n interact?: typeof showThreadComposer;\n chooseBringToMain?: typeof chooseBringToMain;\n deliverBringToMain?: typeof loadBringToMainDraft;\n persistThinkingLevel?: (level: BtwThinkingLevel) => Promise<unknown>;\n now?: () => number;\n}\n\nexport type BtwThreadResult = { kind: \"closed\" };\n\ntype BtwThreadThinkingControl = Omit<BtwThinkingControl, \"keybindings\">;\n\ninterface BtwThreadSteeringControl {\n questions: readonly string[];\n submit: (question: string) => void;\n thinking: BtwThreadThinkingControl;\n}\n\ntype BtwBringToMainChoice =\n | BtwThreadResult\n | {\n kind: \"bringToMain\";\n draft: string;\n summary: BtwBringToMainSummary;\n selectionState?: BtwTextRangeSelectorState;\n }\n | { kind: \"back\" };\n\ntype BtwBringToMainDelivery = \"loaded\" | \"back\" | \"closed\";\n\ninterface RunBtwThreadOptions {\n initialQuestion?: string;\n selected: ResolvedBtwModel;\n thinkingLevel: BtwThinkingLevel;\n rememberThinkingLevelChanges?: boolean;\n settingsPath?: string;\n state?: BtwThreadState;\n ctx: ExtensionCommandContext;\n dependencies?: RunBtwThreadDependencies;\n}\n\nexport async function runBtwThread({\n initialQuestion,\n selected,\n thinkingLevel,\n rememberThinkingLevelChanges = false,\n settingsPath,\n state,\n ctx,\n dependencies = {},\n}: RunBtwThreadOptions): Promise<BtwThreadResult> {\n const ask = dependencies.ask ?? askThreadQuestion;\n const interact = dependencies.interact ?? showThreadComposer;\n const chooseBringToMainAction = dependencies.chooseBringToMain ?? chooseBringToMain;\n const deliverBringToMainDraft = dependencies.deliverBringToMain ?? loadBringToMainDraft;\n const persistThinkingLevel =\n dependencies.persistThinkingLevel ??\n ((level: BtwThinkingLevel) => updateBtwSettings({ thinkingLevel: level }, { settingsPath }));\n const now = dependencies.now ?? Date.now;\n const thread = state?.thread ?? createSideThread(buildConversationContext(ctx.sessionManager.getBranch()));\n const thinkingLevels = getSupportedThinkingLevels(selected.model);\n const pendingWrites = new Set<Promise<void>>();\n const steeringQuestions: string[] = [];\n let activeThinkingLevel = clampThinkingLevel(selected.model, state?.thinkingLevel ?? thinkingLevel);\n if (state) state.thinkingLevel = activeThinkingLevel;\n let pendingQuestion = initialQuestion;\n let composerDraft: string | undefined;\n const createThinkingControl = (): BtwThreadThinkingControl => ({\n level: activeThinkingLevel,\n levels: thinkingLevels,\n onChange: (level) => {\n if (!thinkingLevels.includes(level)) return;\n activeThinkingLevel = level;\n if (state) state.thinkingLevel = level;\n if (!rememberThinkingLevelChanges) return;\n let write!: Promise<void>;\n write = Promise.resolve()\n .then(() => persistThinkingLevel(level))\n .then(() => undefined)\n .catch((error: unknown) => {\n notifySafely(\n ctx,\n `Thinking level changed to ${level}, but could not be remembered in pi-btw.json: ${formatError(error)}`,\n \"warning\",\n );\n })\n .finally(() => pendingWrites.delete(write));\n pendingWrites.add(write);\n },\n });\n\n try {\n while (true) {\n if (!pendingQuestion) {\n const action = await interact(thread, thread.turns.length > 0, ctx, composerDraft, createThinkingControl());\n if (action.kind === \"close\") return { kind: \"closed\" };\n if (action.kind === \"bringToMain\") {\n const choice = await chooseBringToMainAction(thread, ctx);\n if (choice.kind === \"closed\") return choice;\n if (choice.kind === \"back\") {\n composerDraft = action.questionDraft;\n continue;\n }\n const delivery = await deliverBringToMainDraft(choice.draft, ctx, choice.summary);\n if (delivery === \"loaded\" || delivery === \"closed\") return { kind: \"closed\" };\n composerDraft = action.questionDraft;\n continue;\n }\n composerDraft = undefined;\n pendingQuestion = action.question;\n }\n\n const result = await ask(thread, pendingQuestion, selected, activeThinkingLevel, ctx, {\n questions: steeringQuestions,\n submit: (question) => steeringQuestions.push(question),\n thinking: createThinkingControl(),\n });\n if (result.kind === \"aborted\") {\n notifySafely(ctx, \"Cancelled\", \"info\");\n return { kind: \"closed\" };\n }\n if (result.kind === \"error\") {\n thread.turns.push({\n kind: \"error\",\n question: pendingQuestion,\n answer: result.message,\n });\n }\n if (state) {\n state.title ||= sanitizeSingleLine(pendingQuestion) || \"Untitled side thread\";\n state.updatedAt = now();\n }\n\n pendingQuestion = steeringQuestions.shift();\n }\n } finally {\n await Promise.allSettled([...pendingWrites]);\n }\n}\n\ninterface ChooseBringToMainDependencies {\n showMenu?: typeof showBtwMenu;\n showPreview?: typeof showBringToMainPreview;\n}\n\nexport async function chooseBringToMain(\n thread: SideThread,\n ctx: ExtensionCommandContext,\n dependencies: ChooseBringToMainDependencies = {},\n): Promise<BtwBringToMainChoice> {\n const answered = getAnsweredTurns(thread.turns);\n if (answered.length === 0) return { kind: \"back\" };\n const showMenu = dependencies.showMenu ?? showBtwMenu;\n const showPreview = dependencies.showPreview ?? showBringToMainPreview;\n const makeChoice = (segments: readonly BtwBringToMainSegment[]) => ({\n kind: \"bringToMain\" as const,\n draft: formatBtwBringToMain(segments),\n summary: summarizeBringToMain(segments),\n });\n\n const latestSegments = buildQuickBringToMainSegments(thread.turns, { kind: \"latest\" });\n const entireSegments = buildQuickBringToMainSegments(thread.turns, { kind: \"entire\" });\n const latestOption = `Latest question and answer 1 Q&A \u00B7 ~${estimateBringToMainTokens(latestSegments)} tokens`;\n const fromOption = \"From a question onward\u2026 Choose a starting question\";\n const exactOption = \"Select exact text\u2026 Lines or characters\";\n const entireOption = `Entire side thread ${answered.length} Q&A \u00B7 ~${estimateBringToMainTokens(entireSegments)} tokens`;\n const cancelOption = \"Cancel Return to the side thread\";\n let selectedScope: string | undefined;\n\n while (true) {\n const scopeResult = await showMenu(\n ctx,\n \"Bring what back to the main thread?\",\n [latestOption, fromOption, exactOption, entireOption, cancelOption],\n selectedScope,\n );\n if (scopeResult.kind === \"close\") return { kind: \"closed\" };\n if (scopeResult.kind === \"back\" || scopeResult.value === cancelOption) return { kind: \"back\" };\n const scope = scopeResult.value;\n selectedScope = scope;\n if (scope === latestOption) return makeChoice(latestSegments);\n if (scope === entireOption) {\n const choice = makeChoice(entireSegments);\n const preview = await showPreview(ctx, choice.draft, choice.summary);\n if (preview.kind === \"close\") return { kind: \"closed\" };\n if (preview.kind === \"back\") continue;\n return choice;\n }\n if (scope === fromOption) {\n const questions = answered.map(\n (turn, index) => `${index + 1}. ${truncatePreview(sanitizeSingleLine(turn.question))}`,\n );\n let selectedQuestion: string | undefined;\n while (true) {\n const questionResult = await showMenu(ctx, \"Start from which question?\", questions, selectedQuestion);\n if (questionResult.kind === \"close\") return { kind: \"closed\" };\n if (questionResult.kind === \"back\") break;\n const answeredTurnIndex = questions.indexOf(questionResult.value);\n if (answeredTurnIndex < 0) continue;\n selectedQuestion = questionResult.value;\n const choice = makeChoice(buildQuickBringToMainSegments(thread.turns, { kind: \"from\", answeredTurnIndex }));\n const preview = await showPreview(ctx, choice.draft, choice.summary);\n if (preview.kind === \"close\") return { kind: \"closed\" };\n if (preview.kind === \"back\") continue;\n return choice;\n }\n continue;\n }\n\n if (scope !== exactOption) continue;\n let selectionState: BtwTextRangeSelectorState | undefined;\n while (true) {\n const selectedRange = await showBtwCustomPreservingEditor<BtwBringToMainChoice>(\n ctx,\n (tui, theme, keybindings, done) => {\n let selector: BtwTextRangeSelector;\n selector = new BtwTextRangeSelector(\n tui,\n theme,\n keybindings,\n thread.turns,\n (action) => {\n if (action.kind === \"back\") done({ kind: \"back\" });\n else if (action.kind === \"close\") done({ kind: \"closed\" });\n else done({ ...makeChoice(action.segments), selectionState: selector.getState() });\n },\n selectionState,\n );\n return selector;\n },\n );\n if (!selectedRange) return { kind: \"closed\" };\n if (selectedRange.kind === \"closed\") return selectedRange;\n if (selectedRange.kind === \"back\") break;\n const preview = await showPreview(ctx, selectedRange.draft, selectedRange.summary);\n if (preview.kind === \"close\") return { kind: \"closed\" };\n if (preview.kind === \"back\") {\n selectionState = selectedRange.selectionState;\n continue;\n }\n return {\n kind: \"bringToMain\",\n draft: selectedRange.draft,\n summary: selectedRange.summary,\n };\n }\n }\n}\n\ntype BtwMenuSelectorAction = { kind: \"select\"; value: string } | { kind: \"back\" } | { kind: \"close\" };\n\ntype BtwBringToMainPreviewAction = { kind: \"bring\" } | { kind: \"back\" } | { kind: \"close\" };\n\nasync function showBringToMainPreview(\n ctx: ExtensionCommandContext,\n draft: string,\n summary: BtwBringToMainSummary,\n): Promise<BtwBringToMainPreviewAction> {\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (ctx.signal?.aborted) return { kind: \"close\" };\n let confirmed = false;\n const count = summary.messages === 1 ? \"1 message\" : `${summary.messages} messages`;\n const lineCount = summary.lines === 1 ? \"1 line\" : `${summary.lines} lines`;\n const menu = defineMenu<void, \"preview\", \"bring\", MenuContext>({\n start: \"preview\",\n screens: {\n preview: () => ({\n kind: \"review\",\n title: `Preview \u00B7 ${count} \u00B7 ${lineCount} \u00B7 ~${summary.tokens} tokens`,\n content: draft,\n viewportSize: \"adaptive\",\n hint: \"back\",\n confirm: { id: \"bring\", label: \"Bring\", action: \"bring\" },\n }),\n },\n actions: {\n bring: async () => {\n confirmed = true;\n return { kind: \"close\" } as const;\n },\n },\n });\n const result = await runBtwMenuPreservingEditor(ctx, (menuContext) =>\n runMenu(menuContext, menu, { getState: () => undefined }),\n );\n if (confirmed && result.kind === \"closed\" && result.reason === \"close\") {\n return { kind: \"bring\" };\n }\n return terminalBtwMenuAction(result);\n}\n\nasync function showBtwMenu(\n ctx: ExtensionCommandContext,\n title: string,\n options: readonly string[],\n initialValue?: string,\n): Promise<BtwMenuSelectorAction> {\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (ctx.signal?.aborted) return { kind: \"close\" };\n const items = options.map((label, index) => ({ id: `option-${index}`, label }));\n const initialIndex = initialValue === undefined ? -1 : options.indexOf(initialValue);\n let selectedValue: string | undefined;\n const menu = defineMenu<void, \"choices\", \"select\", MenuContext>({\n start: \"choices\",\n screens: {\n choices: () => ({\n kind: \"choice\",\n title,\n items,\n action: \"select\",\n initialItemId: initialIndex >= 0 ? `option-${initialIndex}` : undefined,\n hint: \"back\",\n }),\n },\n actions: {\n select: async ({ itemId }: { itemId: string }) => {\n const index = Number.parseInt(itemId.slice(\"option-\".length), 10);\n selectedValue = options[index];\n return selectedValue === undefined ? ({ kind: \"stay\" } as const) : ({ kind: \"close\" } as const);\n },\n },\n });\n const result = await runBtwMenuPreservingEditor(ctx, (menuContext) =>\n runMenu(menuContext, menu, { getState: () => undefined }),\n );\n return selectedValue !== undefined && result.kind === \"closed\" && result.reason === \"close\"\n ? { kind: \"select\", value: selectedValue }\n : terminalBtwMenuAction(result);\n}\n\nfunction terminalBtwMenuAction(result: RunMenuResult): { kind: \"back\" } | { kind: \"close\" } {\n if (result.kind === \"closed\") return { kind: result.reason };\n if (result.kind === \"error\") throw result.error;\n return { kind: \"close\" };\n}\n\nexport async function loadBringToMainDraft(\n draft: string,\n ctx: ExtensionCommandContext,\n summary: BtwBringToMainSummary,\n): Promise<BtwBringToMainDelivery> {\n const describeContent = () =>\n `${summary.messages} ${summary.messages === 1 ? \"message\" : \"messages\"} (~${summary.tokens} ${summary.tokens === 1 ? \"token\" : \"tokens\"})`;\n const existing = ctx.ui.getEditorText();\n if (!existing.trim()) {\n ctx.ui.setEditorText(draft);\n ctx.ui.notify(`Brought ${describeContent()} to the main editor. Review and submit when ready.`, \"info\");\n return \"loaded\";\n }\n\n const appendOption = \"Append after current draft Recommended\";\n const replaceOption = \"\u26A0 Replace current draft Discards current editor text\";\n const cancelOption = \"Cancel Return to the side thread\";\n while (true) {\n const action = await showBtwMenu(ctx, \"The main editor already has a draft\", [\n appendOption,\n replaceOption,\n cancelOption,\n ]);\n if (action.kind === \"close\") return \"closed\";\n if (action.kind === \"back\" || action.value === cancelOption) return \"back\";\n if (action.value === appendOption) {\n ctx.ui.setEditorText(`${ctx.ui.getEditorText()}\\n\\n${draft}`);\n ctx.ui.notify(\n `Appended ${describeContent()} to the existing main-editor draft. Review and submit when ready.`,\n \"info\",\n );\n return \"loaded\";\n }\n if (action.value !== replaceOption) continue;\n\n const current = ctx.ui.getEditorText();\n const characters = [...current].length;\n const confirmed = await showBtwMenu(ctx, `Replace the current ${characters}-character editor draft?`, [\n \"Back Keep current editor text\",\n \"\u26A0 Replace current draft Cannot be undone\",\n ]);\n if (confirmed.kind === \"close\") return \"closed\";\n if (confirmed.kind === \"back\" || confirmed.value === \"Back Keep current editor text\") continue;\n if (confirmed.value !== \"\u26A0 Replace current draft Cannot be undone\") continue;\n if (ctx.ui.getEditorText() !== current) {\n ctx.ui.notify(\n \"The main editor changed during confirmation. Review the updated draft and choose again.\",\n \"warning\",\n );\n continue;\n }\n ctx.ui.setEditorText(draft);\n ctx.ui.notify(`Replaced the main-editor draft with ${describeContent()}. Review and submit when ready.`, \"info\");\n return \"loaded\";\n }\n}\n\nfunction truncatePreview(text: string): string {\n return text.length <= 72 ? text : `${text.slice(0, 69)}\u2026`;\n}\n\nasync function prepareCurrentTranscriptMarkdown(\n thread: SideThread,\n pendingQuestion: string | undefined,\n ctx: ExtensionCommandContext,\n): Promise<BtwMarkdownTransformers | undefined> {\n while (true) {\n const turnCount = thread.turns.length;\n const createMarkdownTransformers = ctx.signal\n ? await prepareBtwTranscriptMarkdown(thread.turns, pendingQuestion, ctx.signal)\n : await prepareBtwTranscriptMarkdown(thread.turns, pendingQuestion);\n if (!createMarkdownTransformers || ctx.signal?.aborted) return undefined;\n if (thread.turns.length === turnCount) return createMarkdownTransformers;\n }\n}\n\nasync function askThreadQuestion(\n thread: SideThread,\n question: string,\n selected: ResolvedBtwModel,\n thinkingLevel: BtwThinkingLevel,\n ctx: ExtensionCommandContext,\n steering: BtwThreadSteeringControl,\n) {\n const createMarkdownTransformers = await prepareCurrentTranscriptMarkdown(thread, question, ctx);\n if (!createMarkdownTransformers) return { kind: \"aborted\" as const };\n return ctx.ui.custom<Awaited<ReturnType<typeof completeSideThreadTurn>>>((tui, theme, keybindings, done) => {\n let settled = false;\n const view = new BtwAnsweringView(\n tui,\n theme,\n thread.turns,\n question,\n () => {\n if (settled) return;\n settled = true;\n done({ kind: \"aborted\" });\n },\n thinkingLevel,\n {\n markdownTransformers: createMarkdownTransformers(theme),\n steering: {\n questions: steering.questions,\n onSubmit: steering.submit,\n thinking: { ...steering.thinking, keybindings },\n },\n },\n );\n completeSideThreadTurn({\n thread,\n question,\n model: selected.model,\n thinkingLevel,\n auth: selected.auth,\n signal: view.signal,\n completeSimple: createModelRegistryCompleteSimple(ctx.modelRegistry),\n sessionId: readBtwSessionId(ctx),\n }).then((result) => {\n if (settled) return;\n settled = true;\n view.finish();\n done(result);\n });\n return view;\n });\n}\n\nasync function showThreadComposer(\n thread: SideThread,\n startAtBottom: boolean,\n ctx: ExtensionCommandContext,\n initialQuestion: string | undefined,\n thinking: BtwThreadThinkingControl,\n): Promise<TranscriptPagerAction> {\n const createMarkdownTransformers = await prepareCurrentTranscriptMarkdown(thread, initialQuestion, ctx);\n if (!createMarkdownTransformers) return { kind: \"close\" };\n return ctx.ui.custom<TranscriptPagerAction>(\n (tui, theme, keybindings, done) =>\n new BtwTranscriptPager(tui, theme, thread.turns, done, {\n startAtBottom,\n initialQuestion,\n markdownTransformers: createMarkdownTransformers(theme),\n thinking: { ...thinking, keybindings },\n }),\n );\n}\n\ntype MessageContentBlock = {\n type?: string;\n text?: string;\n name?: string;\n arguments?: unknown;\n result?: unknown;\n};\n\ntype SessionMessage = {\n role?: string;\n content?: unknown;\n stopReason?: string;\n};\n\ntype SessionEntry = {\n type: string;\n message?: SessionMessage;\n};\n\nexport function buildConversationContext(entries: readonly SessionEntry[]) {\n const sections: string[] = [];\n\n for (const entry of entries) {\n if (entry.type !== \"message\" || !entry.message?.role) continue;\n\n const role = entry.message.role;\n if (role !== \"user\" && role !== \"assistant\") continue;\n\n const contentLines = extractContentLines(entry.message.content);\n if (contentLines.length === 0) continue;\n\n const label = role === \"user\" ? \"User\" : \"Assistant\";\n const status =\n entry.message.stopReason && entry.message.stopReason !== \"stop\" ? ` (${entry.message.stopReason})` : \"\";\n sections.push(`${label}${status}: ${contentLines.join(\"\\n\")}`);\n }\n\n return truncateFromStart(sections.join(\"\\n\\n\"), MAX_CONTEXT_CHARS);\n}\n\nfunction extractContentLines(content: unknown): string[] {\n if (typeof content === \"string\") return [content.trim()].filter(Boolean);\n if (!Array.isArray(content)) return [];\n\n const lines: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== \"object\") continue;\n const block = part as MessageContentBlock;\n if (block.type === \"text\" && typeof block.text === \"string\") {\n lines.push(block.text.trim());\n } else if (block.type === \"toolCall\" && typeof block.name === \"string\") {\n lines.push(`Tool call: ${block.name}(${formatJson(block.arguments)})`);\n } else if (block.type === \"toolResult\" && typeof block.name === \"string\") {\n lines.push(`Tool result from ${block.name}: ${formatJson(block.result)}`);\n }\n }\n return lines.filter(Boolean);\n}\n\nfunction formatJson(value: unknown) {\n if (value === undefined) return \"\";\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction truncateFromStart(text: string, maxChars: number) {\n if (text.length <= maxChars) return text;\n return `[Earlier context omitted; showing the last ${maxChars} characters.]\\n${text.slice(-maxChars)}`;\n}\n", "import type { KeybindingsManager, Theme } from \"@earendil-works/pi-coding-agent\";\nimport { type Component, Key, matchesKey, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { SideThreadTurn } from \"./side-thread.js\";\n\nconst RESERVED_APP_ROWS = 3;\nconst GRAPHEME_SEGMENTER = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport interface BtwBringToMainSegment {\n role: \"user\" | \"assistant\";\n text: string;\n}\n\nexport interface BtwBringToMainSummary {\n lines: number;\n messages: number;\n tokens: number;\n}\n\nexport interface BtwSelectionLine {\n role: BtwBringToMainSegment[\"role\"];\n text: string;\n}\n\nexport interface BtwTextPosition {\n line: number;\n column: number;\n}\n\nexport interface BtwTextRangeSelectorState {\n cursor: BtwTextPosition;\n anchor?: BtwTextPosition;\n lineAnchor?: number;\n preferredColumn: number;\n scrollOffset: number;\n horizontalOffset: number;\n}\n\nexport type BtwQuickBringToMainScope =\n | { kind: \"latest\" }\n | { kind: \"from\"; answeredTurnIndex: number }\n | { kind: \"entire\" };\n\nexport type BtwTextRangeSelectorAction =\n | { kind: \"confirm\"; segments: BtwBringToMainSegment[] }\n | { kind: \"back\" }\n | { kind: \"close\" };\n\nexport function getAnsweredTurns(turns: readonly SideThreadTurn[]): Extract<SideThreadTurn, { kind: \"answered\" }>[] {\n return turns.filter((turn): turn is Extract<SideThreadTurn, { kind: \"answered\" }> => turn.kind === \"answered\");\n}\n\nexport function buildQuickBringToMainSegments(\n turns: readonly SideThreadTurn[],\n scope: BtwQuickBringToMainScope,\n): BtwBringToMainSegment[] {\n const answered = getAnsweredTurns(turns);\n const selected =\n scope.kind === \"latest\"\n ? answered.slice(-1)\n : scope.kind === \"from\"\n ? answered.slice(Math.max(0, scope.answeredTurnIndex))\n : answered;\n return selected.flatMap((turn) => [\n { role: \"user\" as const, text: turn.question },\n { role: \"assistant\" as const, text: turn.answer },\n ]);\n}\n\nexport function buildBtwSelectionLines(turns: readonly SideThreadTurn[]): BtwSelectionLine[] {\n return buildQuickBringToMainSegments(turns, { kind: \"entire\" }).flatMap((segment) =>\n segment.text.split(\"\\n\").map((text) => ({ role: segment.role, text })),\n );\n}\n\nexport function segmentsFromLineRange(\n lines: readonly BtwSelectionLine[],\n anchor: number,\n cursor: number,\n): BtwBringToMainSegment[] {\n if (lines.length === 0) return [];\n const start = Math.max(0, Math.min(anchor, cursor, lines.length - 1));\n const end = Math.max(0, Math.min(Math.max(anchor, cursor), lines.length - 1));\n const segments: BtwBringToMainSegment[] = [];\n for (const line of lines.slice(start, end + 1)) {\n const previous = segments.at(-1);\n if (previous?.role === line.role) {\n previous.text += `\\n${line.text}`;\n } else {\n segments.push({ role: line.role, text: line.text });\n }\n }\n return segments;\n}\n\nexport function segmentsFromTextRange(\n lines: readonly BtwSelectionLine[],\n anchor: BtwTextPosition,\n cursor: BtwTextPosition,\n): BtwBringToMainSegment[] {\n if (lines.length === 0) return [];\n const first = clampTextPosition(lines, anchor);\n const second = clampTextPosition(lines, cursor);\n const [start, end] = compareTextPositions(first, second) <= 0 ? [first, second] : [second, first];\n if (compareTextPositions(start, end) === 0) return [];\n\n const segments: BtwBringToMainSegment[] = [];\n for (let lineIndex = start.line; lineIndex <= end.line; lineIndex += 1) {\n const line = lines[lineIndex];\n if (!line) continue;\n const characters = splitGraphemes(line.text);\n const from = lineIndex === start.line ? start.column : 0;\n const to = lineIndex === end.line ? end.column : characters.length;\n const text = characters.slice(from, to).join(\"\");\n if (text) {\n const previous = segments.at(-1);\n if (previous?.role === line.role) previous.text += text;\n else segments.push({ role: line.role, text });\n }\n const crossesSameRoleLine = lineIndex < end.line && lines[lineIndex + 1]?.role === line.role;\n if (crossesSameRoleLine) {\n const current = segments.at(-1);\n if (current?.role === line.role) current.text += \"\\n\";\n else segments.push({ role: line.role, text: \"\\n\" });\n }\n }\n return segments;\n}\n\nexport function estimateBringToMainTokens(segments: readonly BtwBringToMainSegment[]): number {\n return Math.ceil(Buffer.byteLength(segments.map((segment) => segment.text).join(\"\\n\"), \"utf8\") / 4);\n}\n\nexport function summarizeBringToMain(segments: readonly BtwBringToMainSegment[]): BtwBringToMainSummary {\n return {\n lines: segments.reduce((count, segment) => count + segment.text.split(\"\\n\").length, 0),\n messages: segments.length,\n tokens: estimateBringToMainTokens(segments),\n };\n}\n\nexport function formatBtwBringToMain(segments: readonly BtwBringToMainSegment[]): string {\n const body = segments\n .map((segment) => `${segment.role === \"user\" ? \"User\" : \"Assistant\"}:\\n${escapeBringToMainText(segment.text)}`)\n .join(\"\\n\\n\");\n return [\n \"The following context was brought back from a /btw side discussion.\",\n \"Treat it as discussion context, not as work already completed.\",\n \"\",\n \"<btw_context>\",\n body,\n \"</btw_context>\",\n ].join(\"\\n\");\n}\n\nexport class BtwTextRangeSelector implements Component {\n private readonly lines: BtwSelectionLine[];\n private cursor: BtwTextPosition = { line: 0, column: 0 };\n private anchor: BtwTextPosition | undefined;\n private lineAnchor: number | undefined;\n private preferredColumn = 0;\n private scrollOffset = 0;\n private horizontalOffset = 0;\n private warning: string | undefined;\n private finished = false;\n\n constructor(\n private readonly tui: TUI,\n private readonly theme: Theme,\n private readonly keybindings: KeybindingsManager,\n turns: readonly SideThreadTurn[],\n private readonly onAction: (action: BtwTextRangeSelectorAction) => void,\n initialState?: BtwTextRangeSelectorState,\n ) {\n this.lines = buildBtwSelectionLines(turns);\n if (initialState) {\n this.cursor = clampTextPosition(this.lines, initialState.cursor);\n this.anchor = initialState.anchor ? clampTextPosition(this.lines, initialState.anchor) : undefined;\n this.lineAnchor =\n initialState.lineAnchor === undefined\n ? undefined\n : Math.max(0, Math.min(this.lines.length - 1, initialState.lineAnchor));\n this.preferredColumn = Math.max(0, initialState.preferredColumn);\n this.scrollOffset = Math.max(0, initialState.scrollOffset);\n this.horizontalOffset = Math.max(0, initialState.horizontalOffset);\n }\n }\n\n getState(): BtwTextRangeSelectorState {\n return {\n cursor: { ...this.cursor },\n anchor: this.anchor ? { ...this.anchor } : undefined,\n lineAnchor: this.lineAnchor,\n preferredColumn: this.preferredColumn,\n scrollOffset: this.scrollOffset,\n horizontalOffset: this.horizontalOffset,\n };\n }\n\n render(width: number): string[] {\n const safeWidth = Math.max(1, width);\n const availableRows = Math.max(1, this.tui.terminal.rows - RESERVED_APP_ROWS);\n const showStatus = availableRows >= 4;\n const showFooter = availableRows >= 3;\n const viewportHeight = Math.max(1, availableRows - 1 - (showStatus ? 1 : 0) - (showFooter ? 1 : 0));\n this.keepCursorVisible(viewportHeight);\n const textWidth = Math.max(1, safeWidth - visibleWidth(\"\u25CF> Assistant \u2502 \"));\n this.keepCursorHorizontallyVisible(textWidth);\n const range = this.getSelectionRange();\n const lineRange = this.getLineSelectionRange();\n const visible = this.lines.slice(this.scrollOffset, this.scrollOffset + viewportHeight);\n const rows = visible.map((line, visibleIndex) => {\n const lineIndex = this.scrollOffset + visibleIndex;\n const role = line.role === \"user\" ? \"User\" : \"Assistant\";\n const lineSelected = lineRange ? lineIndex >= lineRange.start && lineIndex <= lineRange.end : false;\n const prefix = `${lineSelected ? \"\u25CF\" : \" \"}${lineIndex === this.cursor.line ? \">\" : \" \"} ${role.padEnd(9)} \u2502 `;\n const text = this.renderTextLine(line, lineIndex, range, lineSelected);\n return truncateToWidth(\n lineIndex === this.cursor.line ? this.theme.fg(\"accent\", prefix) + text : prefix + text,\n safeWidth,\n \"\",\n );\n });\n const selected = this.getSelectedSegments();\n const summary = summarizeBringToMain(selected);\n const status =\n selected.length === 0\n ? \"Selected: none\"\n : `Selected: ${summary.lines} ${summary.lines === 1 ? \"line\" : \"lines\"} \u00B7 ${summary.messages} ${summary.messages === 1 ? \"message\" : \"messages\"} \u00B7 ~${summary.tokens} ${summary.tokens === 1 ? \"token\" : \"tokens\"}`;\n const confirm = confirmKeyLabel(this.keybindings);\n const back = keybindingLabel(this.keybindings, \"tui.select.cancel\", [\"ctrl+c\"]);\n const vertical = `${keybindingLabel(this.keybindings, \"tui.select.up\")}/${keybindingLabel(this.keybindings, \"tui.select.down\")}`;\n const confirmUsesSpace = this.keybindings.matches(\" \", \"tui.select.confirm\");\n const detailedFooter = this.warning\n ? `${this.warning} \u2022 ${confirmUsesSpace ? \"Shift+Arrows select\" : \"Space lines \u2022 Shift+Arrows text\"} \u2022 ${back} back \u2022 Ctrl+C close`\n : this.lineAnchor !== undefined\n ? `${confirmUsesSpace ? `${vertical} extend lines` : `Space clear \u2022 ${vertical} extend lines`} \u2022 Shift+Arrows text \u2022 ${confirm} bring \u2022 ${back} back \u2022 Ctrl+C close`\n : `Shift+Arrows select \u2022 Arrows move${confirmUsesSpace ? \"\" : \" \u2022 Space lines\"} \u2022 ${confirm} bring \u2022 ${back} back \u2022 Ctrl+C close`;\n const criticalFooter = `${confirm} bring \u2022 ${back} back \u2022 Ctrl+C close`;\n const footer = visibleWidth(detailedFooter) <= safeWidth ? detailedFooter : criticalFooter;\n return fitRows(\n [\n truncateToWidth(this.theme.fg(\"accent\", this.theme.bold(\"Select text to bring to main\")), safeWidth, \"\"),\n ...(showStatus ? [truncateToWidth(this.theme.fg(\"muted\", status), safeWidth, \"\")] : []),\n ...rows,\n ...(showFooter\n ? [truncateToWidth(this.theme.fg(this.warning ? \"warning\" : \"muted\", footer), safeWidth, \"\")]\n : []),\n ],\n availableRows,\n );\n }\n\n handleInput(data: string): void {\n if (this.finished) return;\n if (matchesKey(data, Key.ctrl(\"c\"))) {\n this.finish({ kind: \"close\" });\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.cancel\")) {\n this.finish({ kind: \"back\" });\n return;\n }\n if (matchesConfirm(data, this.keybindings)) {\n if (this.lines.length > 0) {\n const segments = this.getSelectedSegments();\n if (segments.length === 0) {\n this.warning = \"Select text first\";\n this.tui.requestRender();\n } else {\n this.finish({ kind: \"confirm\", segments });\n }\n }\n return;\n }\n if (matchesKey(data, Key.space)) {\n this.anchor = undefined;\n this.lineAnchor = this.lineAnchor === undefined ? this.cursor.line : undefined;\n this.afterMove();\n return;\n }\n if (matchesKey(data, Key.shift(\"left\"))) {\n this.moveHorizontal(-1, true);\n return;\n }\n if (matchesKey(data, Key.shift(\"right\"))) {\n this.moveHorizontal(1, true);\n return;\n }\n if (matchesKey(data, Key.shift(\"up\"))) {\n this.moveVertical(-1, true);\n return;\n }\n if (matchesKey(data, Key.shift(\"down\"))) {\n this.moveVertical(1, true);\n return;\n }\n if (matchesKey(data, Key.left)) {\n this.moveHorizontal(-1, false);\n return;\n }\n if (matchesKey(data, Key.right)) {\n this.moveHorizontal(1, false);\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.up\")) {\n this.moveVertical(-1, false);\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.down\")) {\n this.moveVertical(1, false);\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.pageUp\")) {\n this.moveVertical(-10, false);\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.pageDown\")) {\n this.moveVertical(10, false);\n return;\n }\n }\n\n invalidate(): void {}\n\n private renderTextLine(\n line: BtwSelectionLine,\n lineIndex: number,\n range: { start: BtwTextPosition; end: BtwTextPosition } | undefined,\n lineSelected: boolean,\n ): string {\n const characters = splitGraphemes(line.text);\n let rendered = this.horizontalOffset > 0 ? this.theme.fg(\"muted\", \"\u2026\") : \"\";\n let buffer = \"\";\n let bufferSelected = false;\n const flush = () => {\n if (!buffer) return;\n rendered += bufferSelected ? this.theme.bg(\"selectedBg\", this.theme.fg(\"text\", buffer)) : buffer;\n buffer = \"\";\n };\n for (let column = this.horizontalOffset; column <= characters.length; column += 1) {\n if (range && lineIndex === range.start.line && column === range.start.column) {\n flush();\n rendered += this.theme.fg(\"accent\", \"[\");\n }\n if (lineIndex === this.cursor.line && column === this.cursor.column) {\n flush();\n rendered += this.theme.fg(\"accent\", \"\u2502\");\n }\n if (range && lineIndex === range.end.line && column === range.end.column) {\n flush();\n rendered += this.theme.fg(\"accent\", \"]\");\n }\n const character = characters[column];\n if (character === undefined) continue;\n const selected = lineSelected || (range ? positionFallsInside(lineIndex, column, range) : false);\n if (buffer && selected !== bufferSelected) flush();\n bufferSelected = selected;\n buffer += escapeTerminalControls(character);\n }\n flush();\n return rendered;\n }\n\n private getSelectionRange(): { start: BtwTextPosition; end: BtwTextPosition } | undefined {\n if (!this.anchor || compareTextPositions(this.anchor, this.cursor) === 0) return undefined;\n return compareTextPositions(this.anchor, this.cursor) < 0\n ? { start: this.anchor, end: this.cursor }\n : { start: this.cursor, end: this.anchor };\n }\n\n private getLineSelectionRange(): { start: number; end: number } | undefined {\n return this.lineAnchor === undefined\n ? undefined\n : {\n start: Math.min(this.lineAnchor, this.cursor.line),\n end: Math.max(this.lineAnchor, this.cursor.line),\n };\n }\n\n private getSelectedSegments(): BtwBringToMainSegment[] {\n if (this.lineAnchor !== undefined) {\n return segmentsFromLineRange(this.lines, this.lineAnchor, this.cursor.line);\n }\n return this.anchor ? segmentsFromTextRange(this.lines, this.anchor, this.cursor) : [];\n }\n\n private moveHorizontal(delta: -1 | 1, extend: boolean): void {\n if (this.lines.length === 0) return;\n if (!extend) this.lineAnchor = undefined;\n if (!extend && this.anchor) {\n const range = this.getSelectionRange();\n if (range) this.cursor = delta < 0 ? range.start : range.end;\n this.anchor = undefined;\n this.preferredColumn = this.cursor.column;\n this.afterMove();\n return;\n }\n this.beginOrClearSelection(extend);\n const line = this.lines[this.cursor.line];\n const length = line ? splitGraphemes(line.text).length : 0;\n if (delta < 0) {\n if (this.cursor.column > 0) this.cursor = { ...this.cursor, column: this.cursor.column - 1 };\n else if (this.cursor.line > 0) {\n const previousLine = this.lines[this.cursor.line - 1];\n this.cursor = {\n line: this.cursor.line - 1,\n column: previousLine ? splitGraphemes(previousLine.text).length : 0,\n };\n }\n } else if (this.cursor.column < length) {\n this.cursor = { ...this.cursor, column: this.cursor.column + 1 };\n } else if (this.cursor.line < this.lines.length - 1) {\n this.cursor = { line: this.cursor.line + 1, column: 0 };\n }\n this.preferredColumn = this.cursor.column;\n this.afterMove();\n }\n\n private moveVertical(delta: number, extend: boolean): void {\n if (this.lines.length === 0) return;\n if (extend || this.lineAnchor === undefined) this.beginOrClearSelection(extend);\n const line = Math.max(0, Math.min(this.lines.length - 1, this.cursor.line + delta));\n const target = this.lines[line];\n this.cursor = {\n line,\n column: Math.min(this.preferredColumn, target ? splitGraphemes(target.text).length : 0),\n };\n this.afterMove();\n }\n\n private beginOrClearSelection(extend: boolean): void {\n if (extend) this.lineAnchor = undefined;\n if (extend && !this.anchor) this.anchor = { ...this.cursor };\n if (!extend) this.anchor = undefined;\n }\n\n private afterMove(): void {\n this.warning = undefined;\n this.tui.requestRender();\n }\n\n private keepCursorVisible(height: number): void {\n if (height <= 0) return;\n if (this.cursor.line < this.scrollOffset) this.scrollOffset = this.cursor.line;\n if (this.cursor.line >= this.scrollOffset + height) {\n this.scrollOffset = this.cursor.line - height + 1;\n }\n }\n\n private keepCursorHorizontallyVisible(width: number): void {\n const characters = splitGraphemes(this.lines[this.cursor.line]?.text ?? \"\");\n const displayWidths = characters.map((character) => visibleWidth(escapeTerminalControls(character)));\n const currentWidth = displayWidths[this.cursor.column] ?? 0;\n let usedWidth = 1 + Math.min(currentWidth, Math.max(0, width - 1));\n let offset = this.cursor.column;\n for (let index = this.cursor.column - 1; index >= 0; index -= 1) {\n const nextWidth = usedWidth + (displayWidths[index] ?? 0) + (index > 0 ? 1 : 0);\n if (nextWidth > width) break;\n usedWidth += displayWidths[index] ?? 0;\n offset = index;\n }\n this.horizontalOffset = offset;\n }\n\n private finish(action: BtwTextRangeSelectorAction): void {\n if (this.finished) return;\n this.finished = true;\n this.onAction(action);\n }\n}\n\nfunction clampTextPosition(lines: readonly BtwSelectionLine[], position: BtwTextPosition): BtwTextPosition {\n const line = Math.max(0, Math.min(lines.length - 1, position.line));\n const text = lines[line]?.text ?? \"\";\n return {\n line,\n column: Math.max(0, Math.min(splitGraphemes(text).length, position.column)),\n };\n}\n\nfunction confirmKeyLabel(keybindings: KeybindingsManager): string {\n return keybindingLabel(keybindings, \"tui.select.confirm\", [\"ctrl+c\"], \"enter\");\n}\n\nfunction matchesConfirm(data: string, keybindings: KeybindingsManager): boolean {\n if (matchesKey(data, Key.ctrl(\"c\"))) return false;\n const hasUsableBinding = keybindings\n .getKeys(\"tui.select.confirm\")\n .map(String)\n .some((key) => key.toLowerCase() !== \"ctrl+c\");\n return keybindings.matches(data, \"tui.select.confirm\") || (!hasUsableBinding && matchesKey(data, Key.enter));\n}\n\nfunction keybindingLabel(\n keybindings: KeybindingsManager,\n keybinding:\n | \"tui.select.confirm\"\n | \"tui.select.cancel\"\n | \"tui.select.up\"\n | \"tui.select.down\"\n | \"tui.select.pageUp\"\n | \"tui.select.pageDown\",\n excluded: readonly string[] = [],\n fallback?: string,\n): string {\n const key = keybindings\n .getKeys(keybinding)\n .map(String)\n .find((candidate) => !excluded.includes(candidate.toLowerCase()));\n return formatKeyLabel(key ?? fallback ?? keybinding);\n}\n\nfunction formatKeyLabel(key: string): string {\n return key\n .split(\"+\")\n .map((part) => {\n const lower = part.toLowerCase();\n if (lower === \"ctrl\") return \"Ctrl\";\n if (lower === \"alt\") return \"Alt\";\n if (lower === \"shift\") return \"Shift\";\n if (lower === \"escape\" || lower === \"esc\") return \"Esc\";\n if (lower === \"enter\" || lower === \"return\") return \"Enter\";\n if (lower === \"pageup\") return \"PgUp\";\n if (lower === \"pagedown\") return \"PgDn\";\n return part.length === 1 ? part.toUpperCase() : `${part[0]?.toUpperCase() ?? \"\"}${part.slice(1)}`;\n })\n .join(\"+\");\n}\n\nfunction splitGraphemes(text: string): string[] {\n return [...GRAPHEME_SEGMENTER.segment(text)].map(({ segment }) => segment);\n}\n\nfunction compareTextPositions(first: BtwTextPosition, second: BtwTextPosition): number {\n return first.line === second.line ? first.column - second.column : first.line - second.line;\n}\n\nfunction positionFallsInside(\n line: number,\n column: number,\n range: { start: BtwTextPosition; end: BtwTextPosition },\n): boolean {\n const position = { line, column };\n return compareTextPositions(position, range.start) >= 0 && compareTextPositions(position, range.end) < 0;\n}\n\nfunction fitRows(rows: string[], availableRows: number): string[] {\n if (rows.length <= availableRows) return rows;\n if (availableRows <= 1) return rows.slice(0, 1);\n return [rows[0] ?? \"\", ...rows.slice(rows.length - availableRows + 1)];\n}\n\nfunction escapeBringToMainText(text: string): string {\n return [...text]\n .map((character) => {\n if (character === \"\\n\") return character;\n if (character === \"\\t\") return \" \";\n const code = character.charCodeAt(0);\n if (code <= 31 || (code >= 127 && code <= 159)) {\n return `\\\\x${code.toString(16).padStart(2, \"0\")}`;\n }\n return character;\n })\n .join(\"\")\n .replace(/<btw_context(?=[ \\t\\r\\n>])/g, \"<btw_context\")\n .replace(/<\\/btw_context[ \\t\\r\\n]*>/g, (terminator) => terminator.replaceAll(\"<\", \"<\").replaceAll(\">\", \">\"));\n}\n\nfunction escapeTerminalControls(text: string): string {\n return [...text]\n .map((character) => {\n const code = character.charCodeAt(0);\n if (code <= 31 || (code >= 127 && code <= 159)) {\n return `\\\\x${code.toString(16).padStart(2, \"0\")}`;\n }\n return character;\n })\n .join(\"\");\n}\n", "import { spawn } from \"node:child_process\";\nimport {\n copyToClipboard as copyToHostClipboard,\n type ExtensionCommandContext,\n type KeybindingsManager,\n type Theme,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n type Component,\n isKeyRelease,\n isKittyProtocolActive,\n Key,\n type OverlayHandle,\n parseKey,\n type TUI,\n TuiAltScreen,\n type TuiInputListener,\n type TuiInputListenerResult,\n truncateToWidth,\n} from \"@earendil-works/pi-tui\";\nimport { type BtwKeybindingOverrides, BtwPasteGuard, resolveBtwShortcuts, setBtwShortcuts } from \"./keybindings.js\";\nimport { formatKeyLabel, sanitizeSingleLine } from \"./text.js\";\n\ntype BtwCustomOptions = Parameters<ExtensionCommandContext[\"ui\"][\"custom\"]>[1];\ntype BtwCustomFactory<T> = (\n tui: TUI,\n theme: Theme,\n keybindings: KeybindingsManager,\n done: (result: T) => void,\n) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>;\n\ntype BtwFullscreenTui = TUI & {\n flash?: (message: string, durationMs?: number) => void;\n setLayoutRoot(component: Component | undefined): void;\n addInputListenerBeforeAll?(listener: TuiInputListener): () => void;\n addInputListenerBeforeViewport?(listener: TuiInputListener): () => void;\n};\n\nexport interface BtwFullscreenLayoutComponent extends Component {\n getFullscreenLayout(): Component;\n}\n\nexport interface BtwFullscreenOptions {\n keybindings?: BtwKeybindingOverrides;\n copyOnSelect?: boolean;\n}\n\nexport type BtwFullscreenTuiFactory = (\n parent: TUI,\n theme: Theme,\n keybindings: KeybindingsManager,\n options: BtwFullscreenOptions,\n) => BtwFullscreenTui;\n\nexport interface BtwFullscreenDependencies {\n createTui?: BtwFullscreenTuiFactory;\n openUrl?: (url: string) => void;\n copyToClipboard?: (text: string) => Promise<void>;\n manualSelectionCopySupported?: boolean;\n}\n\nexport type RunBtwFullscreen = <T>(\n ctx: ExtensionCommandContext,\n run: (ctx: ExtensionCommandContext) => Promise<T>,\n options?: BtwFullscreenOptions,\n) => Promise<T>;\n\ntype FullscreenOutcome<T> = { kind: \"completed\"; value: T } | { kind: \"failed\"; error: unknown };\n\nclass FullscreenUiDisposedError extends Error {\n constructor() {\n super(\"The dedicated pi-btw UI was disposed.\");\n this.name = \"FullscreenUiDisposedError\";\n }\n}\n\nexport async function runBtwFullscreen<T>(\n ctx: ExtensionCommandContext,\n run: (ctx: ExtensionCommandContext) => Promise<T>,\n options: BtwFullscreenOptions = {},\n dependencies: BtwFullscreenDependencies = {},\n): Promise<T> {\n const createTui =\n dependencies.createTui ??\n ((parent: TUI, theme: Theme, keybindings: KeybindingsManager, fullscreenOptions: BtwFullscreenOptions) =>\n createBtwFullscreenTui(\n parent,\n theme,\n keybindings,\n fullscreenOptions.copyOnSelect ?? true,\n dependencies.manualSelectionCopySupported ?? hasManualSelectionCopyApi(),\n dependencies.openUrl ?? openUrlInBrowser,\n dependencies.copyToClipboard ?? copyToHostClipboard,\n ));\n let liveEditorText = ctx.ui.getEditorText();\n let restoreEditor = false;\n let host: BtwFullscreenHost<T> | undefined;\n const outcome = await ctx.ui.custom<FullscreenOutcome<T>>(\n (parent, theme, keybindings, done) => {\n host = new BtwFullscreenHost(\n parent,\n theme,\n keybindings,\n ctx,\n run,\n (value) => {\n try {\n liveEditorText = ctx.ui.getEditorText();\n restoreEditor = true;\n } catch {\n // A replaced session owns a different editor and must not receive stale text.\n }\n done(value);\n },\n createTui,\n options,\n );\n return host;\n },\n {\n overlay: true,\n onHandle: (handle) => host?.setParentOverlay(handle),\n },\n );\n if (restoreEditor) {\n try {\n if (ctx.ui.getEditorText() !== liveEditorText) ctx.ui.setEditorText(liveEditorText);\n } catch {\n // A replaced session owns a different editor and must not receive stale restoration.\n }\n }\n if (outcome.kind === \"failed\") throw outcome.error;\n return outcome.value;\n}\n\ntype BtwInputListeners = {\n beforeAll: Set<TuiInputListener>;\n beforeViewport: Set<TuiInputListener>;\n regular: Set<TuiInputListener>;\n};\n\nconst btwInputListeners = new WeakMap<BtwTuiAltScreen, BtwInputListeners>();\n\nfunction dispatchBtwInput(listeners: BtwInputListeners, data: string): TuiInputListenerResult {\n let current = data;\n for (const group of [listeners.beforeAll, listeners.beforeViewport, listeners.regular]) {\n for (const listener of group) {\n const result = listener(current);\n if (result?.consume) return result;\n if (result?.data !== undefined) current = result.data;\n }\n }\n return current === data ? undefined : { data: current };\n}\n\nclass BtwTuiAltScreen extends TuiAltScreen {\n hasFocusedOverlay(): boolean {\n return this.isOverlayFocused();\n }\n\n override addInputListener(listener: TuiInputListener): () => void {\n let listeners = btwInputListeners.get(this);\n if (!listeners) {\n const registeredListeners: BtwInputListeners = {\n beforeAll: new Set(),\n beforeViewport: new Set(),\n regular: new Set(),\n };\n btwInputListeners.set(this, registeredListeners);\n super.addInputListener((data) => dispatchBtwInput(registeredListeners, data));\n listeners = registeredListeners;\n }\n listeners.regular.add(listener);\n return () => listeners.regular.delete(listener);\n }\n\n addInputListenerBeforeAll(listener: TuiInputListener): () => void {\n const listeners = btwInputListeners.get(this);\n if (!listeners) return super.addInputListener(listener);\n listeners.beforeAll.add(listener);\n return () => listeners.beforeAll.delete(listener);\n }\n\n addInputListenerBeforeViewport(listener: TuiInputListener): () => void {\n const listeners = btwInputListeners.get(this);\n if (!listeners) return super.addInputListener(listener);\n listeners.beforeViewport.add(listener);\n return () => listeners.beforeViewport.delete(listener);\n }\n\n override removeInputListener(listener: TuiInputListener): void {\n const listeners = btwInputListeners.get(this);\n if (!listeners) {\n super.removeInputListener(listener);\n return;\n }\n listeners.beforeAll.delete(listener);\n listeners.beforeViewport.delete(listener);\n listeners.regular.delete(listener);\n }\n}\n\nconst BRACKETED_PASTE_START = \"\\u001b[200~\";\nconst BRACKETED_PASTE_END = \"\\u001b[201~\";\n\n// TuiAltScreen evaluates these actions before bottom, so shared keys cannot jump to latest.\nconst ALT_SCREEN_ACTIONS_BEFORE_BOTTOM = [\n \"tui.altScreen.search\",\n \"tui.altScreen.searchNext\",\n \"tui.altScreen.searchPrevious\",\n \"tui.altScreen.searchClose\",\n \"tui.altScreen.pageUp\",\n \"tui.altScreen.pageDown\",\n \"tui.altScreen.halfPageUp\",\n \"tui.altScreen.halfPageDown\",\n \"tui.altScreen.lineUp\",\n \"tui.altScreen.lineDown\",\n \"tui.altScreen.previousPrompt\",\n \"tui.altScreen.nextPrompt\",\n \"tui.altScreen.top\",\n] as const;\nconst KEY_MODIFIER_ORDER = [\"shift\", \"ctrl\", \"alt\", \"super\"] as const;\nconst MATCHABLE_SPECIAL_KEYS = new Set([\n \"space\",\n \"tab\",\n \"enter\",\n \"backspace\",\n \"delete\",\n \"insert\",\n \"home\",\n \"end\",\n \"pageup\",\n \"pagedown\",\n \"up\",\n \"down\",\n \"left\",\n \"right\",\n]);\nconst MATCHABLE_SYMBOL_KEYS = new Set(\"`-=[]\\\\;',./!@#$%^&*()_+|~{}:<>?\");\n\nfunction normalizedKeyId(key: string): string {\n const parts = key.toLowerCase().split(\"+\");\n const base = parts.at(-1);\n if (!base) return \"\";\n const normalizedBase = base === \"esc\" ? \"escape\" : base === \"return\" ? \"enter\" : base;\n const modifiers = KEY_MODIFIER_ORDER.filter((modifier) => parts.includes(modifier));\n return [...modifiers, normalizedBase].join(\"+\");\n}\n\nfunction formatEffectiveKeyLabel(key: string): string {\n const parts = key.split(\"+\");\n const base = parts.at(-1);\n if (base === \"pageup\") parts[parts.length - 1] = \"pageUp\";\n if (base === \"pagedown\") parts[parts.length - 1] = \"pageDown\";\n return formatKeyLabel(parts.join(\"+\"));\n}\n\nfunction canMatchKeyInput(key: string): boolean {\n const parts = key.split(\"+\");\n const base = parts.at(-1) ?? \"\";\n const modifiers = parts.slice(0, -1);\n if (base === \"escape\") return modifiers.length === 0;\n if (base === \"clear\") {\n return modifiers.length === 0 || (modifiers.length === 1 && (modifiers[0] === \"shift\" || modifiers[0] === \"ctrl\"));\n }\n if (/^f(?:[1-9]|1[0-2])$/u.test(base)) return modifiers.length === 0;\n return (\n MATCHABLE_SPECIAL_KEYS.has(base) ||\n (base.length === 1 && (/^[a-z0-9]$/u.test(base) || MATCHABLE_SYMBOL_KEYS.has(base)))\n );\n}\n\nfunction rawCtrlInput(base: string): string | undefined {\n if (base.length !== 1) return undefined;\n const rawBase = base === \"-\" ? \"_\" : base;\n if (!\"abcdefghijklmnopqrstuvwxyz[\\\\]_\".includes(rawBase)) return undefined;\n return String.fromCharCode(rawBase.charCodeAt(0) & 0x1f);\n}\n\nfunction legacyRawInput(key: string): string | undefined {\n const parts = key.split(\"+\");\n const base = parts.at(-1) ?? \"\";\n if (parts.length === 2 && parts[0] === \"ctrl\") return rawCtrlInput(base);\n if (isKittyProtocolActive()) return undefined;\n if (parts.length === 2 && parts[0] === \"alt\" && base.length === 1) return `\\u001b${base}`;\n if (parts.length === 3 && parts[0] === \"ctrl\" && parts[1] === \"alt\") {\n const input = rawCtrlInput(base);\n return input ? `\\u001b${input}` : undefined;\n }\n return undefined;\n}\n\n// Mirror matchesKey(), using parseKey() to canonicalize IDs that share legacy raw input.\nfunction keyInputIdentity(key: string): string {\n const identity = normalizedKeyId(key);\n const input = legacyRawInput(identity);\n return input ? normalizedKeyId(parseKey(input) ?? identity) : identity;\n}\n\nfunction hasManualSelectionCopyApi(): boolean {\n return (\n typeof TuiAltScreen.prototype.hasActiveSelection === \"function\" &&\n typeof TuiAltScreen.prototype.copyActiveSelectionToClipboard === \"function\"\n );\n}\n\nfunction createBtwFullscreenTui(\n parent: TUI,\n theme: Theme,\n keybindings: KeybindingsManager,\n copyOnSelect: boolean,\n manualSelectionCopySupported: boolean,\n openUrl: (url: string) => void,\n copyToClipboard: (text: string) => Promise<void>,\n): BtwFullscreenTui {\n if (!copyOnSelect && !manualSelectionCopySupported) {\n throw new Error(\n \"Manual fullscreen selection copying is unavailable in this Pi version; update Pi or enable automatic selection copying.\",\n );\n }\n const styleSearchMatch = (text: string) => theme.bg(\"searchMatchBg\", theme.fg(\"searchMatchText\", text));\n const fullscreen = new BtwTuiAltScreen(parent.terminal, parent.getShowHardwareCursor(), undefined, {\n mouse: true,\n copyOnSelect,\n searchMatchStyle: (text) => theme.underline(styleSearchMatch(text)),\n scrollToEndIndicator: () => {\n const unavailableKeyIdentities = new Set<string>([keyInputIdentity(Key.ctrl(\"c\"))]);\n for (const action of ALT_SCREEN_ACTIONS_BEFORE_BOTTOM) {\n for (const actionKey of keybindings.getKeys(action)) {\n unavailableKeyIdentities.add(keyInputIdentity(String(actionKey)));\n }\n }\n if (!copyOnSelect) {\n for (const copyKey of keybindings.getKeys(\"app.message.copy\")) {\n unavailableKeyIdentities.add(keyInputIdentity(String(copyKey)));\n }\n }\n const key = keybindings\n .getKeys(\"tui.altScreen.bottom\")\n .map((candidate) => keyInputIdentity(String(candidate)))\n .find(\n (identity) =>\n identity &&\n canMatchKeyInput(identity) &&\n !unavailableKeyIdentities.has(identity) &&\n formatEffectiveKeyLabel(identity),\n );\n const label = theme.fg(\"text\", \" \u2193 Jump to latest message\");\n const shortcut = key ? theme.fg(\"muted\", ` \u00B7 ${formatEffectiveKeyLabel(key)}`) : \"\";\n return theme.bg(\"selectedBg\", `${label}${shortcut} `);\n },\n searchCurrentMatchStyle: (text) => theme.bold(theme.inverse(styleSearchMatch(text))),\n openUrl,\n copySelection: async (text) => {\n try {\n await copyToClipboard(text);\n return true;\n } catch {\n return false;\n }\n },\n });\n if (!copyOnSelect) {\n let isInBracketedPaste = false;\n fullscreen.addInputListenerBeforeViewport((data) => {\n const wasInBracketedPaste = isInBracketedPaste;\n const startsBracketedPaste = data.includes(BRACKETED_PASTE_START);\n if (startsBracketedPaste) isInBracketedPaste = true;\n if (isInBracketedPaste && data.includes(BRACKETED_PASTE_END)) {\n isInBracketedPaste = false;\n }\n if (\n wasInBracketedPaste ||\n startsBracketedPaste ||\n fullscreen.hasFocusedOverlay() ||\n isKeyRelease(data) ||\n !keybindings.matches(data, \"app.message.copy\")\n ) {\n return undefined;\n }\n if (!fullscreen.hasActiveSelection()) {\n fullscreen.flash(\"No selection to copy\");\n return { consume: true };\n }\n void fullscreen.copyActiveSelectionToClipboard().catch(() => fullscreen.flash(\"Copy failed\"));\n return { consume: true };\n });\n }\n return fullscreen;\n}\n\n// Pi does not export its browser opener, so mirror its shell-free launcher for this isolated TUI.\nfunction openUrlInBrowser(target: string): void {\n const [command, args] =\n process.platform === \"darwin\"\n ? [\"open\", [target]]\n : process.platform === \"win32\"\n ? [\"rundll32\", [\"url.dll,FileProtocolHandler\", target]]\n : [\"xdg-open\", [target]];\n spawn(command, args, { stdio: \"ignore\", detached: true })\n .on(\"error\", () => {})\n .unref();\n}\n\nclass BtwFullscreenHost<T> implements Component {\n private fullscreen: BtwFullscreenTui | undefined;\n private parentOverlay: OverlayHandle | undefined;\n private cancelActiveCustom: (() => void) | undefined;\n private hardCancelActiveCustom: (() => void) | undefined;\n private removeHardCancelListener: (() => void) | undefined;\n private removeUpstreamAbortListener: (() => void) | undefined;\n private started = false;\n private disposed = false;\n private finished = false;\n private parentStopped = false;\n private parentRestoreAttempted = false;\n private fullscreenCreated = false;\n private fullscreenStopped = false;\n private parentRestoreQueued = false;\n private parentRestorePromise: Promise<void> | undefined;\n private cleanupError: unknown;\n private readonly lifetimeController = new AbortController();\n\n constructor(\n private readonly parent: TUI,\n private readonly theme: Theme,\n private readonly keybindings: KeybindingsManager,\n private readonly ctx: ExtensionCommandContext,\n private readonly run: (ctx: ExtensionCommandContext) => Promise<T>,\n private readonly done: (outcome: FullscreenOutcome<T>) => void,\n private readonly createTui: BtwFullscreenTuiFactory,\n private readonly options: BtwFullscreenOptions,\n ) {\n queueMicrotask(() => void this.start());\n }\n\n setParentOverlay(overlay: OverlayHandle): void {\n this.parentOverlay = overlay;\n }\n\n render(width: number): string[] {\n return [truncateToWidth(this.theme.fg(\"muted\", \"Opening btw side thread\u2026\"), width)];\n }\n\n invalidate(): void {}\n\n dispose(): void {\n if (this.disposed || this.finished) return;\n this.disposed = true;\n this.lifetimeController.abort();\n this.cancelActiveCustom?.();\n }\n\n private async start(): Promise<void> {\n if (this.started || this.finished) return;\n this.started = true;\n this.watchUpstreamCancellation();\n let outcome: FullscreenOutcome<T>;\n try {\n if (this.disposed) throw new FullscreenUiDisposedError();\n this.parent.stop({ preserveScreen: true });\n this.parentStopped = true;\n if (this.disposed) throw new FullscreenUiDisposedError();\n this.fullscreen = this.createTui(this.parent, this.theme, this.keybindings, this.options);\n this.fullscreenCreated = true;\n this.fullscreen.start();\n const shortcuts = resolveBtwShortcuts(\n this.options.keybindings,\n this.keybindings,\n this.options.copyOnSelect ?? true,\n );\n setBtwShortcuts(this.fullscreen, shortcuts);\n // Negotiate before warning when possible: the first dispatched user input uses\n // the current mode. Recheck each input, including later mode transitions.\n let previousWarnings: readonly string[] = [];\n const reportWarnings = () => {\n const warnings = shortcuts.warnings;\n for (const warning of warnings) {\n if (previousWarnings.includes(warning)) continue;\n try {\n this.ctx.ui.notify(`Pi BTW: ${warning}`, \"warning\");\n } catch {\n /* A replaced context must not prevent terminal cleanup. */\n }\n }\n previousWarnings = warnings;\n };\n const pasteGuard = new BtwPasteGuard();\n // Waiting for the custom promise would leave follow-up keys bound to the side TUI.\n const addHardCancelListener =\n this.fullscreen.addInputListenerBeforeAll?.bind(this.fullscreen) ??\n this.fullscreen.addInputListenerBeforeViewport?.bind(this.fullscreen) ??\n this.fullscreen.addInputListener.bind(this.fullscreen);\n this.removeHardCancelListener = addHardCancelListener((data) => {\n reportWarnings();\n if (pasteGuard.consume(data) || !shortcuts.matches(data, \"exit\")) return undefined;\n this.disposed = true;\n this.lifetimeController.abort();\n try {\n this.hardCancelActiveCustom?.();\n } finally {\n // ProcessTerminal.stop() destroys its active input buffer. Keep cancellation\n // synchronous, then drain input before the physical Windows terminal handoff.\n // Pi has no public input injection, so do not replay bytes already coalesced\n // behind the hard-cancel key.\n this.queueParentRestore();\n }\n return { consume: true };\n });\n outcome = { kind: \"completed\", value: await this.run(this.createContext()) };\n } catch (error) {\n outcome = { kind: \"failed\", error };\n }\n\n try {\n this.cancelActiveCustom?.();\n } catch (error) {\n this.cleanupError ??= error;\n }\n if (this.parentRestorePromise) await this.parentRestorePromise;\n else this.restoreParent();\n if (this.cleanupError !== undefined) outcome = { kind: \"failed\", error: this.cleanupError };\n this.finished = true;\n this.done(outcome);\n }\n\n private watchUpstreamCancellation(): void {\n const signal = this.ctx.signal;\n if (!signal) return;\n const onAbort = () => this.dispose();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n this.removeUpstreamAbortListener = () => signal.removeEventListener(\"abort\", onAbort);\n if (signal.aborted) onAbort();\n }\n\n private queueParentRestore(): void {\n if (this.parentRestoreQueued || this.parentRestoreAttempted) return;\n this.parentRestoreQueued = true;\n this.parentRestorePromise = Promise.resolve().then(async () => {\n try {\n await this.fullscreen?.terminal.drainInput?.();\n } catch (error) {\n this.cleanupError ??= error;\n }\n this.parentRestoreQueued = false;\n this.restoreParent();\n });\n }\n\n private restoreParent(): void {\n const removeUpstreamAbortListener = this.removeUpstreamAbortListener;\n this.removeUpstreamAbortListener = undefined;\n try {\n removeUpstreamAbortListener?.();\n } catch (error) {\n this.cleanupError ??= error;\n }\n const removeHardCancelListener = this.removeHardCancelListener;\n this.removeHardCancelListener = undefined;\n try {\n removeHardCancelListener?.();\n } catch (error) {\n this.cleanupError ??= error;\n }\n if (this.fullscreenCreated && !this.fullscreenStopped) {\n this.fullscreenStopped = true;\n try {\n this.fullscreen?.stop({ preserveScreen: true });\n } catch (error) {\n this.cleanupError ??= error;\n }\n }\n if (!this.parentStopped || this.parentRestoreAttempted) return;\n const parentOverlay = this.parentOverlay;\n this.parentOverlay = undefined;\n try {\n parentOverlay?.setHidden(true);\n } catch (error) {\n this.cleanupError ??= error;\n }\n try {\n this.parentRestoreAttempted = true;\n this.parent.start();\n this.parent.renderNow(false);\n } catch (error) {\n this.cleanupError ??= error;\n }\n }\n\n private createContext(): ExtensionCommandContext {\n const ui = new Proxy(this.ctx.ui, {\n get: (target, property) => {\n if (property === \"custom\") {\n return <Value>(factory: BtwCustomFactory<Value>, options?: BtwCustomOptions) =>\n this.showCustom(factory, options);\n }\n if (property === \"notify\") {\n return (message: string, level?: Parameters<ExtensionCommandContext[\"ui\"][\"notify\"]>[1]) => {\n target.notify(message, level);\n const display = sanitizeSingleLine(message);\n if (display) this.fullscreen?.flash?.(display);\n };\n }\n const value = Reflect.get(target, property, target) as unknown;\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n const signal = this.ctx.signal\n ? AbortSignal.any([this.ctx.signal, this.lifetimeController.signal])\n : this.lifetimeController.signal;\n return new Proxy(this.ctx, {\n get: (target, property) => {\n if (property === \"ui\") return ui;\n if (property === \"signal\") return signal;\n return Reflect.get(target, property, target);\n },\n });\n }\n\n private showCustom<Value>(factory: BtwCustomFactory<Value>, options?: BtwCustomOptions): Promise<Value> {\n const fullscreen = this.fullscreen;\n if (!fullscreen || this.disposed || this.finished) {\n return Promise.reject(new FullscreenUiDisposedError());\n }\n if (this.cancelActiveCustom) {\n return Promise.reject(new Error(\"pi-btw attempted to open overlapping custom UI.\"));\n }\n\n return new Promise<Value>((resolve, reject) => {\n let component: (Component & { dispose?(): void }) | undefined;\n let overlay: OverlayHandle | undefined;\n let mounted = false;\n let layoutMounted = false;\n let factorySettled = false;\n let closed = false;\n let promiseSettled = false;\n let componentDisposed = false;\n let pendingValue: Value | undefined;\n let hasPendingValue = false;\n\n const disposeComponent = () => {\n if (!component || componentDisposed) return;\n componentDisposed = true;\n try {\n component.dispose?.();\n } catch {\n // Cleanup must continue so terminal ownership is restored.\n }\n };\n const unmount = () => {\n let cleanupError: unknown;\n try {\n if (overlay) overlay.hide();\n else if (mounted && layoutMounted) fullscreen.setLayoutRoot(undefined);\n else if (mounted && component) fullscreen.removeChild(component);\n } catch (error) {\n cleanupError = error;\n }\n if (overlay || mounted) {\n try {\n fullscreen.setFocus(null);\n fullscreen.requestRender();\n } catch (error) {\n cleanupError ??= error;\n }\n }\n disposeComponent();\n if (cleanupError !== undefined) throw cleanupError;\n };\n const complete = () => {\n if (promiseSettled || !hasPendingValue) return;\n promiseSettled = true;\n this.cancelActiveCustom = undefined;\n this.hardCancelActiveCustom = undefined;\n if (!factorySettled) {\n resolve(pendingValue as Value);\n return;\n }\n try {\n unmount();\n resolve(pendingValue as Value);\n } catch (error) {\n reject(error);\n }\n };\n const close = (value: Value) => {\n if (closed || promiseSettled) return;\n closed = true;\n pendingValue = value;\n hasPendingValue = true;\n complete();\n };\n const fail = (error: unknown) => {\n if (promiseSettled) return;\n closed = true;\n promiseSettled = true;\n this.cancelActiveCustom = undefined;\n this.hardCancelActiveCustom = undefined;\n try {\n unmount();\n reject(error);\n } catch (cleanupError) {\n reject(cleanupError);\n }\n };\n this.cancelActiveCustom = () => {\n if (promiseSettled) return;\n disposeComponent();\n if (!promiseSettled) fail(new FullscreenUiDisposedError());\n };\n this.hardCancelActiveCustom = () => {\n if (promiseSettled) return;\n try {\n component?.handleInput?.(\"\\u0003\");\n } catch (error) {\n fail(error);\n return;\n }\n this.cancelActiveCustom?.();\n };\n\n let created: ReturnType<BtwCustomFactory<Value>>;\n try {\n created = factory(fullscreen, this.theme, this.keybindings, close);\n } catch (error) {\n factorySettled = true;\n fail(error);\n return;\n }\n Promise.resolve(created)\n .then((value) => {\n component = value;\n factorySettled = true;\n if (promiseSettled) {\n disposeComponent();\n return;\n }\n if (closed) {\n complete();\n return;\n }\n if (options?.overlay) {\n const overlayOptions =\n typeof options.overlayOptions === \"function\" ? options.overlayOptions() : options.overlayOptions;\n overlay = fullscreen.showOverlay(component, overlayOptions);\n options.onHandle?.(overlay);\n } else {\n fullscreen.clear();\n mounted = true;\n if (isFullscreenLayoutComponent(component)) {\n layoutMounted = true;\n fullscreen.setLayoutRoot(component.getFullscreenLayout());\n } else {\n fullscreen.addChild(component);\n }\n fullscreen.setFocus(component);\n fullscreen.requestRender();\n }\n })\n .catch(fail);\n });\n }\n}\n\nfunction isFullscreenLayoutComponent(component: Component): component is BtwFullscreenLayoutComponent {\n return \"getFullscreenLayout\" in component && typeof component.getFullscreenLayout === \"function\";\n}\n", "import {\n isKeyRelease,\n isKittyProtocolActive,\n KeybindingsManager,\n type KeyId,\n matchesKey,\n type TUI,\n TUI_KEYBINDINGS,\n} from \"@earendil-works/pi-tui\";\nimport { formatKeyLabel } from \"./text.js\";\n\nexport const BTW_SHORTCUT_ACTIONS = [\"exit\", \"cycleThinkingLevel\", \"bringToMain\"] as const;\nexport type BtwShortcutAction = (typeof BTW_SHORTCUT_ACTIONS)[number];\nexport type BtwKeybindingOverrides = Partial<Record<BtwShortcutAction, string>>;\n\nconst MODIFIERS = [\"shift\", \"alt\", \"ctrl\", \"super\"] as const;\nconst SYMBOLS = \"`-=[]\\\\;',./!@#$%^&*()_|~{}:<>?\";\nconst SPECIAL: Record<string, number> = {\n escape: 27,\n tab: 9,\n enter: 13,\n space: 32,\n backspace: 127,\n insert: 57425,\n delete: 57426,\n home: 57423,\n end: 57424,\n pageup: 57421,\n pagedown: 57422,\n left: 57417,\n right: 57418,\n up: 57419,\n down: 57420,\n};\nconst FUNCTION_INPUTS = [\"OP\", \"OQ\", \"OR\", \"OS\", \"[15~\", \"[17~\", \"[18~\", \"[19~\", \"[20~\", \"[21~\", \"[23~\", \"[24~\"];\n// All cross-identity legacy collisions in Pi's matchesKey(): raw Ctrl bytes,\n// ESC-prefixed bytes (including Alt+arrows), BS/DEL, Enter and Shift+Tab.\n// CSI-u, keypad, lock bits, shifted letters and modifyOtherKeys normalize to\n// the same key+modifiers; probe that identity instead of duplicating the parser.\nconst LEGACY_INPUTS = [\n ...Array.from({ length: 128 }, (_, code) => String.fromCharCode(code)),\n ...Array.from({ length: 128 }, (_, code) => `\\u001b${String.fromCharCode(code)}`),\n \"\\u001b[Z\",\n \"\\u001bOM\",\n \"\\u001b[E\",\n \"\\u001b[e\",\n \"\\u001bOe\",\n ...FUNCTION_INPUTS.map((suffix) => `\\u001b${suffix}`),\n];\n\n/** Strict settings syntax; Pi itself ignores unknown/duplicate modifier tokens. */\nexport function normalizeBtwKey(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length > 80 || /[\\s\\p{Cc}]/u.test(value)) return undefined;\n const parts = value.toLowerCase().split(\"+\");\n let base = parts.pop();\n if (!base) return undefined;\n if (base === \"esc\") base = \"escape\";\n if (base === \"return\") base = \"enter\";\n if (new Set(parts).size !== parts.length || parts.some((part) => !MODIFIERS.includes(part as never)))\n return undefined;\n if (\n !Object.hasOwn(SPECIAL, base) &&\n base !== \"clear\" &&\n !/^f(?:[1-9]|1[0-2])$/u.test(base) &&\n !(base.length === 1 && (/^[a-z0-9]$/u.test(base) || SYMBOLS.includes(base)))\n )\n return undefined;\n if ((base === \"escape\" || (base.startsWith(\"f\") && base.length > 1)) && parts.length) return undefined;\n if (base === \"clear\" && (parts.length > 1 || (parts.length === 1 && ![\"ctrl\", \"shift\"].includes(parts[0] ?? \"\"))))\n return undefined;\n return [...MODIFIERS.filter((part) => parts.includes(part)), base].join(\"+\");\n}\n\n/** Representative inputs are checked by Pi, including its live terminal-mode branches. */\nfunction inputsFor(key: string): string[] {\n const parts = key.split(\"+\");\n const base = parts.pop() ?? \"\";\n const modifier = MODIFIERS.reduce((mask, part, bit) => mask | (parts.includes(part) ? 1 << bit : 0), 0);\n const code = SPECIAL[base] ?? (base.length === 1 ? base.charCodeAt(0) : undefined);\n const inputs = code === undefined ? LEGACY_INPUTS : [...LEGACY_INPUTS, `\\u001b[${code};${modifier + 1}u`];\n return inputs.filter((input) => matchesKey(input, key as KeyId));\n}\n\nexport function btwKeysOverlap(first: string, second: string): boolean {\n const normalized = normalizeBtwKey(first);\n return normalized !== undefined && inputsFor(normalized).some((input) => matchesKey(input, second as KeyId));\n}\n\nexport interface BtwShortcuts {\n keys: Record<BtwShortcutAction, readonly string[]>;\n warnings: readonly string[];\n matches(data: string, action: BtwShortcutAction): boolean;\n label(action: BtwShortcutAction): string;\n}\n\nfunction reservedKeys(keybindings: KeybindingsManager, copyOnSelect: boolean): string[] {\n // Editor has no autocomplete provider here. Select bindings are still reserved\n // because exit also applies to BTW-owned nested review/menu components.\n return [\n \"ctrl+c\",\n \"shift+backspace\",\n \"shift+delete\",\n \"shift+space\",\n // Exact-range review uses these fixed selection actions even if Editor is remapped.\n \"shift+left\",\n \"shift+right\",\n \"shift+up\",\n \"shift+down\",\n \"left\",\n \"right\",\n \"enter\",\n \"alt+enter\",\n \"ctrl+j\",\n \"pageUp\",\n \"pageDown\",\n ...Object.keys(TUI_KEYBINDINGS).flatMap((id) => keybindings.getKeys(id as keyof typeof TUI_KEYBINDINGS)),\n ...(!copyOnSelect ? keybindings.getKeys(\"app.message.copy\") : []),\n ];\n}\n\nfunction isTextKey(key: string): boolean {\n const parts = key.split(\"+\");\n const base = parts.at(-1) ?? \"\";\n return (base.length === 1 || base === \"space\") && !parts.some((part) => [\"ctrl\", \"alt\", \"super\"].includes(part));\n}\n\nexport function resolveBtwShortcuts(\n overrides: BtwKeybindingOverrides = {},\n keybindings: KeybindingsManager,\n copyOnSelect = true,\n): BtwShortcuts {\n let mode = isKittyProtocolActive();\n let snapshot = resolveShortcutSnapshot(overrides, keybindings, copyOnSelect);\n const current = () => {\n if (mode !== isKittyProtocolActive()) {\n mode = isKittyProtocolActive();\n snapshot = resolveShortcutSnapshot(overrides, keybindings, copyOnSelect);\n }\n return snapshot;\n };\n // ProcessTerminal negotiates Kitty asynchronously after the dedicated TUI starts.\n // Hints and matching must use the same policy after that mode transition.\n return {\n get keys() {\n return current().keys;\n },\n get warnings() {\n return current().warnings;\n },\n matches: (data, action) => current().matches(data, action),\n label: (action) => current().label(action),\n };\n}\n\nfunction resolveShortcutSnapshot(\n overrides: BtwKeybindingOverrides = {},\n keybindings: KeybindingsManager,\n copyOnSelect = true,\n): BtwShortcuts {\n const reserved = reservedKeys(keybindings, copyOnSelect);\n const keys: BtwShortcuts[\"keys\"] = { exit: [\"ctrl+c\"], cycleThinkingLevel: [], bringToMain: [] };\n const warnings: string[] = [];\n const defaults: Record<BtwShortcutAction, readonly string[]> = {\n exit: [\"ctrl+c\"],\n cycleThinkingLevel: keybindings.getKeys(\"app.thinking.cycle\"),\n bringToMain: [\"ctrl+r\"],\n };\n const usable = (action: BtwShortcutAction, candidate: string, inherited = false): string | undefined => {\n const key = normalizeBtwKey(candidate);\n if (!key || (!inherited && isTextKey(key))) return undefined;\n const inputs = inputsFor(key);\n if (!inputs.length) return undefined;\n if (action === \"exit\" && key === \"ctrl+c\") return key;\n if (\n reserved.some((other) => typeof other === \"string\" && inputs.some((input) => matchesKey(input, other as KeyId)))\n )\n return undefined;\n return key;\n };\n const candidates: BtwKeybindingOverrides = {};\n const availableDefaults = { ...defaults };\n for (const action of BTW_SHORTCUT_ACTIONS) {\n availableDefaults[action] = defaults[action]\n .map((key) => usable(action, key, action === \"cycleThinkingLevel\"))\n .filter((key): key is string => key !== undefined);\n const override = overrides[action];\n if (override !== undefined) candidates[action] = usable(action, override);\n }\n // Compare the complete proposal, not only actions visited earlier. Reject conflicts\n // together, then repeat because a rejected override restores its default bindings.\n for (;;) {\n const rejected = BTW_SHORTCUT_ACTIONS.filter((action) => {\n const candidate = candidates[action];\n return (\n candidate !== undefined &&\n BTW_SHORTCUT_ACTIONS.some(\n (other) =>\n other !== action &&\n (candidates[other] ? [candidates[other]] : availableDefaults[other]).some((key) =>\n btwKeysOverlap(candidate, key),\n ),\n )\n );\n });\n if (!rejected.length) break;\n for (const action of rejected) delete candidates[action];\n }\n for (const action of BTW_SHORTCUT_ACTIONS) {\n const override = overrides[action];\n const selected = candidates[action];\n if (override !== undefined && !selected)\n warnings.push(\n `${action}: configured shortcut is invalid or conflicts with a reserved action; using an available default.`,\n );\n const effective = selected\n ? [selected]\n : availableDefaults[action].filter(\n (key) =>\n !BTW_SHORTCUT_ACTIONS.some(\n (other) => other !== action && keys[other].some((used) => btwKeysOverlap(key, used)),\n ),\n );\n keys[action] = action === \"exit\" ? [...new Set([...effective, \"ctrl+c\"])] : effective;\n if (!keys[action].length && (override !== undefined || defaults[action].length > 0))\n warnings.push(`${action}: no usable shortcut; change Pi BTW Settings or Pi keybindings.`);\n }\n return {\n keys,\n warnings,\n matches: (data, action) => !isKeyRelease(data) && keys[action].some((key) => matchesKey(data, key as KeyId)),\n label: (action) => (keys[action].length ? formatKeyLabel(keys[action][0] ?? \"\") : \"Unavailable\"),\n };\n}\n\nexport function validateBtwShortcutEdit(\n action: BtwShortcutAction,\n value: string | undefined,\n overrides: BtwKeybindingOverrides,\n keybindings: KeybindingsManager,\n copyOnSelect: boolean,\n): string | undefined {\n // Reset must remain available even when several existing overrides conflict.\n if (value === undefined) return undefined;\n if (!normalizeBtwKey(value)) return \"Invalid key combination. Use a Pi key name such as ctrl+q or f6.\";\n const next = { ...overrides, [action]: value };\n const resolved = resolveBtwShortcuts(next, keybindings, copyOnSelect);\n const previous = resolveBtwShortcuts(overrides, keybindings, copyOnSelect);\n // Reject edits that disable another binding as well as the edited binding.\n for (const item of BTW_SHORTCUT_ACTIONS) {\n if (\n (item === action && !resolved.keys[item].includes(normalizeBtwKey(value) ?? \"\")) ||\n (item !== action && previous.keys[item].some((key) => !resolved.keys[item].includes(key)))\n ) {\n return `${item} conflicts with another BTW shortcut, editing, selection, search, scrolling, or copying. Choose a different key.`;\n }\n }\n return undefined;\n}\n\nconst bindingsByTui = new WeakMap<TUI, BtwShortcuts>();\nexport function setBtwShortcuts(tui: TUI, shortcuts: BtwShortcuts): void {\n bindingsByTui.set(tui, shortcuts);\n}\nexport function getBtwShortcuts(tui: TUI, keybindings?: KeybindingsManager): BtwShortcuts {\n return (\n bindingsByTui.get(tui) ??\n resolveBtwShortcuts(\n {},\n keybindings ??\n new KeybindingsManager({\n ...TUI_KEYBINDINGS,\n \"app.thinking.cycle\": { defaultKeys: \"shift+tab\" },\n }),\n )\n );\n}\n\n/** Keep split bracketed-paste payloads away from screen-level shortcuts. */\nexport class BtwPasteGuard {\n private active = false;\n consume(data: string): boolean {\n const wasActive = this.active;\n const starts = data.includes(\"\\u001b[200~\");\n if (starts) this.active = true;\n if (this.active && data.includes(\"\\u001b[201~\")) this.active = false;\n return wasActive || starts;\n }\n}\n", "export function sanitizeSingleLine(text: string): string {\n return [...text.replace(/[\\r\\n\\t]/gu, \" \")]\n .filter((character) => {\n const code = character.charCodeAt(0);\n return code > 31 && (code < 127 || code > 159);\n })\n .join(\"\")\n .replace(/ +/gu, \" \")\n .trim();\n}\n\nexport function formatKeyLabel(key: string): string {\n const sanitized = sanitizeSingleLine(key);\n if (!sanitized) return \"\";\n return sanitized\n .split(\"+\")\n .map((part) => {\n const lower = part.toLowerCase();\n if (lower === \"shift\") return \"Shift\";\n if (lower === \"ctrl\") return \"Ctrl\";\n if (lower === \"alt\") return \"Alt\";\n if (lower === \"super\") return \"Super\";\n return part.length === 1 ? part.toUpperCase() : `${part[0]?.toUpperCase() ?? \"\"}${part.slice(1)}`;\n })\n .join(\"+\");\n}\n", "import {\n copyToClipboard,\n type ExtensionAPI,\n type ExtensionCommandContext,\n type SessionEntry,\n type SessionTreeNode,\n TreeSelectorComponent,\n} from \"@earendil-works/pi-coding-agent\";\nimport { type Component, type Focusable, Key, matchesKey } from \"@earendil-works/pi-tui\";\nimport { showBtwCustomPreservingEditor } from \"./menu.js\";\nimport { sanitizeSingleLine } from \"./text.js\";\n\nexport type MainEntryPickResult = { kind: \"selected\"; entryId: string } | { kind: \"back\" } | { kind: \"closed\" };\n\nexport interface MainThreadTreeSelector extends Component, Focusable {\n onCopy?: (text: string | undefined) => void;\n setViewLabel?(entryId: string, label: string | undefined, labelTimestamp?: string): void;\n dispose?(): void;\n}\n\nexport interface MainThreadTreeSelectorOptions {\n tree: SessionTreeNode[];\n currentLeafId: string | null;\n terminalRows: number;\n onSelect: (entryId: string) => void;\n onCancel: () => void;\n onCopy: (entryId: string | undefined, displayText: string | undefined) => void;\n onLabelChange: (entryId: string, label: string | undefined) => void;\n}\n\nexport interface MainThreadTreePickerDependencies {\n createSelector?: (options: MainThreadTreeSelectorOptions) => MainThreadTreeSelector;\n copyToClipboard?: (text: string, signal: AbortSignal) => Promise<void>;\n}\n\nclass MainThreadTreePickerComponent implements Component, Focusable {\n constructor(\n private readonly selector: MainThreadTreeSelector,\n private readonly onClose: () => void,\n ) {}\n\n get focused(): boolean {\n return this.selector.focused;\n }\n\n set focused(value: boolean) {\n this.selector.focused = value;\n }\n\n get wantsKeyRelease(): boolean | undefined {\n return this.selector.wantsKeyRelease;\n }\n\n render(width: number): string[] {\n return this.selector.render(width);\n }\n\n handleInput(data: string): void {\n if (matchesKey(data, Key.ctrl(\"c\"))) {\n this.onClose();\n return;\n }\n this.selector.handleInput?.(data);\n }\n\n invalidate(): void {\n this.selector.invalidate();\n }\n\n dispose(): void {\n this.selector.dispose?.();\n this.onClose();\n }\n}\n\nexport async function pickMainEntry(\n pi: ExtensionAPI,\n ctx: ExtensionCommandContext,\n dependencies: MainThreadTreePickerDependencies = {},\n): Promise<MainEntryPickResult> {\n let rawTree: SessionTreeNode[];\n let currentLeafId: string | null;\n try {\n rawTree = ctx.sessionManager.getTree();\n currentLeafId = ctx.sessionManager.getLeafId();\n } catch {\n return { kind: \"closed\" };\n }\n\n if (rawTree.length === 0) {\n notifySafely(ctx, \"No main-thread entries are available\", \"warning\");\n return { kind: \"back\" };\n }\n\n const tree = sanitizeTreeForDisplay(rawTree);\n const rawCopyText = collectRawCopyText(rawTree);\n const savedLabels = collectSavedLabels(rawTree);\n const createSelector = dependencies.createSelector ?? createNativeTreeSelector;\n const copy = dependencies.copyToClipboard ?? copyText;\n const copyControllers = new Set<AbortController>();\n const copyTasks = new Set<Promise<void>>();\n const abortCopies = () => {\n for (const controller of copyControllers) {\n controller.abort(new Error(\"The main-thread tree picker closed\"));\n }\n };\n const result = await showBtwCustomPreservingEditor<MainEntryPickResult>(ctx, (tui, _theme, _keybindings, done) => {\n let settled = false;\n let selector: MainThreadTreeSelector | undefined;\n const finish = (value: MainEntryPickResult) => {\n if (settled) return;\n settled = true;\n abortCopies();\n done(value);\n };\n const onCopy = (entryId: string | undefined, displayText: string | undefined) => {\n if (settled) return;\n const text = entryId ? rawCopyText.get(entryId) : displayText;\n if (!text) {\n notifySafely(ctx, \"Selected entry has no text to copy\", \"warning\");\n return;\n }\n const controller = new AbortController();\n copyControllers.add(controller);\n let operation: Promise<void>;\n try {\n operation = copy(text, controller.signal);\n } catch (error: unknown) {\n operation = Promise.reject(error);\n }\n let task!: Promise<void>;\n task = operation\n .then(() => {\n if (!settled) notifySafely(ctx, \"Copied selected message\", \"info\");\n })\n .catch((error: unknown) => {\n if (!settled && !controller.signal.aborted) {\n notifySafely(ctx, `Could not copy selected message: ${formatError(error)}`, \"error\");\n }\n })\n .finally(() => {\n copyControllers.delete(controller);\n copyTasks.delete(task);\n });\n copyTasks.add(task);\n };\n const restoreLabel = (entryId: string) => {\n const previous = savedLabels.get(entryId);\n selector?.setViewLabel?.(entryId, previous?.label, previous?.labelTimestamp);\n tui.requestRender();\n };\n const onLabelChange = (entryId: string, label: string | undefined) => {\n if (settled) return;\n try {\n if (!ctx.sessionManager.getEntry(entryId)) {\n restoreLabel(entryId);\n notifySafely(ctx, \"The selected main-thread entry is no longer available\", \"warning\");\n return;\n }\n const persistedLabel = label === undefined ? undefined : sanitizeSingleLine(label);\n pi.setLabel(entryId, persistedLabel);\n savedLabels.set(entryId, { label: persistedLabel });\n selector?.setViewLabel?.(entryId, persistedLabel);\n tui.requestRender();\n } catch (error: unknown) {\n restoreLabel(entryId);\n notifySafely(ctx, `Could not update tree label: ${formatError(error)}`, \"error\");\n }\n };\n selector = createSelector({\n tree,\n currentLeafId,\n terminalRows: tui.terminal.rows,\n onSelect: (entryId) => finish({ kind: \"selected\", entryId }),\n onCancel: () => finish({ kind: \"back\" }),\n onCopy,\n onLabelChange,\n });\n return new MainThreadTreePickerComponent(selector, () => finish({ kind: \"closed\" }));\n });\n abortCopies();\n await Promise.allSettled([...copyTasks]);\n\n return result ?? { kind: \"closed\" };\n}\n\nfunction createNativeTreeSelector(options: MainThreadTreeSelectorOptions): MainThreadTreeSelector {\n const selector = new TreeSelectorComponent(\n options.tree,\n options.currentLeafId,\n options.terminalRows,\n options.onSelect,\n options.onCancel,\n options.onLabelChange,\n );\n selector.onCopy = (displayText) => options.onCopy(selector.getTreeList().getSelectedNode()?.entry.id, displayText);\n const result = selector as MainThreadTreeSelector;\n result.setViewLabel = (entryId, label, labelTimestamp) =>\n selector.getTreeList().updateNodeLabel(entryId, label, labelTimestamp);\n return result;\n}\n\nfunction sanitizeTreeForDisplay(tree: readonly SessionTreeNode[]): SessionTreeNode[] {\n return tree.map((node) => {\n const result: SessionTreeNode = {\n entry: sanitizeEntryForDisplay(node.entry),\n children: sanitizeTreeForDisplay(node.children),\n };\n if (node.label !== undefined) result.label = sanitizeSingleLine(node.label);\n if (node.labelTimestamp !== undefined) {\n result.labelTimestamp = sanitizeSingleLine(node.labelTimestamp);\n }\n return result;\n });\n}\n\nfunction sanitizeEntryForDisplay(entry: SessionEntry): SessionEntry {\n switch (entry.type) {\n case \"message\": {\n const message = { ...entry.message } as Record<string, unknown>;\n if (\"content\" in entry.message) message.content = sanitizeDisplayContent(entry.message.content);\n for (const key of [\"role\", \"errorMessage\", \"command\", \"toolName\"] as const) {\n const value = message[key];\n if (typeof value === \"string\") message[key] = sanitizeSingleLine(value);\n }\n return { ...entry, message } as unknown as SessionEntry;\n }\n case \"custom_message\":\n return {\n ...entry,\n customType: sanitizeSingleLine(entry.customType),\n content: sanitizeDisplayContent(entry.content) as typeof entry.content,\n };\n case \"compaction\":\n return { ...entry, summary: sanitizeSingleLine(entry.summary) };\n case \"branch_summary\":\n return { ...entry, summary: sanitizeSingleLine(entry.summary) };\n case \"model_change\":\n return {\n ...entry,\n provider: sanitizeSingleLine(entry.provider),\n modelId: sanitizeSingleLine(entry.modelId),\n };\n case \"thinking_level_change\":\n return { ...entry, thinkingLevel: sanitizeSingleLine(entry.thinkingLevel) };\n case \"custom\":\n return { ...entry, customType: sanitizeSingleLine(entry.customType) };\n case \"label\":\n return {\n ...entry,\n label: entry.label === undefined ? undefined : sanitizeSingleLine(entry.label),\n };\n case \"session_info\":\n return {\n ...entry,\n name: entry.name === undefined ? undefined : sanitizeSingleLine(entry.name),\n };\n }\n}\n\nfunction sanitizeDisplayContent(content: unknown): unknown {\n if (typeof content === \"string\") return sanitizeSingleLine(content);\n if (!Array.isArray(content)) return content;\n return content.map((block) => {\n if (block === null || typeof block !== \"object\" || !(\"type\" in block)) return block;\n if (block.type === \"text\" && \"text\" in block && typeof block.text === \"string\") {\n return { ...block, text: sanitizeSingleLine(block.text) };\n }\n if (block.type === \"toolCall\") {\n const copy = { ...block } as Record<string, unknown>;\n if (typeof copy.name === \"string\") copy.name = sanitizeSingleLine(copy.name);\n copy.arguments = sanitizeToolArguments(copy.arguments, new WeakMap());\n return copy;\n }\n return block;\n });\n}\n\nfunction sanitizeToolArguments(value: unknown, seen: WeakMap<object, unknown>): unknown {\n if (typeof value === \"string\") return sanitizeSingleLine(value);\n if (value === null || typeof value !== \"object\") return value;\n const existing = seen.get(value);\n if (existing !== undefined) return existing;\n if (Array.isArray(value)) {\n const result: unknown[] = [];\n seen.set(value, result);\n for (const item of value) result.push(sanitizeToolArguments(item, seen));\n return result;\n }\n const result: Record<string, unknown> = {};\n seen.set(value, result);\n for (const [key, item] of Object.entries(value)) {\n result[key] = sanitizeToolArguments(item, seen);\n }\n return result;\n}\n\nfunction collectRawCopyText(tree: readonly SessionTreeNode[]): Map<string, string> {\n const result = new Map<string, string>();\n const visit = (nodes: readonly SessionTreeNode[]) => {\n for (const node of nodes) {\n const text = getRawCopyText(node.entry);\n if (text !== undefined) result.set(node.entry.id, text);\n visit(node.children);\n }\n };\n visit(tree);\n return result;\n}\n\nfunction getRawCopyText(entry: SessionEntry): string | undefined {\n let text: string | undefined;\n if (entry.type === \"message\") {\n if (entry.message.role === \"bashExecution\") text = entry.message.command;\n else if (\"content\" in entry.message) {\n text = extractRawText(entry.message.content);\n if (!text && entry.message.role === \"assistant\") text = entry.message.errorMessage;\n }\n } else if (entry.type === \"custom_message\") text = extractRawText(entry.content);\n else if (entry.type === \"compaction\" || entry.type === \"branch_summary\") text = entry.summary;\n return text?.trim() ? text : undefined;\n}\n\nfunction extractRawText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .filter(\n (block): block is { type: \"text\"; text: string } =>\n block !== null &&\n typeof block === \"object\" &&\n \"type\" in block &&\n block.type === \"text\" &&\n \"text\" in block &&\n typeof block.text === \"string\",\n )\n .map((block) => block.text)\n .join(\"\");\n}\n\ninterface SavedLabel {\n label: string | undefined;\n labelTimestamp?: string;\n}\n\nfunction collectSavedLabels(tree: readonly SessionTreeNode[]): Map<string, SavedLabel> {\n const result = new Map<string, SavedLabel>();\n const visit = (nodes: readonly SessionTreeNode[]) => {\n for (const node of nodes) {\n result.set(node.entry.id, {\n label: node.label === undefined ? undefined : sanitizeSingleLine(node.label),\n labelTimestamp: node.labelTimestamp === undefined ? undefined : sanitizeSingleLine(node.labelTimestamp),\n });\n visit(node.children);\n }\n };\n visit(tree);\n return result;\n}\n\nasync function copyText(text: string, signal: AbortSignal): Promise<void> {\n signal.throwIfAborted();\n await copyToClipboard(text);\n signal.throwIfAborted();\n}\n\nfunction notifySafely(\n ctx: ExtensionCommandContext,\n message: string,\n level: Parameters<ExtensionCommandContext[\"ui\"][\"notify\"]>[1],\n): void {\n try {\n ctx.ui.notify(sanitizeSingleLine(message), level);\n } catch {\n // The command context may have been replaced while the selector was open.\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport { BTW_SHORTCUT_ACTIONS, type BtwKeybindingOverrides, normalizeBtwKey } from \"./keybindings.js\";\nimport { BTW_THINKING_LEVELS, type BtwThinkingLevel } from \"./side-thread.js\";\n\nexport const BTW_SETTINGS_FILE = \"pi-btw.json\";\nexport const DEFAULT_FULLSCREEN_COPY_ON_SELECT = true;\nexport const DEFAULT_REMEMBER_THINKING_LEVEL_CHANGES = true;\nconst MAX_SETTINGS_BYTES = 64 * 1024;\n\nexport interface BtwSettings {\n keybindings?: BtwKeybindingOverrides;\n model?: string;\n thinkingLevel?: BtwThinkingLevel;\n rememberThinkingLevelChanges?: boolean;\n fullscreenCopyOnSelect?: boolean;\n}\n\nexport type BtwSettingsLoadResult =\n | { kind: \"missing\" }\n | { kind: \"invalid\"; reason: string }\n | { kind: \"loaded\"; settings: BtwSettings };\n\nexport interface BtwSettingsPatch {\n keybindings?: BtwKeybindingOverrides;\n thinkingLevel?: BtwThinkingLevel;\n rememberThinkingLevelChanges?: boolean;\n fullscreenCopyOnSelect?: boolean;\n}\n\nexport interface UpdateBtwSettingsOptions {\n /** Validate against the latest document inside the mutation queue, before applying the patch. */\n validateCurrent?: (settings: BtwSettings) => void;\n settingsPath?: string;\n signal?: AbortSignal;\n beforeRename?: (temporaryPath: string, settingsPath: string) => Promise<void>;\n}\n\ntype SettingsDocument = Record<string, unknown>;\n\nconst mutationQueues = new Map<string, Promise<void>>();\n\nexport function btwSettingsPath(): string {\n return join(getAgentDir(), BTW_SETTINGS_FILE);\n}\n\nexport function normalizeBtwSettings(value: unknown): BtwSettings | undefined {\n if (!isSettingsDocument(value)) return undefined;\n\n const settings: BtwSettings = {};\n if (Object.hasOwn(value, \"keybindings\")) {\n const keys = value.keybindings;\n if (!isSettingsDocument(keys)) return undefined;\n settings.keybindings = {};\n for (const action of BTW_SHORTCUT_ACTIONS) {\n if (!Object.hasOwn(keys, action)) continue;\n const key = normalizeBtwKey(keys[action]);\n if (!key) return undefined;\n settings.keybindings[action] = key;\n }\n }\n if (Object.hasOwn(value, \"model\")) {\n const model = Reflect.get(value, \"model\");\n if (typeof model !== \"string\" || !parseBtwModelReference(model)) return undefined;\n settings.model = model;\n }\n if (Object.hasOwn(value, \"thinkingLevel\")) {\n const thinkingLevel = Reflect.get(value, \"thinkingLevel\");\n if (!isBtwThinkingLevel(thinkingLevel)) return undefined;\n settings.thinkingLevel = thinkingLevel;\n }\n if (Object.hasOwn(value, \"rememberThinkingLevelChanges\")) {\n const remember = Reflect.get(value, \"rememberThinkingLevelChanges\");\n if (typeof remember !== \"boolean\") return undefined;\n settings.rememberThinkingLevelChanges = remember;\n }\n if (Object.hasOwn(value, \"fullscreenCopyOnSelect\")) {\n const copyOnSelect = Reflect.get(value, \"fullscreenCopyOnSelect\");\n if (typeof copyOnSelect !== \"boolean\") return undefined;\n settings.fullscreenCopyOnSelect = copyOnSelect;\n }\n return settings;\n}\n\nexport function parseBtwModelReference(reference: string): { provider: string; modelId: string } | undefined {\n if (/[\\s\\p{Cc}]/u.test(reference)) return undefined;\n const separator = reference.indexOf(\"/\");\n if (separator <= 0 || separator === reference.length - 1) return undefined;\n return { provider: reference.slice(0, separator), modelId: reference.slice(separator + 1) };\n}\n\nexport function effectiveFullscreenCopyOnSelect(settings: BtwSettings): boolean {\n return settings.fullscreenCopyOnSelect ?? DEFAULT_FULLSCREEN_COPY_ON_SELECT;\n}\n\nexport function effectiveRememberThinkingLevelChanges(settings: BtwSettings): boolean {\n return settings.rememberThinkingLevelChanges ?? DEFAULT_REMEMBER_THINKING_LEVEL_CHANGES;\n}\n\nexport async function readBtwSettings(settingsPath = btwSettingsPath()): Promise<BtwSettingsLoadResult> {\n await awaitBtwSettingsWrites(settingsPath);\n return readBtwSettingsUncoordinated(settingsPath);\n}\n\nexport function updateBtwSettings(\n patch: BtwSettingsPatch,\n options: UpdateBtwSettingsOptions = {},\n): Promise<BtwSettings> {\n const settingsPath = options.settingsPath ?? btwSettingsPath();\n return enqueueMutation(settingsPath, async () => {\n options.signal?.throwIfAborted();\n const current = await readSettingsDocumentForUpdate(settingsPath);\n options.signal?.throwIfAborted();\n options.validateCurrent?.(normalizeBtwSettings(current) ?? {});\n const updated = applyBtwSettingsPatch(current, patch);\n const settings = normalizeBtwSettings(updated);\n if (!settings) throw invalidSettingsError(settingsPath, \"invalid settings shape\");\n await publishSettings(settingsPath, updated, options.signal, options.beforeRename);\n return settings;\n });\n}\n\nexport async function awaitBtwSettingsWrites(settingsPath = btwSettingsPath()): Promise<void> {\n await mutationQueues.get(settingsPath);\n}\n\nfunction enqueueMutation<T>(settingsPath: string, mutation: () => Promise<T>): Promise<T> {\n const previous = mutationQueues.get(settingsPath) ?? Promise.resolve();\n const result = previous.then(mutation, mutation);\n const settled = result.then(\n () => undefined,\n () => undefined,\n );\n mutationQueues.set(settingsPath, settled);\n void settled.finally(() => {\n if (mutationQueues.get(settingsPath) === settled) mutationQueues.delete(settingsPath);\n });\n return result;\n}\n\nasync function readBtwSettingsUncoordinated(settingsPath: string): Promise<BtwSettingsLoadResult> {\n let contents: string;\n try {\n contents = await readSettingsContents(settingsPath);\n } catch (error: unknown) {\n if (isNodeError(error) && error.code === \"ENOENT\") return { kind: \"missing\" };\n return { kind: \"invalid\", reason: `${settingsPath}: ${formatError(error)}` };\n }\n\n try {\n const settings = normalizeBtwSettings(JSON.parse(contents) as unknown);\n return settings\n ? { kind: \"loaded\", settings }\n : { kind: \"invalid\", reason: `${settingsPath}: invalid settings shape` };\n } catch {\n return { kind: \"invalid\", reason: `${settingsPath}: invalid JSON` };\n }\n}\n\nasync function readSettingsDocumentForUpdate(settingsPath: string): Promise<SettingsDocument> {\n let contents: string;\n try {\n contents = await readSettingsContents(settingsPath);\n } catch (error: unknown) {\n if (isNodeError(error) && error.code === \"ENOENT\") return {};\n throw invalidSettingsError(settingsPath, formatError(error));\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents) as unknown;\n } catch {\n throw invalidSettingsError(settingsPath, \"invalid JSON\");\n }\n if (!isSettingsDocument(parsed) || !normalizeBtwSettings(parsed)) {\n throw invalidSettingsError(settingsPath, \"invalid settings shape\");\n }\n return parsed;\n}\n\nasync function readSettingsContents(settingsPath: string): Promise<string> {\n const flags = constants.O_RDONLY | (constants.O_NONBLOCK ?? 0);\n const handle = await open(settingsPath, flags);\n try {\n const descriptorStats = await handle.stat();\n if (!descriptorStats.isFile()) throw new Error(\"settings path is not a regular file\");\n if (descriptorStats.size > MAX_SETTINGS_BYTES) {\n throw new Error(`settings file exceeds ${MAX_SETTINGS_BYTES} bytes`);\n }\n\n const buffer = Buffer.alloc(MAX_SETTINGS_BYTES + 1);\n let offset = 0;\n while (offset < buffer.byteLength) {\n const { bytesRead } = await handle.read(buffer, offset, buffer.byteLength - offset, offset);\n if (bytesRead === 0) break;\n offset += bytesRead;\n }\n if (offset > MAX_SETTINGS_BYTES) {\n throw new Error(`settings file exceeds ${MAX_SETTINGS_BYTES} bytes`);\n }\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(buffer.subarray(0, offset));\n } catch {\n throw new Error(\"settings file is not valid UTF-8\");\n }\n } finally {\n await handle.close();\n }\n}\n\nasync function publishSettings(\n settingsPath: string,\n document: SettingsDocument,\n signal?: AbortSignal,\n beforeRename?: (temporaryPath: string, settingsPath: string) => Promise<void>,\n): Promise<void> {\n signal?.throwIfAborted();\n const contents = `${JSON.stringify(document, null, 2)}\\n`;\n if (Buffer.byteLength(contents, \"utf8\") > MAX_SETTINGS_BYTES) {\n throw new Error(`settings document exceeds ${MAX_SETTINGS_BYTES} bytes`);\n }\n const directory = dirname(settingsPath);\n await mkdir(directory, { recursive: true });\n signal?.throwIfAborted();\n const temporaryPath = join(directory, `.${basename(settingsPath)}.${process.pid}.${randomUUID()}.tmp`);\n try {\n await writeFile(temporaryPath, contents, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n signal,\n });\n await beforeRename?.(temporaryPath, settingsPath);\n signal?.throwIfAborted();\n await rename(temporaryPath, settingsPath);\n } catch (error) {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nfunction applyBtwSettingsPatch(current: SettingsDocument, patch: BtwSettingsPatch): SettingsDocument {\n const updated: SettingsDocument = { ...current };\n if (patch.keybindings) {\n const keys = isSettingsDocument(current.keybindings) ? { ...current.keybindings } : {};\n for (const action of BTW_SHORTCUT_ACTIONS) {\n if (!Object.hasOwn(patch.keybindings, action)) continue;\n if (patch.keybindings[action] === undefined) delete keys[action];\n else keys[action] = patch.keybindings[action];\n }\n if (Object.keys(keys).length) updated.keybindings = keys;\n else delete updated.keybindings;\n }\n if (Object.hasOwn(patch, \"thinkingLevel\")) {\n if (patch.thinkingLevel === undefined) delete updated.thinkingLevel;\n else updated.thinkingLevel = patch.thinkingLevel;\n }\n if (Object.hasOwn(patch, \"rememberThinkingLevelChanges\")) {\n updated.rememberThinkingLevelChanges = patch.rememberThinkingLevelChanges;\n }\n if (Object.hasOwn(patch, \"fullscreenCopyOnSelect\")) {\n if (patch.fullscreenCopyOnSelect === undefined) delete updated.fullscreenCopyOnSelect;\n else updated.fullscreenCopyOnSelect = patch.fullscreenCopyOnSelect;\n }\n return updated;\n}\n\nfunction isSettingsDocument(value: unknown): value is SettingsDocument {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isBtwThinkingLevel(value: unknown): value is BtwThinkingLevel {\n return BTW_THINKING_LEVELS.includes(value as BtwThinkingLevel);\n}\n\nfunction invalidSettingsError(settingsPath: string, reason: string): Error {\n return new Error(`pi-btw settings at ${settingsPath} are invalid: ${reason}`);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import type {\n Api,\n AssistantMessage,\n Context,\n Message,\n Model,\n ProviderHeaders,\n SimpleStreamOptions,\n UserMessage,\n} from \"@earendil-works/pi-ai\";\n\nexport const BTW_THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\n\nexport type BtwThinkingLevel = (typeof BTW_THINKING_LEVELS)[number];\n\nexport interface SideQuestionAuth {\n apiKey?: string;\n headers?: ProviderHeaders;\n env?: Record<string, string>;\n}\n\nexport type CompleteSimpleFunction = <TApi extends Api>(\n model: Model<TApi>,\n context: Context,\n options?: SimpleStreamOptions,\n) => Promise<AssistantMessage>;\n\nexport type SideThreadTurn =\n | {\n kind: \"answered\";\n question: string;\n answer: string;\n response: AssistantMessage;\n }\n | {\n kind: \"error\";\n question: string;\n answer: string;\n };\n\nexport interface SideThread {\n conversationContext: string;\n turns: SideThreadTurn[];\n}\n\nexport function createSideThread(conversationContext: string): SideThread {\n return { conversationContext, turns: [] };\n}\n\nexport function buildSideThreadMessages(thread: SideThread, question: string): Message[] {\n const answeredTurns = thread.turns.filter(\n (turn): turn is Extract<SideThreadTurn, { kind: \"answered\" }> => turn.kind === \"answered\",\n );\n const messages: Message[] = [];\n\n if (answeredTurns.length === 0) {\n messages.push(createUserMessage(buildUserPrompt(question, thread.conversationContext)));\n return messages;\n }\n\n const [first, ...rest] = answeredTurns;\n messages.push(createUserMessage(buildUserPrompt(first.question, thread.conversationContext)), first.response);\n for (const turn of rest) {\n messages.push(createUserMessage(buildFollowUpPrompt(turn.question)), turn.response);\n }\n messages.push(createUserMessage(buildFollowUpPrompt(question)));\n return messages;\n}\n\nexport interface CompleteSideThreadTurnOptions {\n thread: SideThread;\n model: Model<Api>;\n question: string;\n thinkingLevel: BtwThinkingLevel;\n auth: SideQuestionAuth;\n signal?: AbortSignal;\n completeSimple: CompleteSimpleFunction;\n sessionId?: string;\n}\n\nexport type CompleteSideThreadTurnResult =\n | { kind: \"answered\"; response: AssistantMessage; answer: string }\n | { kind: \"aborted\" }\n | { kind: \"error\"; message: string };\n\nexport async function completeSideThreadTurn({\n thread,\n model,\n question,\n thinkingLevel,\n auth,\n signal,\n completeSimple,\n sessionId,\n}: CompleteSideThreadTurnOptions): Promise<CompleteSideThreadTurnResult> {\n if (signal?.aborted) return { kind: \"aborted\" };\n try {\n const response = await completeSimple(\n model,\n { systemPrompt: SYSTEM_PROMPT, messages: buildSideThreadMessages(thread, question) },\n buildStreamOptions(auth, { thinkingLevel, signal, model, sessionId }),\n );\n if (signal?.aborted || response?.stopReason === \"aborted\") return { kind: \"aborted\" };\n if (!isAssistantMessage(response)) {\n return { kind: \"error\", message: \"The side model returned a malformed response.\" };\n }\n if (response.stopReason === \"error\") {\n return {\n kind: \"error\",\n message: response.errorMessage ?? \"The side model returned an error.\",\n };\n }\n\n const answer = extractAssistantText(response) || \"No response received.\";\n thread.turns.push({ kind: \"answered\", question, answer, response });\n return { kind: \"answered\", response, answer };\n } catch (error: unknown) {\n if (signal?.aborted) return { kind: \"aborted\" };\n return { kind: \"error\", message: formatError(error) };\n }\n}\n\nexport interface CompleteSideQuestionOptions {\n model: Model<Api>;\n question: string;\n conversationContext: string;\n thinkingLevel: BtwThinkingLevel;\n auth: SideQuestionAuth;\n signal?: AbortSignal;\n completeSimple: CompleteSimpleFunction;\n sessionId?: string;\n}\n\nexport async function completeSideQuestion({\n model,\n question,\n conversationContext,\n thinkingLevel,\n auth,\n signal,\n completeSimple,\n sessionId,\n}: CompleteSideQuestionOptions): Promise<AssistantMessage> {\n return completeSimple(\n model,\n {\n systemPrompt: SYSTEM_PROMPT,\n messages: [createUserMessage(buildUserPrompt(question, conversationContext))],\n },\n buildStreamOptions(auth, { thinkingLevel, signal, model, sessionId }),\n );\n}\n\nexport function extractAssistantText(response: AssistantMessage): string {\n return response.content\n .filter(\n (content): content is { type: \"text\"; text: string } =>\n content !== null && typeof content === \"object\" && content.type === \"text\" && typeof content.text === \"string\",\n )\n .map((content) => content.text)\n .join(\"\\n\")\n .trim();\n}\n\nfunction isAssistantMessage(value: unknown): value is AssistantMessage {\n if (value === null || typeof value !== \"object\") return false;\n const candidate = value as Partial<AssistantMessage>;\n return candidate.role === \"assistant\" && Array.isArray(candidate.content) && typeof candidate.stopReason === \"string\";\n}\n\nexport function buildUserPrompt(question: string, conversationContext: string): string {\n return [\n \"Answer this side question without modifying the main conversation.\",\n \"\",\n \"<side_question>\",\n question,\n \"</side_question>\",\n \"\",\n \"<conversation_context>\",\n conversationContext || \"No prior conversation context was available.\",\n \"</conversation_context>\",\n ].join(\"\\n\");\n}\n\nexport function buildFollowUpPrompt(question: string): string {\n return [\"Continue the same side conversation.\", \"\", \"<side_question>\", question, \"</side_question>\"].join(\"\\n\");\n}\n\nfunction createUserMessage(text: string): UserMessage {\n return {\n role: \"user\",\n content: [{ type: \"text\", text }],\n timestamp: Date.now(),\n };\n}\n\n// Minimal session-headers fork of Pi core provider-attribution\n// (pinned to @earendil-works/pi-coding-agent@0.85.0 src/core/provider-attribution.ts:getSessionHeaders).\n// Core does not export this helper and extensions have no SettingsManager, so only session\n// headers are mirrored here. Default attribution headers are intentionally out of scope.\n// Keep semantics bug-compatible with core: case-sensitive Object.assign, explicit auth\n// headers win on exact-case match.\nconst OPENCODE_HOST = \"opencode.ai\";\n\nfunction matchesOpencodeHost(baseUrl: string | undefined): boolean {\n if (!baseUrl) return false;\n try {\n return new URL(baseUrl).hostname === OPENCODE_HOST;\n } catch {\n return false;\n }\n}\n\nfunction getOpencodeSessionHeaders(\n model: Pick<Model<Api>, \"provider\" | \"baseUrl\">,\n sessionId?: string,\n): ProviderHeaders | undefined {\n if (!sessionId) return undefined;\n if (model.provider !== \"opencode\" && model.provider !== \"opencode-go\" && !matchesOpencodeHost(model.baseUrl)) {\n return undefined;\n }\n return { \"x-opencode-session\": sessionId, \"x-opencode-client\": \"pi\" };\n}\n\nfunction mergeSessionHeaders(\n authHeaders: ProviderHeaders | undefined,\n sessionHeaders: ProviderHeaders | undefined,\n): ProviderHeaders | undefined {\n if (!sessionHeaders && !authHeaders) return undefined;\n // Bug-compatible with core mergeProviderAttributionHeaders: case-sensitive assign.\n return { ...sessionHeaders, ...authHeaders };\n}\n\ninterface BuildSideThreadStreamOptions {\n thinkingLevel: BtwThinkingLevel;\n signal?: AbortSignal;\n model?: Pick<Model<Api>, \"provider\" | \"baseUrl\">;\n sessionId?: string;\n}\n\nfunction buildStreamOptions(\n auth: SideQuestionAuth,\n { thinkingLevel, signal, model, sessionId }: BuildSideThreadStreamOptions,\n): SimpleStreamOptions {\n const sessionHeaders = model ? getOpencodeSessionHeaders(model, sessionId) : undefined;\n const options: SimpleStreamOptions = {\n apiKey: auth.apiKey,\n headers: mergeSessionHeaders(auth.headers, sessionHeaders),\n env: auth.env,\n signal,\n };\n if (thinkingLevel !== \"off\") options.reasoning = thinkingLevel;\n return options;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nconst SYSTEM_PROMPT = `You answer quick side questions for a coding-agent user.\n\nUse the provided conversation context only as background. Answer the user's side question directly and concisely. Do not claim to have changed files, run tools, or affected the main task. If the context is insufficient, say what is unknown and give the best next step.`;\n", "import type { ExtensionCommandContext, KeybindingsManager, Theme } from \"@earendil-works/pi-coding-agent\";\nimport type { Component, TUI } from \"@earendil-works/pi-tui\";\nimport type { MenuContext, RunMenuResult } from \"@narumitw/pi-tui-kit\";\nimport {\n BTW_SHORTCUT_ACTIONS,\n type BtwShortcutAction,\n normalizeBtwKey,\n resolveBtwShortcuts,\n validateBtwShortcutEdit,\n} from \"./keybindings.js\";\nimport {\n type BtwSettings,\n type BtwSettingsPatch,\n btwSettingsPath,\n effectiveFullscreenCopyOnSelect,\n effectiveRememberThinkingLevelChanges,\n readBtwSettings,\n type UpdateBtwSettingsOptions,\n updateBtwSettings,\n} from \"./settings.js\";\nimport { BTW_THINKING_LEVELS, type BtwThinkingLevel } from \"./side-thread.js\";\nimport { formatKeyLabel, sanitizeSingleLine } from \"./text.js\";\n\ninterface BtwMenuState {\n kind: \"valid\" | \"invalid\";\n settings: BtwSettings;\n reason?: string;\n}\n\nexport interface BtwResumeThreadSummary {\n id: string;\n title: string;\n questionCount: number;\n}\n\nexport interface ShowBtwCommandMenuOptions {\n currentThinkingLevel: BtwThinkingLevel;\n availableThinkingLevels: readonly BtwThinkingLevel[];\n resumeThreads?: readonly BtwResumeThreadSummary[];\n settingsPath?: string;\n readSettings?: typeof readBtwSettings;\n updateSettings?: (patch: BtwSettingsPatch, options: UpdateBtwSettingsOptions) => Promise<BtwSettings>;\n}\n\nexport type BtwCommandMenuResult = \"start\" | \"tree\" | \"closed\" | { kind: \"resume\"; threadId: string };\n\ntype BtwMenuScreen = \"main\" | \"resume\" | \"settings\" | \"invalid\" | \"shortcut\" | \"shortcut-input\";\ntype BtwMenuAction =\n | \"start\"\n | \"start-tree\"\n | \"resume\"\n | \"set-thinking\"\n | \"set-remember\"\n | \"set-fullscreen-copy\"\n | \"edit-shortcut\"\n | \"save-shortcut\"\n | \"reset-shortcut\";\nconst SAME_AS_MAIN_THREAD = \"Same as main thread\";\ntype BtwCustomOptions = Parameters<ExtensionCommandContext[\"ui\"][\"custom\"]>[1];\n\ntype BtwCustomFactory<T> = (\n tui: TUI,\n theme: Theme,\n keybindings: KeybindingsManager,\n done: (result: T) => void,\n) => Component;\n\nexport async function showBtwCommandMenu(\n ctx: ExtensionCommandContext,\n options: ShowBtwCommandMenuOptions,\n): Promise<BtwCommandMenuResult> {\n if (ctx.mode !== \"tui\") return \"closed\";\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (ctx.signal?.aborted) return \"closed\";\n const settingsPath = options.settingsPath ?? btwSettingsPath();\n const readSettings = options.readSettings ?? readBtwSettings;\n const updateSettings = options.updateSettings ?? updateBtwSettings;\n const levels =\n options.availableThinkingLevels.length > 0\n ? [...options.availableThinkingLevels]\n : ([\"off\"] satisfies BtwThinkingLevel[]);\n const displaySettingsPath = sanitizeSingleLine(settingsPath);\n const resumeThreads = options.resumeThreads ?? [];\n let startSelected = false;\n let treeSelected = false;\n let resumedThreadId: string | undefined;\n let keybindings: KeybindingsManager | undefined;\n let shortcut: BtwShortcutAction = \"exit\";\n const shortcutLabels: Record<BtwShortcutAction, string> = {\n exit: \"Exit shortcut\",\n cycleThinkingLevel: \"Cycle thinking level shortcut\",\n bringToMain: \"Bring to main shortcut\",\n };\n const shortcutValue = (settings: BtwSettings, action: BtwShortcutAction): string => {\n if (!keybindings) return \"Default\";\n const effective = resolveBtwShortcuts(settings.keybindings, keybindings, effectiveFullscreenCopyOnSelect(settings));\n const configured = settings.keybindings?.[action];\n if (configured !== undefined && !effective.keys[action].includes(configured)) {\n return `Fallback (${effective.label(action)}; saved ${formatKeyLabel(configured)})`;\n }\n const source = configured === undefined ? (action === \"cycleThinkingLevel\" ? \"Inherit Pi\" : \"Default\") : \"Custom\";\n return `${source} (${effective.label(action)})`;\n };\n const saveShortcut = async (state: BtwMenuState, value: string | undefined, signal: AbortSignal) => {\n if (!keybindings || state.kind !== \"valid\" || signal.aborted) return { kind: \"rejected\" } as const;\n const action = shortcut;\n const manager = keybindings;\n const validate = (settings: BtwSettings) =>\n validateBtwShortcutEdit(\n action,\n value,\n settings.keybindings ?? {},\n manager,\n effectiveFullscreenCopyOnSelect(settings),\n );\n const error = validate(state.settings);\n if (error) {\n notifySafely(ctx, error, \"error\");\n return { kind: \"rejected\" } as const;\n }\n try {\n await updateSettings(\n { keybindings: { [action]: value === undefined ? undefined : normalizeBtwKey(value) } },\n {\n settingsPath,\n signal,\n validateCurrent: (settings) => {\n const conflict = validate(settings);\n if (conflict) throw new Error(conflict);\n },\n },\n );\n if (signal.aborted) return { kind: \"rejected\" } as const;\n notifySafely(ctx, \"Pi BTW shortcut saved; applies when opening or resuming BTW.\", \"info\");\n return { kind: \"back\" } as const;\n } catch (error) {\n if (!signal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" } as const;\n }\n };\n\n const loadState = async (): Promise<BtwMenuState> => {\n const loaded = await readSettings(settingsPath);\n if (loaded.kind === \"invalid\") {\n return { kind: \"invalid\", settings: {}, reason: loaded.reason };\n }\n return { kind: \"valid\", settings: loaded.kind === \"loaded\" ? loaded.settings : {} };\n };\n const currentMainThinkingLevel = clampToAvailableThinkingLevel(options.currentThinkingLevel, levels);\n const displayThinkingLevel = (settings: BtwSettings): string =>\n settings.thinkingLevel === undefined\n ? SAME_AS_MAIN_THREAD\n : clampToAvailableThinkingLevel(settings.thinkingLevel, levels);\n const displayThinkingSummary = (settings: BtwSettings): string =>\n settings.thinkingLevel === undefined\n ? `${SAME_AS_MAIN_THREAD} (currently ${currentMainThinkingLevel})`\n : displayThinkingLevel(settings);\n const displayRememberSummary = (settings: BtwSettings): string => {\n const value = effectiveRememberThinkingLevelChanges(settings) ? \"On\" : \"Off\";\n return settings.thinkingLevel === undefined ? `${value} (fixed levels only)` : value;\n };\n\n const menu = defineMenu<BtwMenuState, BtwMenuScreen, BtwMenuAction, MenuContext>({\n start: \"main\",\n screens: {\n main: ({ state }) => ({\n kind: \"actions\",\n title: \"Pi BTW\",\n lines: [\n `Thinking: ${displayThinkingSummary(state.settings)} \u00B7 Remember changes: ${displayRememberSummary(state.settings)}`,\n `Copy on select: ${effectiveFullscreenCopyOnSelect(state.settings) ? \"On\" : \"Off\"}`,\n ],\n items: [\n {\n id: \"start\",\n label: \"Start side thread\",\n description: \"Open an empty side thread\",\n action: \"start\",\n },\n {\n id: \"start-tree\",\n label: \"Start from main thread tree\u2026\",\n description: \"Choose context without switching the main branch\",\n action: \"start-tree\",\n },\n ...(resumeThreads.length > 0\n ? [\n {\n id: \"resume\" as const,\n label: \"Resume side thread\",\n description: \"Continue an in-memory side thread\",\n to: \"resume\" as const,\n },\n ]\n : []),\n {\n id: \"settings\",\n label: \"Settings\",\n description: \"Choose thinking, keybindings, and selection copying\",\n to: state.kind === \"invalid\" ? \"invalid\" : \"settings\",\n },\n ],\n hint: \"close\",\n }),\n resume: () => ({\n kind: \"choice\",\n title: \"Resume BTW side thread\",\n enableSearch: true,\n items: resumeThreads.map((thread) => ({\n id: thread.id,\n label: thread.title,\n description: `${thread.questionCount} ${thread.questionCount === 1 ? \"question\" : \"questions\"}`,\n })),\n action: \"resume\",\n viewportSize: 10,\n hint: \"back\",\n }),\n settings: ({ state }) => ({\n kind: \"settings\",\n title: \"Pi BTW Settings\",\n lines: [`User settings \u00B7 ${displaySettingsPath}`],\n items: [\n {\n id: \"thinkingLevel\",\n label: \"Thinking level\",\n description: `Set the starting level for future pi-btw side threads. Currently ${currentMainThinkingLevel}.`,\n currentValue: displayThinkingLevel(state.settings),\n values: [SAME_AS_MAIN_THREAD, ...levels],\n action: \"set-thinking\",\n },\n {\n id: \"rememberThinkingLevelChanges\",\n label: \"Remember thinking level changes\",\n description: \"Save shortcut changes for fixed thinking levels to pi-btw.json.\",\n currentValue: effectiveRememberThinkingLevelChanges(state.settings) ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"set-remember\",\n },\n {\n id: \"fullscreenCopyOnSelect\",\n label: \"Copy selection automatically\",\n description: \"Copy mouse selections immediately instead of with the configured copy key.\",\n currentValue: effectiveFullscreenCopyOnSelect(state.settings) ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"set-fullscreen-copy\",\n },\n ...BTW_SHORTCUT_ACTIONS.map((action) => ({\n id: action,\n label: shortcutLabels[action],\n description: \"Edit a BTW-only key combination or restore its default. Ctrl+C always hard-cancels.\",\n currentValue: shortcutValue(state.settings, action),\n action: \"edit-shortcut\" as const,\n })),\n ],\n }),\n shortcut: ({ state }) => ({\n kind: \"actions\",\n title: shortcutLabels[shortcut],\n lines: [shortcutValue(state.settings, shortcut), \"Ctrl+C always hard-cancels BTW.\"],\n items: [\n { id: \"edit\", label: \"Edit key combination\u2026\", to: \"shortcut-input\" },\n { id: \"reset\", label: \"Restore default\", action: \"reset-shortcut\" },\n ],\n hint: \"back\",\n }),\n \"shortcut-input\": () => ({\n kind: \"input\",\n title: shortcutLabels[shortcut],\n lines: [\"Type a key name, not the shortcut itself. For example: ctrl+q or f6.\"],\n placeholder: \"Key combination\",\n action: \"save-shortcut\",\n hint: \"back\",\n }),\n invalid: ({ state }) => ({\n kind: \"detail\",\n title: \"Pi BTW Settings \u00B7 Read only\",\n lines: [\n `Invalid settings file. Fix ${displaySettingsPath} before saving.`,\n sanitizeSingleLine(state.reason ?? \"The settings file is invalid.\"),\n ],\n hint: \"back\",\n }),\n },\n actions: {\n \"edit-shortcut\": ({ itemId }) => {\n if (!BTW_SHORTCUT_ACTIONS.includes(itemId as BtwShortcutAction)) return { kind: \"rejected\" };\n shortcut = itemId as BtwShortcutAction;\n return { kind: \"to\", screen: \"shortcut\" };\n },\n \"save-shortcut\": ({ state, value, signal }) => saveShortcut(state, value?.trim() ?? \"\", signal),\n \"reset-shortcut\": ({ state, signal }) => saveShortcut(state, undefined, signal),\n start: async () => {\n startSelected = true;\n return { kind: \"close\" };\n },\n \"start-tree\": async () => {\n treeSelected = true;\n return { kind: \"close\" };\n },\n resume: async ({ itemId }: { itemId: string }) => {\n if (!resumeThreads.some((thread) => thread.id === itemId)) {\n return { kind: \"rejected\" } as const;\n }\n resumedThreadId = itemId;\n return { kind: \"close\" } as const;\n },\n \"set-thinking\": async ({ value, signal }) => {\n if (!value) return { kind: \"rejected\" };\n const patch =\n value === SAME_AS_MAIN_THREAD\n ? ({ thinkingLevel: undefined } satisfies BtwSettingsPatch)\n : levels.includes(value as BtwThinkingLevel)\n ? ({ thinkingLevel: value as BtwThinkingLevel } satisfies BtwSettingsPatch)\n : undefined;\n if (!patch) return { kind: \"rejected\" };\n try {\n await updateSettings(patch, { settingsPath, signal });\n if (signal.aborted) return { kind: \"rejected\" };\n notifySafely(ctx, `Pi BTW thinking level: ${value}.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!signal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"set-remember\": async ({ value, signal }) => {\n if (value !== \"On\" && value !== \"Off\") return { kind: \"rejected\" };\n try {\n await updateSettings({ rememberThinkingLevelChanges: value === \"On\" }, { settingsPath, signal });\n if (signal.aborted) return { kind: \"rejected\" };\n notifySafely(ctx, `Remember thinking level changes: ${value}.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!signal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"set-fullscreen-copy\": async ({ value, signal }) => {\n if (value !== \"On\" && value !== \"Off\") return { kind: \"rejected\" };\n try {\n await updateSettings({ fullscreenCopyOnSelect: value === \"On\" }, { settingsPath, signal });\n if (signal.aborted) return { kind: \"rejected\" };\n notifySafely(ctx, `Copy selection automatically: ${value}.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!signal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n },\n });\n\n const result = await runBtwMenuPreservingEditor(\n ctx,\n (menuContext) => runMenu(menuContext, menu, { getState: loadState }),\n (manager) => {\n keybindings = manager;\n },\n );\n if (result.kind !== \"closed\" || result.reason !== \"close\") return \"closed\";\n if (resumedThreadId) return { kind: \"resume\", threadId: resumedThreadId };\n if (treeSelected) return \"tree\";\n return startSelected ? \"start\" : \"closed\";\n}\n\nexport async function showBtwCustomPreservingEditor<T>(\n ctx: ExtensionCommandContext,\n factory: BtwCustomFactory<T>,\n): Promise<T | undefined> {\n let liveEditorText = ctx.ui.getEditorText();\n let completed = false;\n const result = await ctx.ui.custom<T>((tui, theme, keybindings, done) =>\n factory(tui, theme, keybindings, (value) => {\n try {\n liveEditorText = ctx.ui.getEditorText();\n } catch {\n // Keep completion finite if session replacement invalidates the editor context.\n }\n completed = true;\n done(value);\n }),\n );\n if (completed) {\n try {\n if (ctx.ui.getEditorText() !== liveEditorText) ctx.ui.setEditorText(liveEditorText);\n } catch {\n // A replaced context owns a different editor and must not receive stale restoration.\n }\n }\n return result;\n}\n\nexport async function runBtwMenuPreservingEditor(\n ctx: ExtensionCommandContext,\n run: (menuContext: MenuContext) => Promise<RunMenuResult>,\n onKeybindings?: (keybindings: KeybindingsManager) => void,\n): Promise<RunMenuResult> {\n let liveEditorText = ctx.ui.getEditorText();\n let completed = false;\n const ui = new Proxy(ctx.ui, {\n get(target, property) {\n if (property === \"custom\") {\n return <Value>(factory: BtwCustomFactory<Value>, customOptions?: BtwCustomOptions) =>\n target.custom<Value>((tui, theme, keybindings, done) => {\n onKeybindings?.(keybindings);\n return factory(tui, theme, keybindings, (value) => {\n try {\n liveEditorText = target.getEditorText();\n } catch {\n // Keep completion finite if session replacement invalidates the editor context.\n }\n completed = true;\n done(value);\n });\n }, customOptions);\n }\n const value = Reflect.get(target, property, target) as unknown;\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n const result = await run({ mode: ctx.mode, hasUI: ctx.hasUI, ui });\n if (result.kind !== \"stale\" && completed) {\n try {\n if (ctx.ui.getEditorText() !== liveEditorText) ctx.ui.setEditorText(liveEditorText);\n } catch {\n // A replaced context owns a different editor and must not receive stale restoration.\n }\n }\n return result;\n}\n\nfunction clampToAvailableThinkingLevel(\n requested: BtwThinkingLevel,\n available: readonly BtwThinkingLevel[],\n): BtwThinkingLevel {\n if (available.includes(requested)) return requested;\n const requestedIndex = BTW_THINKING_LEVELS.indexOf(requested);\n for (let index = requestedIndex; index < BTW_THINKING_LEVELS.length; index += 1) {\n const candidate = BTW_THINKING_LEVELS[index];\n if (candidate && available.includes(candidate)) return candidate;\n }\n for (let index = requestedIndex - 1; index >= 0; index -= 1) {\n const candidate = BTW_THINKING_LEVELS[index];\n if (candidate && available.includes(candidate)) return candidate;\n }\n return available[0] ?? \"off\";\n}\n\nfunction notifySaveFailure(ctx: ExtensionCommandContext, error: unknown): void {\n notifySafely(\n ctx,\n `Pi BTW settings were not saved; the previous value remains active: ${formatError(error)}`,\n \"error\",\n );\n}\n\nfunction notifySafely(\n ctx: ExtensionCommandContext,\n message: string,\n level: Parameters<ExtensionCommandContext[\"ui\"][\"notify\"]>[1],\n): void {\n try {\n ctx.ui.notify(sanitizeSingleLine(message), level);\n } catch {\n // A completed save remains valid if its command context was replaced before notification.\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import type { MarkdownTransformer, Theme } from \"@earendil-works/pi-coding-agent\";\nimport type { SideThreadTurn } from \"./side-thread.js\";\n\nexport type BtwMarkdownTransformers = (theme: Theme) => readonly MarkdownTransformer[];\n\ntype MermaidMarkdownModule = typeof import(\"@narumitw/pi-tui-kit/markdown\");\n\nconst MERMAID_MARKDOWN_MODULE = \"@narumitw/pi-tui-kit/markdown\";\nconst noMarkdownTransformers: BtwMarkdownTransformers = () => [];\n\nexport function prepareBtwTranscriptMarkdown(\n turns: readonly SideThreadTurn[],\n pendingQuestion?: string,\n): Promise<BtwMarkdownTransformers>;\nexport function prepareBtwTranscriptMarkdown(\n turns: readonly SideThreadTurn[],\n pendingQuestion: string | undefined,\n signal: AbortSignal,\n): Promise<BtwMarkdownTransformers | undefined>;\nexport async function prepareBtwTranscriptMarkdown(\n turns: readonly SideThreadTurn[],\n pendingQuestion?: string,\n signal?: AbortSignal,\n): Promise<BtwMarkdownTransformers | undefined> {\n const documents = turns.flatMap((turn) =>\n turn.kind === \"answered\" ? [turn.question, turn.answer] : [turn.question],\n );\n if (pendingQuestion) documents.push(pendingQuestion);\n if (!documents.some((document) => /mermaid/iu.test(document))) return noMarkdownTransformers;\n if (signal?.aborted) return undefined;\n\n const markdownModule = await settleUnlessAborted(\n import(MERMAID_MARKDOWN_MODULE) as Promise<MermaidMarkdownModule>,\n signal,\n );\n if (!markdownModule || signal?.aborted) return undefined;\n const { createMermaidMarkdownTransformer, prepareMermaidMarkdownRenderer } = markdownModule;\n const preparations = new Set<Promise<void>>();\n for (const document of documents) {\n const preparation = prepareMermaidMarkdownRenderer(document);\n if (preparation) preparations.add(preparation);\n }\n if (preparations.size > 0 && !(await settleUnlessAborted(Promise.all(preparations), signal))) return undefined;\n if (signal?.aborted) return undefined;\n\n return (theme) => {\n const transformer = createMermaidMarkdownTransformer(theme);\n return transformer ? [transformer] : [];\n };\n}\n\nasync function settleUnlessAborted<T>(operation: Promise<T>, signal?: AbortSignal): Promise<T | undefined> {\n if (!signal) return operation;\n let onAbort: (() => void) | undefined;\n const aborted = new Promise<undefined>((resolve) => {\n onAbort = () => resolve(undefined);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) onAbort();\n });\n try {\n return await Promise.race([operation, aborted]);\n } finally {\n if (onAbort) signal.removeEventListener(\"abort\", onAbort);\n }\n}\n", "import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport {\n AssistantMessageComponent,\n getMarkdownTheme,\n type KeybindingsManager,\n type MarkdownTransformer,\n type Theme,\n UserMessageComponent,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n type Component,\n CURSOR_MARKER,\n Editor,\n type EditorTheme,\n type Focusable,\n Key,\n Loader,\n Markdown,\n matchesKey,\n ScrollView,\n type TUI,\n truncateToWidth,\n VStack,\n visibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { BtwFullscreenLayoutComponent } from \"./fullscreen-ui.js\";\nimport { BtwPasteGuard, type BtwShortcuts, getBtwShortcuts } from \"./keybindings.js\";\nimport type { BtwThinkingLevel, SideThreadTurn } from \"./side-thread.js\";\nimport { sanitizeSingleLine } from \"./text.js\";\n\nconst TRANSCRIPT_CHROME_LINES = 2;\nconst MAX_STEERING_DISPLAY_LINES = 3;\nconst OSC133_MARKERS = [\"\\u001b]133;A\\u0007\", \"\\u001b]133;B\\u0007\", \"\\u001b]133;C\\u0007\"];\n// Pi renders a spacer above the custom component and a two-line built-in footer below it.\nconst RESERVED_APP_LINES = 3;\n\n// A temporary fit after manual scrolling must not silently resume following new output.\nclass PreservingScrollView extends ScrollView {\n override updateLayout(contentHeight: number, viewportHeight: number, requestRender: () => void): void {\n const preserveManualPosition = !this.isFollowingEnd;\n super.updateLayout(contentHeight, viewportHeight, requestRender);\n if (preserveManualPosition && this.isFollowingEnd) {\n this.scrollTo(this.scrollTop, { disableFollow: true });\n }\n }\n}\n\nexport type TranscriptPagerAction =\n | { kind: \"submit\"; question: string }\n | { kind: \"bringToMain\"; questionDraft: string }\n | { kind: \"close\" };\n\nexport interface BtwThinkingControl {\n level: BtwThinkingLevel;\n levels: readonly BtwThinkingLevel[];\n keybindings: KeybindingsManager;\n onChange: (level: BtwThinkingLevel) => void;\n}\n\nexport interface BtwAnsweringViewOptions {\n markdownTransformers?: readonly MarkdownTransformer[];\n steering?: {\n questions: readonly string[];\n onSubmit: (question: string) => void;\n thinking?: BtwThinkingControl;\n };\n}\n\nexport class BtwTranscriptPager implements BtwFullscreenLayoutComponent, Focusable {\n private readonly shortcuts: BtwShortcuts;\n private readonly pasteGuard = new BtwPasteGuard();\n private readonly transcriptComponents: Component[];\n private readonly editor: Editor;\n private readonly canBringToMain: boolean;\n private readonly scrollView: ScrollView;\n private readonly layoutRoot: VStack;\n private lastContentLineCount = 0;\n private warning: string | undefined;\n private finished = false;\n private isFocused = false;\n private thinkingLevel: BtwThinkingLevel | undefined;\n\n constructor(\n private readonly tui: TUI,\n private readonly theme: Theme,\n turns: readonly SideThreadTurn[],\n private readonly onAction: (action: TranscriptPagerAction) => void,\n private readonly options: {\n startAtBottom?: boolean;\n initialQuestion?: string;\n markdownTransformers?: readonly MarkdownTransformer[];\n thinking?: BtwThinkingControl;\n } = {},\n ) {\n this.shortcuts = getBtwShortcuts(tui, options.thinking?.keybindings);\n this.transcriptComponents = buildTranscriptComponents(turns, this.theme, undefined, options.markdownTransformers);\n this.canBringToMain = turns.some((turn) => turn.kind === \"answered\");\n this.thinkingLevel = options.thinking?.level;\n const editorTheme: EditorTheme = {\n borderColor: (text) => this.theme.fg(\"accent\", text),\n selectList: {\n selectedPrefix: (text) => this.theme.fg(\"accent\", text),\n selectedText: (text) => this.theme.fg(\"accent\", text),\n description: (text) => this.theme.fg(\"muted\", text),\n scrollInfo: (text) => this.theme.fg(\"dim\", text),\n noMatch: (text) => this.theme.fg(\"warning\", text),\n },\n };\n this.editor = new Editor(this.tui, editorTheme);\n if (options.initialQuestion) this.editor.setText(options.initialQuestion);\n this.editor.onChange = () => {\n this.warning = undefined;\n };\n this.editor.onSubmit = (text) => {\n const question = text.trim();\n if (!question) {\n this.warning = \"Question cannot be empty\";\n return;\n }\n this.finished = true;\n this.onAction({ kind: \"submit\", question });\n };\n const transcript = this.createTranscriptComponent();\n this.scrollView = new PreservingScrollView(transcript, {\n follow: options.startAtBottom ? \"end\" : \"none\",\n primary: true,\n });\n this.layoutRoot = new VStack([\n { component: this.createHeaderComponent(), basis: 1, shrink: 0, minSize: 1 },\n { component: this.scrollView, basis: 0, grow: 1, minSize: 0 },\n { component: this.createFooterComponent(), basis: 1, shrink: 0, minSize: 1 },\n { component: this.editor, basis: \"auto\", shrink: 1, minSize: 0 },\n ]);\n }\n\n get focused(): boolean {\n return this.isFocused;\n }\n\n set focused(value: boolean) {\n this.isFocused = value;\n this.editor.focused = value;\n }\n\n getFullscreenLayout(): Component {\n return this.layoutRoot;\n }\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const safeWidth = Math.max(1, width);\n const editorLines = this.editor.render(safeWidth);\n const availableRows = Math.max(1, this.tui.terminal.rows - RESERVED_APP_LINES);\n const viewportHeight = Math.max(0, availableRows - editorLines.length - TRANSCRIPT_CHROME_LINES);\n const contentLines = renderTranscriptLines(this.transcriptComponents, safeWidth);\n this.lastContentLineCount = contentLines.length;\n this.scrollView.updateLayout(contentLines.length, viewportHeight, () => this.tui.requestRender());\n\n return fitComposerLayout(\n renderSideThreadHeader(safeWidth, this.theme, this.thinkingLevel),\n contentLines.slice(this.scrollView.scrollTop, this.scrollView.scrollTop + viewportHeight),\n this.renderFooter(safeWidth),\n editorLines,\n availableRows,\n ).map((line) => truncateToWidth(line, safeWidth));\n }\n\n handleInput(data: string): void {\n if (this.finished) return;\n if (this.pasteGuard.consume(data)) {\n this.editor.handleInput(data);\n this.tui.requestRender();\n return;\n }\n if (this.shortcuts.matches(data, \"exit\")) {\n this.finished = true;\n this.onAction({ kind: \"close\" });\n return;\n }\n if (this.canBringToMain && this.shortcuts.matches(data, \"bringToMain\")) {\n this.finished = true;\n this.onAction({ kind: \"bringToMain\", questionDraft: this.editor.getExpandedText() });\n return;\n }\n const thinking = this.options.thinking;\n if (thinking && thinking.levels.length > 1 && this.shortcuts.matches(data, \"cycleThinkingLevel\")) {\n const currentIndex = thinking.levels.indexOf(this.thinkingLevel ?? thinking.level);\n const nextLevel = thinking.levels[(currentIndex + 1) % thinking.levels.length];\n if (nextLevel) {\n this.thinkingLevel = nextLevel;\n thinking.onChange(nextLevel);\n this.warning = undefined;\n this.tui.requestRender();\n }\n return;\n }\n if (matchesKey(data, Key.pageUp)) {\n this.scrollView.scrollBy(-Math.max(1, this.scrollView.viewportHeight));\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, Key.pageDown)) {\n this.scrollView.scrollBy(Math.max(1, this.scrollView.viewportHeight));\n this.tui.requestRender();\n return;\n }\n this.editor.handleInput(data);\n if (!this.finished) this.tui.requestRender();\n }\n\n invalidate(): void {\n this.layoutRoot.invalidate();\n }\n\n dispose(): void {\n if (this.finished) return;\n this.finished = true;\n this.onAction({ kind: \"close\" });\n }\n\n private renderFooter(width: number): string {\n const exit = this.shortcuts.label(\"exit\");\n const bring = this.canBringToMain && this.shortcuts.keys.bringToMain.length > 0;\n const bringKey = this.shortcuts.label(\"bringToMain\");\n if (this.warning) {\n const warning = width < 32 ? `Empty \u2022 ${exit}` : `${this.warning} \u2022 ${exit} exit`;\n return truncateToWidth(this.theme.fg(\"warning\", warning), width);\n }\n const scrollable = this.getMaxScrollOffset() > 0;\n const thinking = this.options.thinking;\n const cycleHint =\n thinking && thinking.levels.length > 1 && this.thinkingLevel && this.shortcuts.keys.cycleThinkingLevel.length\n ? ` \u2022 thinking ${this.thinkingLevel} \u2022 ${this.shortcuts.label(\"cycleThinkingLevel\")} cycle`\n : \"\";\n const base = bring\n ? `btw \u2022 Enter send \u2022 ${bringKey} bring to main \u2022 ${exit} exit`\n : `btw \u2022 Enter send \u2022 ${exit} exit`;\n const fullBase = `${base}${cycleHint}`;\n const fallbackBase = `btw \u2022 Enter \u2022 ${exit}`;\n const compactBase = bring ? `btw \u2022 Enter \u2022 ${bringKey} \u2022 ${exit}` : fallbackBase;\n const compactWithThinking = `${compactBase}${cycleHint}`;\n let hints =\n visibleWidth(fullBase) <= width\n ? fullBase\n : visibleWidth(compactWithThinking) <= width\n ? compactWithThinking\n : visibleWidth(compactBase) <= width\n ? compactBase\n : fallbackBase;\n if (scrollable) {\n const history = ` \u2022 ${this.scrollView.scrollTop > 0 ? \"\u2191 older\" : \"\u2193 newer\"} \u2022 PgUp/PgDn history`;\n const compactHistory = \" \u2022 PgUp/PgDn\";\n const compactScrollable = bring\n ? `Enter \u2022 ${bringKey} \u2022 ${exit} \u2022 PgUp/PgDn`\n : `${fallbackBase}${compactHistory}`;\n if (visibleWidth(`${hints}${history}`) <= width) {\n hints += history;\n } else if (visibleWidth(`${compactBase}${history}`) <= width) {\n hints = `${compactBase}${history}`;\n } else if (visibleWidth(`${hints}${compactHistory}`) <= width) {\n hints += compactHistory;\n } else if (visibleWidth(`${compactBase}${compactHistory}`) <= width) {\n hints = `${compactBase}${compactHistory}`;\n } else if (visibleWidth(compactScrollable) <= width) {\n hints = compactScrollable;\n }\n }\n return truncateToWidth(this.theme.fg(\"muted\", hints), width);\n }\n\n private createHeaderComponent(): Component {\n return {\n render: (width) => [renderSideThreadHeader(width, this.theme, this.thinkingLevel)],\n invalidate() {},\n };\n }\n\n private createTranscriptComponent(): Component {\n return {\n render: (width) => {\n const lines = renderTranscriptLines(this.transcriptComponents, width);\n this.lastContentLineCount = lines.length;\n return lines;\n },\n invalidate: () => {\n for (const component of this.transcriptComponents) component.invalidate();\n },\n };\n }\n\n private createFooterComponent(): Component {\n return {\n render: (width) => [this.renderFooter(width)],\n invalidate() {},\n };\n }\n\n private getMaxScrollOffset(): number {\n return Math.max(0, this.lastContentLineCount - this.scrollView.viewportHeight);\n }\n}\n\nexport class BtwAnsweringView implements BtwFullscreenLayoutComponent, Focusable {\n private readonly shortcuts: BtwShortcuts;\n private readonly pasteGuard = new BtwPasteGuard();\n private readonly transcriptComponents: Component[];\n private readonly loader: Loader;\n private readonly editor: Editor | undefined;\n private readonly controller = new AbortController();\n private readonly scrollView: ScrollView;\n private readonly layoutRoot: VStack;\n private lastContentLineCount = 0;\n private warning: string | undefined;\n private finished = false;\n private isFocused = false;\n private thinkingLevel: BtwThinkingLevel | undefined;\n\n constructor(\n private readonly tui: TUI,\n private readonly theme: Theme,\n turns: readonly SideThreadTurn[],\n pendingQuestion: string,\n private readonly onCancel: () => void,\n thinkingLevel?: BtwThinkingLevel,\n private readonly options: BtwAnsweringViewOptions = {},\n ) {\n this.shortcuts = getBtwShortcuts(tui, options.steering?.thinking?.keybindings);\n this.transcriptComponents = buildTranscriptComponents(\n turns,\n this.theme,\n pendingQuestion,\n options.markdownTransformers,\n );\n this.thinkingLevel = options.steering?.thinking?.level ?? thinkingLevel;\n this.loader = new Loader(\n this.tui,\n (text) => this.theme.fg(\"accent\", text),\n (text) => this.theme.fg(\"muted\", text),\n \"Answering\u2026\",\n );\n if (options.steering) {\n const editorTheme: EditorTheme = {\n borderColor: (text) => this.theme.fg(\"accent\", text),\n selectList: {\n selectedPrefix: (text) => this.theme.fg(\"accent\", text),\n selectedText: (text) => this.theme.fg(\"accent\", text),\n description: (text) => this.theme.fg(\"muted\", text),\n scrollInfo: (text) => this.theme.fg(\"dim\", text),\n noMatch: (text) => this.theme.fg(\"warning\", text),\n },\n };\n this.editor = new Editor(this.tui, editorTheme);\n this.editor.onChange = () => {\n this.warning = undefined;\n };\n this.editor.onSubmit = (text) => {\n const question = text.trim();\n if (!question) {\n this.warning = \"Question cannot be empty\";\n return;\n }\n options.steering?.onSubmit(question);\n this.warning = undefined;\n };\n }\n const transcript = this.createTranscriptComponent();\n this.scrollView = new PreservingScrollView(transcript, { follow: \"end\", primary: true });\n this.layoutRoot = new VStack([\n { component: this.createHeaderComponent(), basis: 1, shrink: 0, minSize: 1 },\n { component: this.scrollView, basis: 0, grow: 1, minSize: 0 },\n {\n component: this.createSteeringComponent(),\n basis: \"auto\",\n shrink: 1,\n minSize: 0,\n maxSize: MAX_STEERING_DISPLAY_LINES,\n },\n { component: this.createFooterComponent(), basis: 1, shrink: 0, minSize: 1 },\n ...(this.editor ? [{ component: this.editor, basis: \"auto\" as const, shrink: 1, minSize: 0 }] : []),\n ]);\n }\n\n get focused(): boolean {\n return this.isFocused;\n }\n\n set focused(value: boolean) {\n this.isFocused = value;\n if (this.editor) this.editor.focused = value;\n }\n\n get signal(): AbortSignal {\n return this.controller.signal;\n }\n\n getFullscreenLayout(): Component {\n return this.layoutRoot;\n }\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const safeWidth = Math.max(1, width);\n const availableRows = Math.max(1, this.tui.terminal.rows - RESERVED_APP_LINES);\n const editorLines = this.editor?.render(safeWidth) ?? [];\n const steeringCapacity = Math.max(0, availableRows - editorLines.length - TRANSCRIPT_CHROME_LINES);\n const steeringLines = renderSteeringLines(\n this.options.steering?.questions ?? [],\n safeWidth,\n this.theme,\n Math.min(MAX_STEERING_DISPLAY_LINES, steeringCapacity),\n );\n const viewportHeight = Math.max(\n 0,\n availableRows - editorLines.length - TRANSCRIPT_CHROME_LINES - steeringLines.length,\n );\n const contentLines = renderTranscriptLines(this.transcriptComponents, safeWidth);\n this.lastContentLineCount = contentLines.length;\n this.scrollView.updateLayout(contentLines.length, viewportHeight, () => this.tui.requestRender());\n\n return fitComposerLayout(\n renderSideThreadHeader(safeWidth, this.theme, this.thinkingLevel),\n contentLines.slice(this.scrollView.scrollTop, this.scrollView.scrollTop + viewportHeight),\n this.renderFooter(safeWidth),\n editorLines,\n availableRows,\n steeringLines,\n ).map((line) => truncateToWidth(line, safeWidth));\n }\n\n handleInput(data: string): void {\n if (this.finished) return;\n if (this.pasteGuard.consume(data)) {\n this.editor?.handleInput(data);\n this.tui.requestRender();\n return;\n }\n if (this.shortcuts.matches(data, \"exit\")) {\n this.finished = true;\n this.loader.stop();\n this.controller.abort();\n this.onCancel();\n return;\n }\n const thinking = this.options.steering?.thinking;\n if (thinking && thinking.levels.length > 1 && this.shortcuts.matches(data, \"cycleThinkingLevel\")) {\n const currentIndex = thinking.levels.indexOf(this.thinkingLevel ?? thinking.level);\n const nextLevel = thinking.levels[(currentIndex + 1) % thinking.levels.length];\n if (nextLevel) {\n this.thinkingLevel = nextLevel;\n thinking.onChange(nextLevel);\n this.warning = undefined;\n this.tui.requestRender();\n }\n return;\n }\n if (matchesKey(data, Key.pageUp)) {\n this.scrollView.scrollBy(-Math.max(1, this.scrollView.viewportHeight));\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, Key.pageDown)) {\n this.scrollView.scrollBy(Math.max(1, this.scrollView.viewportHeight));\n this.tui.requestRender();\n return;\n }\n this.editor?.handleInput(data);\n this.tui.requestRender();\n }\n\n invalidate(): void {\n this.layoutRoot.invalidate();\n }\n\n finish(): void {\n this.finished = true;\n this.loader.stop();\n }\n\n dispose(): void {\n if (this.finished) {\n this.loader.stop();\n this.controller.abort();\n return;\n }\n this.finished = true;\n this.loader.stop();\n this.controller.abort();\n this.onCancel();\n }\n\n private renderFooter(width: number): string {\n const exit = this.shortcuts.label(\"exit\");\n if (this.warning) {\n const warning = width < 32 ? `Empty \u2022 ${exit}` : `${this.warning} \u2022 ${exit} cancel`;\n return truncateToWidth(this.theme.fg(\"warning\", warning), width);\n }\n const baseHint = this.editor ? `Enter steer \u2022 ${exit} cancel` : `${exit} cancel`;\n const thinking = this.options.steering?.thinking;\n const cycleHint =\n thinking && thinking.levels.length > 1 && this.thinkingLevel && this.shortcuts.keys.cycleThinkingLevel.length\n ? ` \u2022 thinking ${this.thinkingLevel} \u2022 ${this.shortcuts.label(\"cycleThinkingLevel\")} cycle`\n : \"\";\n const scrollHint = this.getMaxScrollOffset() > 0 ? \" \u2022 PgUp/PgDn history\" : \"\";\n const hints = `${baseHint}${cycleHint}${scrollHint}`;\n const compactHints = this.editor ? `Enter \u2022 ${exit}` : exit;\n const selectedHints = visibleWidth(hints) <= width ? hints : compactHints;\n const loaderWidth = Math.max(1, width - visibleWidth(selectedHints) - 3);\n const loaderLine = this.loader.render(loaderWidth).at(-1) ?? \"Answering\u2026\";\n return truncateToWidth(`${loaderLine} \u2022 ${this.theme.fg(\"muted\", selectedHints)}`, width);\n }\n\n private createHeaderComponent(): Component {\n return {\n render: (width) => [renderSideThreadHeader(width, this.theme, this.thinkingLevel)],\n invalidate() {},\n };\n }\n\n private createTranscriptComponent(): Component {\n return {\n render: (width) => {\n const lines = renderTranscriptLines(this.transcriptComponents, width);\n this.lastContentLineCount = lines.length;\n return lines;\n },\n invalidate: () => {\n for (const component of this.transcriptComponents) component.invalidate();\n },\n };\n }\n\n private createSteeringComponent(): Component {\n return {\n render: (width) =>\n renderSteeringLines(this.options.steering?.questions ?? [], width, this.theme, MAX_STEERING_DISPLAY_LINES),\n invalidate() {},\n };\n }\n\n private createFooterComponent(): Component {\n return {\n render: (width) => [this.renderFooter(width)],\n invalidate: () => this.loader.invalidate(),\n };\n }\n\n private getMaxScrollOffset(): number {\n return Math.max(0, this.lastContentLineCount - this.scrollView.viewportHeight);\n }\n}\n\nexport function formatSideTranscript(turns: readonly SideThreadTurn[]): string {\n return turns\n .map((turn) => {\n const question = escapeTerminalControls(turn.question);\n const rawAnswer = escapeTerminalControls(turn.answer);\n const answer = turn.kind === \"error\" ? `Error: ${rawAnswer}` : rawAnswer;\n return `${question}\\n\\n${answer}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction buildTranscriptComponents(\n turns: readonly SideThreadTurn[],\n theme: Theme,\n pendingQuestion?: string,\n markdownTransformers: readonly MarkdownTransformer[] = [],\n): Component[] {\n const components = turns.flatMap((turn): Component[] => {\n const question = new UserMessageComponent(\n escapeTerminalControls(turn.question),\n getMarkdownTheme(),\n 1,\n markdownTransformers,\n );\n if (turn.kind === \"error\") {\n const error = new Markdown(`Error: ${escapeTerminalControls(turn.answer)}`, 1, 1, getMarkdownTheme(), {\n color: (text) => theme.fg(\"error\", text),\n });\n return [question, error];\n }\n const response: AssistantMessage = {\n ...turn.response,\n content: [{ type: \"text\", text: escapeTerminalControls(turn.answer) }],\n stopReason: \"stop\",\n errorMessage: undefined,\n };\n return [question, new AssistantMessageComponent(response, true, getMarkdownTheme(), \"\", 1, markdownTransformers)];\n });\n if (pendingQuestion) {\n components.push(\n new UserMessageComponent(escapeTerminalControls(pendingQuestion), getMarkdownTheme(), 1, markdownTransformers),\n );\n }\n return components;\n}\n\nfunction renderTranscriptLines(components: readonly Component[], width: number): string[] {\n return components.flatMap((component) => component.render(width)).map(stripShellIntegrationMarkers);\n}\n\nfunction renderSideThreadHeader(width: number, theme: Theme, thinkingLevel?: BtwThinkingLevel): string {\n const thinking = thinkingLevel ? ` \u00B7 thinking ${thinkingLevel}` : \"\";\n const title = truncateToWidth(`\u2500 btw \u00B7 side thread${thinking} `, width);\n const ruleWidth = Math.max(0, width - visibleWidth(title));\n return theme.fg(\"muted\", `${title}${\"\u2500\".repeat(ruleWidth)}`);\n}\n\nfunction fitComposerLayout(\n header: string,\n contentLines: string[],\n footer: string,\n editorLines: string[],\n availableRows: number,\n statusLines: string[] = [],\n): string[] {\n const lines = [header, ...contentLines, ...statusLines, footer, ...editorLines];\n if (lines.length <= availableRows) return lines;\n if (availableRows <= 1) return [header];\n const editorBudget = Math.max(0, availableRows - 2);\n return [header, footer, ...fitEditorLines(editorLines, editorBudget)];\n}\n\nfunction fitEditorLines(editorLines: string[], budget: number): string[] {\n if (budget <= 0) return [];\n if (editorLines.length <= budget) return editorLines;\n const cursorIndex = editorLines.findIndex((line) => line.includes(CURSOR_MARKER));\n if (cursorIndex < 0) return editorLines.slice(-budget);\n const start = Math.min(cursorIndex, editorLines.length - budget);\n return editorLines.slice(start, start + budget);\n}\n\nfunction renderSteeringLines(questions: readonly string[], width: number, theme: Theme, maxLines: number): string[] {\n if (questions.length === 0 || maxLines <= 0) return [];\n const formatQuestion = (question: string) => sanitizeSingleLine(question) || \"(non-printing message)\";\n if (maxLines === 1 && questions.length > 1) {\n return [\n truncateToWidth(\n theme.fg(\"dim\", `Steering (+${questions.length - 1} more): ${formatQuestion(questions[0] ?? \"\")}`),\n width,\n ),\n ];\n }\n const hasOverflow = questions.length > maxLines;\n const questionLimit = hasOverflow ? Math.max(1, maxLines - 1) : maxLines;\n const lines = questions\n .slice(0, questionLimit)\n .map((question) => truncateToWidth(theme.fg(\"dim\", `Steering: ${formatQuestion(question)}`), width));\n if (hasOverflow) {\n lines.push(truncateToWidth(theme.fg(\"dim\", `Steering: \u2026 +${questions.length - questionLimit} more`), width));\n }\n return lines;\n}\n\nfunction stripShellIntegrationMarkers(line: string): string {\n return OSC133_MARKERS.reduce((result, marker) => result.replaceAll(marker, \"\"), line);\n}\n\nfunction escapeTerminalControls(text: string): string {\n return [...text]\n .map((character) => {\n if (character === \"\\n\") return character;\n if (character === \"\\t\") return \" \";\n const code = character.charCodeAt(0);\n if (code <= 31 || (code >= 127 && code <= 159)) {\n return `\\\\x${code.toString(16).padStart(2, \"0\")}`;\n }\n return character;\n })\n .join(\"\");\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["isKeyRelease", "isKittyProtocolActive", "Key", "truncateToWidth", "matchesKey", "formatKeyLabel", "matchesKey", "formatKeyLabel", "formatKeyLabel", "isKittyProtocolActive", "copyToClipboard", "Key", "isKeyRelease", "truncateToWidth", "Key", "matchesKey", "formatError", "formatKeyLabel", "error", "value", "formatError", "matchesKey", "Key", "notifySafely", "formatError", "result", "Key", "matchesKey", "truncateToWidth", "visibleWidth", "truncateToWidth", "matchesKey", "Key", "visibleWidth", "escapeTerminalControls", "truncateToWidth", "visibleWidth", "formatError", "formatError", "notifySafely", "
|
|
3
|
+
"sources": ["../src/btw.ts", "../src/bring-to-main.ts", "../src/fullscreen-ui.ts", "../src/keybindings.ts", "../src/text.ts", "../src/main-tree-picker.ts", "../src/menu.ts", "../src/settings.ts", "../src/side-thread.ts", "../src/transcript-markdown.ts", "../src/transcript-pager.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type Api,\n clampThinkingLevel,\n getSupportedThinkingLevels,\n type Model,\n type ProviderHeaders,\n} from \"@earendil-works/pi-ai\";\nimport { BorderedLoader, type ExtensionAPI, type ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { MenuContext, RunMenuResult } from \"@narumitw/pi-tui-kit\";\nimport {\n type BtwBringToMainSegment,\n type BtwBringToMainSummary,\n BtwTextRangeSelector,\n type BtwTextRangeSelectorState,\n buildQuickBringToMainSegments,\n estimateBringToMainTokens,\n formatBtwBringToMain,\n getAnsweredTurns,\n summarizeBringToMain,\n} from \"./bring-to-main.js\";\nimport { type RunBtwFullscreen, runBtwFullscreen } from \"./fullscreen-ui.js\";\nimport { pickMainEntry } from \"./main-tree-picker.js\";\nimport {\n type BtwCommandMenuResult,\n type BtwResumeThreadSummary,\n runBtwMenuPreservingEditor,\n showBtwCommandMenu,\n showBtwCustomPreservingEditor,\n} from \"./menu.js\";\nimport {\n type BtwSettings,\n effectiveFullscreenCopyOnSelect,\n effectiveRememberThinkingLevelChanges,\n parseBtwModelReference,\n readBtwSettings,\n updateBtwSettings,\n} from \"./settings.js\";\nimport {\n BTW_THINKING_LEVELS,\n type BtwThinkingLevel,\n type CompleteSimpleFunction,\n completeSideThreadTurn,\n createSideThread,\n type SideQuestionAuth,\n type SideThread,\n} from \"./side-thread.js\";\nimport { sanitizeSingleLine } from \"./text.js\";\nimport { type BtwMarkdownTransformers, prepareBtwTranscriptMarkdown } from \"./transcript-markdown.js\";\nimport {\n BtwAnsweringView,\n type BtwThinkingControl,\n BtwTranscriptPager,\n type TranscriptPagerAction,\n} from \"./transcript-pager.js\";\n\nexport {\n BTW_SETTINGS_FILE,\n type BtwSettings,\n type BtwSettingsLoadResult,\n normalizeBtwSettings,\n parseBtwModelReference,\n readBtwSettings,\n} from \"./settings.js\";\nexport {\n BTW_THINKING_LEVELS,\n type BtwThinkingLevel,\n buildUserPrompt,\n completeSideQuestion,\n} from \"./side-thread.js\";\nexport { sanitizeSingleLine } from \"./text.js\";\n\nconst MAX_CONTEXT_CHARS = 40_000;\n\ninterface LoadBtwThinkingLevelOptions {\n settingsPath?: string;\n warn?: (message: string) => void;\n}\n\ntype BtwModelRegistry = Pick<ExtensionCommandContext[\"modelRegistry\"], \"find\" | \"getApiKeyAndHeaders\">;\n\ntype BtwProviderRegistry = Pick<ExtensionCommandContext[\"modelRegistry\"], \"getProvider\">;\n\nexport function createModelRegistryCompleteSimple(modelRegistry: BtwProviderRegistry): CompleteSimpleFunction {\n return async (model, context, options) => {\n const provider = modelRegistry.getProvider(model.provider);\n if (!provider) throw new Error(`No provider registered for model provider: ${model.provider}`);\n return provider.streamSimple(model, context, options).result();\n };\n}\n\ninterface ResolveBtwModelOptions {\n settings: BtwSettings;\n currentModel: Model<Api> | undefined;\n modelRegistry: BtwModelRegistry;\n warn?: (message: string) => void;\n}\n\nexport interface ResolvedBtwModel {\n model: Model<Api>;\n auth: SideQuestionAuth;\n}\n\nexport interface BtwThreadState {\n id: string;\n title?: string;\n thread: SideThread;\n thinkingLevel: BtwThinkingLevel;\n createdAt: number;\n updatedAt: number;\n}\n\nexport async function resolveBtwModel({\n settings,\n currentModel,\n modelRegistry,\n warn,\n}: ResolveBtwModelOptions): Promise<ResolvedBtwModel | undefined> {\n const reportWarning = (message: string) => warn?.(sanitizeSingleLine(message));\n if (settings.model) {\n const fallback = currentModel ? `${currentModel.provider}/${currentModel.id}` : \"the current model\";\n const reference = parseBtwModelReference(settings.model);\n if (!reference) {\n reportWarning(`pi-btw model ${settings.model} is invalid; falling back to ${fallback}.`);\n return resolveBtwModel({ settings: {}, currentModel, modelRegistry, warn: reportWarning });\n }\n const configuredModel = modelRegistry.find(reference.provider, reference.modelId);\n if (!configuredModel) {\n reportWarning(`pi-btw model ${settings.model} was not found; falling back to ${fallback}.`);\n } else {\n const sameAsCurrent =\n configuredModel === currentModel ||\n (configuredModel.provider === currentModel?.provider && configuredModel.id === currentModel.id);\n const fallbackAction = sameAsCurrent ? \"no distinct current model is available\" : `falling back to ${fallback}`;\n try {\n const auth = await modelRegistry.getApiKeyAndHeaders(configuredModel);\n if (auth.ok && hasRequestAuth(auth)) {\n return {\n model: auth.baseUrl ? { ...configuredModel, baseUrl: auth.baseUrl } : configuredModel,\n auth,\n };\n }\n const reason = auth.ok ? \"has no request credentials\" : auth.error;\n reportWarning(`pi-btw model ${settings.model} is unavailable (${reason}); ${fallbackAction}.`);\n } catch (error: unknown) {\n reportWarning(`pi-btw model ${settings.model} credentials failed (${formatError(error)}); ${fallbackAction}.`);\n }\n if (sameAsCurrent) return undefined;\n }\n }\n\n if (!currentModel) return undefined;\n try {\n const auth = await modelRegistry.getApiKeyAndHeaders(currentModel);\n if (auth.ok && hasRequestAuth(auth)) {\n // Direct provider streams bypass Pi's request preparation, including OAuth routing.\n return {\n model: auth.baseUrl ? { ...currentModel, baseUrl: auth.baseUrl } : currentModel,\n auth,\n };\n }\n } catch {\n // The caller reports the final lack of an available model.\n }\n return undefined;\n}\n\nfunction hasRequestAuth(auth: SideQuestionAuth): boolean {\n return Boolean(\n auth.apiKey || providerHeadersHaveValue(auth.headers) || (auth.env && Object.keys(auth.env).length > 0),\n );\n}\n\nfunction providerHeadersHaveValue(headers: ProviderHeaders | undefined): boolean {\n return headers !== undefined && Object.values(headers).some((value) => value !== null);\n}\n\nexport async function loadBtwThinkingLevel(\n currentThinkingLevel: BtwThinkingLevel,\n options: LoadBtwThinkingLevelOptions = {},\n): Promise<BtwThinkingLevel> {\n const settings = await readBtwSettings(options.settingsPath);\n if (settings.kind === \"missing\") return currentThinkingLevel;\n if (settings.kind === \"loaded\") {\n return settings.settings.thinkingLevel ?? currentThinkingLevel;\n }\n\n options.warn?.(\n sanitizeSingleLine(\n `pi-btw settings ignored: ${settings.reason}; expected optional model \"provider/model-id\", omitted thinkingLevel for Same as main thread or thinkingLevel \"${BTW_THINKING_LEVELS.join('\" | \"')}\", boolean rememberThinkingLevelChanges, and boolean fullscreenCopyOnSelect. Using current Pi thinking level.`,\n ),\n );\n return currentThinkingLevel;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction readBtwSessionId(ctx: ExtensionCommandContext): string | undefined {\n const getSessionId = ctx.sessionManager.getSessionId;\n if (typeof getSessionId !== \"function\") return undefined;\n const sessionId = getSessionId.call(ctx.sessionManager);\n return sessionId.length > 0 ? sessionId : undefined;\n}\n\nfunction notifySafely(\n ctx: ExtensionCommandContext,\n message: string,\n level: Parameters<ExtensionCommandContext[\"ui\"][\"notify\"]>[1],\n): void {\n try {\n ctx.ui.notify(sanitizeSingleLine(message), level);\n } catch {\n // Async command continuations may finish after their ExtensionContext is replaced.\n }\n}\n\n// Keep this slightly-over-1,000-line command coordinator intact: its injectable menu,\n// request, resume, and delivery flows share the same thread-state and test seams;\n// settings, keybinding policy, terminal ownership, and rendering live in separate modules.\nexport interface BtwExtensionDependencies {\n showCommandMenu?: (\n pi: ExtensionAPI,\n ctx: ExtensionCommandContext,\n resumeThreads: readonly BtwResumeThreadSummary[],\n ) => Promise<BtwCommandMenuResult>;\n pickMainEntry?: typeof pickMainEntry;\n loadSettings?: typeof loadSettingsForCommand;\n resolveModel?: typeof resolveBtwModelWithLoader;\n runThread?: typeof runBtwThread;\n runFullscreen?: RunBtwFullscreen;\n}\n\nexport default function btw(pi: ExtensionAPI, dependencies: BtwExtensionDependencies = {}) {\n const showCommandMenu = dependencies.showCommandMenu ?? showCommandMenuForBtw;\n const pickEntry = dependencies.pickMainEntry ?? pickMainEntry;\n const loadSettings = dependencies.loadSettings ?? loadSettingsForCommand;\n const resolveModel = dependencies.resolveModel ?? resolveBtwModelWithLoader;\n const runThread = dependencies.runThread ?? runBtwThread;\n const runFullscreen = dependencies.runFullscreen ?? runBtwFullscreen;\n // Pi creates a fresh extension instance after session replacement or reload.\n const resumableThreads = new Map<string, BtwThreadState>();\n let nextThreadNumber = 1;\n const listResumeThreads = (): BtwResumeThreadSummary[] =>\n [...resumableThreads.values()]\n .reverse()\n .filter((state) => state.thread.turns.length > 0 && state.title)\n .sort((first, second) => second.updatedAt - first.updatedAt || second.createdAt - first.createdAt)\n .map((state) => ({\n id: state.id,\n title: state.title ?? \"Untitled side thread\",\n questionCount: state.thread.turns.length,\n }));\n pi.registerCommand(\"btw\", {\n description: \"Ask a quick side question without adding it to the main conversation\",\n handler: async (args, ctx) => {\n const question = args.trim();\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(\"/btw requires interactive TUI mode\", \"error\");\n return;\n }\n\n let menuResult: BtwCommandMenuResult = \"start\";\n let selectedConversationContext: string | undefined;\n if (!question) {\n while (true) {\n menuResult = await showCommandMenu(pi, ctx, listResumeThreads());\n if (menuResult === \"closed\") return;\n if (menuResult !== \"tree\") break;\n\n const treeResult = await pickEntry(pi, ctx);\n if (treeResult.kind === \"closed\") return;\n if (treeResult.kind === \"back\") continue;\n try {\n if (!ctx.sessionManager.getEntry(treeResult.entryId)) {\n notifySafely(ctx, \"The selected main-thread entry is no longer available\", \"warning\");\n continue;\n }\n const branch = ctx.sessionManager.getBranch(treeResult.entryId);\n if (branch.at(-1)?.id !== treeResult.entryId) {\n notifySafely(ctx, \"The selected main-thread branch is no longer available\", \"warning\");\n continue;\n }\n selectedConversationContext = buildConversationContext(branch);\n menuResult = \"start\";\n break;\n } catch {\n return;\n }\n }\n }\n\n const settings = await loadSettings(ctx);\n const sameAsMainThinkingLevel = settings.thinkingLevel === undefined;\n const resolution = await resolveModel(settings, ctx);\n if (resolution.kind === \"cancelled\") {\n notifySafely(ctx, \"Cancelled\", \"info\");\n return;\n }\n if (resolution.kind === \"unavailable\") {\n notifySafely(ctx, \"No available model for /btw\", \"error\");\n return;\n }\n\n let state = typeof menuResult === \"object\" ? resumableThreads.get(menuResult.threadId) : undefined;\n if (typeof menuResult === \"object\" && !state) {\n notifySafely(ctx, \"The selected /btw side thread is no longer available\", \"warning\");\n return;\n }\n const startingTurnCount = state?.thread.turns.length ?? 0;\n\n try {\n await runFullscreen(\n ctx,\n (fullscreenCtx) => {\n if (!state) {\n const createdAt = Date.now();\n state = {\n id: `btw-${nextThreadNumber}`,\n thread: createSideThread(\n selectedConversationContext ?? buildConversationContext(fullscreenCtx.sessionManager.getBranch()),\n ),\n thinkingLevel: settings.thinkingLevel ?? pi.getThinkingLevel(),\n createdAt,\n updatedAt: createdAt,\n };\n nextThreadNumber += 1;\n }\n return runThread({\n initialQuestion: question || undefined,\n selected: resolution.selected,\n thinkingLevel: state.thinkingLevel,\n rememberThinkingLevelChanges: !sameAsMainThinkingLevel && effectiveRememberThinkingLevelChanges(settings),\n state,\n ctx: fullscreenCtx,\n });\n },\n {\n copyOnSelect: effectiveFullscreenCopyOnSelect(settings),\n ...(settings.keybindings ? { keybindings: settings.keybindings } : {}),\n },\n );\n } finally {\n if (state?.title && state.thread.turns.length > 0) {\n if (state.thread.turns.length > startingTurnCount) {\n resumableThreads.delete(state.id);\n }\n resumableThreads.set(state.id, state);\n }\n }\n },\n });\n}\n\nasync function showCommandMenuForBtw(\n pi: ExtensionAPI,\n ctx: ExtensionCommandContext,\n resumeThreads: readonly BtwResumeThreadSummary[],\n): Promise<BtwCommandMenuResult> {\n return showBtwCommandMenu(ctx, {\n currentThinkingLevel: pi.getThinkingLevel(),\n resumeThreads,\n });\n}\n\nasync function loadSettingsForCommand(ctx: ExtensionCommandContext): Promise<BtwSettings> {\n const settingsResult = await readBtwSettings();\n if (settingsResult.kind === \"loaded\") return settingsResult.settings;\n if (settingsResult.kind === \"invalid\") {\n notifySafely(ctx, `pi-btw settings ignored: ${settingsResult.reason}`, \"warning\");\n }\n return {};\n}\n\ntype ModelResolutionOutcome =\n | { kind: \"cancelled\" }\n | { kind: \"unavailable\" }\n | { kind: \"selected\"; selected: ResolvedBtwModel };\n\nasync function resolveBtwModelWithLoader(\n settings: BtwSettings,\n ctx: ExtensionCommandContext,\n): Promise<ModelResolutionOutcome> {\n return ctx.ui.custom<ModelResolutionOutcome>((tui, theme, _keybindings, done) => {\n const loader = new BorderedLoader(tui, theme, \"Resolving /btw model credentials...\");\n let settled = false;\n loader.onAbort = () => {\n if (settled) return;\n settled = true;\n done({ kind: \"cancelled\" });\n };\n\n resolveBtwModel({\n settings,\n currentModel: ctx.model,\n modelRegistry: ctx.modelRegistry,\n warn: (message) => {\n if (!settled) notifySafely(ctx, message, \"warning\");\n },\n })\n .then((selected) => {\n if (settled) return;\n settled = true;\n done(selected ? { kind: \"selected\", selected } : { kind: \"unavailable\" });\n })\n .catch(() => {\n if (settled) return;\n settled = true;\n done({ kind: \"unavailable\" });\n });\n\n return loader;\n });\n}\n\ninterface RunBtwThreadDependencies {\n ask?: typeof askThreadQuestion;\n interact?: typeof showThreadComposer;\n chooseBringToMain?: typeof chooseBringToMain;\n deliverBringToMain?: typeof loadBringToMainDraft;\n persistThinkingLevel?: (level: BtwThinkingLevel) => Promise<unknown>;\n now?: () => number;\n}\n\nexport type BtwThreadResult = { kind: \"closed\" };\n\ntype BtwThreadThinkingControl = Omit<BtwThinkingControl, \"keybindings\">;\n\ninterface BtwThreadSteeringControl {\n questions: readonly string[];\n submit: (question: string) => void;\n thinking: BtwThreadThinkingControl;\n}\n\ntype BtwBringToMainChoice =\n | BtwThreadResult\n | {\n kind: \"bringToMain\";\n draft: string;\n summary: BtwBringToMainSummary;\n selectionState?: BtwTextRangeSelectorState;\n }\n | { kind: \"back\" };\n\ntype BtwBringToMainDelivery = \"loaded\" | \"back\" | \"closed\";\n\ninterface RunBtwThreadOptions {\n initialQuestion?: string;\n selected: ResolvedBtwModel;\n thinkingLevel: BtwThinkingLevel;\n rememberThinkingLevelChanges?: boolean;\n settingsPath?: string;\n state?: BtwThreadState;\n ctx: ExtensionCommandContext;\n dependencies?: RunBtwThreadDependencies;\n}\n\nexport async function runBtwThread({\n initialQuestion,\n selected,\n thinkingLevel,\n rememberThinkingLevelChanges = false,\n settingsPath,\n state,\n ctx,\n dependencies = {},\n}: RunBtwThreadOptions): Promise<BtwThreadResult> {\n const ask = dependencies.ask ?? askThreadQuestion;\n const interact = dependencies.interact ?? showThreadComposer;\n const chooseBringToMainAction = dependencies.chooseBringToMain ?? chooseBringToMain;\n const deliverBringToMainDraft = dependencies.deliverBringToMain ?? loadBringToMainDraft;\n const persistThinkingLevel =\n dependencies.persistThinkingLevel ??\n ((level: BtwThinkingLevel) => updateBtwSettings({ thinkingLevel: level }, { settingsPath }));\n const now = dependencies.now ?? Date.now;\n const thread = state?.thread ?? createSideThread(buildConversationContext(ctx.sessionManager.getBranch()));\n const thinkingLevels = getSupportedThinkingLevels(selected.model);\n const pendingWrites = new Set<Promise<void>>();\n const steeringQuestions: string[] = [];\n let activeThinkingLevel = clampThinkingLevel(selected.model, state?.thinkingLevel ?? thinkingLevel);\n if (state) state.thinkingLevel = activeThinkingLevel;\n let pendingQuestion = initialQuestion;\n let composerDraft: string | undefined;\n const createThinkingControl = (): BtwThreadThinkingControl => ({\n level: activeThinkingLevel,\n levels: thinkingLevels,\n onChange: (level) => {\n if (!thinkingLevels.includes(level)) return;\n activeThinkingLevel = level;\n if (state) state.thinkingLevel = level;\n if (!rememberThinkingLevelChanges) return;\n let write!: Promise<void>;\n write = Promise.resolve()\n .then(() => persistThinkingLevel(level))\n .then(() => undefined)\n .catch((error: unknown) => {\n notifySafely(\n ctx,\n `Thinking level changed to ${level}, but could not be remembered in pi-btw.json: ${formatError(error)}`,\n \"warning\",\n );\n })\n .finally(() => pendingWrites.delete(write));\n pendingWrites.add(write);\n },\n });\n\n try {\n while (true) {\n if (!pendingQuestion) {\n const action = await interact(thread, thread.turns.length > 0, ctx, composerDraft, createThinkingControl());\n if (action.kind === \"close\") return { kind: \"closed\" };\n if (action.kind === \"bringToMain\") {\n const choice = await chooseBringToMainAction(thread, ctx);\n if (choice.kind === \"closed\") return choice;\n if (choice.kind === \"back\") {\n composerDraft = action.questionDraft;\n continue;\n }\n const delivery = await deliverBringToMainDraft(choice.draft, ctx, choice.summary);\n if (delivery === \"loaded\" || delivery === \"closed\") return { kind: \"closed\" };\n composerDraft = action.questionDraft;\n continue;\n }\n composerDraft = undefined;\n pendingQuestion = action.question;\n }\n\n const result = await ask(thread, pendingQuestion, selected, activeThinkingLevel, ctx, {\n questions: steeringQuestions,\n submit: (question) => steeringQuestions.push(question),\n thinking: createThinkingControl(),\n });\n if (result.kind === \"aborted\") {\n notifySafely(ctx, \"Cancelled\", \"info\");\n return { kind: \"closed\" };\n }\n if (result.kind === \"error\") {\n thread.turns.push({\n kind: \"error\",\n question: pendingQuestion,\n answer: result.message,\n });\n }\n if (state) {\n state.title ||= sanitizeSingleLine(pendingQuestion) || \"Untitled side thread\";\n state.updatedAt = now();\n }\n\n pendingQuestion = steeringQuestions.shift();\n }\n } finally {\n await Promise.allSettled([...pendingWrites]);\n }\n}\n\ninterface ChooseBringToMainDependencies {\n showMenu?: typeof showBtwMenu;\n showPreview?: typeof showBringToMainPreview;\n}\n\nexport async function chooseBringToMain(\n thread: SideThread,\n ctx: ExtensionCommandContext,\n dependencies: ChooseBringToMainDependencies = {},\n): Promise<BtwBringToMainChoice> {\n const answered = getAnsweredTurns(thread.turns);\n if (answered.length === 0) return { kind: \"back\" };\n const showMenu = dependencies.showMenu ?? showBtwMenu;\n const showPreview = dependencies.showPreview ?? showBringToMainPreview;\n const makeChoice = (segments: readonly BtwBringToMainSegment[]) => ({\n kind: \"bringToMain\" as const,\n draft: formatBtwBringToMain(segments),\n summary: summarizeBringToMain(segments),\n });\n\n const latestSegments = buildQuickBringToMainSegments(thread.turns, { kind: \"latest\" });\n const entireSegments = buildQuickBringToMainSegments(thread.turns, { kind: \"entire\" });\n const latestOption = `Latest question and answer 1 Q&A \u00B7 ~${estimateBringToMainTokens(latestSegments)} tokens`;\n const fromOption = \"From a question onward\u2026 Choose a starting question\";\n const exactOption = \"Select exact text\u2026 Lines or characters\";\n const entireOption = `Entire side thread ${answered.length} Q&A \u00B7 ~${estimateBringToMainTokens(entireSegments)} tokens`;\n const cancelOption = \"Cancel Return to the side thread\";\n let selectedScope: string | undefined;\n\n while (true) {\n const scopeResult = await showMenu(\n ctx,\n \"Bring what back to the main thread?\",\n [latestOption, fromOption, exactOption, entireOption, cancelOption],\n selectedScope,\n );\n if (scopeResult.kind === \"close\") return { kind: \"closed\" };\n if (scopeResult.kind === \"back\" || scopeResult.value === cancelOption) return { kind: \"back\" };\n const scope = scopeResult.value;\n selectedScope = scope;\n if (scope === latestOption) return makeChoice(latestSegments);\n if (scope === entireOption) {\n const choice = makeChoice(entireSegments);\n const preview = await showPreview(ctx, choice.draft, choice.summary);\n if (preview.kind === \"close\") return { kind: \"closed\" };\n if (preview.kind === \"back\") continue;\n return choice;\n }\n if (scope === fromOption) {\n const questions = answered.map(\n (turn, index) => `${index + 1}. ${truncatePreview(sanitizeSingleLine(turn.question))}`,\n );\n let selectedQuestion: string | undefined;\n while (true) {\n const questionResult = await showMenu(ctx, \"Start from which question?\", questions, selectedQuestion);\n if (questionResult.kind === \"close\") return { kind: \"closed\" };\n if (questionResult.kind === \"back\") break;\n const answeredTurnIndex = questions.indexOf(questionResult.value);\n if (answeredTurnIndex < 0) continue;\n selectedQuestion = questionResult.value;\n const choice = makeChoice(buildQuickBringToMainSegments(thread.turns, { kind: \"from\", answeredTurnIndex }));\n const preview = await showPreview(ctx, choice.draft, choice.summary);\n if (preview.kind === \"close\") return { kind: \"closed\" };\n if (preview.kind === \"back\") continue;\n return choice;\n }\n continue;\n }\n\n if (scope !== exactOption) continue;\n let selectionState: BtwTextRangeSelectorState | undefined;\n while (true) {\n const selectedRange = await showBtwCustomPreservingEditor<BtwBringToMainChoice>(\n ctx,\n (tui, theme, keybindings, done) => {\n let selector: BtwTextRangeSelector;\n selector = new BtwTextRangeSelector(\n tui,\n theme,\n keybindings,\n thread.turns,\n (action) => {\n if (action.kind === \"back\") done({ kind: \"back\" });\n else if (action.kind === \"close\") done({ kind: \"closed\" });\n else done({ ...makeChoice(action.segments), selectionState: selector.getState() });\n },\n selectionState,\n );\n return selector;\n },\n );\n if (!selectedRange) return { kind: \"closed\" };\n if (selectedRange.kind === \"closed\") return selectedRange;\n if (selectedRange.kind === \"back\") break;\n const preview = await showPreview(ctx, selectedRange.draft, selectedRange.summary);\n if (preview.kind === \"close\") return { kind: \"closed\" };\n if (preview.kind === \"back\") {\n selectionState = selectedRange.selectionState;\n continue;\n }\n return {\n kind: \"bringToMain\",\n draft: selectedRange.draft,\n summary: selectedRange.summary,\n };\n }\n }\n}\n\ntype BtwMenuSelectorAction = { kind: \"select\"; value: string } | { kind: \"back\" } | { kind: \"close\" };\n\ntype BtwBringToMainPreviewAction = { kind: \"bring\" } | { kind: \"back\" } | { kind: \"close\" };\n\nasync function showBringToMainPreview(\n ctx: ExtensionCommandContext,\n draft: string,\n summary: BtwBringToMainSummary,\n): Promise<BtwBringToMainPreviewAction> {\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (ctx.signal?.aborted) return { kind: \"close\" };\n let confirmed = false;\n const count = summary.messages === 1 ? \"1 message\" : `${summary.messages} messages`;\n const lineCount = summary.lines === 1 ? \"1 line\" : `${summary.lines} lines`;\n const menu = defineMenu<void, \"preview\", \"bring\", MenuContext>({\n start: \"preview\",\n screens: {\n preview: () => ({\n kind: \"review\",\n title: `Preview \u00B7 ${count} \u00B7 ${lineCount} \u00B7 ~${summary.tokens} tokens`,\n content: draft,\n viewportSize: \"adaptive\",\n hint: \"back\",\n confirm: { id: \"bring\", label: \"Bring\", action: \"bring\" },\n }),\n },\n actions: {\n bring: async () => {\n confirmed = true;\n return { kind: \"close\" } as const;\n },\n },\n });\n const result = await runBtwMenuPreservingEditor(ctx, (menuContext) =>\n runMenu(menuContext, menu, { getState: () => undefined }),\n );\n if (confirmed && result.kind === \"closed\" && result.reason === \"close\") {\n return { kind: \"bring\" };\n }\n return terminalBtwMenuAction(result);\n}\n\nasync function showBtwMenu(\n ctx: ExtensionCommandContext,\n title: string,\n options: readonly string[],\n initialValue?: string,\n): Promise<BtwMenuSelectorAction> {\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (ctx.signal?.aborted) return { kind: \"close\" };\n const items = options.map((label, index) => ({ id: `option-${index}`, label }));\n const initialIndex = initialValue === undefined ? -1 : options.indexOf(initialValue);\n let selectedValue: string | undefined;\n const menu = defineMenu<void, \"choices\", \"select\", MenuContext>({\n start: \"choices\",\n screens: {\n choices: () => ({\n kind: \"choice\",\n title,\n items,\n action: \"select\",\n initialItemId: initialIndex >= 0 ? `option-${initialIndex}` : undefined,\n hint: \"back\",\n }),\n },\n actions: {\n select: async ({ itemId }: { itemId: string }) => {\n const index = Number.parseInt(itemId.slice(\"option-\".length), 10);\n selectedValue = options[index];\n return selectedValue === undefined ? ({ kind: \"stay\" } as const) : ({ kind: \"close\" } as const);\n },\n },\n });\n const result = await runBtwMenuPreservingEditor(ctx, (menuContext) =>\n runMenu(menuContext, menu, { getState: () => undefined }),\n );\n return selectedValue !== undefined && result.kind === \"closed\" && result.reason === \"close\"\n ? { kind: \"select\", value: selectedValue }\n : terminalBtwMenuAction(result);\n}\n\nfunction terminalBtwMenuAction(result: RunMenuResult): { kind: \"back\" } | { kind: \"close\" } {\n if (result.kind === \"closed\") return { kind: result.reason };\n if (result.kind === \"error\") throw result.error;\n return { kind: \"close\" };\n}\n\nexport async function loadBringToMainDraft(\n draft: string,\n ctx: ExtensionCommandContext,\n summary: BtwBringToMainSummary,\n): Promise<BtwBringToMainDelivery> {\n const describeContent = () =>\n `${summary.messages} ${summary.messages === 1 ? \"message\" : \"messages\"} (~${summary.tokens} ${summary.tokens === 1 ? \"token\" : \"tokens\"})`;\n const existing = ctx.ui.getEditorText();\n if (!existing.trim()) {\n ctx.ui.setEditorText(draft);\n ctx.ui.notify(`Brought ${describeContent()} to the main editor. Review and submit when ready.`, \"info\");\n return \"loaded\";\n }\n\n const appendOption = \"Append after current draft Recommended\";\n const replaceOption = \"\u26A0 Replace current draft Discards current editor text\";\n const cancelOption = \"Cancel Return to the side thread\";\n while (true) {\n const action = await showBtwMenu(ctx, \"The main editor already has a draft\", [\n appendOption,\n replaceOption,\n cancelOption,\n ]);\n if (action.kind === \"close\") return \"closed\";\n if (action.kind === \"back\" || action.value === cancelOption) return \"back\";\n if (action.value === appendOption) {\n ctx.ui.setEditorText(`${ctx.ui.getEditorText()}\\n\\n${draft}`);\n ctx.ui.notify(\n `Appended ${describeContent()} to the existing main-editor draft. Review and submit when ready.`,\n \"info\",\n );\n return \"loaded\";\n }\n if (action.value !== replaceOption) continue;\n\n const current = ctx.ui.getEditorText();\n const characters = [...current].length;\n const confirmed = await showBtwMenu(ctx, `Replace the current ${characters}-character editor draft?`, [\n \"Back Keep current editor text\",\n \"\u26A0 Replace current draft Cannot be undone\",\n ]);\n if (confirmed.kind === \"close\") return \"closed\";\n if (confirmed.kind === \"back\" || confirmed.value === \"Back Keep current editor text\") continue;\n if (confirmed.value !== \"\u26A0 Replace current draft Cannot be undone\") continue;\n if (ctx.ui.getEditorText() !== current) {\n ctx.ui.notify(\n \"The main editor changed during confirmation. Review the updated draft and choose again.\",\n \"warning\",\n );\n continue;\n }\n ctx.ui.setEditorText(draft);\n ctx.ui.notify(`Replaced the main-editor draft with ${describeContent()}. Review and submit when ready.`, \"info\");\n return \"loaded\";\n }\n}\n\nfunction truncatePreview(text: string): string {\n return text.length <= 72 ? text : `${text.slice(0, 69)}\u2026`;\n}\n\nasync function prepareCurrentTranscriptMarkdown(\n thread: SideThread,\n pendingQuestion: string | undefined,\n ctx: ExtensionCommandContext,\n): Promise<BtwMarkdownTransformers | undefined> {\n while (true) {\n const turnCount = thread.turns.length;\n const createMarkdownTransformers = ctx.signal\n ? await prepareBtwTranscriptMarkdown(thread.turns, pendingQuestion, ctx.signal)\n : await prepareBtwTranscriptMarkdown(thread.turns, pendingQuestion);\n if (!createMarkdownTransformers || ctx.signal?.aborted) return undefined;\n if (thread.turns.length === turnCount) return createMarkdownTransformers;\n }\n}\n\nasync function askThreadQuestion(\n thread: SideThread,\n question: string,\n selected: ResolvedBtwModel,\n thinkingLevel: BtwThinkingLevel,\n ctx: ExtensionCommandContext,\n steering: BtwThreadSteeringControl,\n) {\n const createMarkdownTransformers = await prepareCurrentTranscriptMarkdown(thread, question, ctx);\n if (!createMarkdownTransformers) return { kind: \"aborted\" as const };\n return ctx.ui.custom<Awaited<ReturnType<typeof completeSideThreadTurn>>>((tui, theme, keybindings, done) => {\n let settled = false;\n const view = new BtwAnsweringView(\n tui,\n theme,\n thread.turns,\n question,\n () => {\n if (settled) return;\n settled = true;\n done({ kind: \"aborted\" });\n },\n thinkingLevel,\n {\n markdownTransformers: createMarkdownTransformers(theme),\n steering: {\n questions: steering.questions,\n onSubmit: steering.submit,\n thinking: { ...steering.thinking, keybindings },\n },\n },\n );\n completeSideThreadTurn({\n thread,\n question,\n model: selected.model,\n thinkingLevel,\n auth: selected.auth,\n signal: view.signal,\n completeSimple: createModelRegistryCompleteSimple(ctx.modelRegistry),\n sessionId: readBtwSessionId(ctx),\n }).then((result) => {\n if (settled) return;\n settled = true;\n view.finish();\n done(result);\n });\n return view;\n });\n}\n\nasync function showThreadComposer(\n thread: SideThread,\n startAtBottom: boolean,\n ctx: ExtensionCommandContext,\n initialQuestion: string | undefined,\n thinking: BtwThreadThinkingControl,\n): Promise<TranscriptPagerAction> {\n const createMarkdownTransformers = await prepareCurrentTranscriptMarkdown(thread, initialQuestion, ctx);\n if (!createMarkdownTransformers) return { kind: \"close\" };\n return ctx.ui.custom<TranscriptPagerAction>(\n (tui, theme, keybindings, done) =>\n new BtwTranscriptPager(tui, theme, thread.turns, done, {\n startAtBottom,\n initialQuestion,\n markdownTransformers: createMarkdownTransformers(theme),\n thinking: { ...thinking, keybindings },\n }),\n );\n}\n\ntype MessageContentBlock = {\n type?: string;\n text?: string;\n name?: string;\n arguments?: unknown;\n result?: unknown;\n};\n\ntype SessionMessage = {\n role?: string;\n content?: unknown;\n stopReason?: string;\n};\n\ntype SessionEntry = {\n type: string;\n message?: SessionMessage;\n};\n\nexport function buildConversationContext(entries: readonly SessionEntry[]) {\n const sections: string[] = [];\n\n for (const entry of entries) {\n if (entry.type !== \"message\" || !entry.message?.role) continue;\n\n const role = entry.message.role;\n if (role !== \"user\" && role !== \"assistant\") continue;\n\n const contentLines = extractContentLines(entry.message.content);\n if (contentLines.length === 0) continue;\n\n const label = role === \"user\" ? \"User\" : \"Assistant\";\n const status =\n entry.message.stopReason && entry.message.stopReason !== \"stop\" ? ` (${entry.message.stopReason})` : \"\";\n sections.push(`${label}${status}: ${contentLines.join(\"\\n\")}`);\n }\n\n return truncateFromStart(sections.join(\"\\n\\n\"), MAX_CONTEXT_CHARS);\n}\n\nfunction extractContentLines(content: unknown): string[] {\n if (typeof content === \"string\") return [content.trim()].filter(Boolean);\n if (!Array.isArray(content)) return [];\n\n const lines: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== \"object\") continue;\n const block = part as MessageContentBlock;\n if (block.type === \"text\" && typeof block.text === \"string\") {\n lines.push(block.text.trim());\n } else if (block.type === \"toolCall\" && typeof block.name === \"string\") {\n lines.push(`Tool call: ${block.name}(${formatJson(block.arguments)})`);\n } else if (block.type === \"toolResult\" && typeof block.name === \"string\") {\n lines.push(`Tool result from ${block.name}: ${formatJson(block.result)}`);\n }\n }\n return lines.filter(Boolean);\n}\n\nfunction formatJson(value: unknown) {\n if (value === undefined) return \"\";\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction truncateFromStart(text: string, maxChars: number) {\n if (text.length <= maxChars) return text;\n return `[Earlier context omitted; showing the last ${maxChars} characters.]\\n${text.slice(-maxChars)}`;\n}\n", "import type { KeybindingsManager, Theme } from \"@earendil-works/pi-coding-agent\";\nimport { type Component, Key, matchesKey, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { SideThreadTurn } from \"./side-thread.js\";\n\nconst RESERVED_APP_ROWS = 3;\nconst GRAPHEME_SEGMENTER = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport interface BtwBringToMainSegment {\n role: \"user\" | \"assistant\";\n text: string;\n}\n\nexport interface BtwBringToMainSummary {\n lines: number;\n messages: number;\n tokens: number;\n}\n\nexport interface BtwSelectionLine {\n role: BtwBringToMainSegment[\"role\"];\n text: string;\n}\n\nexport interface BtwTextPosition {\n line: number;\n column: number;\n}\n\nexport interface BtwTextRangeSelectorState {\n cursor: BtwTextPosition;\n anchor?: BtwTextPosition;\n lineAnchor?: number;\n preferredColumn: number;\n scrollOffset: number;\n horizontalOffset: number;\n}\n\nexport type BtwQuickBringToMainScope =\n | { kind: \"latest\" }\n | { kind: \"from\"; answeredTurnIndex: number }\n | { kind: \"entire\" };\n\nexport type BtwTextRangeSelectorAction =\n | { kind: \"confirm\"; segments: BtwBringToMainSegment[] }\n | { kind: \"back\" }\n | { kind: \"close\" };\n\nexport function getAnsweredTurns(turns: readonly SideThreadTurn[]): Extract<SideThreadTurn, { kind: \"answered\" }>[] {\n return turns.filter((turn): turn is Extract<SideThreadTurn, { kind: \"answered\" }> => turn.kind === \"answered\");\n}\n\nexport function buildQuickBringToMainSegments(\n turns: readonly SideThreadTurn[],\n scope: BtwQuickBringToMainScope,\n): BtwBringToMainSegment[] {\n const answered = getAnsweredTurns(turns);\n const selected =\n scope.kind === \"latest\"\n ? answered.slice(-1)\n : scope.kind === \"from\"\n ? answered.slice(Math.max(0, scope.answeredTurnIndex))\n : answered;\n return selected.flatMap((turn) => [\n { role: \"user\" as const, text: turn.question },\n { role: \"assistant\" as const, text: turn.answer },\n ]);\n}\n\nexport function buildBtwSelectionLines(turns: readonly SideThreadTurn[]): BtwSelectionLine[] {\n return buildQuickBringToMainSegments(turns, { kind: \"entire\" }).flatMap((segment) =>\n segment.text.split(\"\\n\").map((text) => ({ role: segment.role, text })),\n );\n}\n\nexport function segmentsFromLineRange(\n lines: readonly BtwSelectionLine[],\n anchor: number,\n cursor: number,\n): BtwBringToMainSegment[] {\n if (lines.length === 0) return [];\n const start = Math.max(0, Math.min(anchor, cursor, lines.length - 1));\n const end = Math.max(0, Math.min(Math.max(anchor, cursor), lines.length - 1));\n const segments: BtwBringToMainSegment[] = [];\n for (const line of lines.slice(start, end + 1)) {\n const previous = segments.at(-1);\n if (previous?.role === line.role) {\n previous.text += `\\n${line.text}`;\n } else {\n segments.push({ role: line.role, text: line.text });\n }\n }\n return segments;\n}\n\nexport function segmentsFromTextRange(\n lines: readonly BtwSelectionLine[],\n anchor: BtwTextPosition,\n cursor: BtwTextPosition,\n): BtwBringToMainSegment[] {\n if (lines.length === 0) return [];\n const first = clampTextPosition(lines, anchor);\n const second = clampTextPosition(lines, cursor);\n const [start, end] = compareTextPositions(first, second) <= 0 ? [first, second] : [second, first];\n if (compareTextPositions(start, end) === 0) return [];\n\n const segments: BtwBringToMainSegment[] = [];\n for (let lineIndex = start.line; lineIndex <= end.line; lineIndex += 1) {\n const line = lines[lineIndex];\n if (!line) continue;\n const characters = splitGraphemes(line.text);\n const from = lineIndex === start.line ? start.column : 0;\n const to = lineIndex === end.line ? end.column : characters.length;\n const text = characters.slice(from, to).join(\"\");\n if (text) {\n const previous = segments.at(-1);\n if (previous?.role === line.role) previous.text += text;\n else segments.push({ role: line.role, text });\n }\n const crossesSameRoleLine = lineIndex < end.line && lines[lineIndex + 1]?.role === line.role;\n if (crossesSameRoleLine) {\n const current = segments.at(-1);\n if (current?.role === line.role) current.text += \"\\n\";\n else segments.push({ role: line.role, text: \"\\n\" });\n }\n }\n return segments;\n}\n\nexport function estimateBringToMainTokens(segments: readonly BtwBringToMainSegment[]): number {\n return Math.ceil(Buffer.byteLength(segments.map((segment) => segment.text).join(\"\\n\"), \"utf8\") / 4);\n}\n\nexport function summarizeBringToMain(segments: readonly BtwBringToMainSegment[]): BtwBringToMainSummary {\n return {\n lines: segments.reduce((count, segment) => count + segment.text.split(\"\\n\").length, 0),\n messages: segments.length,\n tokens: estimateBringToMainTokens(segments),\n };\n}\n\nexport function formatBtwBringToMain(segments: readonly BtwBringToMainSegment[]): string {\n const body = segments\n .map((segment) => `${segment.role === \"user\" ? \"User\" : \"Assistant\"}:\\n${escapeBringToMainText(segment.text)}`)\n .join(\"\\n\\n\");\n return [\n \"The following context was brought back from a /btw side discussion.\",\n \"Treat it as discussion context, not as work already completed.\",\n \"\",\n \"<btw_context>\",\n body,\n \"</btw_context>\",\n ].join(\"\\n\");\n}\n\nexport class BtwTextRangeSelector implements Component {\n private readonly lines: BtwSelectionLine[];\n private cursor: BtwTextPosition = { line: 0, column: 0 };\n private anchor: BtwTextPosition | undefined;\n private lineAnchor: number | undefined;\n private preferredColumn = 0;\n private scrollOffset = 0;\n private horizontalOffset = 0;\n private warning: string | undefined;\n private finished = false;\n\n constructor(\n private readonly tui: TUI,\n private readonly theme: Theme,\n private readonly keybindings: KeybindingsManager,\n turns: readonly SideThreadTurn[],\n private readonly onAction: (action: BtwTextRangeSelectorAction) => void,\n initialState?: BtwTextRangeSelectorState,\n ) {\n this.lines = buildBtwSelectionLines(turns);\n if (initialState) {\n this.cursor = clampTextPosition(this.lines, initialState.cursor);\n this.anchor = initialState.anchor ? clampTextPosition(this.lines, initialState.anchor) : undefined;\n this.lineAnchor =\n initialState.lineAnchor === undefined\n ? undefined\n : Math.max(0, Math.min(this.lines.length - 1, initialState.lineAnchor));\n this.preferredColumn = Math.max(0, initialState.preferredColumn);\n this.scrollOffset = Math.max(0, initialState.scrollOffset);\n this.horizontalOffset = Math.max(0, initialState.horizontalOffset);\n }\n }\n\n getState(): BtwTextRangeSelectorState {\n return {\n cursor: { ...this.cursor },\n anchor: this.anchor ? { ...this.anchor } : undefined,\n lineAnchor: this.lineAnchor,\n preferredColumn: this.preferredColumn,\n scrollOffset: this.scrollOffset,\n horizontalOffset: this.horizontalOffset,\n };\n }\n\n render(width: number): string[] {\n const safeWidth = Math.max(1, width);\n const availableRows = Math.max(1, this.tui.terminal.rows - RESERVED_APP_ROWS);\n const showStatus = availableRows >= 4;\n const showFooter = availableRows >= 3;\n const viewportHeight = Math.max(1, availableRows - 1 - (showStatus ? 1 : 0) - (showFooter ? 1 : 0));\n this.keepCursorVisible(viewportHeight);\n const textWidth = Math.max(1, safeWidth - visibleWidth(\"\u25CF> Assistant \u2502 \"));\n this.keepCursorHorizontallyVisible(textWidth);\n const range = this.getSelectionRange();\n const lineRange = this.getLineSelectionRange();\n const visible = this.lines.slice(this.scrollOffset, this.scrollOffset + viewportHeight);\n const rows = visible.map((line, visibleIndex) => {\n const lineIndex = this.scrollOffset + visibleIndex;\n const role = line.role === \"user\" ? \"User\" : \"Assistant\";\n const lineSelected = lineRange ? lineIndex >= lineRange.start && lineIndex <= lineRange.end : false;\n const prefix = `${lineSelected ? \"\u25CF\" : \" \"}${lineIndex === this.cursor.line ? \">\" : \" \"} ${role.padEnd(9)} \u2502 `;\n const text = this.renderTextLine(line, lineIndex, range, lineSelected);\n return truncateToWidth(\n lineIndex === this.cursor.line ? this.theme.fg(\"accent\", prefix) + text : prefix + text,\n safeWidth,\n \"\",\n );\n });\n const selected = this.getSelectedSegments();\n const summary = summarizeBringToMain(selected);\n const status =\n selected.length === 0\n ? \"Selected: none\"\n : `Selected: ${summary.lines} ${summary.lines === 1 ? \"line\" : \"lines\"} \u00B7 ${summary.messages} ${summary.messages === 1 ? \"message\" : \"messages\"} \u00B7 ~${summary.tokens} ${summary.tokens === 1 ? \"token\" : \"tokens\"}`;\n const confirm = confirmKeyLabel(this.keybindings);\n const back = keybindingLabel(this.keybindings, \"tui.select.cancel\", [\"ctrl+c\"]);\n const vertical = `${keybindingLabel(this.keybindings, \"tui.select.up\")}/${keybindingLabel(this.keybindings, \"tui.select.down\")}`;\n const confirmUsesSpace = this.keybindings.matches(\" \", \"tui.select.confirm\");\n const detailedFooter = this.warning\n ? `${this.warning} \u2022 ${confirmUsesSpace ? \"Shift+Arrows select\" : \"Space lines \u2022 Shift+Arrows text\"} \u2022 ${back} back \u2022 Ctrl+C close`\n : this.lineAnchor !== undefined\n ? `${confirmUsesSpace ? `${vertical} extend lines` : `Space clear \u2022 ${vertical} extend lines`} \u2022 Shift+Arrows text \u2022 ${confirm} bring \u2022 ${back} back \u2022 Ctrl+C close`\n : `Shift+Arrows select \u2022 Arrows move${confirmUsesSpace ? \"\" : \" \u2022 Space lines\"} \u2022 ${confirm} bring \u2022 ${back} back \u2022 Ctrl+C close`;\n const criticalFooter = `${confirm} bring \u2022 ${back} back \u2022 Ctrl+C close`;\n const footer = visibleWidth(detailedFooter) <= safeWidth ? detailedFooter : criticalFooter;\n return fitRows(\n [\n truncateToWidth(this.theme.fg(\"accent\", this.theme.bold(\"Select text to bring to main\")), safeWidth, \"\"),\n ...(showStatus ? [truncateToWidth(this.theme.fg(\"muted\", status), safeWidth, \"\")] : []),\n ...rows,\n ...(showFooter\n ? [truncateToWidth(this.theme.fg(this.warning ? \"warning\" : \"muted\", footer), safeWidth, \"\")]\n : []),\n ],\n availableRows,\n );\n }\n\n handleInput(data: string): void {\n if (this.finished) return;\n if (matchesKey(data, Key.ctrl(\"c\"))) {\n this.finish({ kind: \"close\" });\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.cancel\")) {\n this.finish({ kind: \"back\" });\n return;\n }\n if (matchesConfirm(data, this.keybindings)) {\n if (this.lines.length > 0) {\n const segments = this.getSelectedSegments();\n if (segments.length === 0) {\n this.warning = \"Select text first\";\n this.tui.requestRender();\n } else {\n this.finish({ kind: \"confirm\", segments });\n }\n }\n return;\n }\n if (matchesKey(data, Key.space)) {\n this.anchor = undefined;\n this.lineAnchor = this.lineAnchor === undefined ? this.cursor.line : undefined;\n this.afterMove();\n return;\n }\n if (matchesKey(data, Key.shift(\"left\"))) {\n this.moveHorizontal(-1, true);\n return;\n }\n if (matchesKey(data, Key.shift(\"right\"))) {\n this.moveHorizontal(1, true);\n return;\n }\n if (matchesKey(data, Key.shift(\"up\"))) {\n this.moveVertical(-1, true);\n return;\n }\n if (matchesKey(data, Key.shift(\"down\"))) {\n this.moveVertical(1, true);\n return;\n }\n if (matchesKey(data, Key.left)) {\n this.moveHorizontal(-1, false);\n return;\n }\n if (matchesKey(data, Key.right)) {\n this.moveHorizontal(1, false);\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.up\")) {\n this.moveVertical(-1, false);\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.down\")) {\n this.moveVertical(1, false);\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.pageUp\")) {\n this.moveVertical(-10, false);\n return;\n }\n if (this.keybindings.matches(data, \"tui.select.pageDown\")) {\n this.moveVertical(10, false);\n return;\n }\n }\n\n invalidate(): void {}\n\n private renderTextLine(\n line: BtwSelectionLine,\n lineIndex: number,\n range: { start: BtwTextPosition; end: BtwTextPosition } | undefined,\n lineSelected: boolean,\n ): string {\n const characters = splitGraphemes(line.text);\n let rendered = this.horizontalOffset > 0 ? this.theme.fg(\"muted\", \"\u2026\") : \"\";\n let buffer = \"\";\n let bufferSelected = false;\n const flush = () => {\n if (!buffer) return;\n rendered += bufferSelected ? this.theme.bg(\"selectedBg\", this.theme.fg(\"text\", buffer)) : buffer;\n buffer = \"\";\n };\n for (let column = this.horizontalOffset; column <= characters.length; column += 1) {\n if (range && lineIndex === range.start.line && column === range.start.column) {\n flush();\n rendered += this.theme.fg(\"accent\", \"[\");\n }\n if (lineIndex === this.cursor.line && column === this.cursor.column) {\n flush();\n rendered += this.theme.fg(\"accent\", \"\u2502\");\n }\n if (range && lineIndex === range.end.line && column === range.end.column) {\n flush();\n rendered += this.theme.fg(\"accent\", \"]\");\n }\n const character = characters[column];\n if (character === undefined) continue;\n const selected = lineSelected || (range ? positionFallsInside(lineIndex, column, range) : false);\n if (buffer && selected !== bufferSelected) flush();\n bufferSelected = selected;\n buffer += escapeTerminalControls(character);\n }\n flush();\n return rendered;\n }\n\n private getSelectionRange(): { start: BtwTextPosition; end: BtwTextPosition } | undefined {\n if (!this.anchor || compareTextPositions(this.anchor, this.cursor) === 0) return undefined;\n return compareTextPositions(this.anchor, this.cursor) < 0\n ? { start: this.anchor, end: this.cursor }\n : { start: this.cursor, end: this.anchor };\n }\n\n private getLineSelectionRange(): { start: number; end: number } | undefined {\n return this.lineAnchor === undefined\n ? undefined\n : {\n start: Math.min(this.lineAnchor, this.cursor.line),\n end: Math.max(this.lineAnchor, this.cursor.line),\n };\n }\n\n private getSelectedSegments(): BtwBringToMainSegment[] {\n if (this.lineAnchor !== undefined) {\n return segmentsFromLineRange(this.lines, this.lineAnchor, this.cursor.line);\n }\n return this.anchor ? segmentsFromTextRange(this.lines, this.anchor, this.cursor) : [];\n }\n\n private moveHorizontal(delta: -1 | 1, extend: boolean): void {\n if (this.lines.length === 0) return;\n if (!extend) this.lineAnchor = undefined;\n if (!extend && this.anchor) {\n const range = this.getSelectionRange();\n if (range) this.cursor = delta < 0 ? range.start : range.end;\n this.anchor = undefined;\n this.preferredColumn = this.cursor.column;\n this.afterMove();\n return;\n }\n this.beginOrClearSelection(extend);\n const line = this.lines[this.cursor.line];\n const length = line ? splitGraphemes(line.text).length : 0;\n if (delta < 0) {\n if (this.cursor.column > 0) this.cursor = { ...this.cursor, column: this.cursor.column - 1 };\n else if (this.cursor.line > 0) {\n const previousLine = this.lines[this.cursor.line - 1];\n this.cursor = {\n line: this.cursor.line - 1,\n column: previousLine ? splitGraphemes(previousLine.text).length : 0,\n };\n }\n } else if (this.cursor.column < length) {\n this.cursor = { ...this.cursor, column: this.cursor.column + 1 };\n } else if (this.cursor.line < this.lines.length - 1) {\n this.cursor = { line: this.cursor.line + 1, column: 0 };\n }\n this.preferredColumn = this.cursor.column;\n this.afterMove();\n }\n\n private moveVertical(delta: number, extend: boolean): void {\n if (this.lines.length === 0) return;\n if (extend || this.lineAnchor === undefined) this.beginOrClearSelection(extend);\n const line = Math.max(0, Math.min(this.lines.length - 1, this.cursor.line + delta));\n const target = this.lines[line];\n this.cursor = {\n line,\n column: Math.min(this.preferredColumn, target ? splitGraphemes(target.text).length : 0),\n };\n this.afterMove();\n }\n\n private beginOrClearSelection(extend: boolean): void {\n if (extend) this.lineAnchor = undefined;\n if (extend && !this.anchor) this.anchor = { ...this.cursor };\n if (!extend) this.anchor = undefined;\n }\n\n private afterMove(): void {\n this.warning = undefined;\n this.tui.requestRender();\n }\n\n private keepCursorVisible(height: number): void {\n if (height <= 0) return;\n if (this.cursor.line < this.scrollOffset) this.scrollOffset = this.cursor.line;\n if (this.cursor.line >= this.scrollOffset + height) {\n this.scrollOffset = this.cursor.line - height + 1;\n }\n }\n\n private keepCursorHorizontallyVisible(width: number): void {\n const characters = splitGraphemes(this.lines[this.cursor.line]?.text ?? \"\");\n const displayWidths = characters.map((character) => visibleWidth(escapeTerminalControls(character)));\n const currentWidth = displayWidths[this.cursor.column] ?? 0;\n let usedWidth = 1 + Math.min(currentWidth, Math.max(0, width - 1));\n let offset = this.cursor.column;\n for (let index = this.cursor.column - 1; index >= 0; index -= 1) {\n const nextWidth = usedWidth + (displayWidths[index] ?? 0) + (index > 0 ? 1 : 0);\n if (nextWidth > width) break;\n usedWidth += displayWidths[index] ?? 0;\n offset = index;\n }\n this.horizontalOffset = offset;\n }\n\n private finish(action: BtwTextRangeSelectorAction): void {\n if (this.finished) return;\n this.finished = true;\n this.onAction(action);\n }\n}\n\nfunction clampTextPosition(lines: readonly BtwSelectionLine[], position: BtwTextPosition): BtwTextPosition {\n const line = Math.max(0, Math.min(lines.length - 1, position.line));\n const text = lines[line]?.text ?? \"\";\n return {\n line,\n column: Math.max(0, Math.min(splitGraphemes(text).length, position.column)),\n };\n}\n\nfunction confirmKeyLabel(keybindings: KeybindingsManager): string {\n return keybindingLabel(keybindings, \"tui.select.confirm\", [\"ctrl+c\"], \"enter\");\n}\n\nfunction matchesConfirm(data: string, keybindings: KeybindingsManager): boolean {\n if (matchesKey(data, Key.ctrl(\"c\"))) return false;\n const hasUsableBinding = keybindings\n .getKeys(\"tui.select.confirm\")\n .map(String)\n .some((key) => key.toLowerCase() !== \"ctrl+c\");\n return keybindings.matches(data, \"tui.select.confirm\") || (!hasUsableBinding && matchesKey(data, Key.enter));\n}\n\nfunction keybindingLabel(\n keybindings: KeybindingsManager,\n keybinding:\n | \"tui.select.confirm\"\n | \"tui.select.cancel\"\n | \"tui.select.up\"\n | \"tui.select.down\"\n | \"tui.select.pageUp\"\n | \"tui.select.pageDown\",\n excluded: readonly string[] = [],\n fallback?: string,\n): string {\n const key = keybindings\n .getKeys(keybinding)\n .map(String)\n .find((candidate) => !excluded.includes(candidate.toLowerCase()));\n return formatKeyLabel(key ?? fallback ?? keybinding);\n}\n\nfunction formatKeyLabel(key: string): string {\n return key\n .split(\"+\")\n .map((part) => {\n const lower = part.toLowerCase();\n if (lower === \"ctrl\") return \"Ctrl\";\n if (lower === \"alt\") return \"Alt\";\n if (lower === \"shift\") return \"Shift\";\n if (lower === \"escape\" || lower === \"esc\") return \"Esc\";\n if (lower === \"enter\" || lower === \"return\") return \"Enter\";\n if (lower === \"pageup\") return \"PgUp\";\n if (lower === \"pagedown\") return \"PgDn\";\n return part.length === 1 ? part.toUpperCase() : `${part[0]?.toUpperCase() ?? \"\"}${part.slice(1)}`;\n })\n .join(\"+\");\n}\n\nfunction splitGraphemes(text: string): string[] {\n return [...GRAPHEME_SEGMENTER.segment(text)].map(({ segment }) => segment);\n}\n\nfunction compareTextPositions(first: BtwTextPosition, second: BtwTextPosition): number {\n return first.line === second.line ? first.column - second.column : first.line - second.line;\n}\n\nfunction positionFallsInside(\n line: number,\n column: number,\n range: { start: BtwTextPosition; end: BtwTextPosition },\n): boolean {\n const position = { line, column };\n return compareTextPositions(position, range.start) >= 0 && compareTextPositions(position, range.end) < 0;\n}\n\nfunction fitRows(rows: string[], availableRows: number): string[] {\n if (rows.length <= availableRows) return rows;\n if (availableRows <= 1) return rows.slice(0, 1);\n return [rows[0] ?? \"\", ...rows.slice(rows.length - availableRows + 1)];\n}\n\nfunction escapeBringToMainText(text: string): string {\n return [...text]\n .map((character) => {\n if (character === \"\\n\") return character;\n if (character === \"\\t\") return \" \";\n const code = character.charCodeAt(0);\n if (code <= 31 || (code >= 127 && code <= 159)) {\n return `\\\\x${code.toString(16).padStart(2, \"0\")}`;\n }\n return character;\n })\n .join(\"\")\n .replace(/<btw_context(?=[ \\t\\r\\n>])/g, \"<btw_context\")\n .replace(/<\\/btw_context[ \\t\\r\\n]*>/g, (terminator) => terminator.replaceAll(\"<\", \"<\").replaceAll(\">\", \">\"));\n}\n\nfunction escapeTerminalControls(text: string): string {\n return [...text]\n .map((character) => {\n const code = character.charCodeAt(0);\n if (code <= 31 || (code >= 127 && code <= 159)) {\n return `\\\\x${code.toString(16).padStart(2, \"0\")}`;\n }\n return character;\n })\n .join(\"\");\n}\n", "import { spawn } from \"node:child_process\";\nimport {\n copyToClipboard as copyToHostClipboard,\n type ExtensionCommandContext,\n type KeybindingsManager,\n type Theme,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n type Component,\n isKeyRelease,\n isKittyProtocolActive,\n Key,\n type OverlayHandle,\n parseKey,\n type TUI,\n TuiAltScreen,\n type TuiInputListener,\n type TuiInputListenerResult,\n truncateToWidth,\n} from \"@earendil-works/pi-tui\";\nimport { type BtwKeybindingOverrides, BtwPasteGuard, resolveBtwShortcuts, setBtwShortcuts } from \"./keybindings.js\";\nimport { formatKeyLabel, sanitizeSingleLine } from \"./text.js\";\n\ntype BtwCustomOptions = Parameters<ExtensionCommandContext[\"ui\"][\"custom\"]>[1];\ntype BtwCustomFactory<T> = (\n tui: TUI,\n theme: Theme,\n keybindings: KeybindingsManager,\n done: (result: T) => void,\n) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>;\n\ntype BtwFullscreenTui = TUI & {\n flash?: (message: string, durationMs?: number) => void;\n setLayoutRoot(component: Component | undefined): void;\n addInputListenerBeforeAll?(listener: TuiInputListener): () => void;\n addInputListenerBeforeViewport?(listener: TuiInputListener): () => void;\n};\n\nexport interface BtwFullscreenLayoutComponent extends Component {\n getFullscreenLayout(): Component;\n}\n\nexport interface BtwFullscreenOptions {\n keybindings?: BtwKeybindingOverrides;\n copyOnSelect?: boolean;\n}\n\nexport type BtwFullscreenTuiFactory = (\n parent: TUI,\n theme: Theme,\n keybindings: KeybindingsManager,\n options: BtwFullscreenOptions,\n) => BtwFullscreenTui;\n\nexport interface BtwFullscreenDependencies {\n createTui?: BtwFullscreenTuiFactory;\n openUrl?: (url: string) => void;\n copyToClipboard?: (text: string) => Promise<void>;\n manualSelectionCopySupported?: boolean;\n}\n\nexport type RunBtwFullscreen = <T>(\n ctx: ExtensionCommandContext,\n run: (ctx: ExtensionCommandContext) => Promise<T>,\n options?: BtwFullscreenOptions,\n) => Promise<T>;\n\ntype FullscreenOutcome<T> = { kind: \"completed\"; value: T } | { kind: \"failed\"; error: unknown };\n\nclass FullscreenUiDisposedError extends Error {\n constructor() {\n super(\"The dedicated pi-btw UI was disposed.\");\n this.name = \"FullscreenUiDisposedError\";\n }\n}\n\nexport async function runBtwFullscreen<T>(\n ctx: ExtensionCommandContext,\n run: (ctx: ExtensionCommandContext) => Promise<T>,\n options: BtwFullscreenOptions = {},\n dependencies: BtwFullscreenDependencies = {},\n): Promise<T> {\n const createTui =\n dependencies.createTui ??\n ((parent: TUI, theme: Theme, keybindings: KeybindingsManager, fullscreenOptions: BtwFullscreenOptions) =>\n createBtwFullscreenTui(\n parent,\n theme,\n keybindings,\n fullscreenOptions.copyOnSelect ?? true,\n dependencies.manualSelectionCopySupported ?? hasManualSelectionCopyApi(),\n dependencies.openUrl ?? openUrlInBrowser,\n dependencies.copyToClipboard ?? copyToHostClipboard,\n ));\n let liveEditorText = ctx.ui.getEditorText();\n let restoreEditor = false;\n let host: BtwFullscreenHost<T> | undefined;\n const outcome = await ctx.ui.custom<FullscreenOutcome<T>>(\n (parent, theme, keybindings, done) => {\n host = new BtwFullscreenHost(\n parent,\n theme,\n keybindings,\n ctx,\n run,\n (value) => {\n try {\n liveEditorText = ctx.ui.getEditorText();\n restoreEditor = true;\n } catch {\n // A replaced session owns a different editor and must not receive stale text.\n }\n done(value);\n },\n createTui,\n options,\n );\n return host;\n },\n {\n overlay: true,\n onHandle: (handle) => host?.setParentOverlay(handle),\n },\n );\n if (restoreEditor) {\n try {\n if (ctx.ui.getEditorText() !== liveEditorText) ctx.ui.setEditorText(liveEditorText);\n } catch {\n // A replaced session owns a different editor and must not receive stale restoration.\n }\n }\n if (outcome.kind === \"failed\") throw outcome.error;\n return outcome.value;\n}\n\ntype BtwInputListeners = {\n beforeAll: Set<TuiInputListener>;\n beforeViewport: Set<TuiInputListener>;\n regular: Set<TuiInputListener>;\n};\n\nconst btwInputListeners = new WeakMap<BtwTuiAltScreen, BtwInputListeners>();\n\nfunction dispatchBtwInput(listeners: BtwInputListeners, data: string): TuiInputListenerResult {\n let current = data;\n for (const group of [listeners.beforeAll, listeners.beforeViewport, listeners.regular]) {\n for (const listener of group) {\n const result = listener(current);\n if (result?.consume) return result;\n if (result?.data !== undefined) current = result.data;\n }\n }\n return current === data ? undefined : { data: current };\n}\n\nclass BtwTuiAltScreen extends TuiAltScreen {\n hasFocusedOverlay(): boolean {\n return this.isOverlayFocused();\n }\n\n override addInputListener(listener: TuiInputListener): () => void {\n let listeners = btwInputListeners.get(this);\n if (!listeners) {\n const registeredListeners: BtwInputListeners = {\n beforeAll: new Set(),\n beforeViewport: new Set(),\n regular: new Set(),\n };\n btwInputListeners.set(this, registeredListeners);\n super.addInputListener((data) => dispatchBtwInput(registeredListeners, data));\n listeners = registeredListeners;\n }\n listeners.regular.add(listener);\n return () => listeners.regular.delete(listener);\n }\n\n addInputListenerBeforeAll(listener: TuiInputListener): () => void {\n const listeners = btwInputListeners.get(this);\n if (!listeners) return super.addInputListener(listener);\n listeners.beforeAll.add(listener);\n return () => listeners.beforeAll.delete(listener);\n }\n\n addInputListenerBeforeViewport(listener: TuiInputListener): () => void {\n const listeners = btwInputListeners.get(this);\n if (!listeners) return super.addInputListener(listener);\n listeners.beforeViewport.add(listener);\n return () => listeners.beforeViewport.delete(listener);\n }\n\n override removeInputListener(listener: TuiInputListener): void {\n const listeners = btwInputListeners.get(this);\n if (!listeners) {\n super.removeInputListener(listener);\n return;\n }\n listeners.beforeAll.delete(listener);\n listeners.beforeViewport.delete(listener);\n listeners.regular.delete(listener);\n }\n}\n\nconst BRACKETED_PASTE_START = \"\\u001b[200~\";\nconst BRACKETED_PASTE_END = \"\\u001b[201~\";\n\n// TuiAltScreen evaluates these actions before bottom, so shared keys cannot jump to latest.\nconst ALT_SCREEN_ACTIONS_BEFORE_BOTTOM = [\n \"tui.altScreen.search\",\n \"tui.altScreen.searchNext\",\n \"tui.altScreen.searchPrevious\",\n \"tui.altScreen.searchClose\",\n \"tui.altScreen.pageUp\",\n \"tui.altScreen.pageDown\",\n \"tui.altScreen.halfPageUp\",\n \"tui.altScreen.halfPageDown\",\n \"tui.altScreen.lineUp\",\n \"tui.altScreen.lineDown\",\n \"tui.altScreen.previousPrompt\",\n \"tui.altScreen.nextPrompt\",\n \"tui.altScreen.top\",\n] as const;\nconst KEY_MODIFIER_ORDER = [\"shift\", \"ctrl\", \"alt\", \"super\"] as const;\nconst MATCHABLE_SPECIAL_KEYS = new Set([\n \"space\",\n \"tab\",\n \"enter\",\n \"backspace\",\n \"delete\",\n \"insert\",\n \"home\",\n \"end\",\n \"pageup\",\n \"pagedown\",\n \"up\",\n \"down\",\n \"left\",\n \"right\",\n]);\nconst MATCHABLE_SYMBOL_KEYS = new Set(\"`-=[]\\\\;',./!@#$%^&*()_+|~{}:<>?\");\n\nfunction normalizedKeyId(key: string): string {\n const parts = key.toLowerCase().split(\"+\");\n const base = parts.at(-1);\n if (!base) return \"\";\n const normalizedBase = base === \"esc\" ? \"escape\" : base === \"return\" ? \"enter\" : base;\n const modifiers = KEY_MODIFIER_ORDER.filter((modifier) => parts.includes(modifier));\n return [...modifiers, normalizedBase].join(\"+\");\n}\n\nfunction formatEffectiveKeyLabel(key: string): string {\n const parts = key.split(\"+\");\n const base = parts.at(-1);\n if (base === \"pageup\") parts[parts.length - 1] = \"pageUp\";\n if (base === \"pagedown\") parts[parts.length - 1] = \"pageDown\";\n return formatKeyLabel(parts.join(\"+\"));\n}\n\nfunction canMatchKeyInput(key: string): boolean {\n const parts = key.split(\"+\");\n const base = parts.at(-1) ?? \"\";\n const modifiers = parts.slice(0, -1);\n if (base === \"escape\") return modifiers.length === 0;\n if (base === \"clear\") {\n return modifiers.length === 0 || (modifiers.length === 1 && (modifiers[0] === \"shift\" || modifiers[0] === \"ctrl\"));\n }\n if (/^f(?:[1-9]|1[0-2])$/u.test(base)) return modifiers.length === 0;\n return (\n MATCHABLE_SPECIAL_KEYS.has(base) ||\n (base.length === 1 && (/^[a-z0-9]$/u.test(base) || MATCHABLE_SYMBOL_KEYS.has(base)))\n );\n}\n\nfunction rawCtrlInput(base: string): string | undefined {\n if (base.length !== 1) return undefined;\n const rawBase = base === \"-\" ? \"_\" : base;\n if (!\"abcdefghijklmnopqrstuvwxyz[\\\\]_\".includes(rawBase)) return undefined;\n return String.fromCharCode(rawBase.charCodeAt(0) & 0x1f);\n}\n\nfunction legacyRawInput(key: string): string | undefined {\n const parts = key.split(\"+\");\n const base = parts.at(-1) ?? \"\";\n if (parts.length === 2 && parts[0] === \"ctrl\") return rawCtrlInput(base);\n if (isKittyProtocolActive()) return undefined;\n if (parts.length === 2 && parts[0] === \"alt\" && base.length === 1) return `\\u001b${base}`;\n if (parts.length === 3 && parts[0] === \"ctrl\" && parts[1] === \"alt\") {\n const input = rawCtrlInput(base);\n return input ? `\\u001b${input}` : undefined;\n }\n return undefined;\n}\n\n// Mirror matchesKey(), using parseKey() to canonicalize IDs that share legacy raw input.\nfunction keyInputIdentity(key: string): string {\n const identity = normalizedKeyId(key);\n const input = legacyRawInput(identity);\n return input ? normalizedKeyId(parseKey(input) ?? identity) : identity;\n}\n\nfunction hasManualSelectionCopyApi(): boolean {\n return (\n typeof TuiAltScreen.prototype.hasActiveSelection === \"function\" &&\n typeof TuiAltScreen.prototype.copyActiveSelectionToClipboard === \"function\"\n );\n}\n\nfunction createBtwFullscreenTui(\n parent: TUI,\n theme: Theme,\n keybindings: KeybindingsManager,\n copyOnSelect: boolean,\n manualSelectionCopySupported: boolean,\n openUrl: (url: string) => void,\n copyToClipboard: (text: string) => Promise<void>,\n): BtwFullscreenTui {\n if (!copyOnSelect && !manualSelectionCopySupported) {\n throw new Error(\n \"Manual fullscreen selection copying is unavailable in this Pi version; update Pi or enable automatic selection copying.\",\n );\n }\n const styleSearchMatch = (text: string) => theme.bg(\"searchMatchBg\", theme.fg(\"searchMatchText\", text));\n const fullscreen = new BtwTuiAltScreen(parent.terminal, parent.getShowHardwareCursor(), undefined, {\n mouse: true,\n copyOnSelect,\n searchMatchStyle: (text) => theme.underline(styleSearchMatch(text)),\n scrollToEndIndicator: () => {\n const unavailableKeyIdentities = new Set<string>([keyInputIdentity(Key.ctrl(\"c\"))]);\n for (const action of ALT_SCREEN_ACTIONS_BEFORE_BOTTOM) {\n for (const actionKey of keybindings.getKeys(action)) {\n unavailableKeyIdentities.add(keyInputIdentity(String(actionKey)));\n }\n }\n if (!copyOnSelect) {\n for (const copyKey of keybindings.getKeys(\"app.message.copy\")) {\n unavailableKeyIdentities.add(keyInputIdentity(String(copyKey)));\n }\n }\n const key = keybindings\n .getKeys(\"tui.altScreen.bottom\")\n .map((candidate) => keyInputIdentity(String(candidate)))\n .find(\n (identity) =>\n identity &&\n canMatchKeyInput(identity) &&\n !unavailableKeyIdentities.has(identity) &&\n formatEffectiveKeyLabel(identity),\n );\n const label = theme.fg(\"text\", \" \u2193 Jump to latest message\");\n const shortcut = key ? theme.fg(\"muted\", ` \u00B7 ${formatEffectiveKeyLabel(key)}`) : \"\";\n return theme.bg(\"selectedBg\", `${label}${shortcut} `);\n },\n searchCurrentMatchStyle: (text) => theme.bold(theme.inverse(styleSearchMatch(text))),\n openUrl,\n copySelection: async (text) => {\n try {\n await copyToClipboard(text);\n return true;\n } catch {\n return false;\n }\n },\n });\n if (!copyOnSelect) {\n let isInBracketedPaste = false;\n fullscreen.addInputListenerBeforeViewport((data) => {\n const wasInBracketedPaste = isInBracketedPaste;\n const startsBracketedPaste = data.includes(BRACKETED_PASTE_START);\n if (startsBracketedPaste) isInBracketedPaste = true;\n if (isInBracketedPaste && data.includes(BRACKETED_PASTE_END)) {\n isInBracketedPaste = false;\n }\n if (\n wasInBracketedPaste ||\n startsBracketedPaste ||\n fullscreen.hasFocusedOverlay() ||\n isKeyRelease(data) ||\n !keybindings.matches(data, \"app.message.copy\")\n ) {\n return undefined;\n }\n if (!fullscreen.hasActiveSelection()) {\n fullscreen.flash(\"No selection to copy\");\n return { consume: true };\n }\n void fullscreen.copyActiveSelectionToClipboard().catch(() => fullscreen.flash(\"Copy failed\"));\n return { consume: true };\n });\n }\n return fullscreen;\n}\n\n// Pi does not export its browser opener, so mirror its shell-free launcher for this isolated TUI.\nfunction openUrlInBrowser(target: string): void {\n const [command, args] =\n process.platform === \"darwin\"\n ? [\"open\", [target]]\n : process.platform === \"win32\"\n ? [\"rundll32\", [\"url.dll,FileProtocolHandler\", target]]\n : [\"xdg-open\", [target]];\n spawn(command, args, { stdio: \"ignore\", detached: true })\n .on(\"error\", () => {})\n .unref();\n}\n\nclass BtwFullscreenHost<T> implements Component {\n private fullscreen: BtwFullscreenTui | undefined;\n private parentOverlay: OverlayHandle | undefined;\n private cancelActiveCustom: (() => void) | undefined;\n private hardCancelActiveCustom: (() => void) | undefined;\n private removeHardCancelListener: (() => void) | undefined;\n private removeUpstreamAbortListener: (() => void) | undefined;\n private started = false;\n private disposed = false;\n private finished = false;\n private parentStopped = false;\n private parentRestoreAttempted = false;\n private fullscreenCreated = false;\n private fullscreenStopped = false;\n private parentRestoreQueued = false;\n private parentRestorePromise: Promise<void> | undefined;\n private cleanupError: unknown;\n private readonly lifetimeController = new AbortController();\n\n constructor(\n private readonly parent: TUI,\n private readonly theme: Theme,\n private readonly keybindings: KeybindingsManager,\n private readonly ctx: ExtensionCommandContext,\n private readonly run: (ctx: ExtensionCommandContext) => Promise<T>,\n private readonly done: (outcome: FullscreenOutcome<T>) => void,\n private readonly createTui: BtwFullscreenTuiFactory,\n private readonly options: BtwFullscreenOptions,\n ) {\n queueMicrotask(() => void this.start());\n }\n\n setParentOverlay(overlay: OverlayHandle): void {\n this.parentOverlay = overlay;\n }\n\n render(width: number): string[] {\n return [truncateToWidth(this.theme.fg(\"muted\", \"Opening btw side thread\u2026\"), width)];\n }\n\n invalidate(): void {}\n\n dispose(): void {\n if (this.disposed || this.finished) return;\n this.disposed = true;\n this.lifetimeController.abort();\n this.cancelActiveCustom?.();\n }\n\n private async start(): Promise<void> {\n if (this.started || this.finished) return;\n this.started = true;\n this.watchUpstreamCancellation();\n let outcome: FullscreenOutcome<T>;\n try {\n if (this.disposed) throw new FullscreenUiDisposedError();\n this.parent.stop({ preserveScreen: true });\n this.parentStopped = true;\n if (this.disposed) throw new FullscreenUiDisposedError();\n this.fullscreen = this.createTui(this.parent, this.theme, this.keybindings, this.options);\n this.fullscreenCreated = true;\n this.fullscreen.start();\n const shortcuts = resolveBtwShortcuts(\n this.options.keybindings,\n this.keybindings,\n this.options.copyOnSelect ?? true,\n );\n setBtwShortcuts(this.fullscreen, shortcuts);\n // Negotiate before warning when possible: the first dispatched user input uses\n // the current mode. Recheck each input, including later mode transitions.\n let previousWarnings: readonly string[] = [];\n const reportWarnings = () => {\n const warnings = shortcuts.warnings;\n for (const warning of warnings) {\n if (previousWarnings.includes(warning)) continue;\n try {\n this.ctx.ui.notify(`Pi BTW: ${warning}`, \"warning\");\n } catch {\n /* A replaced context must not prevent terminal cleanup. */\n }\n }\n previousWarnings = warnings;\n };\n const pasteGuard = new BtwPasteGuard();\n // Waiting for the custom promise would leave follow-up keys bound to the side TUI.\n const addHardCancelListener =\n this.fullscreen.addInputListenerBeforeAll?.bind(this.fullscreen) ??\n this.fullscreen.addInputListenerBeforeViewport?.bind(this.fullscreen) ??\n this.fullscreen.addInputListener.bind(this.fullscreen);\n this.removeHardCancelListener = addHardCancelListener((data) => {\n reportWarnings();\n if (pasteGuard.consume(data) || !shortcuts.matches(data, \"exit\")) return undefined;\n this.disposed = true;\n this.lifetimeController.abort();\n try {\n this.hardCancelActiveCustom?.();\n } finally {\n // ProcessTerminal.stop() destroys its active input buffer. Keep cancellation\n // synchronous, then drain input before the physical Windows terminal handoff.\n // Pi has no public input injection, so do not replay bytes already coalesced\n // behind the hard-cancel key.\n this.queueParentRestore();\n }\n return { consume: true };\n });\n outcome = { kind: \"completed\", value: await this.run(this.createContext()) };\n } catch (error) {\n outcome = { kind: \"failed\", error };\n }\n\n try {\n this.cancelActiveCustom?.();\n } catch (error) {\n this.cleanupError ??= error;\n }\n if (this.parentRestorePromise) await this.parentRestorePromise;\n else this.restoreParent();\n if (this.cleanupError !== undefined) outcome = { kind: \"failed\", error: this.cleanupError };\n this.finished = true;\n this.done(outcome);\n }\n\n private watchUpstreamCancellation(): void {\n const signal = this.ctx.signal;\n if (!signal) return;\n const onAbort = () => this.dispose();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n this.removeUpstreamAbortListener = () => signal.removeEventListener(\"abort\", onAbort);\n if (signal.aborted) onAbort();\n }\n\n private queueParentRestore(): void {\n if (this.parentRestoreQueued || this.parentRestoreAttempted) return;\n this.parentRestoreQueued = true;\n this.parentRestorePromise = Promise.resolve().then(async () => {\n try {\n await this.fullscreen?.terminal.drainInput?.();\n } catch (error) {\n this.cleanupError ??= error;\n }\n this.parentRestoreQueued = false;\n this.restoreParent();\n });\n }\n\n private restoreParent(): void {\n const removeUpstreamAbortListener = this.removeUpstreamAbortListener;\n this.removeUpstreamAbortListener = undefined;\n try {\n removeUpstreamAbortListener?.();\n } catch (error) {\n this.cleanupError ??= error;\n }\n const removeHardCancelListener = this.removeHardCancelListener;\n this.removeHardCancelListener = undefined;\n try {\n removeHardCancelListener?.();\n } catch (error) {\n this.cleanupError ??= error;\n }\n if (this.fullscreenCreated && !this.fullscreenStopped) {\n this.fullscreenStopped = true;\n try {\n this.fullscreen?.stop({ preserveScreen: true });\n } catch (error) {\n this.cleanupError ??= error;\n }\n }\n if (!this.parentStopped || this.parentRestoreAttempted) return;\n const parentOverlay = this.parentOverlay;\n this.parentOverlay = undefined;\n try {\n parentOverlay?.setHidden(true);\n } catch (error) {\n this.cleanupError ??= error;\n }\n try {\n this.parentRestoreAttempted = true;\n this.parent.start();\n this.parent.renderNow(false);\n } catch (error) {\n this.cleanupError ??= error;\n }\n }\n\n private createContext(): ExtensionCommandContext {\n const ui = new Proxy(this.ctx.ui, {\n get: (target, property) => {\n if (property === \"custom\") {\n return <Value>(factory: BtwCustomFactory<Value>, options?: BtwCustomOptions) =>\n this.showCustom(factory, options);\n }\n if (property === \"notify\") {\n return (message: string, level?: Parameters<ExtensionCommandContext[\"ui\"][\"notify\"]>[1]) => {\n target.notify(message, level);\n const display = sanitizeSingleLine(message);\n if (display) this.fullscreen?.flash?.(display);\n };\n }\n const value = Reflect.get(target, property, target) as unknown;\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n const signal = this.ctx.signal\n ? AbortSignal.any([this.ctx.signal, this.lifetimeController.signal])\n : this.lifetimeController.signal;\n return new Proxy(this.ctx, {\n get: (target, property) => {\n if (property === \"ui\") return ui;\n if (property === \"signal\") return signal;\n return Reflect.get(target, property, target);\n },\n });\n }\n\n private showCustom<Value>(factory: BtwCustomFactory<Value>, options?: BtwCustomOptions): Promise<Value> {\n const fullscreen = this.fullscreen;\n if (!fullscreen || this.disposed || this.finished) {\n return Promise.reject(new FullscreenUiDisposedError());\n }\n if (this.cancelActiveCustom) {\n return Promise.reject(new Error(\"pi-btw attempted to open overlapping custom UI.\"));\n }\n\n return new Promise<Value>((resolve, reject) => {\n let component: (Component & { dispose?(): void }) | undefined;\n let overlay: OverlayHandle | undefined;\n let mounted = false;\n let layoutMounted = false;\n let factorySettled = false;\n let closed = false;\n let promiseSettled = false;\n let componentDisposed = false;\n let pendingValue: Value | undefined;\n let hasPendingValue = false;\n\n const disposeComponent = () => {\n if (!component || componentDisposed) return;\n componentDisposed = true;\n try {\n component.dispose?.();\n } catch {\n // Cleanup must continue so terminal ownership is restored.\n }\n };\n const unmount = () => {\n let cleanupError: unknown;\n try {\n if (overlay) overlay.hide();\n else if (mounted && layoutMounted) fullscreen.setLayoutRoot(undefined);\n else if (mounted && component) fullscreen.removeChild(component);\n } catch (error) {\n cleanupError = error;\n }\n if (overlay || mounted) {\n try {\n fullscreen.setFocus(null);\n fullscreen.requestRender();\n } catch (error) {\n cleanupError ??= error;\n }\n }\n disposeComponent();\n if (cleanupError !== undefined) throw cleanupError;\n };\n const complete = () => {\n if (promiseSettled || !hasPendingValue) return;\n promiseSettled = true;\n this.cancelActiveCustom = undefined;\n this.hardCancelActiveCustom = undefined;\n if (!factorySettled) {\n resolve(pendingValue as Value);\n return;\n }\n try {\n unmount();\n resolve(pendingValue as Value);\n } catch (error) {\n reject(error);\n }\n };\n const close = (value: Value) => {\n if (closed || promiseSettled) return;\n closed = true;\n pendingValue = value;\n hasPendingValue = true;\n complete();\n };\n const fail = (error: unknown) => {\n if (promiseSettled) return;\n closed = true;\n promiseSettled = true;\n this.cancelActiveCustom = undefined;\n this.hardCancelActiveCustom = undefined;\n try {\n unmount();\n reject(error);\n } catch (cleanupError) {\n reject(cleanupError);\n }\n };\n this.cancelActiveCustom = () => {\n if (promiseSettled) return;\n disposeComponent();\n if (!promiseSettled) fail(new FullscreenUiDisposedError());\n };\n this.hardCancelActiveCustom = () => {\n if (promiseSettled) return;\n try {\n component?.handleInput?.(\"\\u0003\");\n } catch (error) {\n fail(error);\n return;\n }\n this.cancelActiveCustom?.();\n };\n\n let created: ReturnType<BtwCustomFactory<Value>>;\n try {\n created = factory(fullscreen, this.theme, this.keybindings, close);\n } catch (error) {\n factorySettled = true;\n fail(error);\n return;\n }\n Promise.resolve(created)\n .then((value) => {\n component = value;\n factorySettled = true;\n if (promiseSettled) {\n disposeComponent();\n return;\n }\n if (closed) {\n complete();\n return;\n }\n if (options?.overlay) {\n const overlayOptions =\n typeof options.overlayOptions === \"function\" ? options.overlayOptions() : options.overlayOptions;\n overlay = fullscreen.showOverlay(component, overlayOptions);\n options.onHandle?.(overlay);\n } else {\n fullscreen.clear();\n mounted = true;\n if (isFullscreenLayoutComponent(component)) {\n layoutMounted = true;\n fullscreen.setLayoutRoot(component.getFullscreenLayout());\n } else {\n fullscreen.addChild(component);\n }\n fullscreen.setFocus(component);\n fullscreen.requestRender();\n }\n })\n .catch(fail);\n });\n }\n}\n\nfunction isFullscreenLayoutComponent(component: Component): component is BtwFullscreenLayoutComponent {\n return \"getFullscreenLayout\" in component && typeof component.getFullscreenLayout === \"function\";\n}\n", "import {\n isKeyRelease,\n isKittyProtocolActive,\n KeybindingsManager,\n type KeyId,\n matchesKey,\n type TUI,\n TUI_KEYBINDINGS,\n} from \"@earendil-works/pi-tui\";\nimport { formatKeyLabel } from \"./text.js\";\n\nexport const BTW_SHORTCUT_ACTIONS = [\"exit\", \"cycleThinkingLevel\", \"bringToMain\"] as const;\nexport type BtwShortcutAction = (typeof BTW_SHORTCUT_ACTIONS)[number];\nexport type BtwKeybindingOverrides = Partial<Record<BtwShortcutAction, string>>;\n\nconst MODIFIERS = [\"shift\", \"alt\", \"ctrl\", \"super\"] as const;\nconst SYMBOLS = \"`-=[]\\\\;',./!@#$%^&*()_|~{}:<>?\";\nconst SPECIAL: Record<string, number> = {\n escape: 27,\n tab: 9,\n enter: 13,\n space: 32,\n backspace: 127,\n insert: 57425,\n delete: 57426,\n home: 57423,\n end: 57424,\n pageup: 57421,\n pagedown: 57422,\n left: 57417,\n right: 57418,\n up: 57419,\n down: 57420,\n};\nconst FUNCTION_INPUTS = [\"OP\", \"OQ\", \"OR\", \"OS\", \"[15~\", \"[17~\", \"[18~\", \"[19~\", \"[20~\", \"[21~\", \"[23~\", \"[24~\"];\n// All cross-identity legacy collisions in Pi's matchesKey(): raw Ctrl bytes,\n// ESC-prefixed bytes (including Alt+arrows), BS/DEL, Enter and Shift+Tab.\n// CSI-u, keypad, lock bits, shifted letters and modifyOtherKeys normalize to\n// the same key+modifiers; probe that identity instead of duplicating the parser.\nconst LEGACY_INPUTS = [\n ...Array.from({ length: 128 }, (_, code) => String.fromCharCode(code)),\n ...Array.from({ length: 128 }, (_, code) => `\\u001b${String.fromCharCode(code)}`),\n \"\\u001b[Z\",\n \"\\u001bOM\",\n \"\\u001b[E\",\n \"\\u001b[e\",\n \"\\u001bOe\",\n ...FUNCTION_INPUTS.map((suffix) => `\\u001b${suffix}`),\n];\n\n/** Strict settings syntax; Pi itself ignores unknown/duplicate modifier tokens. */\nexport function normalizeBtwKey(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length > 80 || /[\\s\\p{Cc}]/u.test(value)) return undefined;\n const parts = value.toLowerCase().split(\"+\");\n let base = parts.pop();\n if (!base) return undefined;\n if (base === \"esc\") base = \"escape\";\n if (base === \"return\") base = \"enter\";\n if (new Set(parts).size !== parts.length || parts.some((part) => !MODIFIERS.includes(part as never)))\n return undefined;\n if (\n !Object.hasOwn(SPECIAL, base) &&\n base !== \"clear\" &&\n !/^f(?:[1-9]|1[0-2])$/u.test(base) &&\n !(base.length === 1 && (/^[a-z0-9]$/u.test(base) || SYMBOLS.includes(base)))\n )\n return undefined;\n if ((base === \"escape\" || (base.startsWith(\"f\") && base.length > 1)) && parts.length) return undefined;\n if (base === \"clear\" && (parts.length > 1 || (parts.length === 1 && ![\"ctrl\", \"shift\"].includes(parts[0] ?? \"\"))))\n return undefined;\n return [...MODIFIERS.filter((part) => parts.includes(part)), base].join(\"+\");\n}\n\n/** Representative inputs are checked by Pi, including its live terminal-mode branches. */\nfunction inputsFor(key: string): string[] {\n const parts = key.split(\"+\");\n const base = parts.pop() ?? \"\";\n const modifier = MODIFIERS.reduce((mask, part, bit) => mask | (parts.includes(part) ? 1 << bit : 0), 0);\n const code = SPECIAL[base] ?? (base.length === 1 ? base.charCodeAt(0) : undefined);\n const inputs = code === undefined ? LEGACY_INPUTS : [...LEGACY_INPUTS, `\\u001b[${code};${modifier + 1}u`];\n return inputs.filter((input) => matchesKey(input, key as KeyId));\n}\n\nexport function btwKeysOverlap(first: string, second: string): boolean {\n const normalized = normalizeBtwKey(first);\n return normalized !== undefined && inputsFor(normalized).some((input) => matchesKey(input, second as KeyId));\n}\n\nexport interface BtwShortcuts {\n keys: Record<BtwShortcutAction, readonly string[]>;\n warnings: readonly string[];\n matches(data: string, action: BtwShortcutAction): boolean;\n label(action: BtwShortcutAction): string;\n}\n\nfunction reservedKeys(keybindings: KeybindingsManager, copyOnSelect: boolean): string[] {\n // Editor has no autocomplete provider here. Select bindings are still reserved\n // because exit also applies to BTW-owned nested review/menu components.\n return [\n \"ctrl+c\",\n \"shift+backspace\",\n \"shift+delete\",\n \"shift+space\",\n // Exact-range review uses these fixed selection actions even if Editor is remapped.\n \"shift+left\",\n \"shift+right\",\n \"shift+up\",\n \"shift+down\",\n \"left\",\n \"right\",\n \"enter\",\n \"alt+enter\",\n \"ctrl+j\",\n \"pageUp\",\n \"pageDown\",\n ...Object.keys(TUI_KEYBINDINGS).flatMap((id) => keybindings.getKeys(id as keyof typeof TUI_KEYBINDINGS)),\n ...(!copyOnSelect ? keybindings.getKeys(\"app.message.copy\") : []),\n ];\n}\n\nfunction isTextKey(key: string): boolean {\n const parts = key.split(\"+\");\n const base = parts.at(-1) ?? \"\";\n return (base.length === 1 || base === \"space\") && !parts.some((part) => [\"ctrl\", \"alt\", \"super\"].includes(part));\n}\n\nexport function resolveBtwShortcuts(\n overrides: BtwKeybindingOverrides = {},\n keybindings: KeybindingsManager,\n copyOnSelect = true,\n): BtwShortcuts {\n let mode = isKittyProtocolActive();\n let snapshot = resolveShortcutSnapshot(overrides, keybindings, copyOnSelect);\n const current = () => {\n if (mode !== isKittyProtocolActive()) {\n mode = isKittyProtocolActive();\n snapshot = resolveShortcutSnapshot(overrides, keybindings, copyOnSelect);\n }\n return snapshot;\n };\n // ProcessTerminal negotiates Kitty asynchronously after the dedicated TUI starts.\n // Hints and matching must use the same policy after that mode transition.\n return {\n get keys() {\n return current().keys;\n },\n get warnings() {\n return current().warnings;\n },\n matches: (data, action) => current().matches(data, action),\n label: (action) => current().label(action),\n };\n}\n\nfunction resolveShortcutSnapshot(\n overrides: BtwKeybindingOverrides = {},\n keybindings: KeybindingsManager,\n copyOnSelect = true,\n): BtwShortcuts {\n const reserved = reservedKeys(keybindings, copyOnSelect);\n const keys: BtwShortcuts[\"keys\"] = { exit: [\"ctrl+c\"], cycleThinkingLevel: [], bringToMain: [] };\n const warnings: string[] = [];\n const defaults: Record<BtwShortcutAction, readonly string[]> = {\n exit: [\"ctrl+c\"],\n cycleThinkingLevel: keybindings.getKeys(\"app.thinking.cycle\"),\n bringToMain: [\"ctrl+r\"],\n };\n const usable = (action: BtwShortcutAction, candidate: string, inherited = false): string | undefined => {\n const key = normalizeBtwKey(candidate);\n if (!key || (!inherited && isTextKey(key))) return undefined;\n const inputs = inputsFor(key);\n if (!inputs.length) return undefined;\n if (action === \"exit\" && key === \"ctrl+c\") return key;\n if (\n reserved.some((other) => typeof other === \"string\" && inputs.some((input) => matchesKey(input, other as KeyId)))\n )\n return undefined;\n return key;\n };\n const candidates: BtwKeybindingOverrides = {};\n const availableDefaults = { ...defaults };\n for (const action of BTW_SHORTCUT_ACTIONS) {\n availableDefaults[action] = defaults[action]\n .map((key) => usable(action, key, action === \"cycleThinkingLevel\"))\n .filter((key): key is string => key !== undefined);\n const override = overrides[action];\n if (override !== undefined) candidates[action] = usable(action, override);\n }\n // Compare the complete proposal, not only actions visited earlier. Reject conflicts\n // together, then repeat because a rejected override restores its default bindings.\n for (;;) {\n const rejected = BTW_SHORTCUT_ACTIONS.filter((action) => {\n const candidate = candidates[action];\n return (\n candidate !== undefined &&\n BTW_SHORTCUT_ACTIONS.some(\n (other) =>\n other !== action &&\n (candidates[other] ? [candidates[other]] : availableDefaults[other]).some((key) =>\n btwKeysOverlap(candidate, key),\n ),\n )\n );\n });\n if (!rejected.length) break;\n for (const action of rejected) delete candidates[action];\n }\n for (const action of BTW_SHORTCUT_ACTIONS) {\n const override = overrides[action];\n const selected = candidates[action];\n if (override !== undefined && !selected)\n warnings.push(\n `${action}: configured shortcut is invalid or conflicts with a reserved action; using an available default.`,\n );\n const effective = selected\n ? [selected]\n : availableDefaults[action].filter(\n (key) =>\n !BTW_SHORTCUT_ACTIONS.some(\n (other) => other !== action && keys[other].some((used) => btwKeysOverlap(key, used)),\n ),\n );\n keys[action] = action === \"exit\" ? [...new Set([...effective, \"ctrl+c\"])] : effective;\n if (!keys[action].length && (override !== undefined || defaults[action].length > 0))\n warnings.push(`${action}: no usable shortcut; change Pi BTW Settings or Pi keybindings.`);\n }\n return {\n keys,\n warnings,\n matches: (data, action) => !isKeyRelease(data) && keys[action].some((key) => matchesKey(data, key as KeyId)),\n label: (action) => (keys[action].length ? formatKeyLabel(keys[action][0] ?? \"\") : \"Unavailable\"),\n };\n}\n\nexport function validateBtwShortcutEdit(\n action: BtwShortcutAction,\n value: string | undefined,\n overrides: BtwKeybindingOverrides,\n keybindings: KeybindingsManager,\n copyOnSelect: boolean,\n): string | undefined {\n // Reset must remain available even when several existing overrides conflict.\n if (value === undefined) return undefined;\n if (!normalizeBtwKey(value)) return \"Invalid key combination. Use a Pi key name such as ctrl+q or f6.\";\n const next = { ...overrides, [action]: value };\n const resolved = resolveBtwShortcuts(next, keybindings, copyOnSelect);\n const previous = resolveBtwShortcuts(overrides, keybindings, copyOnSelect);\n // Reject edits that disable another binding as well as the edited binding.\n for (const item of BTW_SHORTCUT_ACTIONS) {\n if (\n (item === action && !resolved.keys[item].includes(normalizeBtwKey(value) ?? \"\")) ||\n (item !== action && previous.keys[item].some((key) => !resolved.keys[item].includes(key)))\n ) {\n return `${item} conflicts with another BTW shortcut, editing, selection, search, scrolling, or copying. Choose a different key.`;\n }\n }\n return undefined;\n}\n\nconst bindingsByTui = new WeakMap<TUI, BtwShortcuts>();\nexport function setBtwShortcuts(tui: TUI, shortcuts: BtwShortcuts): void {\n bindingsByTui.set(tui, shortcuts);\n}\nexport function getBtwShortcuts(tui: TUI, keybindings?: KeybindingsManager): BtwShortcuts {\n return (\n bindingsByTui.get(tui) ??\n resolveBtwShortcuts(\n {},\n keybindings ??\n new KeybindingsManager({\n ...TUI_KEYBINDINGS,\n \"app.thinking.cycle\": { defaultKeys: \"shift+tab\" },\n }),\n )\n );\n}\n\n/** Keep split bracketed-paste payloads away from screen-level shortcuts. */\nexport class BtwPasteGuard {\n private active = false;\n consume(data: string): boolean {\n const wasActive = this.active;\n const starts = data.includes(\"\\u001b[200~\");\n if (starts) this.active = true;\n if (this.active && data.includes(\"\\u001b[201~\")) this.active = false;\n return wasActive || starts;\n }\n}\n", "export function sanitizeSingleLine(text: string): string {\n return [...text.replace(/[\\r\\n\\t]/gu, \" \")]\n .filter((character) => {\n const code = character.charCodeAt(0);\n return code > 31 && (code < 127 || code > 159);\n })\n .join(\"\")\n .replace(/ +/gu, \" \")\n .trim();\n}\n\nexport function formatKeyLabel(key: string): string {\n const sanitized = sanitizeSingleLine(key);\n if (!sanitized) return \"\";\n return sanitized\n .split(\"+\")\n .map((part) => {\n const lower = part.toLowerCase();\n if (lower === \"shift\") return \"Shift\";\n if (lower === \"ctrl\") return \"Ctrl\";\n if (lower === \"alt\") return \"Alt\";\n if (lower === \"super\") return \"Super\";\n return part.length === 1 ? part.toUpperCase() : `${part[0]?.toUpperCase() ?? \"\"}${part.slice(1)}`;\n })\n .join(\"+\");\n}\n", "import {\n copyToClipboard,\n type ExtensionAPI,\n type ExtensionCommandContext,\n type SessionEntry,\n type SessionTreeNode,\n TreeSelectorComponent,\n} from \"@earendil-works/pi-coding-agent\";\nimport { type Component, type Focusable, Key, matchesKey } from \"@earendil-works/pi-tui\";\nimport { showBtwCustomPreservingEditor } from \"./menu.js\";\nimport { sanitizeSingleLine } from \"./text.js\";\n\nexport type MainEntryPickResult = { kind: \"selected\"; entryId: string } | { kind: \"back\" } | { kind: \"closed\" };\n\nexport interface MainThreadTreeSelector extends Component, Focusable {\n onCopy?: (text: string | undefined) => void;\n setViewLabel?(entryId: string, label: string | undefined, labelTimestamp?: string): void;\n dispose?(): void;\n}\n\nexport interface MainThreadTreeSelectorOptions {\n tree: SessionTreeNode[];\n currentLeafId: string | null;\n terminalRows: number;\n onSelect: (entryId: string) => void;\n onCancel: () => void;\n onCopy: (entryId: string | undefined, displayText: string | undefined) => void;\n onLabelChange: (entryId: string, label: string | undefined) => void;\n}\n\nexport interface MainThreadTreePickerDependencies {\n createSelector?: (options: MainThreadTreeSelectorOptions) => MainThreadTreeSelector;\n copyToClipboard?: (text: string, signal: AbortSignal) => Promise<void>;\n}\n\nclass MainThreadTreePickerComponent implements Component, Focusable {\n constructor(\n private readonly selector: MainThreadTreeSelector,\n private readonly onClose: () => void,\n ) {}\n\n get focused(): boolean {\n return this.selector.focused;\n }\n\n set focused(value: boolean) {\n this.selector.focused = value;\n }\n\n get wantsKeyRelease(): boolean | undefined {\n return this.selector.wantsKeyRelease;\n }\n\n render(width: number): string[] {\n return this.selector.render(width);\n }\n\n handleInput(data: string): void {\n if (matchesKey(data, Key.ctrl(\"c\"))) {\n this.onClose();\n return;\n }\n this.selector.handleInput?.(data);\n }\n\n invalidate(): void {\n this.selector.invalidate();\n }\n\n dispose(): void {\n this.selector.dispose?.();\n this.onClose();\n }\n}\n\nexport async function pickMainEntry(\n pi: ExtensionAPI,\n ctx: ExtensionCommandContext,\n dependencies: MainThreadTreePickerDependencies = {},\n): Promise<MainEntryPickResult> {\n let rawTree: SessionTreeNode[];\n let currentLeafId: string | null;\n try {\n rawTree = ctx.sessionManager.getTree();\n currentLeafId = ctx.sessionManager.getLeafId();\n } catch {\n return { kind: \"closed\" };\n }\n\n if (rawTree.length === 0) {\n notifySafely(ctx, \"No main-thread entries are available\", \"warning\");\n return { kind: \"back\" };\n }\n\n const tree = sanitizeTreeForDisplay(rawTree);\n const rawCopyText = collectRawCopyText(rawTree);\n const savedLabels = collectSavedLabels(rawTree);\n const createSelector = dependencies.createSelector ?? createNativeTreeSelector;\n const copy = dependencies.copyToClipboard ?? copyText;\n const copyControllers = new Set<AbortController>();\n const copyTasks = new Set<Promise<void>>();\n const abortCopies = () => {\n for (const controller of copyControllers) {\n controller.abort(new Error(\"The main-thread tree picker closed\"));\n }\n };\n const result = await showBtwCustomPreservingEditor<MainEntryPickResult>(ctx, (tui, _theme, _keybindings, done) => {\n let settled = false;\n let selector: MainThreadTreeSelector | undefined;\n const finish = (value: MainEntryPickResult) => {\n if (settled) return;\n settled = true;\n abortCopies();\n done(value);\n };\n const onCopy = (entryId: string | undefined, displayText: string | undefined) => {\n if (settled) return;\n const text = entryId ? rawCopyText.get(entryId) : displayText;\n if (!text) {\n notifySafely(ctx, \"Selected entry has no text to copy\", \"warning\");\n return;\n }\n const controller = new AbortController();\n copyControllers.add(controller);\n let operation: Promise<void>;\n try {\n operation = copy(text, controller.signal);\n } catch (error: unknown) {\n operation = Promise.reject(error);\n }\n let task!: Promise<void>;\n task = operation\n .then(() => {\n if (!settled) notifySafely(ctx, \"Copied selected message\", \"info\");\n })\n .catch((error: unknown) => {\n if (!settled && !controller.signal.aborted) {\n notifySafely(ctx, `Could not copy selected message: ${formatError(error)}`, \"error\");\n }\n })\n .finally(() => {\n copyControllers.delete(controller);\n copyTasks.delete(task);\n });\n copyTasks.add(task);\n };\n const restoreLabel = (entryId: string) => {\n const previous = savedLabels.get(entryId);\n selector?.setViewLabel?.(entryId, previous?.label, previous?.labelTimestamp);\n tui.requestRender();\n };\n const onLabelChange = (entryId: string, label: string | undefined) => {\n if (settled) return;\n try {\n if (!ctx.sessionManager.getEntry(entryId)) {\n restoreLabel(entryId);\n notifySafely(ctx, \"The selected main-thread entry is no longer available\", \"warning\");\n return;\n }\n const persistedLabel = label === undefined ? undefined : sanitizeSingleLine(label);\n pi.setLabel(entryId, persistedLabel);\n savedLabels.set(entryId, { label: persistedLabel });\n selector?.setViewLabel?.(entryId, persistedLabel);\n tui.requestRender();\n } catch (error: unknown) {\n restoreLabel(entryId);\n notifySafely(ctx, `Could not update tree label: ${formatError(error)}`, \"error\");\n }\n };\n selector = createSelector({\n tree,\n currentLeafId,\n terminalRows: tui.terminal.rows,\n onSelect: (entryId) => finish({ kind: \"selected\", entryId }),\n onCancel: () => finish({ kind: \"back\" }),\n onCopy,\n onLabelChange,\n });\n return new MainThreadTreePickerComponent(selector, () => finish({ kind: \"closed\" }));\n });\n abortCopies();\n await Promise.allSettled([...copyTasks]);\n\n return result ?? { kind: \"closed\" };\n}\n\nfunction createNativeTreeSelector(options: MainThreadTreeSelectorOptions): MainThreadTreeSelector {\n const selector = new TreeSelectorComponent(\n options.tree,\n options.currentLeafId,\n options.terminalRows,\n options.onSelect,\n options.onCancel,\n options.onLabelChange,\n );\n selector.onCopy = (displayText) => options.onCopy(selector.getTreeList().getSelectedNode()?.entry.id, displayText);\n const result = selector as MainThreadTreeSelector;\n result.setViewLabel = (entryId, label, labelTimestamp) =>\n selector.getTreeList().updateNodeLabel(entryId, label, labelTimestamp);\n return result;\n}\n\nfunction sanitizeTreeForDisplay(tree: readonly SessionTreeNode[]): SessionTreeNode[] {\n return tree.map((node) => {\n const result: SessionTreeNode = {\n entry: sanitizeEntryForDisplay(node.entry),\n children: sanitizeTreeForDisplay(node.children),\n };\n if (node.label !== undefined) result.label = sanitizeSingleLine(node.label);\n if (node.labelTimestamp !== undefined) {\n result.labelTimestamp = sanitizeSingleLine(node.labelTimestamp);\n }\n return result;\n });\n}\n\nfunction sanitizeEntryForDisplay(entry: SessionEntry): SessionEntry {\n switch (entry.type) {\n case \"message\": {\n const message = { ...entry.message } as Record<string, unknown>;\n if (\"content\" in entry.message) message.content = sanitizeDisplayContent(entry.message.content);\n for (const key of [\"role\", \"errorMessage\", \"command\", \"toolName\"] as const) {\n const value = message[key];\n if (typeof value === \"string\") message[key] = sanitizeSingleLine(value);\n }\n return { ...entry, message } as unknown as SessionEntry;\n }\n case \"custom_message\":\n return {\n ...entry,\n customType: sanitizeSingleLine(entry.customType),\n content: sanitizeDisplayContent(entry.content) as typeof entry.content,\n };\n case \"compaction\":\n return { ...entry, summary: sanitizeSingleLine(entry.summary) };\n case \"branch_summary\":\n return { ...entry, summary: sanitizeSingleLine(entry.summary) };\n case \"model_change\":\n return {\n ...entry,\n provider: sanitizeSingleLine(entry.provider),\n modelId: sanitizeSingleLine(entry.modelId),\n };\n case \"thinking_level_change\":\n return { ...entry, thinkingLevel: sanitizeSingleLine(entry.thinkingLevel) };\n case \"custom\":\n return { ...entry, customType: sanitizeSingleLine(entry.customType) };\n case \"label\":\n return {\n ...entry,\n label: entry.label === undefined ? undefined : sanitizeSingleLine(entry.label),\n };\n case \"session_info\":\n return {\n ...entry,\n name: entry.name === undefined ? undefined : sanitizeSingleLine(entry.name),\n };\n }\n}\n\nfunction sanitizeDisplayContent(content: unknown): unknown {\n if (typeof content === \"string\") return sanitizeSingleLine(content);\n if (!Array.isArray(content)) return content;\n return content.map((block) => {\n if (block === null || typeof block !== \"object\" || !(\"type\" in block)) return block;\n if (block.type === \"text\" && \"text\" in block && typeof block.text === \"string\") {\n return { ...block, text: sanitizeSingleLine(block.text) };\n }\n if (block.type === \"toolCall\") {\n const copy = { ...block } as Record<string, unknown>;\n if (typeof copy.name === \"string\") copy.name = sanitizeSingleLine(copy.name);\n copy.arguments = sanitizeToolArguments(copy.arguments, new WeakMap());\n return copy;\n }\n return block;\n });\n}\n\nfunction sanitizeToolArguments(value: unknown, seen: WeakMap<object, unknown>): unknown {\n if (typeof value === \"string\") return sanitizeSingleLine(value);\n if (value === null || typeof value !== \"object\") return value;\n const existing = seen.get(value);\n if (existing !== undefined) return existing;\n if (Array.isArray(value)) {\n const result: unknown[] = [];\n seen.set(value, result);\n for (const item of value) result.push(sanitizeToolArguments(item, seen));\n return result;\n }\n const result: Record<string, unknown> = {};\n seen.set(value, result);\n for (const [key, item] of Object.entries(value)) {\n result[key] = sanitizeToolArguments(item, seen);\n }\n return result;\n}\n\nfunction collectRawCopyText(tree: readonly SessionTreeNode[]): Map<string, string> {\n const result = new Map<string, string>();\n const visit = (nodes: readonly SessionTreeNode[]) => {\n for (const node of nodes) {\n const text = getRawCopyText(node.entry);\n if (text !== undefined) result.set(node.entry.id, text);\n visit(node.children);\n }\n };\n visit(tree);\n return result;\n}\n\nfunction getRawCopyText(entry: SessionEntry): string | undefined {\n let text: string | undefined;\n if (entry.type === \"message\") {\n if (entry.message.role === \"bashExecution\") text = entry.message.command;\n else if (\"content\" in entry.message) {\n text = extractRawText(entry.message.content);\n if (!text && entry.message.role === \"assistant\") text = entry.message.errorMessage;\n }\n } else if (entry.type === \"custom_message\") text = extractRawText(entry.content);\n else if (entry.type === \"compaction\" || entry.type === \"branch_summary\") text = entry.summary;\n return text?.trim() ? text : undefined;\n}\n\nfunction extractRawText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .filter(\n (block): block is { type: \"text\"; text: string } =>\n block !== null &&\n typeof block === \"object\" &&\n \"type\" in block &&\n block.type === \"text\" &&\n \"text\" in block &&\n typeof block.text === \"string\",\n )\n .map((block) => block.text)\n .join(\"\");\n}\n\ninterface SavedLabel {\n label: string | undefined;\n labelTimestamp?: string;\n}\n\nfunction collectSavedLabels(tree: readonly SessionTreeNode[]): Map<string, SavedLabel> {\n const result = new Map<string, SavedLabel>();\n const visit = (nodes: readonly SessionTreeNode[]) => {\n for (const node of nodes) {\n result.set(node.entry.id, {\n label: node.label === undefined ? undefined : sanitizeSingleLine(node.label),\n labelTimestamp: node.labelTimestamp === undefined ? undefined : sanitizeSingleLine(node.labelTimestamp),\n });\n visit(node.children);\n }\n };\n visit(tree);\n return result;\n}\n\nasync function copyText(text: string, signal: AbortSignal): Promise<void> {\n signal.throwIfAborted();\n await copyToClipboard(text);\n signal.throwIfAborted();\n}\n\nfunction notifySafely(\n ctx: ExtensionCommandContext,\n message: string,\n level: Parameters<ExtensionCommandContext[\"ui\"][\"notify\"]>[1],\n): void {\n try {\n ctx.ui.notify(sanitizeSingleLine(message), level);\n } catch {\n // The command context may have been replaced while the selector was open.\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import { type Api, getSupportedThinkingLevels, type Model } from \"@earendil-works/pi-ai\";\nimport {\n BorderedLoader,\n type ExtensionCommandContext,\n type KeybindingsManager,\n type Theme,\n} from \"@earendil-works/pi-coding-agent\";\nimport type { Component, TUI } from \"@earendil-works/pi-tui\";\nimport type { MenuContext, RunMenuResult } from \"@narumitw/pi-tui-kit\";\nimport {\n BTW_SHORTCUT_ACTIONS,\n type BtwShortcutAction,\n normalizeBtwKey,\n resolveBtwShortcuts,\n validateBtwShortcutEdit,\n} from \"./keybindings.js\";\nimport {\n type BtwSettings,\n type BtwSettingsPatch,\n btwSettingsPath,\n effectiveFullscreenCopyOnSelect,\n effectiveRememberThinkingLevelChanges,\n parseBtwModelReference,\n readBtwSettings,\n type UpdateBtwSettingsOptions,\n updateBtwSettings,\n} from \"./settings.js\";\nimport { BTW_THINKING_LEVELS, type BtwThinkingLevel } from \"./side-thread.js\";\nimport { formatKeyLabel, sanitizeSingleLine } from \"./text.js\";\n\ninterface BtwMenuState {\n kind: \"valid\" | \"invalid\";\n settings: BtwSettings;\n reason?: string;\n}\n\nexport interface BtwResumeThreadSummary {\n id: string;\n title: string;\n questionCount: number;\n}\n\nexport interface ShowBtwCommandMenuOptions {\n currentThinkingLevel: BtwThinkingLevel;\n /** Deterministic test override; production derives levels from each selected model. */\n availableThinkingLevels?: readonly BtwThinkingLevel[];\n availableModels?: readonly Model<Api>[];\n currentModel?: Model<Api>;\n scopedModels?: ExtensionCommandContext[\"scopedModels\"];\n resumeThreads?: readonly BtwResumeThreadSummary[];\n settingsPath?: string;\n readSettings?: typeof readBtwSettings;\n updateSettings?: (patch: BtwSettingsPatch, options: UpdateBtwSettingsOptions) => Promise<BtwSettings>;\n}\n\nexport type BtwCommandMenuResult = \"start\" | \"tree\" | \"closed\" | { kind: \"resume\"; threadId: string };\n\ntype BtwMenuScreen = \"main\" | \"resume\" | \"settings\" | \"model\" | \"invalid\" | \"shortcut\" | \"shortcut-input\";\ntype BtwMenuAction =\n | \"start\"\n | \"start-tree\"\n | \"resume\"\n | \"open-model\"\n | \"set-model\"\n | \"set-thinking\"\n | \"set-remember\"\n | \"set-fullscreen-copy\"\n | \"edit-shortcut\"\n | \"save-shortcut\"\n | \"reset-shortcut\";\nconst SAME_AS_MAIN_THREAD = \"Same as main thread\";\ntype BtwCustomOptions = Parameters<ExtensionCommandContext[\"ui\"][\"custom\"]>[1];\n\ntype BtwCustomFactory<T> = (\n tui: TUI,\n theme: Theme,\n keybindings: KeybindingsManager,\n done: (result: T) => void,\n) => Component;\n\nexport async function showBtwCommandMenu(\n ctx: ExtensionCommandContext,\n options: ShowBtwCommandMenuOptions,\n): Promise<BtwCommandMenuResult> {\n if (ctx.mode !== \"tui\") return \"closed\";\n const { defineMenu, runMenu, sanitizeTerminalText } = await import(\"@narumitw/pi-tui-kit\");\n if (ctx.signal?.aborted) return \"closed\";\n const settingsPath = options.settingsPath ?? btwSettingsPath();\n const readSettings = options.readSettings ?? readBtwSettings;\n const updateSettings = options.updateSettings ?? updateBtwSettings;\n const getAvailable = ctx.modelRegistry.getAvailable;\n const allAvailableModels = deduplicateModels(\n options.availableModels ??\n (typeof getAvailable === \"function\" ? getAvailable.call(ctx.modelRegistry) : ctx.modelRegistry.getAll()),\n );\n const currentModel = options.currentModel ?? ctx.model;\n const scopedModels = options.scopedModels ?? ctx.scopedModels ?? [];\n const selectableModels = availableModelsInScope(allAvailableModels, scopedModels);\n const modelItemIds = new Map(selectableModels.map((model, index) => [model, `btw-settings-model:${index}`]));\n const modelsByItemId = new Map(selectableModels.map((model) => [modelItemIds.get(model) as string, model]));\n const safeModelMetadata = (value: string, fallback: string): string => {\n const safe = sanitizeTerminalText(value).trim() || fallback;\n return [...safe].slice(0, 512).join(\"\");\n };\n const displayModelReference = (model: Pick<Model<Api>, \"provider\" | \"id\">): string =>\n `${safeModelMetadata(model.id, \"unknown model\")} [${safeModelMetadata(model.provider, \"unknown provider\")}]`;\n const rawModelReference = (model: Pick<Model<Api>, \"provider\" | \"id\">): string | undefined => {\n const reference = `${model.provider}/${model.id}`;\n const parsed = parseBtwModelReference(reference);\n return parsed?.provider === model.provider && parsed.modelId === model.id ? reference : undefined;\n };\n const displaySettingsPath = sanitizeSingleLine(settingsPath);\n const resumeThreads = options.resumeThreads ?? [];\n let startSelected = false;\n let treeSelected = false;\n let resumedThreadId: string | undefined;\n let keybindings: KeybindingsManager | undefined;\n let shortcut: BtwShortcutAction = \"exit\";\n const shortcutLabels: Record<BtwShortcutAction, string> = {\n exit: \"Exit shortcut\",\n cycleThinkingLevel: \"Cycle thinking level shortcut\",\n bringToMain: \"Bring to main shortcut\",\n };\n const shortcutValue = (settings: BtwSettings, action: BtwShortcutAction): string => {\n if (!keybindings) return \"Default\";\n const effective = resolveBtwShortcuts(settings.keybindings, keybindings, effectiveFullscreenCopyOnSelect(settings));\n const configured = settings.keybindings?.[action];\n if (configured !== undefined && !effective.keys[action].includes(configured)) {\n return `Fallback (${effective.label(action)}; saved ${formatKeyLabel(configured)})`;\n }\n const source = configured === undefined ? (action === \"cycleThinkingLevel\" ? \"Inherit Pi\" : \"Default\") : \"Custom\";\n return `${source} (${effective.label(action)})`;\n };\n const saveShortcut = async (state: BtwMenuState, value: string | undefined, signal: AbortSignal) => {\n if (!keybindings || state.kind !== \"valid\" || signal.aborted) return { kind: \"rejected\" } as const;\n const action = shortcut;\n const manager = keybindings;\n const validate = (settings: BtwSettings) =>\n validateBtwShortcutEdit(\n action,\n value,\n settings.keybindings ?? {},\n manager,\n effectiveFullscreenCopyOnSelect(settings),\n );\n const error = validate(state.settings);\n if (error) {\n notifySafely(ctx, error, \"error\");\n return { kind: \"rejected\" } as const;\n }\n try {\n await updateSettings(\n { keybindings: { [action]: value === undefined ? undefined : normalizeBtwKey(value) } },\n {\n settingsPath,\n signal,\n validateCurrent: (settings) => {\n const conflict = validate(settings);\n if (conflict) throw new Error(conflict);\n },\n },\n );\n if (signal.aborted) return { kind: \"rejected\" } as const;\n notifySafely(ctx, \"Pi BTW shortcut saved; applies when opening or resuming BTW.\", \"info\");\n return { kind: \"back\" } as const;\n } catch (error) {\n if (!signal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" } as const;\n }\n };\n\n const saveModel = async (\n model: Model<Api> | undefined,\n signal: AbortSignal,\n ): Promise<{ kind: \"saved\" } | { kind: \"cancelled\" } | { kind: \"failed\"; error: unknown }> => {\n const modelReference = model ? rawModelReference(model) : undefined;\n if (model && !modelReference) return { kind: \"cancelled\" };\n const result = await ctx.ui.custom<{ kind: \"saved\" } | { kind: \"cancelled\" } | { kind: \"failed\"; error: unknown }>(\n (tui, theme, _keybindings, done) => {\n const loader = new BorderedLoader(tui, theme, \"Saving Pi BTW model...\");\n const ownerController = new AbortController();\n const saveSignal = AbortSignal.any([signal, loader.signal, ownerController.signal]);\n let settled = false;\n const finish = (value: { kind: \"saved\" } | { kind: \"cancelled\" } | { kind: \"failed\"; error: unknown }) => {\n if (settled) return;\n settled = true;\n done(value);\n };\n const cancel = () => finish({ kind: \"cancelled\" });\n loader.onAbort = cancel;\n saveSignal.addEventListener(\"abort\", cancel, { once: true });\n queueMicrotask(() => {\n void (async () => {\n // Let the host mount the loader before a synchronous test double or cached write can settle it.\n await Promise.resolve();\n if (saveSignal.aborted) return;\n try {\n await updateSettings({ model: modelReference }, { settingsPath, signal: saveSignal });\n finish({ kind: \"saved\" });\n } catch (error) {\n finish(saveSignal.aborted ? { kind: \"cancelled\" } : { kind: \"failed\", error });\n }\n })();\n });\n return {\n render: (width: number) => loader.render(width),\n invalidate: () => loader.invalidate(),\n handleInput: (data: string) => loader.handleInput(data),\n dispose() {\n ownerController.abort(new DOMException(\"Pi BTW model save disposed\", \"AbortError\"));\n loader.dispose();\n },\n };\n },\n );\n return result ?? { kind: \"cancelled\" };\n };\n\n const loadState = async (): Promise<BtwMenuState> => {\n const loaded = await readSettings(settingsPath);\n if (loaded.kind === \"invalid\") {\n return { kind: \"invalid\", settings: {}, reason: loaded.reason };\n }\n return { kind: \"valid\", settings: loaded.kind === \"loaded\" ? loaded.settings : {} };\n };\n const configuredModel = (settings: BtwSettings): Model<Api> | undefined => {\n if (!settings.model) return undefined;\n const reference = parseBtwModelReference(settings.model);\n return reference\n ? allAvailableModels.find((model) => model.provider === reference.provider && model.id === reference.modelId)\n : undefined;\n };\n const selectableConfiguredModel = (settings: BtwSettings): Model<Api> | undefined => {\n const configured = configuredModel(settings);\n return configured ? selectableModels.find((model) => sameModel(model, configured)) : undefined;\n };\n const thinkingLevels = (settings: BtwSettings): BtwThinkingLevel[] => {\n const overridden = options.availableThinkingLevels;\n const effectiveModel = configuredModel(settings) ?? currentModel;\n const available =\n overridden && overridden.length > 0\n ? overridden\n : effectiveModel\n ? getSupportedThinkingLevels(effectiveModel)\n : BTW_THINKING_LEVELS;\n return available.length > 0 ? [...available] : [\"off\"];\n };\n const currentMainThinkingLevel = (settings: BtwSettings): BtwThinkingLevel =>\n clampToAvailableThinkingLevel(options.currentThinkingLevel, thinkingLevels(settings));\n const displayThinkingLevel = (settings: BtwSettings): string =>\n settings.thinkingLevel === undefined\n ? SAME_AS_MAIN_THREAD\n : clampToAvailableThinkingLevel(settings.thinkingLevel, thinkingLevels(settings));\n const displayThinkingSummary = (settings: BtwSettings): string =>\n settings.thinkingLevel === undefined\n ? `${SAME_AS_MAIN_THREAD} (currently ${currentMainThinkingLevel(settings)})`\n : displayThinkingLevel(settings);\n const displayRememberSummary = (settings: BtwSettings): string => {\n const value = effectiveRememberThinkingLevelChanges(settings) ? \"On\" : \"Off\";\n return settings.thinkingLevel === undefined ? `${value} (fixed levels only)` : value;\n };\n const displayModelValue = (settings: BtwSettings): string => {\n if (!settings.model) {\n return currentModel ? `${SAME_AS_MAIN_THREAD} (${displayModelReference(currentModel)})` : SAME_AS_MAIN_THREAD;\n }\n const available = configuredModel(settings);\n if (!available) return `${SAME_AS_MAIN_THREAD} \u00B7 ${safeModelMetadata(settings.model, \"unknown model\")} unavailable`;\n const reference = displayModelReference(available);\n return selectableConfiguredModel(settings) ? reference : `${reference} \u00B7 outside current scope`;\n };\n const modelItems = (settings: BtwSettings) => {\n const configured = configuredModel(settings);\n const selectable = selectableConfiguredModel(settings);\n const retained = settings.model && !selectable;\n return [\n {\n id: \"same-as-main\",\n label: SAME_AS_MAIN_THREAD,\n description: currentModel\n ? `Currently ${displayModelReference(currentModel)}`\n : \"Use the main thread model when /btw starts.\",\n },\n ...selectableModels.map((model) => {\n const reference = displayModelReference(model);\n const name = safeModelMetadata(model.name ?? \"\", \"\");\n const validReference = rawModelReference(model);\n return {\n id: modelItemIds.get(model) as string,\n label: reference,\n ...(name ? { details: [`Model Name: ${name}`] } : {}),\n searchText: [reference, name].filter(Boolean).join(\" \"),\n ...(!validReference\n ? {\n disabled: true,\n disabledReason: \"This model identity cannot be stored in pi-btw.json.\",\n }\n : {}),\n };\n }),\n ...(retained\n ? [\n {\n id: \"configured-model\",\n label: configured\n ? displayModelReference(configured)\n : safeModelMetadata(settings.model as string, \"unknown model\"),\n ...(configured\n ? { description: \"Configured outside the current model scope; retained until changed.\" }\n : {\n disabled: true,\n disabledReason: \"Configured model is unavailable; /btw falls back to the main model.\",\n }),\n },\n ]\n : []),\n ];\n };\n const selectedModelItemId = (settings: BtwSettings): string => {\n const selected = selectableConfiguredModel(settings);\n return selected ? (modelItemIds.get(selected) as string) : settings.model ? \"configured-model\" : \"same-as-main\";\n };\n const currentModelItemId = (settings: BtwSettings): string =>\n settings.model && configuredModel(settings) ? selectedModelItemId(settings) : \"same-as-main\";\n\n const menu = defineMenu<BtwMenuState, BtwMenuScreen, BtwMenuAction, MenuContext>({\n start: \"main\",\n screens: {\n main: ({ state }) => ({\n kind: \"actions\",\n title: \"Pi BTW\",\n lines: [\n `Model: ${displayModelValue(state.settings)}`,\n `Thinking: ${displayThinkingSummary(state.settings)} \u00B7 Remember changes: ${displayRememberSummary(state.settings)}`,\n `Copy on select: ${effectiveFullscreenCopyOnSelect(state.settings) ? \"On\" : \"Off\"}`,\n ],\n items: [\n {\n id: \"start\",\n label: \"Start side thread\",\n description: \"Open an empty side thread\",\n action: \"start\",\n },\n {\n id: \"start-tree\",\n label: \"Start from main thread tree\u2026\",\n description: \"Choose context without switching the main branch\",\n action: \"start-tree\",\n },\n ...(resumeThreads.length > 0\n ? [\n {\n id: \"resume\" as const,\n label: \"Resume side thread\",\n description: \"Continue an in-memory side thread\",\n to: \"resume\" as const,\n },\n ]\n : []),\n {\n id: \"settings\",\n label: \"Settings\",\n description: \"Choose model, thinking, keybindings, and selection copying\",\n to: state.kind === \"invalid\" ? \"invalid\" : \"settings\",\n },\n ],\n hint: \"close\",\n }),\n resume: () => ({\n kind: \"choice\",\n title: \"Resume BTW side thread\",\n enableSearch: true,\n items: resumeThreads.map((thread) => ({\n id: thread.id,\n label: thread.title,\n description: `${thread.questionCount} ${thread.questionCount === 1 ? \"question\" : \"questions\"}`,\n })),\n action: \"resume\",\n viewportSize: 10,\n hint: \"back\",\n }),\n settings: ({ state }) => ({\n kind: \"settings\",\n title: \"Pi BTW Settings\",\n lines: [`User settings \u00B7 ${displaySettingsPath}`],\n items: [\n {\n id: \"model\",\n label: \"Model\",\n description: \"Choose the model for future pi-btw side threads without changing the main session.\",\n currentValue: displayModelValue(state.settings),\n action: \"open-model\",\n },\n {\n id: \"thinkingLevel\",\n label: \"Thinking level\",\n description: `Set the starting level for future pi-btw side threads. Currently ${currentMainThinkingLevel(state.settings)}.`,\n currentValue: displayThinkingLevel(state.settings),\n values: [SAME_AS_MAIN_THREAD, ...thinkingLevels(state.settings)],\n action: \"set-thinking\",\n },\n {\n id: \"rememberThinkingLevelChanges\",\n label: \"Remember thinking level changes\",\n description: \"Save shortcut changes for fixed thinking levels to pi-btw.json.\",\n currentValue: effectiveRememberThinkingLevelChanges(state.settings) ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"set-remember\",\n },\n {\n id: \"fullscreenCopyOnSelect\",\n label: \"Copy selection automatically\",\n description: \"Copy mouse selections immediately instead of with the configured copy key.\",\n currentValue: effectiveFullscreenCopyOnSelect(state.settings) ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"set-fullscreen-copy\",\n },\n ...BTW_SHORTCUT_ACTIONS.map((action) => ({\n id: action,\n label: shortcutLabels[action],\n description: \"Edit a BTW-only key combination or restore its default. Ctrl+C always hard-cancels.\",\n currentValue: shortcutValue(state.settings, action),\n action: \"edit-shortcut\" as const,\n })),\n ],\n }),\n model: ({ state }) => ({\n kind: \"choice\",\n title: \"Pi BTW Model\",\n lines: [\n \"Same as main thread is the default and fallback when a configured model is unavailable.\",\n ...(state.settings.model && !selectableConfiguredModel(state.settings)\n ? [`Configured: ${displayModelValue(state.settings)}`]\n : []),\n ],\n items: modelItems(state.settings),\n action: \"set-model\",\n currentItemId: currentModelItemId(state.settings),\n initialItemId: selectedModelItemId(state.settings),\n enableSearch: true,\n viewportSize: 10,\n hint: \"back\",\n }),\n shortcut: ({ state }) => ({\n kind: \"actions\",\n title: shortcutLabels[shortcut],\n lines: [shortcutValue(state.settings, shortcut), \"Ctrl+C always hard-cancels BTW.\"],\n items: [\n { id: \"edit\", label: \"Edit key combination\u2026\", to: \"shortcut-input\" },\n { id: \"reset\", label: \"Restore default\", action: \"reset-shortcut\" },\n ],\n hint: \"back\",\n }),\n \"shortcut-input\": () => ({\n kind: \"input\",\n title: shortcutLabels[shortcut],\n lines: [\"Type a key name, not the shortcut itself. For example: ctrl+q or f6.\"],\n placeholder: \"Key combination\",\n action: \"save-shortcut\",\n hint: \"back\",\n }),\n invalid: ({ state }) => ({\n kind: \"detail\",\n title: \"Pi BTW Settings \u00B7 Read only\",\n lines: [\n `Invalid settings file. Fix ${displaySettingsPath} before saving.`,\n sanitizeSingleLine(state.reason ?? \"The settings file is invalid.\"),\n ],\n hint: \"back\",\n }),\n },\n actions: {\n \"edit-shortcut\": ({ itemId }) => {\n if (!BTW_SHORTCUT_ACTIONS.includes(itemId as BtwShortcutAction)) return { kind: \"rejected\" };\n shortcut = itemId as BtwShortcutAction;\n return { kind: \"to\", screen: \"shortcut\" };\n },\n \"save-shortcut\": ({ state, value, signal }) => saveShortcut(state, value?.trim() ?? \"\", signal),\n \"reset-shortcut\": ({ state, signal }) => saveShortcut(state, undefined, signal),\n \"open-model\": async () => ({ kind: \"to\", screen: \"model\" }),\n \"set-model\": async ({ state, itemId, signal }) => {\n if (itemId === \"configured-model\" && configuredModel(state.settings)) {\n return { kind: \"back\" };\n }\n const model = itemId ? modelsByItemId.get(itemId) : undefined;\n if (itemId !== \"same-as-main\" && (!model || !rawModelReference(model))) return { kind: \"rejected\" };\n const result = await saveModel(model, signal);\n if (result.kind === \"failed\") {\n notifySaveFailure(ctx, result.error);\n return { kind: \"rejected\" };\n }\n if (result.kind === \"cancelled\" || signal.aborted) return { kind: \"close\" };\n notifySafely(\n ctx,\n model ? `Pi BTW model: ${displayModelReference(model)}.` : `Pi BTW model: ${SAME_AS_MAIN_THREAD}.`,\n \"info\",\n );\n return { kind: \"back\" };\n },\n start: async () => {\n startSelected = true;\n return { kind: \"close\" };\n },\n \"start-tree\": async () => {\n treeSelected = true;\n return { kind: \"close\" };\n },\n resume: async ({ itemId }: { itemId: string }) => {\n if (!resumeThreads.some((thread) => thread.id === itemId)) {\n return { kind: \"rejected\" } as const;\n }\n resumedThreadId = itemId;\n return { kind: \"close\" } as const;\n },\n \"set-thinking\": async ({ state, value, signal }) => {\n if (!value) return { kind: \"rejected\" };\n const levels = thinkingLevels(state.settings);\n const patch =\n value === SAME_AS_MAIN_THREAD\n ? ({ thinkingLevel: undefined } satisfies BtwSettingsPatch)\n : levels.includes(value as BtwThinkingLevel)\n ? ({ thinkingLevel: value as BtwThinkingLevel } satisfies BtwSettingsPatch)\n : undefined;\n if (!patch) return { kind: \"rejected\" };\n try {\n await updateSettings(patch, { settingsPath, signal });\n if (signal.aborted) return { kind: \"rejected\" };\n notifySafely(ctx, `Pi BTW thinking level: ${value}.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!signal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"set-remember\": async ({ value, signal }) => {\n if (value !== \"On\" && value !== \"Off\") return { kind: \"rejected\" };\n try {\n await updateSettings({ rememberThinkingLevelChanges: value === \"On\" }, { settingsPath, signal });\n if (signal.aborted) return { kind: \"rejected\" };\n notifySafely(ctx, `Remember thinking level changes: ${value}.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!signal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"set-fullscreen-copy\": async ({ value, signal }) => {\n if (value !== \"On\" && value !== \"Off\") return { kind: \"rejected\" };\n try {\n await updateSettings({ fullscreenCopyOnSelect: value === \"On\" }, { settingsPath, signal });\n if (signal.aborted) return { kind: \"rejected\" };\n notifySafely(ctx, `Copy selection automatically: ${value}.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!signal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n },\n });\n\n const result = await runBtwMenuPreservingEditor(\n ctx,\n (menuContext) => runMenu(menuContext, menu, { getState: loadState }),\n (manager) => {\n keybindings = manager;\n },\n );\n if (result.kind !== \"closed\" || result.reason !== \"close\") return \"closed\";\n if (resumedThreadId) return { kind: \"resume\", threadId: resumedThreadId };\n if (treeSelected) return \"tree\";\n return startSelected ? \"start\" : \"closed\";\n}\n\nexport async function showBtwCustomPreservingEditor<T>(\n ctx: ExtensionCommandContext,\n factory: BtwCustomFactory<T>,\n): Promise<T | undefined> {\n let liveEditorText = ctx.ui.getEditorText();\n let completed = false;\n const result = await ctx.ui.custom<T>((tui, theme, keybindings, done) =>\n factory(tui, theme, keybindings, (value) => {\n try {\n liveEditorText = ctx.ui.getEditorText();\n } catch {\n // Keep completion finite if session replacement invalidates the editor context.\n }\n completed = true;\n done(value);\n }),\n );\n if (completed) {\n try {\n if (ctx.ui.getEditorText() !== liveEditorText) ctx.ui.setEditorText(liveEditorText);\n } catch {\n // A replaced context owns a different editor and must not receive stale restoration.\n }\n }\n return result;\n}\n\nexport async function runBtwMenuPreservingEditor(\n ctx: ExtensionCommandContext,\n run: (menuContext: MenuContext) => Promise<RunMenuResult>,\n onKeybindings?: (keybindings: KeybindingsManager) => void,\n): Promise<RunMenuResult> {\n let liveEditorText = ctx.ui.getEditorText();\n let completed = false;\n const ui = new Proxy(ctx.ui, {\n get(target, property) {\n if (property === \"custom\") {\n return <Value>(factory: BtwCustomFactory<Value>, customOptions?: BtwCustomOptions) =>\n target.custom<Value>((tui, theme, keybindings, done) => {\n onKeybindings?.(keybindings);\n return factory(tui, theme, keybindings, (value) => {\n try {\n liveEditorText = target.getEditorText();\n } catch {\n // Keep completion finite if session replacement invalidates the editor context.\n }\n completed = true;\n done(value);\n });\n }, customOptions);\n }\n const value = Reflect.get(target, property, target) as unknown;\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n const result = await run({ mode: ctx.mode, hasUI: ctx.hasUI, ui });\n if (result.kind !== \"stale\" && completed) {\n try {\n if (ctx.ui.getEditorText() !== liveEditorText) ctx.ui.setEditorText(liveEditorText);\n } catch {\n // A replaced context owns a different editor and must not receive stale restoration.\n }\n }\n return result;\n}\n\nfunction deduplicateModels(models: readonly Model<Api>[]): Model<Api>[] {\n return models.filter((model, index) => models.findIndex((candidate) => sameModel(candidate, model)) === index);\n}\n\nfunction availableModelsInScope(\n availableModels: readonly Model<Api>[],\n scopedModels: ExtensionCommandContext[\"scopedModels\"],\n): Model<Api>[] {\n if (scopedModels.length === 0) return [...availableModels];\n return deduplicateModels(\n scopedModels.flatMap((entry) => {\n const available = availableModels.find((model) => sameModel(model, entry.model));\n return available ? [available] : [];\n }),\n );\n}\n\nfunction sameModel(left: Pick<Model<Api>, \"provider\" | \"id\">, right: Pick<Model<Api>, \"provider\" | \"id\">): boolean {\n return left.provider === right.provider && left.id === right.id;\n}\n\nfunction clampToAvailableThinkingLevel(\n requested: BtwThinkingLevel,\n available: readonly BtwThinkingLevel[],\n): BtwThinkingLevel {\n if (available.includes(requested)) return requested;\n const requestedIndex = BTW_THINKING_LEVELS.indexOf(requested);\n for (let index = requestedIndex; index < BTW_THINKING_LEVELS.length; index += 1) {\n const candidate = BTW_THINKING_LEVELS[index];\n if (candidate && available.includes(candidate)) return candidate;\n }\n for (let index = requestedIndex - 1; index >= 0; index -= 1) {\n const candidate = BTW_THINKING_LEVELS[index];\n if (candidate && available.includes(candidate)) return candidate;\n }\n return available[0] ?? \"off\";\n}\n\nfunction notifySaveFailure(ctx: ExtensionCommandContext, error: unknown): void {\n notifySafely(\n ctx,\n `Pi BTW settings were not saved; the previous value remains active: ${formatError(error)}`,\n \"error\",\n );\n}\n\nfunction notifySafely(\n ctx: ExtensionCommandContext,\n message: string,\n level: Parameters<ExtensionCommandContext[\"ui\"][\"notify\"]>[1],\n): void {\n try {\n ctx.ui.notify(sanitizeSingleLine(message), level);\n } catch {\n // A completed save remains valid if its command context was replaced before notification.\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport { BTW_SHORTCUT_ACTIONS, type BtwKeybindingOverrides, normalizeBtwKey } from \"./keybindings.js\";\nimport { BTW_THINKING_LEVELS, type BtwThinkingLevel } from \"./side-thread.js\";\n\nexport const BTW_SETTINGS_FILE = \"pi-btw.json\";\nexport const DEFAULT_FULLSCREEN_COPY_ON_SELECT = true;\nexport const DEFAULT_REMEMBER_THINKING_LEVEL_CHANGES = true;\nconst MAX_SETTINGS_BYTES = 64 * 1024;\n\nexport interface BtwSettings {\n keybindings?: BtwKeybindingOverrides;\n model?: string;\n thinkingLevel?: BtwThinkingLevel;\n rememberThinkingLevelChanges?: boolean;\n fullscreenCopyOnSelect?: boolean;\n}\n\nexport type BtwSettingsLoadResult =\n | { kind: \"missing\" }\n | { kind: \"invalid\"; reason: string }\n | { kind: \"loaded\"; settings: BtwSettings };\n\nexport interface BtwSettingsPatch {\n keybindings?: BtwKeybindingOverrides;\n model?: string;\n thinkingLevel?: BtwThinkingLevel;\n rememberThinkingLevelChanges?: boolean;\n fullscreenCopyOnSelect?: boolean;\n}\n\nexport interface UpdateBtwSettingsOptions {\n /** Validate against the latest document inside the mutation queue, before applying the patch. */\n validateCurrent?: (settings: BtwSettings) => void;\n settingsPath?: string;\n signal?: AbortSignal;\n beforeRename?: (temporaryPath: string, settingsPath: string) => Promise<void>;\n}\n\ntype SettingsDocument = Record<string, unknown>;\n\nconst mutationQueues = new Map<string, Promise<void>>();\n\nexport function btwSettingsPath(): string {\n return join(getAgentDir(), BTW_SETTINGS_FILE);\n}\n\nexport function normalizeBtwSettings(value: unknown): BtwSettings | undefined {\n if (!isSettingsDocument(value)) return undefined;\n\n const settings: BtwSettings = {};\n if (Object.hasOwn(value, \"keybindings\")) {\n const keys = value.keybindings;\n if (!isSettingsDocument(keys)) return undefined;\n settings.keybindings = {};\n for (const action of BTW_SHORTCUT_ACTIONS) {\n if (!Object.hasOwn(keys, action)) continue;\n const key = normalizeBtwKey(keys[action]);\n if (!key) return undefined;\n settings.keybindings[action] = key;\n }\n }\n if (Object.hasOwn(value, \"model\")) {\n const model = Reflect.get(value, \"model\");\n if (typeof model !== \"string\" || !parseBtwModelReference(model)) return undefined;\n settings.model = model;\n }\n if (Object.hasOwn(value, \"thinkingLevel\")) {\n const thinkingLevel = Reflect.get(value, \"thinkingLevel\");\n if (!isBtwThinkingLevel(thinkingLevel)) return undefined;\n settings.thinkingLevel = thinkingLevel;\n }\n if (Object.hasOwn(value, \"rememberThinkingLevelChanges\")) {\n const remember = Reflect.get(value, \"rememberThinkingLevelChanges\");\n if (typeof remember !== \"boolean\") return undefined;\n settings.rememberThinkingLevelChanges = remember;\n }\n if (Object.hasOwn(value, \"fullscreenCopyOnSelect\")) {\n const copyOnSelect = Reflect.get(value, \"fullscreenCopyOnSelect\");\n if (typeof copyOnSelect !== \"boolean\") return undefined;\n settings.fullscreenCopyOnSelect = copyOnSelect;\n }\n return settings;\n}\n\nexport function parseBtwModelReference(reference: string): { provider: string; modelId: string } | undefined {\n if (/[\\s\\p{Cc}]/u.test(reference)) return undefined;\n const separator = reference.indexOf(\"/\");\n if (separator <= 0 || separator === reference.length - 1) return undefined;\n return { provider: reference.slice(0, separator), modelId: reference.slice(separator + 1) };\n}\n\nexport function effectiveFullscreenCopyOnSelect(settings: BtwSettings): boolean {\n return settings.fullscreenCopyOnSelect ?? DEFAULT_FULLSCREEN_COPY_ON_SELECT;\n}\n\nexport function effectiveRememberThinkingLevelChanges(settings: BtwSettings): boolean {\n return settings.rememberThinkingLevelChanges ?? DEFAULT_REMEMBER_THINKING_LEVEL_CHANGES;\n}\n\nexport async function readBtwSettings(settingsPath = btwSettingsPath()): Promise<BtwSettingsLoadResult> {\n await awaitBtwSettingsWrites(settingsPath);\n return readBtwSettingsUncoordinated(settingsPath);\n}\n\nexport function updateBtwSettings(\n patch: BtwSettingsPatch,\n options: UpdateBtwSettingsOptions = {},\n): Promise<BtwSettings> {\n const settingsPath = options.settingsPath ?? btwSettingsPath();\n return enqueueMutation(settingsPath, async () => {\n options.signal?.throwIfAborted();\n const current = await readSettingsDocumentForUpdate(settingsPath);\n options.signal?.throwIfAborted();\n options.validateCurrent?.(normalizeBtwSettings(current) ?? {});\n const updated = applyBtwSettingsPatch(current, patch);\n const settings = normalizeBtwSettings(updated);\n if (!settings) throw invalidSettingsError(settingsPath, \"invalid settings shape\");\n await publishSettings(settingsPath, updated, options.signal, options.beforeRename);\n return settings;\n });\n}\n\nexport async function awaitBtwSettingsWrites(settingsPath = btwSettingsPath()): Promise<void> {\n await mutationQueues.get(settingsPath);\n}\n\nfunction enqueueMutation<T>(settingsPath: string, mutation: () => Promise<T>): Promise<T> {\n const previous = mutationQueues.get(settingsPath) ?? Promise.resolve();\n const result = previous.then(mutation, mutation);\n const settled = result.then(\n () => undefined,\n () => undefined,\n );\n mutationQueues.set(settingsPath, settled);\n void settled.finally(() => {\n if (mutationQueues.get(settingsPath) === settled) mutationQueues.delete(settingsPath);\n });\n return result;\n}\n\nasync function readBtwSettingsUncoordinated(settingsPath: string): Promise<BtwSettingsLoadResult> {\n let contents: string;\n try {\n contents = await readSettingsContents(settingsPath);\n } catch (error: unknown) {\n if (isNodeError(error) && error.code === \"ENOENT\") return { kind: \"missing\" };\n return { kind: \"invalid\", reason: `${settingsPath}: ${formatError(error)}` };\n }\n\n try {\n const settings = normalizeBtwSettings(JSON.parse(contents) as unknown);\n return settings\n ? { kind: \"loaded\", settings }\n : { kind: \"invalid\", reason: `${settingsPath}: invalid settings shape` };\n } catch {\n return { kind: \"invalid\", reason: `${settingsPath}: invalid JSON` };\n }\n}\n\nasync function readSettingsDocumentForUpdate(settingsPath: string): Promise<SettingsDocument> {\n let contents: string;\n try {\n contents = await readSettingsContents(settingsPath);\n } catch (error: unknown) {\n if (isNodeError(error) && error.code === \"ENOENT\") return {};\n throw invalidSettingsError(settingsPath, formatError(error));\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents) as unknown;\n } catch {\n throw invalidSettingsError(settingsPath, \"invalid JSON\");\n }\n if (!isSettingsDocument(parsed) || !normalizeBtwSettings(parsed)) {\n throw invalidSettingsError(settingsPath, \"invalid settings shape\");\n }\n return parsed;\n}\n\nasync function readSettingsContents(settingsPath: string): Promise<string> {\n const flags = constants.O_RDONLY | (constants.O_NONBLOCK ?? 0);\n const handle = await open(settingsPath, flags);\n try {\n const descriptorStats = await handle.stat();\n if (!descriptorStats.isFile()) throw new Error(\"settings path is not a regular file\");\n if (descriptorStats.size > MAX_SETTINGS_BYTES) {\n throw new Error(`settings file exceeds ${MAX_SETTINGS_BYTES} bytes`);\n }\n\n const buffer = Buffer.alloc(MAX_SETTINGS_BYTES + 1);\n let offset = 0;\n while (offset < buffer.byteLength) {\n const { bytesRead } = await handle.read(buffer, offset, buffer.byteLength - offset, offset);\n if (bytesRead === 0) break;\n offset += bytesRead;\n }\n if (offset > MAX_SETTINGS_BYTES) {\n throw new Error(`settings file exceeds ${MAX_SETTINGS_BYTES} bytes`);\n }\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(buffer.subarray(0, offset));\n } catch {\n throw new Error(\"settings file is not valid UTF-8\");\n }\n } finally {\n await handle.close();\n }\n}\n\nasync function publishSettings(\n settingsPath: string,\n document: SettingsDocument,\n signal?: AbortSignal,\n beforeRename?: (temporaryPath: string, settingsPath: string) => Promise<void>,\n): Promise<void> {\n signal?.throwIfAborted();\n const contents = `${JSON.stringify(document, null, 2)}\\n`;\n if (Buffer.byteLength(contents, \"utf8\") > MAX_SETTINGS_BYTES) {\n throw new Error(`settings document exceeds ${MAX_SETTINGS_BYTES} bytes`);\n }\n const directory = dirname(settingsPath);\n await mkdir(directory, { recursive: true });\n signal?.throwIfAborted();\n const temporaryPath = join(directory, `.${basename(settingsPath)}.${process.pid}.${randomUUID()}.tmp`);\n try {\n await writeFile(temporaryPath, contents, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n signal,\n });\n await beforeRename?.(temporaryPath, settingsPath);\n signal?.throwIfAborted();\n await rename(temporaryPath, settingsPath);\n } catch (error) {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nfunction applyBtwSettingsPatch(current: SettingsDocument, patch: BtwSettingsPatch): SettingsDocument {\n const updated: SettingsDocument = { ...current };\n if (patch.keybindings) {\n const keys = isSettingsDocument(current.keybindings) ? { ...current.keybindings } : {};\n for (const action of BTW_SHORTCUT_ACTIONS) {\n if (!Object.hasOwn(patch.keybindings, action)) continue;\n if (patch.keybindings[action] === undefined) delete keys[action];\n else keys[action] = patch.keybindings[action];\n }\n if (Object.keys(keys).length) updated.keybindings = keys;\n else delete updated.keybindings;\n }\n if (Object.hasOwn(patch, \"model\")) {\n if (patch.model === undefined) delete updated.model;\n else updated.model = patch.model;\n }\n if (Object.hasOwn(patch, \"thinkingLevel\")) {\n if (patch.thinkingLevel === undefined) delete updated.thinkingLevel;\n else updated.thinkingLevel = patch.thinkingLevel;\n }\n if (Object.hasOwn(patch, \"rememberThinkingLevelChanges\")) {\n updated.rememberThinkingLevelChanges = patch.rememberThinkingLevelChanges;\n }\n if (Object.hasOwn(patch, \"fullscreenCopyOnSelect\")) {\n if (patch.fullscreenCopyOnSelect === undefined) delete updated.fullscreenCopyOnSelect;\n else updated.fullscreenCopyOnSelect = patch.fullscreenCopyOnSelect;\n }\n return updated;\n}\n\nfunction isSettingsDocument(value: unknown): value is SettingsDocument {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isBtwThinkingLevel(value: unknown): value is BtwThinkingLevel {\n return BTW_THINKING_LEVELS.includes(value as BtwThinkingLevel);\n}\n\nfunction invalidSettingsError(settingsPath: string, reason: string): Error {\n return new Error(`pi-btw settings at ${settingsPath} are invalid: ${reason}`);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import type {\n Api,\n AssistantMessage,\n Context,\n Message,\n Model,\n ProviderHeaders,\n SimpleStreamOptions,\n UserMessage,\n} from \"@earendil-works/pi-ai\";\n\nexport const BTW_THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\n\nexport type BtwThinkingLevel = (typeof BTW_THINKING_LEVELS)[number];\n\nexport interface SideQuestionAuth {\n apiKey?: string;\n headers?: ProviderHeaders;\n env?: Record<string, string>;\n}\n\nexport type CompleteSimpleFunction = <TApi extends Api>(\n model: Model<TApi>,\n context: Context,\n options?: SimpleStreamOptions,\n) => Promise<AssistantMessage>;\n\nexport type SideThreadTurn =\n | {\n kind: \"answered\";\n question: string;\n answer: string;\n response: AssistantMessage;\n }\n | {\n kind: \"error\";\n question: string;\n answer: string;\n };\n\nexport interface SideThread {\n conversationContext: string;\n turns: SideThreadTurn[];\n}\n\nexport function createSideThread(conversationContext: string): SideThread {\n return { conversationContext, turns: [] };\n}\n\nexport function buildSideThreadMessages(thread: SideThread, question: string): Message[] {\n const answeredTurns = thread.turns.filter(\n (turn): turn is Extract<SideThreadTurn, { kind: \"answered\" }> => turn.kind === \"answered\",\n );\n const messages: Message[] = [];\n\n if (answeredTurns.length === 0) {\n messages.push(createUserMessage(buildUserPrompt(question, thread.conversationContext)));\n return messages;\n }\n\n const [first, ...rest] = answeredTurns;\n messages.push(createUserMessage(buildUserPrompt(first.question, thread.conversationContext)), first.response);\n for (const turn of rest) {\n messages.push(createUserMessage(buildFollowUpPrompt(turn.question)), turn.response);\n }\n messages.push(createUserMessage(buildFollowUpPrompt(question)));\n return messages;\n}\n\nexport interface CompleteSideThreadTurnOptions {\n thread: SideThread;\n model: Model<Api>;\n question: string;\n thinkingLevel: BtwThinkingLevel;\n auth: SideQuestionAuth;\n signal?: AbortSignal;\n completeSimple: CompleteSimpleFunction;\n sessionId?: string;\n}\n\nexport type CompleteSideThreadTurnResult =\n | { kind: \"answered\"; response: AssistantMessage; answer: string }\n | { kind: \"aborted\" }\n | { kind: \"error\"; message: string };\n\nexport async function completeSideThreadTurn({\n thread,\n model,\n question,\n thinkingLevel,\n auth,\n signal,\n completeSimple,\n sessionId,\n}: CompleteSideThreadTurnOptions): Promise<CompleteSideThreadTurnResult> {\n if (signal?.aborted) return { kind: \"aborted\" };\n try {\n const response = await completeSimple(\n model,\n { systemPrompt: SYSTEM_PROMPT, messages: buildSideThreadMessages(thread, question) },\n buildStreamOptions(auth, { thinkingLevel, signal, model, sessionId }),\n );\n if (signal?.aborted || response?.stopReason === \"aborted\") return { kind: \"aborted\" };\n if (!isAssistantMessage(response)) {\n return { kind: \"error\", message: \"The side model returned a malformed response.\" };\n }\n if (response.stopReason === \"error\") {\n return {\n kind: \"error\",\n message: response.errorMessage ?? \"The side model returned an error.\",\n };\n }\n\n const answer = extractAssistantText(response) || \"No response received.\";\n thread.turns.push({ kind: \"answered\", question, answer, response });\n return { kind: \"answered\", response, answer };\n } catch (error: unknown) {\n if (signal?.aborted) return { kind: \"aborted\" };\n return { kind: \"error\", message: formatError(error) };\n }\n}\n\nexport interface CompleteSideQuestionOptions {\n model: Model<Api>;\n question: string;\n conversationContext: string;\n thinkingLevel: BtwThinkingLevel;\n auth: SideQuestionAuth;\n signal?: AbortSignal;\n completeSimple: CompleteSimpleFunction;\n sessionId?: string;\n}\n\nexport async function completeSideQuestion({\n model,\n question,\n conversationContext,\n thinkingLevel,\n auth,\n signal,\n completeSimple,\n sessionId,\n}: CompleteSideQuestionOptions): Promise<AssistantMessage> {\n return completeSimple(\n model,\n {\n systemPrompt: SYSTEM_PROMPT,\n messages: [createUserMessage(buildUserPrompt(question, conversationContext))],\n },\n buildStreamOptions(auth, { thinkingLevel, signal, model, sessionId }),\n );\n}\n\nexport function extractAssistantText(response: AssistantMessage): string {\n return response.content\n .filter(\n (content): content is { type: \"text\"; text: string } =>\n content !== null && typeof content === \"object\" && content.type === \"text\" && typeof content.text === \"string\",\n )\n .map((content) => content.text)\n .join(\"\\n\")\n .trim();\n}\n\nfunction isAssistantMessage(value: unknown): value is AssistantMessage {\n if (value === null || typeof value !== \"object\") return false;\n const candidate = value as Partial<AssistantMessage>;\n return candidate.role === \"assistant\" && Array.isArray(candidate.content) && typeof candidate.stopReason === \"string\";\n}\n\nexport function buildUserPrompt(question: string, conversationContext: string): string {\n return [\n \"Answer this side question without modifying the main conversation.\",\n \"\",\n \"<side_question>\",\n question,\n \"</side_question>\",\n \"\",\n \"<conversation_context>\",\n conversationContext || \"No prior conversation context was available.\",\n \"</conversation_context>\",\n ].join(\"\\n\");\n}\n\nexport function buildFollowUpPrompt(question: string): string {\n return [\"Continue the same side conversation.\", \"\", \"<side_question>\", question, \"</side_question>\"].join(\"\\n\");\n}\n\nfunction createUserMessage(text: string): UserMessage {\n return {\n role: \"user\",\n content: [{ type: \"text\", text }],\n timestamp: Date.now(),\n };\n}\n\n// Minimal session-headers fork of Pi core provider-attribution\n// (pinned to @earendil-works/pi-coding-agent@0.85.0 src/core/provider-attribution.ts:getSessionHeaders).\n// Core does not export this helper and extensions have no SettingsManager, so only session\n// headers are mirrored here. Default attribution headers are intentionally out of scope.\n// Keep semantics bug-compatible with core: case-sensitive Object.assign, explicit auth\n// headers win on exact-case match.\nconst OPENCODE_HOST = \"opencode.ai\";\n\nfunction matchesOpencodeHost(baseUrl: string | undefined): boolean {\n if (!baseUrl) return false;\n try {\n return new URL(baseUrl).hostname === OPENCODE_HOST;\n } catch {\n return false;\n }\n}\n\nfunction getOpencodeSessionHeaders(\n model: Pick<Model<Api>, \"provider\" | \"baseUrl\">,\n sessionId?: string,\n): ProviderHeaders | undefined {\n if (!sessionId) return undefined;\n if (model.provider !== \"opencode\" && model.provider !== \"opencode-go\" && !matchesOpencodeHost(model.baseUrl)) {\n return undefined;\n }\n return { \"x-opencode-session\": sessionId, \"x-opencode-client\": \"pi\" };\n}\n\nfunction mergeSessionHeaders(\n authHeaders: ProviderHeaders | undefined,\n sessionHeaders: ProviderHeaders | undefined,\n): ProviderHeaders | undefined {\n if (!sessionHeaders && !authHeaders) return undefined;\n // Bug-compatible with core mergeProviderAttributionHeaders: case-sensitive assign.\n return { ...sessionHeaders, ...authHeaders };\n}\n\ninterface BuildSideThreadStreamOptions {\n thinkingLevel: BtwThinkingLevel;\n signal?: AbortSignal;\n model?: Pick<Model<Api>, \"provider\" | \"baseUrl\">;\n sessionId?: string;\n}\n\nfunction buildStreamOptions(\n auth: SideQuestionAuth,\n { thinkingLevel, signal, model, sessionId }: BuildSideThreadStreamOptions,\n): SimpleStreamOptions {\n const sessionHeaders = model ? getOpencodeSessionHeaders(model, sessionId) : undefined;\n const options: SimpleStreamOptions = {\n apiKey: auth.apiKey,\n headers: mergeSessionHeaders(auth.headers, sessionHeaders),\n env: auth.env,\n signal,\n };\n if (thinkingLevel !== \"off\") options.reasoning = thinkingLevel;\n return options;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nconst SYSTEM_PROMPT = `You answer quick side questions for a coding-agent user.\n\nUse the provided conversation context only as background. Answer the user's side question directly and concisely. Do not claim to have changed files, run tools, or affected the main task. If the context is insufficient, say what is unknown and give the best next step.`;\n", "import type { MarkdownTransformer, Theme } from \"@earendil-works/pi-coding-agent\";\nimport type { SideThreadTurn } from \"./side-thread.js\";\n\nexport type BtwMarkdownTransformers = (theme: Theme) => readonly MarkdownTransformer[];\n\ntype MermaidMarkdownModule = typeof import(\"@narumitw/pi-tui-kit/markdown\");\n\nconst MERMAID_MARKDOWN_MODULE = \"@narumitw/pi-tui-kit/markdown\";\nconst noMarkdownTransformers: BtwMarkdownTransformers = () => [];\n\nexport function prepareBtwTranscriptMarkdown(\n turns: readonly SideThreadTurn[],\n pendingQuestion?: string,\n): Promise<BtwMarkdownTransformers>;\nexport function prepareBtwTranscriptMarkdown(\n turns: readonly SideThreadTurn[],\n pendingQuestion: string | undefined,\n signal: AbortSignal,\n): Promise<BtwMarkdownTransformers | undefined>;\nexport async function prepareBtwTranscriptMarkdown(\n turns: readonly SideThreadTurn[],\n pendingQuestion?: string,\n signal?: AbortSignal,\n): Promise<BtwMarkdownTransformers | undefined> {\n const documents = turns.flatMap((turn) =>\n turn.kind === \"answered\" ? [turn.question, turn.answer] : [turn.question],\n );\n if (pendingQuestion) documents.push(pendingQuestion);\n if (!documents.some((document) => /mermaid/iu.test(document))) return noMarkdownTransformers;\n if (signal?.aborted) return undefined;\n\n const markdownModule = await settleUnlessAborted(\n import(MERMAID_MARKDOWN_MODULE) as Promise<MermaidMarkdownModule>,\n signal,\n );\n if (!markdownModule || signal?.aborted) return undefined;\n const { createMermaidMarkdownTransformer, prepareMermaidMarkdownRenderer } = markdownModule;\n const preparations = new Set<Promise<void>>();\n for (const document of documents) {\n const preparation = prepareMermaidMarkdownRenderer(document);\n if (preparation) preparations.add(preparation);\n }\n if (preparations.size > 0 && !(await settleUnlessAborted(Promise.all(preparations), signal))) return undefined;\n if (signal?.aborted) return undefined;\n\n return (theme) => {\n const transformer = createMermaidMarkdownTransformer(theme);\n return transformer ? [transformer] : [];\n };\n}\n\nasync function settleUnlessAborted<T>(operation: Promise<T>, signal?: AbortSignal): Promise<T | undefined> {\n if (!signal) return operation;\n let onAbort: (() => void) | undefined;\n const aborted = new Promise<undefined>((resolve) => {\n onAbort = () => resolve(undefined);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) onAbort();\n });\n try {\n return await Promise.race([operation, aborted]);\n } finally {\n if (onAbort) signal.removeEventListener(\"abort\", onAbort);\n }\n}\n", "import type { AssistantMessage } from \"@earendil-works/pi-ai\";\nimport {\n AssistantMessageComponent,\n getMarkdownTheme,\n type KeybindingsManager,\n type MarkdownTransformer,\n type Theme,\n UserMessageComponent,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n type Component,\n CURSOR_MARKER,\n Editor,\n type EditorTheme,\n type Focusable,\n Key,\n Loader,\n Markdown,\n matchesKey,\n ScrollView,\n type TUI,\n truncateToWidth,\n VStack,\n visibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { BtwFullscreenLayoutComponent } from \"./fullscreen-ui.js\";\nimport { BtwPasteGuard, type BtwShortcuts, getBtwShortcuts } from \"./keybindings.js\";\nimport type { BtwThinkingLevel, SideThreadTurn } from \"./side-thread.js\";\nimport { sanitizeSingleLine } from \"./text.js\";\n\nconst TRANSCRIPT_CHROME_LINES = 2;\nconst MAX_STEERING_DISPLAY_LINES = 3;\nconst OSC133_MARKERS = [\"\\u001b]133;A\\u0007\", \"\\u001b]133;B\\u0007\", \"\\u001b]133;C\\u0007\"];\n// Pi renders a spacer above the custom component and a two-line built-in footer below it.\nconst RESERVED_APP_LINES = 3;\n\n// A temporary fit after manual scrolling must not silently resume following new output.\nclass PreservingScrollView extends ScrollView {\n override updateLayout(contentHeight: number, viewportHeight: number, requestRender: () => void): void {\n const preserveManualPosition = !this.isFollowingEnd;\n super.updateLayout(contentHeight, viewportHeight, requestRender);\n if (preserveManualPosition && this.isFollowingEnd) {\n this.scrollTo(this.scrollTop, { disableFollow: true });\n }\n }\n}\n\nexport type TranscriptPagerAction =\n | { kind: \"submit\"; question: string }\n | { kind: \"bringToMain\"; questionDraft: string }\n | { kind: \"close\" };\n\nexport interface BtwThinkingControl {\n level: BtwThinkingLevel;\n levels: readonly BtwThinkingLevel[];\n keybindings: KeybindingsManager;\n onChange: (level: BtwThinkingLevel) => void;\n}\n\nexport interface BtwAnsweringViewOptions {\n markdownTransformers?: readonly MarkdownTransformer[];\n steering?: {\n questions: readonly string[];\n onSubmit: (question: string) => void;\n thinking?: BtwThinkingControl;\n };\n}\n\nexport class BtwTranscriptPager implements BtwFullscreenLayoutComponent, Focusable {\n private readonly shortcuts: BtwShortcuts;\n private readonly pasteGuard = new BtwPasteGuard();\n private readonly transcriptComponents: Component[];\n private readonly editor: Editor;\n private readonly canBringToMain: boolean;\n private readonly scrollView: ScrollView;\n private readonly layoutRoot: VStack;\n private lastContentLineCount = 0;\n private warning: string | undefined;\n private finished = false;\n private isFocused = false;\n private thinkingLevel: BtwThinkingLevel | undefined;\n\n constructor(\n private readonly tui: TUI,\n private readonly theme: Theme,\n turns: readonly SideThreadTurn[],\n private readonly onAction: (action: TranscriptPagerAction) => void,\n private readonly options: {\n startAtBottom?: boolean;\n initialQuestion?: string;\n markdownTransformers?: readonly MarkdownTransformer[];\n thinking?: BtwThinkingControl;\n } = {},\n ) {\n this.shortcuts = getBtwShortcuts(tui, options.thinking?.keybindings);\n this.transcriptComponents = buildTranscriptComponents(turns, this.theme, undefined, options.markdownTransformers);\n this.canBringToMain = turns.some((turn) => turn.kind === \"answered\");\n this.thinkingLevel = options.thinking?.level;\n const editorTheme: EditorTheme = {\n borderColor: (text) => this.theme.fg(\"accent\", text),\n selectList: {\n selectedPrefix: (text) => this.theme.fg(\"accent\", text),\n selectedText: (text) => this.theme.fg(\"accent\", text),\n description: (text) => this.theme.fg(\"muted\", text),\n scrollInfo: (text) => this.theme.fg(\"dim\", text),\n noMatch: (text) => this.theme.fg(\"warning\", text),\n },\n };\n this.editor = new Editor(this.tui, editorTheme);\n if (options.initialQuestion) this.editor.setText(options.initialQuestion);\n this.editor.onChange = () => {\n this.warning = undefined;\n };\n this.editor.onSubmit = (text) => {\n const question = text.trim();\n if (!question) {\n this.warning = \"Question cannot be empty\";\n return;\n }\n this.finished = true;\n this.onAction({ kind: \"submit\", question });\n };\n const transcript = this.createTranscriptComponent();\n this.scrollView = new PreservingScrollView(transcript, {\n follow: options.startAtBottom ? \"end\" : \"none\",\n primary: true,\n });\n this.layoutRoot = new VStack([\n { component: this.createHeaderComponent(), basis: 1, shrink: 0, minSize: 1 },\n { component: this.scrollView, basis: 0, grow: 1, minSize: 0 },\n { component: this.createFooterComponent(), basis: 1, shrink: 0, minSize: 1 },\n { component: this.editor, basis: \"auto\", shrink: 1, minSize: 0 },\n ]);\n }\n\n get focused(): boolean {\n return this.isFocused;\n }\n\n set focused(value: boolean) {\n this.isFocused = value;\n this.editor.focused = value;\n }\n\n getFullscreenLayout(): Component {\n return this.layoutRoot;\n }\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const safeWidth = Math.max(1, width);\n const editorLines = this.editor.render(safeWidth);\n const availableRows = Math.max(1, this.tui.terminal.rows - RESERVED_APP_LINES);\n const viewportHeight = Math.max(0, availableRows - editorLines.length - TRANSCRIPT_CHROME_LINES);\n const contentLines = renderTranscriptLines(this.transcriptComponents, safeWidth);\n this.lastContentLineCount = contentLines.length;\n this.scrollView.updateLayout(contentLines.length, viewportHeight, () => this.tui.requestRender());\n\n return fitComposerLayout(\n renderSideThreadHeader(safeWidth, this.theme, this.thinkingLevel),\n contentLines.slice(this.scrollView.scrollTop, this.scrollView.scrollTop + viewportHeight),\n this.renderFooter(safeWidth),\n editorLines,\n availableRows,\n ).map((line) => truncateToWidth(line, safeWidth));\n }\n\n handleInput(data: string): void {\n if (this.finished) return;\n if (this.pasteGuard.consume(data)) {\n this.editor.handleInput(data);\n this.tui.requestRender();\n return;\n }\n if (this.shortcuts.matches(data, \"exit\")) {\n this.finished = true;\n this.onAction({ kind: \"close\" });\n return;\n }\n if (this.canBringToMain && this.shortcuts.matches(data, \"bringToMain\")) {\n this.finished = true;\n this.onAction({ kind: \"bringToMain\", questionDraft: this.editor.getExpandedText() });\n return;\n }\n const thinking = this.options.thinking;\n if (thinking && thinking.levels.length > 1 && this.shortcuts.matches(data, \"cycleThinkingLevel\")) {\n const currentIndex = thinking.levels.indexOf(this.thinkingLevel ?? thinking.level);\n const nextLevel = thinking.levels[(currentIndex + 1) % thinking.levels.length];\n if (nextLevel) {\n this.thinkingLevel = nextLevel;\n thinking.onChange(nextLevel);\n this.warning = undefined;\n this.tui.requestRender();\n }\n return;\n }\n if (matchesKey(data, Key.pageUp)) {\n this.scrollView.scrollBy(-Math.max(1, this.scrollView.viewportHeight));\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, Key.pageDown)) {\n this.scrollView.scrollBy(Math.max(1, this.scrollView.viewportHeight));\n this.tui.requestRender();\n return;\n }\n this.editor.handleInput(data);\n if (!this.finished) this.tui.requestRender();\n }\n\n invalidate(): void {\n this.layoutRoot.invalidate();\n }\n\n dispose(): void {\n if (this.finished) return;\n this.finished = true;\n this.onAction({ kind: \"close\" });\n }\n\n private renderFooter(width: number): string {\n const exit = this.shortcuts.label(\"exit\");\n const bring = this.canBringToMain && this.shortcuts.keys.bringToMain.length > 0;\n const bringKey = this.shortcuts.label(\"bringToMain\");\n if (this.warning) {\n const warning = width < 32 ? `Empty \u2022 ${exit}` : `${this.warning} \u2022 ${exit} exit`;\n return truncateToWidth(this.theme.fg(\"warning\", warning), width);\n }\n const scrollable = this.getMaxScrollOffset() > 0;\n const thinking = this.options.thinking;\n const cycleHint =\n thinking && thinking.levels.length > 1 && this.thinkingLevel && this.shortcuts.keys.cycleThinkingLevel.length\n ? ` \u2022 thinking ${this.thinkingLevel} \u2022 ${this.shortcuts.label(\"cycleThinkingLevel\")} cycle`\n : \"\";\n const base = bring\n ? `btw \u2022 Enter send \u2022 ${bringKey} bring to main \u2022 ${exit} exit`\n : `btw \u2022 Enter send \u2022 ${exit} exit`;\n const fullBase = `${base}${cycleHint}`;\n const fallbackBase = `btw \u2022 Enter \u2022 ${exit}`;\n const compactBase = bring ? `btw \u2022 Enter \u2022 ${bringKey} \u2022 ${exit}` : fallbackBase;\n const compactWithThinking = `${compactBase}${cycleHint}`;\n let hints =\n visibleWidth(fullBase) <= width\n ? fullBase\n : visibleWidth(compactWithThinking) <= width\n ? compactWithThinking\n : visibleWidth(compactBase) <= width\n ? compactBase\n : fallbackBase;\n if (scrollable) {\n const history = ` \u2022 ${this.scrollView.scrollTop > 0 ? \"\u2191 older\" : \"\u2193 newer\"} \u2022 PgUp/PgDn history`;\n const compactHistory = \" \u2022 PgUp/PgDn\";\n const compactScrollable = bring\n ? `Enter \u2022 ${bringKey} \u2022 ${exit} \u2022 PgUp/PgDn`\n : `${fallbackBase}${compactHistory}`;\n if (visibleWidth(`${hints}${history}`) <= width) {\n hints += history;\n } else if (visibleWidth(`${compactBase}${history}`) <= width) {\n hints = `${compactBase}${history}`;\n } else if (visibleWidth(`${hints}${compactHistory}`) <= width) {\n hints += compactHistory;\n } else if (visibleWidth(`${compactBase}${compactHistory}`) <= width) {\n hints = `${compactBase}${compactHistory}`;\n } else if (visibleWidth(compactScrollable) <= width) {\n hints = compactScrollable;\n }\n }\n return truncateToWidth(this.theme.fg(\"muted\", hints), width);\n }\n\n private createHeaderComponent(): Component {\n return {\n render: (width) => [renderSideThreadHeader(width, this.theme, this.thinkingLevel)],\n invalidate() {},\n };\n }\n\n private createTranscriptComponent(): Component {\n return {\n render: (width) => {\n const lines = renderTranscriptLines(this.transcriptComponents, width);\n this.lastContentLineCount = lines.length;\n return lines;\n },\n invalidate: () => {\n for (const component of this.transcriptComponents) component.invalidate();\n },\n };\n }\n\n private createFooterComponent(): Component {\n return {\n render: (width) => [this.renderFooter(width)],\n invalidate() {},\n };\n }\n\n private getMaxScrollOffset(): number {\n return Math.max(0, this.lastContentLineCount - this.scrollView.viewportHeight);\n }\n}\n\nexport class BtwAnsweringView implements BtwFullscreenLayoutComponent, Focusable {\n private readonly shortcuts: BtwShortcuts;\n private readonly pasteGuard = new BtwPasteGuard();\n private readonly transcriptComponents: Component[];\n private readonly loader: Loader;\n private readonly editor: Editor | undefined;\n private readonly controller = new AbortController();\n private readonly scrollView: ScrollView;\n private readonly layoutRoot: VStack;\n private lastContentLineCount = 0;\n private warning: string | undefined;\n private finished = false;\n private isFocused = false;\n private thinkingLevel: BtwThinkingLevel | undefined;\n\n constructor(\n private readonly tui: TUI,\n private readonly theme: Theme,\n turns: readonly SideThreadTurn[],\n pendingQuestion: string,\n private readonly onCancel: () => void,\n thinkingLevel?: BtwThinkingLevel,\n private readonly options: BtwAnsweringViewOptions = {},\n ) {\n this.shortcuts = getBtwShortcuts(tui, options.steering?.thinking?.keybindings);\n this.transcriptComponents = buildTranscriptComponents(\n turns,\n this.theme,\n pendingQuestion,\n options.markdownTransformers,\n );\n this.thinkingLevel = options.steering?.thinking?.level ?? thinkingLevel;\n this.loader = new Loader(\n this.tui,\n (text) => this.theme.fg(\"accent\", text),\n (text) => this.theme.fg(\"muted\", text),\n \"Answering\u2026\",\n );\n if (options.steering) {\n const editorTheme: EditorTheme = {\n borderColor: (text) => this.theme.fg(\"accent\", text),\n selectList: {\n selectedPrefix: (text) => this.theme.fg(\"accent\", text),\n selectedText: (text) => this.theme.fg(\"accent\", text),\n description: (text) => this.theme.fg(\"muted\", text),\n scrollInfo: (text) => this.theme.fg(\"dim\", text),\n noMatch: (text) => this.theme.fg(\"warning\", text),\n },\n };\n this.editor = new Editor(this.tui, editorTheme);\n this.editor.onChange = () => {\n this.warning = undefined;\n };\n this.editor.onSubmit = (text) => {\n const question = text.trim();\n if (!question) {\n this.warning = \"Question cannot be empty\";\n return;\n }\n options.steering?.onSubmit(question);\n this.warning = undefined;\n };\n }\n const transcript = this.createTranscriptComponent();\n this.scrollView = new PreservingScrollView(transcript, { follow: \"end\", primary: true });\n this.layoutRoot = new VStack([\n { component: this.createHeaderComponent(), basis: 1, shrink: 0, minSize: 1 },\n { component: this.scrollView, basis: 0, grow: 1, minSize: 0 },\n {\n component: this.createSteeringComponent(),\n basis: \"auto\",\n shrink: 1,\n minSize: 0,\n maxSize: MAX_STEERING_DISPLAY_LINES,\n },\n { component: this.createFooterComponent(), basis: 1, shrink: 0, minSize: 1 },\n ...(this.editor ? [{ component: this.editor, basis: \"auto\" as const, shrink: 1, minSize: 0 }] : []),\n ]);\n }\n\n get focused(): boolean {\n return this.isFocused;\n }\n\n set focused(value: boolean) {\n this.isFocused = value;\n if (this.editor) this.editor.focused = value;\n }\n\n get signal(): AbortSignal {\n return this.controller.signal;\n }\n\n getFullscreenLayout(): Component {\n return this.layoutRoot;\n }\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const safeWidth = Math.max(1, width);\n const availableRows = Math.max(1, this.tui.terminal.rows - RESERVED_APP_LINES);\n const editorLines = this.editor?.render(safeWidth) ?? [];\n const steeringCapacity = Math.max(0, availableRows - editorLines.length - TRANSCRIPT_CHROME_LINES);\n const steeringLines = renderSteeringLines(\n this.options.steering?.questions ?? [],\n safeWidth,\n this.theme,\n Math.min(MAX_STEERING_DISPLAY_LINES, steeringCapacity),\n );\n const viewportHeight = Math.max(\n 0,\n availableRows - editorLines.length - TRANSCRIPT_CHROME_LINES - steeringLines.length,\n );\n const contentLines = renderTranscriptLines(this.transcriptComponents, safeWidth);\n this.lastContentLineCount = contentLines.length;\n this.scrollView.updateLayout(contentLines.length, viewportHeight, () => this.tui.requestRender());\n\n return fitComposerLayout(\n renderSideThreadHeader(safeWidth, this.theme, this.thinkingLevel),\n contentLines.slice(this.scrollView.scrollTop, this.scrollView.scrollTop + viewportHeight),\n this.renderFooter(safeWidth),\n editorLines,\n availableRows,\n steeringLines,\n ).map((line) => truncateToWidth(line, safeWidth));\n }\n\n handleInput(data: string): void {\n if (this.finished) return;\n if (this.pasteGuard.consume(data)) {\n this.editor?.handleInput(data);\n this.tui.requestRender();\n return;\n }\n if (this.shortcuts.matches(data, \"exit\")) {\n this.finished = true;\n this.loader.stop();\n this.controller.abort();\n this.onCancel();\n return;\n }\n const thinking = this.options.steering?.thinking;\n if (thinking && thinking.levels.length > 1 && this.shortcuts.matches(data, \"cycleThinkingLevel\")) {\n const currentIndex = thinking.levels.indexOf(this.thinkingLevel ?? thinking.level);\n const nextLevel = thinking.levels[(currentIndex + 1) % thinking.levels.length];\n if (nextLevel) {\n this.thinkingLevel = nextLevel;\n thinking.onChange(nextLevel);\n this.warning = undefined;\n this.tui.requestRender();\n }\n return;\n }\n if (matchesKey(data, Key.pageUp)) {\n this.scrollView.scrollBy(-Math.max(1, this.scrollView.viewportHeight));\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, Key.pageDown)) {\n this.scrollView.scrollBy(Math.max(1, this.scrollView.viewportHeight));\n this.tui.requestRender();\n return;\n }\n this.editor?.handleInput(data);\n this.tui.requestRender();\n }\n\n invalidate(): void {\n this.layoutRoot.invalidate();\n }\n\n finish(): void {\n this.finished = true;\n this.loader.stop();\n }\n\n dispose(): void {\n if (this.finished) {\n this.loader.stop();\n this.controller.abort();\n return;\n }\n this.finished = true;\n this.loader.stop();\n this.controller.abort();\n this.onCancel();\n }\n\n private renderFooter(width: number): string {\n const exit = this.shortcuts.label(\"exit\");\n if (this.warning) {\n const warning = width < 32 ? `Empty \u2022 ${exit}` : `${this.warning} \u2022 ${exit} cancel`;\n return truncateToWidth(this.theme.fg(\"warning\", warning), width);\n }\n const baseHint = this.editor ? `Enter steer \u2022 ${exit} cancel` : `${exit} cancel`;\n const thinking = this.options.steering?.thinking;\n const cycleHint =\n thinking && thinking.levels.length > 1 && this.thinkingLevel && this.shortcuts.keys.cycleThinkingLevel.length\n ? ` \u2022 thinking ${this.thinkingLevel} \u2022 ${this.shortcuts.label(\"cycleThinkingLevel\")} cycle`\n : \"\";\n const scrollHint = this.getMaxScrollOffset() > 0 ? \" \u2022 PgUp/PgDn history\" : \"\";\n const hints = `${baseHint}${cycleHint}${scrollHint}`;\n const compactHints = this.editor ? `Enter \u2022 ${exit}` : exit;\n const selectedHints = visibleWidth(hints) <= width ? hints : compactHints;\n const loaderWidth = Math.max(1, width - visibleWidth(selectedHints) - 3);\n const loaderLine = this.loader.render(loaderWidth).at(-1) ?? \"Answering\u2026\";\n return truncateToWidth(`${loaderLine} \u2022 ${this.theme.fg(\"muted\", selectedHints)}`, width);\n }\n\n private createHeaderComponent(): Component {\n return {\n render: (width) => [renderSideThreadHeader(width, this.theme, this.thinkingLevel)],\n invalidate() {},\n };\n }\n\n private createTranscriptComponent(): Component {\n return {\n render: (width) => {\n const lines = renderTranscriptLines(this.transcriptComponents, width);\n this.lastContentLineCount = lines.length;\n return lines;\n },\n invalidate: () => {\n for (const component of this.transcriptComponents) component.invalidate();\n },\n };\n }\n\n private createSteeringComponent(): Component {\n return {\n render: (width) =>\n renderSteeringLines(this.options.steering?.questions ?? [], width, this.theme, MAX_STEERING_DISPLAY_LINES),\n invalidate() {},\n };\n }\n\n private createFooterComponent(): Component {\n return {\n render: (width) => [this.renderFooter(width)],\n invalidate: () => this.loader.invalidate(),\n };\n }\n\n private getMaxScrollOffset(): number {\n return Math.max(0, this.lastContentLineCount - this.scrollView.viewportHeight);\n }\n}\n\nexport function formatSideTranscript(turns: readonly SideThreadTurn[]): string {\n return turns\n .map((turn) => {\n const question = escapeTerminalControls(turn.question);\n const rawAnswer = escapeTerminalControls(turn.answer);\n const answer = turn.kind === \"error\" ? `Error: ${rawAnswer}` : rawAnswer;\n return `${question}\\n\\n${answer}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction buildTranscriptComponents(\n turns: readonly SideThreadTurn[],\n theme: Theme,\n pendingQuestion?: string,\n markdownTransformers: readonly MarkdownTransformer[] = [],\n): Component[] {\n const components = turns.flatMap((turn): Component[] => {\n const question = new UserMessageComponent(\n escapeTerminalControls(turn.question),\n getMarkdownTheme(),\n 1,\n markdownTransformers,\n );\n if (turn.kind === \"error\") {\n const error = new Markdown(`Error: ${escapeTerminalControls(turn.answer)}`, 1, 1, getMarkdownTheme(), {\n color: (text) => theme.fg(\"error\", text),\n });\n return [question, error];\n }\n const response: AssistantMessage = {\n ...turn.response,\n content: [{ type: \"text\", text: escapeTerminalControls(turn.answer) }],\n stopReason: \"stop\",\n errorMessage: undefined,\n };\n return [question, new AssistantMessageComponent(response, true, getMarkdownTheme(), \"\", 1, markdownTransformers)];\n });\n if (pendingQuestion) {\n components.push(\n new UserMessageComponent(escapeTerminalControls(pendingQuestion), getMarkdownTheme(), 1, markdownTransformers),\n );\n }\n return components;\n}\n\nfunction renderTranscriptLines(components: readonly Component[], width: number): string[] {\n return components.flatMap((component) => component.render(width)).map(stripShellIntegrationMarkers);\n}\n\nfunction renderSideThreadHeader(width: number, theme: Theme, thinkingLevel?: BtwThinkingLevel): string {\n const thinking = thinkingLevel ? ` \u00B7 thinking ${thinkingLevel}` : \"\";\n const title = truncateToWidth(`\u2500 btw \u00B7 side thread${thinking} `, width);\n const ruleWidth = Math.max(0, width - visibleWidth(title));\n return theme.fg(\"muted\", `${title}${\"\u2500\".repeat(ruleWidth)}`);\n}\n\nfunction fitComposerLayout(\n header: string,\n contentLines: string[],\n footer: string,\n editorLines: string[],\n availableRows: number,\n statusLines: string[] = [],\n): string[] {\n const lines = [header, ...contentLines, ...statusLines, footer, ...editorLines];\n if (lines.length <= availableRows) return lines;\n if (availableRows <= 1) return [header];\n const editorBudget = Math.max(0, availableRows - 2);\n return [header, footer, ...fitEditorLines(editorLines, editorBudget)];\n}\n\nfunction fitEditorLines(editorLines: string[], budget: number): string[] {\n if (budget <= 0) return [];\n if (editorLines.length <= budget) return editorLines;\n const cursorIndex = editorLines.findIndex((line) => line.includes(CURSOR_MARKER));\n if (cursorIndex < 0) return editorLines.slice(-budget);\n const start = Math.min(cursorIndex, editorLines.length - budget);\n return editorLines.slice(start, start + budget);\n}\n\nfunction renderSteeringLines(questions: readonly string[], width: number, theme: Theme, maxLines: number): string[] {\n if (questions.length === 0 || maxLines <= 0) return [];\n const formatQuestion = (question: string) => sanitizeSingleLine(question) || \"(non-printing message)\";\n if (maxLines === 1 && questions.length > 1) {\n return [\n truncateToWidth(\n theme.fg(\"dim\", `Steering (+${questions.length - 1} more): ${formatQuestion(questions[0] ?? \"\")}`),\n width,\n ),\n ];\n }\n const hasOverflow = questions.length > maxLines;\n const questionLimit = hasOverflow ? Math.max(1, maxLines - 1) : maxLines;\n const lines = questions\n .slice(0, questionLimit)\n .map((question) => truncateToWidth(theme.fg(\"dim\", `Steering: ${formatQuestion(question)}`), width));\n if (hasOverflow) {\n lines.push(truncateToWidth(theme.fg(\"dim\", `Steering: \u2026 +${questions.length - questionLimit} more`), width));\n }\n return lines;\n}\n\nfunction stripShellIntegrationMarkers(line: string): string {\n return OSC133_MARKERS.reduce((result, marker) => result.replaceAll(marker, \"\"), line);\n}\n\nfunction escapeTerminalControls(text: string): string {\n return [...text]\n .map((character) => {\n if (character === \"\\n\") return character;\n if (character === \"\\t\") return \" \";\n const code = character.charCodeAt(0);\n if (code <= 31 || (code >= 127 && code <= 159)) {\n return `\\\\x${code.toString(16).padStart(2, \"0\")}`;\n }\n return character;\n })\n .join(\"\");\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAAA;AAAA,EAEE;AAAA,EACA,8BAAAA;AAAA,OAGK;AACP,SAAS,kBAAAC,uBAAuE;;;ACNhF,SAAyB,KAAK,YAAsB,iBAAiB,oBAAoB;AAGzF,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB,IAAI,KAAK,UAAU,QAAW,EAAE,aAAa,WAAW,CAAC;AA0C7E,SAAS,iBAAiB,OAAmF;AAClH,SAAO,MAAM,OAAO,CAAC,SAAgE,KAAK,SAAS,UAAU;AAC/G;AAEO,SAAS,8BACd,OACA,OACyB;AACzB,QAAM,WAAW,iBAAiB,KAAK;AACvC,QAAM,WACJ,MAAM,SAAS,WACX,SAAS,MAAM,EAAE,IACjB,MAAM,SAAS,SACb,SAAS,MAAM,KAAK,IAAI,GAAG,MAAM,iBAAiB,CAAC,IACnD;AACR,SAAO,SAAS,QAAQ,CAAC,SAAS;AAAA,IAChC,EAAE,MAAM,QAAiB,MAAM,KAAK,SAAS;AAAA,IAC7C,EAAE,MAAM,aAAsB,MAAM,KAAK,OAAO;AAAA,EAClD,CAAC;AACH;AAEO,SAAS,uBAAuB,OAAsD;AAC3F,SAAO,8BAA8B,OAAO,EAAE,MAAM,SAAS,CAAC,EAAE;AAAA,IAAQ,CAAC,YACvE,QAAQ,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,MAAM,KAAK,EAAE;AAAA,EACvE;AACF;AAEO,SAAS,sBACd,OACA,QACA,QACyB;AACzB,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,QAAQ,MAAM,SAAS,CAAC,CAAC;AACpE,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,QAAQ,MAAM,GAAG,MAAM,SAAS,CAAC,CAAC;AAC5E,QAAM,WAAoC,CAAC;AAC3C,aAAW,QAAQ,MAAM,MAAM,OAAO,MAAM,CAAC,GAAG;AAC9C,UAAM,WAAW,SAAS,GAAG,EAAE;AAC/B,QAAI,UAAU,SAAS,KAAK,MAAM;AAChC,eAAS,QAAQ;AAAA,EAAK,KAAK,IAAI;AAAA,IACjC,OAAO;AACL,eAAS,KAAK,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,sBACd,OACA,QACA,QACyB;AACzB,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,QAAM,QAAQ,kBAAkB,OAAO,MAAM;AAC7C,QAAM,SAAS,kBAAkB,OAAO,MAAM;AAC9C,QAAM,CAAC,OAAO,GAAG,IAAI,qBAAqB,OAAO,MAAM,KAAK,IAAI,CAAC,OAAO,MAAM,IAAI,CAAC,QAAQ,KAAK;AAChG,MAAI,qBAAqB,OAAO,GAAG,MAAM,EAAG,QAAO,CAAC;AAEpD,QAAM,WAAoC,CAAC;AAC3C,WAAS,YAAY,MAAM,MAAM,aAAa,IAAI,MAAM,aAAa,GAAG;AACtE,UAAM,OAAO,MAAM,SAAS;AAC5B,QAAI,CAAC,KAAM;AACX,UAAM,aAAa,eAAe,KAAK,IAAI;AAC3C,UAAM,OAAO,cAAc,MAAM,OAAO,MAAM,SAAS;AACvD,UAAM,KAAK,cAAc,IAAI,OAAO,IAAI,SAAS,WAAW;AAC5D,UAAM,OAAO,WAAW,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE;AAC/C,QAAI,MAAM;AACR,YAAM,WAAW,SAAS,GAAG,EAAE;AAC/B,UAAI,UAAU,SAAS,KAAK,KAAM,UAAS,QAAQ;AAAA,UAC9C,UAAS,KAAK,EAAE,MAAM,KAAK,MAAM,KAAK,CAAC;AAAA,IAC9C;AACA,UAAM,sBAAsB,YAAY,IAAI,QAAQ,MAAM,YAAY,CAAC,GAAG,SAAS,KAAK;AACxF,QAAI,qBAAqB;AACvB,YAAM,UAAU,SAAS,GAAG,EAAE;AAC9B,UAAI,SAAS,SAAS,KAAK,KAAM,SAAQ,QAAQ;AAAA,UAC5C,UAAS,KAAK,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,CAAC;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,0BAA0B,UAAoD;AAC5F,SAAO,KAAK,KAAK,OAAO,WAAW,SAAS,IAAI,CAAC,YAAY,QAAQ,IAAI,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;AACpG;AAEO,SAAS,qBAAqB,UAAmE;AACtG,SAAO;AAAA,IACL,OAAO,SAAS,OAAO,CAAC,OAAO,YAAY,QAAQ,QAAQ,KAAK,MAAM,IAAI,EAAE,QAAQ,CAAC;AAAA,IACrF,UAAU,SAAS;AAAA,IACnB,QAAQ,0BAA0B,QAAQ;AAAA,EAC5C;AACF;AAEO,SAAS,qBAAqB,UAAoD;AACvF,QAAM,OAAO,SACV,IAAI,CAAC,YAAY,GAAG,QAAQ,SAAS,SAAS,SAAS,WAAW;AAAA,EAAM,sBAAsB,QAAQ,IAAI,CAAC,EAAE,EAC7G,KAAK,MAAM;AACd,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,IAAM,uBAAN,MAAgD;AAAA,EAWrD,YACmB,KACA,OACA,aACjB,OACiB,UACjB,cACA;AANiB;AACA;AACA;AAEA;AAGjB,SAAK,QAAQ,uBAAuB,KAAK;AACzC,QAAI,cAAc;AAChB,WAAK,SAAS,kBAAkB,KAAK,OAAO,aAAa,MAAM;AAC/D,WAAK,SAAS,aAAa,SAAS,kBAAkB,KAAK,OAAO,aAAa,MAAM,IAAI;AACzF,WAAK,aACH,aAAa,eAAe,SACxB,SACA,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,SAAS,GAAG,aAAa,UAAU,CAAC;AAC1E,WAAK,kBAAkB,KAAK,IAAI,GAAG,aAAa,eAAe;AAC/D,WAAK,eAAe,KAAK,IAAI,GAAG,aAAa,YAAY;AACzD,WAAK,mBAAmB,KAAK,IAAI,GAAG,aAAa,gBAAgB;AAAA,IACnE;AAAA,EACF;AAAA,EAnBmB;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAfF;AAAA,EACT,SAA0B,EAAE,MAAM,GAAG,QAAQ,EAAE;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB;AAAA,EACA,WAAW;AAAA,EAwBnB,WAAsC;AACpC,WAAO;AAAA,MACL,QAAQ,EAAE,GAAG,KAAK,OAAO;AAAA,MACzB,QAAQ,KAAK,SAAS,EAAE,GAAG,KAAK,OAAO,IAAI;AAAA,MAC3C,YAAY,KAAK;AAAA,MACjB,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB,kBAAkB,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAO,OAAyB;AAC9B,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK;AACnC,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,OAAO,iBAAiB;AAC5E,UAAM,aAAa,iBAAiB;AACpC,UAAM,aAAa,iBAAiB;AACpC,UAAM,iBAAiB,KAAK,IAAI,GAAG,gBAAgB,KAAK,aAAa,IAAI,MAAM,aAAa,IAAI,EAAE;AAClG,SAAK,kBAAkB,cAAc;AACrC,UAAM,YAAY,KAAK,IAAI,GAAG,YAAY,aAAa,2BAAiB,CAAC;AACzE,SAAK,8BAA8B,SAAS;AAC5C,UAAM,QAAQ,KAAK,kBAAkB;AACrC,UAAM,YAAY,KAAK,sBAAsB;AAC7C,UAAM,UAAU,KAAK,MAAM,MAAM,KAAK,cAAc,KAAK,eAAe,cAAc;AACtF,UAAM,OAAO,QAAQ,IAAI,CAAC,MAAM,iBAAiB;AAC/C,YAAM,YAAY,KAAK,eAAe;AACtC,YAAM,OAAO,KAAK,SAAS,SAAS,SAAS;AAC7C,YAAM,eAAe,YAAY,aAAa,UAAU,SAAS,aAAa,UAAU,MAAM;AAC9F,YAAM,SAAS,GAAG,eAAe,WAAM,GAAG,GAAG,cAAc,KAAK,OAAO,OAAO,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC;AACzG,YAAM,OAAO,KAAK,eAAe,MAAM,WAAW,OAAO,YAAY;AACrE,aAAO;AAAA,QACL,cAAc,KAAK,OAAO,OAAO,KAAK,MAAM,GAAG,UAAU,MAAM,IAAI,OAAO,SAAS;AAAA,QACnF;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,WAAW,KAAK,oBAAoB;AAC1C,UAAM,UAAU,qBAAqB,QAAQ;AAC7C,UAAM,SACJ,SAAS,WAAW,IAChB,mBACA,aAAa,QAAQ,KAAK,IAAI,QAAQ,UAAU,IAAI,SAAS,OAAO,SAAM,QAAQ,QAAQ,IAAI,QAAQ,aAAa,IAAI,YAAY,UAAU,UAAO,QAAQ,MAAM,IAAI,QAAQ,WAAW,IAAI,UAAU,QAAQ;AACrN,UAAM,UAAU,gBAAgB,KAAK,WAAW;AAChD,UAAM,OAAO,gBAAgB,KAAK,aAAa,qBAAqB,CAAC,QAAQ,CAAC;AAC9E,UAAM,WAAW,GAAG,gBAAgB,KAAK,aAAa,eAAe,CAAC,IAAI,gBAAgB,KAAK,aAAa,iBAAiB,CAAC;AAC9H,UAAM,mBAAmB,KAAK,YAAY,QAAQ,KAAK,oBAAoB;AAC3E,UAAM,iBAAiB,KAAK,UACxB,GAAG,KAAK,OAAO,WAAM,mBAAmB,wBAAwB,sCAAiC,WAAM,IAAI,8BAC3G,KAAK,eAAe,SAClB,GAAG,mBAAmB,GAAG,QAAQ,kBAAkB,sBAAiB,QAAQ,eAAe,oCAA0B,OAAO,iBAAY,IAAI,8BAC5I,yCAAoC,mBAAmB,KAAK,qBAAgB,WAAM,OAAO,iBAAY,IAAI;AAC/G,UAAM,iBAAiB,GAAG,OAAO,iBAAY,IAAI;AACjD,UAAM,SAAS,aAAa,cAAc,KAAK,YAAY,iBAAiB;AAC5E,WAAO;AAAA,MACL;AAAA,QACE,gBAAgB,KAAK,MAAM,GAAG,UAAU,KAAK,MAAM,KAAK,8BAA8B,CAAC,GAAG,WAAW,EAAE;AAAA,QACvG,GAAI,aAAa,CAAC,gBAAgB,KAAK,MAAM,GAAG,SAAS,MAAM,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC;AAAA,QACrF,GAAG;AAAA,QACH,GAAI,aACA,CAAC,gBAAgB,KAAK,MAAM,GAAG,KAAK,UAAU,YAAY,SAAS,MAAM,GAAG,WAAW,EAAE,CAAC,IAC1F,CAAC;AAAA,MACP;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,MAAoB;AAC9B,QAAI,KAAK,SAAU;AACnB,QAAI,WAAW,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG;AACnC,WAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC7B;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,mBAAmB,GAAG;AACvD,WAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5B;AAAA,IACF;AACA,QAAI,eAAe,MAAM,KAAK,WAAW,GAAG;AAC1C,UAAI,KAAK,MAAM,SAAS,GAAG;AACzB,cAAM,WAAW,KAAK,oBAAoB;AAC1C,YAAI,SAAS,WAAW,GAAG;AACzB,eAAK,UAAU;AACf,eAAK,IAAI,cAAc;AAAA,QACzB,OAAO;AACL,eAAK,OAAO,EAAE,MAAM,WAAW,SAAS,CAAC;AAAA,QAC3C;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,WAAW,MAAM,IAAI,KAAK,GAAG;AAC/B,WAAK,SAAS;AACd,WAAK,aAAa,KAAK,eAAe,SAAY,KAAK,OAAO,OAAO;AACrE,WAAK,UAAU;AACf;AAAA,IACF;AACA,QAAI,WAAW,MAAM,IAAI,MAAM,MAAM,CAAC,GAAG;AACvC,WAAK,eAAe,IAAI,IAAI;AAC5B;AAAA,IACF;AACA,QAAI,WAAW,MAAM,IAAI,MAAM,OAAO,CAAC,GAAG;AACxC,WAAK,eAAe,GAAG,IAAI;AAC3B;AAAA,IACF;AACA,QAAI,WAAW,MAAM,IAAI,MAAM,IAAI,CAAC,GAAG;AACrC,WAAK,aAAa,IAAI,IAAI;AAC1B;AAAA,IACF;AACA,QAAI,WAAW,MAAM,IAAI,MAAM,MAAM,CAAC,GAAG;AACvC,WAAK,aAAa,GAAG,IAAI;AACzB;AAAA,IACF;AACA,QAAI,WAAW,MAAM,IAAI,IAAI,GAAG;AAC9B,WAAK,eAAe,IAAI,KAAK;AAC7B;AAAA,IACF;AACA,QAAI,WAAW,MAAM,IAAI,KAAK,GAAG;AAC/B,WAAK,eAAe,GAAG,KAAK;AAC5B;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,eAAe,GAAG;AACnD,WAAK,aAAa,IAAI,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,iBAAiB,GAAG;AACrD,WAAK,aAAa,GAAG,KAAK;AAC1B;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,mBAAmB,GAAG;AACvD,WAAK,aAAa,KAAK,KAAK;AAC5B;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,qBAAqB,GAAG;AACzD,WAAK,aAAa,IAAI,KAAK;AAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAmB;AAAA,EAAC;AAAA,EAEZ,eACN,MACA,WACA,OACA,cACQ;AACR,UAAM,aAAa,eAAe,KAAK,IAAI;AAC3C,QAAI,WAAW,KAAK,mBAAmB,IAAI,KAAK,MAAM,GAAG,SAAS,QAAG,IAAI;AACzE,QAAI,SAAS;AACb,QAAI,iBAAiB;AACrB,UAAM,QAAQ,MAAM;AAClB,UAAI,CAAC,OAAQ;AACb,kBAAY,iBAAiB,KAAK,MAAM,GAAG,cAAc,KAAK,MAAM,GAAG,QAAQ,MAAM,CAAC,IAAI;AAC1F,eAAS;AAAA,IACX;AACA,aAAS,SAAS,KAAK,kBAAkB,UAAU,WAAW,QAAQ,UAAU,GAAG;AACjF,UAAI,SAAS,cAAc,MAAM,MAAM,QAAQ,WAAW,MAAM,MAAM,QAAQ;AAC5E,cAAM;AACN,oBAAY,KAAK,MAAM,GAAG,UAAU,GAAG;AAAA,MACzC;AACA,UAAI,cAAc,KAAK,OAAO,QAAQ,WAAW,KAAK,OAAO,QAAQ;AACnE,cAAM;AACN,oBAAY,KAAK,MAAM,GAAG,UAAU,QAAG;AAAA,MACzC;AACA,UAAI,SAAS,cAAc,MAAM,IAAI,QAAQ,WAAW,MAAM,IAAI,QAAQ;AACxE,cAAM;AACN,oBAAY,KAAK,MAAM,GAAG,UAAU,GAAG;AAAA,MACzC;AACA,YAAM,YAAY,WAAW,MAAM;AACnC,UAAI,cAAc,OAAW;AAC7B,YAAM,WAAW,iBAAiB,QAAQ,oBAAoB,WAAW,QAAQ,KAAK,IAAI;AAC1F,UAAI,UAAU,aAAa,eAAgB,OAAM;AACjD,uBAAiB;AACjB,gBAAU,uBAAuB,SAAS;AAAA,IAC5C;AACA,UAAM;AACN,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAkF;AACxF,QAAI,CAAC,KAAK,UAAU,qBAAqB,KAAK,QAAQ,KAAK,MAAM,MAAM,EAAG,QAAO;AACjF,WAAO,qBAAqB,KAAK,QAAQ,KAAK,MAAM,IAAI,IACpD,EAAE,OAAO,KAAK,QAAQ,KAAK,KAAK,OAAO,IACvC,EAAE,OAAO,KAAK,QAAQ,KAAK,KAAK,OAAO;AAAA,EAC7C;AAAA,EAEQ,wBAAoE;AAC1E,WAAO,KAAK,eAAe,SACvB,SACA;AAAA,MACE,OAAO,KAAK,IAAI,KAAK,YAAY,KAAK,OAAO,IAAI;AAAA,MACjD,KAAK,KAAK,IAAI,KAAK,YAAY,KAAK,OAAO,IAAI;AAAA,IACjD;AAAA,EACN;AAAA,EAEQ,sBAA+C;AACrD,QAAI,KAAK,eAAe,QAAW;AACjC,aAAO,sBAAsB,KAAK,OAAO,KAAK,YAAY,KAAK,OAAO,IAAI;AAAA,IAC5E;AACA,WAAO,KAAK,SAAS,sBAAsB,KAAK,OAAO,KAAK,QAAQ,KAAK,MAAM,IAAI,CAAC;AAAA,EACtF;AAAA,EAEQ,eAAe,OAAe,QAAuB;AAC3D,QAAI,KAAK,MAAM,WAAW,EAAG;AAC7B,QAAI,CAAC,OAAQ,MAAK,aAAa;AAC/B,QAAI,CAAC,UAAU,KAAK,QAAQ;AAC1B,YAAM,QAAQ,KAAK,kBAAkB;AACrC,UAAI,MAAO,MAAK,SAAS,QAAQ,IAAI,MAAM,QAAQ,MAAM;AACzD,WAAK,SAAS;AACd,WAAK,kBAAkB,KAAK,OAAO;AACnC,WAAK,UAAU;AACf;AAAA,IACF;AACA,SAAK,sBAAsB,MAAM;AACjC,UAAM,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI;AACxC,UAAM,SAAS,OAAO,eAAe,KAAK,IAAI,EAAE,SAAS;AACzD,QAAI,QAAQ,GAAG;AACb,UAAI,KAAK,OAAO,SAAS,EAAG,MAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,QAAQ,KAAK,OAAO,SAAS,EAAE;AAAA,eAClF,KAAK,OAAO,OAAO,GAAG;AAC7B,cAAM,eAAe,KAAK,MAAM,KAAK,OAAO,OAAO,CAAC;AACpD,aAAK,SAAS;AAAA,UACZ,MAAM,KAAK,OAAO,OAAO;AAAA,UACzB,QAAQ,eAAe,eAAe,aAAa,IAAI,EAAE,SAAS;AAAA,QACpE;AAAA,MACF;AAAA,IACF,WAAW,KAAK,OAAO,SAAS,QAAQ;AACtC,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,QAAQ,KAAK,OAAO,SAAS,EAAE;AAAA,IACjE,WAAW,KAAK,OAAO,OAAO,KAAK,MAAM,SAAS,GAAG;AACnD,WAAK,SAAS,EAAE,MAAM,KAAK,OAAO,OAAO,GAAG,QAAQ,EAAE;AAAA,IACxD;AACA,SAAK,kBAAkB,KAAK,OAAO;AACnC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,aAAa,OAAe,QAAuB;AACzD,QAAI,KAAK,MAAM,WAAW,EAAG;AAC7B,QAAI,UAAU,KAAK,eAAe,OAAW,MAAK,sBAAsB,MAAM;AAC9E,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,SAAS,GAAG,KAAK,OAAO,OAAO,KAAK,CAAC;AAClF,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,SAAK,SAAS;AAAA,MACZ;AAAA,MACA,QAAQ,KAAK,IAAI,KAAK,iBAAiB,SAAS,eAAe,OAAO,IAAI,EAAE,SAAS,CAAC;AAAA,IACxF;AACA,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,sBAAsB,QAAuB;AACnD,QAAI,OAAQ,MAAK,aAAa;AAC9B,QAAI,UAAU,CAAC,KAAK,OAAQ,MAAK,SAAS,EAAE,GAAG,KAAK,OAAO;AAC3D,QAAI,CAAC,OAAQ,MAAK,SAAS;AAAA,EAC7B;AAAA,EAEQ,YAAkB;AACxB,SAAK,UAAU;AACf,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA,EAEQ,kBAAkB,QAAsB;AAC9C,QAAI,UAAU,EAAG;AACjB,QAAI,KAAK,OAAO,OAAO,KAAK,aAAc,MAAK,eAAe,KAAK,OAAO;AAC1E,QAAI,KAAK,OAAO,QAAQ,KAAK,eAAe,QAAQ;AAClD,WAAK,eAAe,KAAK,OAAO,OAAO,SAAS;AAAA,IAClD;AAAA,EACF;AAAA,EAEQ,8BAA8B,OAAqB;AACzD,UAAM,aAAa,eAAe,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,QAAQ,EAAE;AAC1E,UAAM,gBAAgB,WAAW,IAAI,CAAC,cAAc,aAAa,uBAAuB,SAAS,CAAC,CAAC;AACnG,UAAM,eAAe,cAAc,KAAK,OAAO,MAAM,KAAK;AAC1D,QAAI,YAAY,IAAI,KAAK,IAAI,cAAc,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACjE,QAAI,SAAS,KAAK,OAAO;AACzB,aAAS,QAAQ,KAAK,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC/D,YAAM,YAAY,aAAa,cAAc,KAAK,KAAK,MAAM,QAAQ,IAAI,IAAI;AAC7E,UAAI,YAAY,MAAO;AACvB,mBAAa,cAAc,KAAK,KAAK;AACrC,eAAS;AAAA,IACX;AACA,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,OAAO,QAA0C;AACvD,QAAI,KAAK,SAAU;AACnB,SAAK,WAAW;AAChB,SAAK,SAAS,MAAM;AAAA,EACtB;AACF;AAEA,SAAS,kBAAkB,OAAoC,UAA4C;AACzG,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC;AAClE,QAAM,OAAO,MAAM,IAAI,GAAG,QAAQ;AAClC,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,eAAe,IAAI,EAAE,QAAQ,SAAS,MAAM,CAAC;AAAA,EAC5E;AACF;AAEA,SAAS,gBAAgB,aAAyC;AAChE,SAAO,gBAAgB,aAAa,sBAAsB,CAAC,QAAQ,GAAG,OAAO;AAC/E;AAEA,SAAS,eAAe,MAAc,aAA0C;AAC9E,MAAI,WAAW,MAAM,IAAI,KAAK,GAAG,CAAC,EAAG,QAAO;AAC5C,QAAM,mBAAmB,YACtB,QAAQ,oBAAoB,EAC5B,IAAI,MAAM,EACV,KAAK,CAAC,QAAQ,IAAI,YAAY,MAAM,QAAQ;AAC/C,SAAO,YAAY,QAAQ,MAAM,oBAAoB,KAAM,CAAC,oBAAoB,WAAW,MAAM,IAAI,KAAK;AAC5G;AAEA,SAAS,gBACP,aACA,YAOA,WAA8B,CAAC,GAC/B,UACQ;AACR,QAAM,MAAM,YACT,QAAQ,UAAU,EAClB,IAAI,MAAM,EACV,KAAK,CAAC,cAAc,CAAC,SAAS,SAAS,UAAU,YAAY,CAAC,CAAC;AAClE,SAAO,eAAe,OAAO,YAAY,UAAU;AACrD;AAEA,SAAS,eAAe,KAAqB;AAC3C,SAAO,IACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AACb,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,UAAU,OAAQ,QAAO;AAC7B,QAAI,UAAU,MAAO,QAAO;AAC5B,QAAI,UAAU,QAAS,QAAO;AAC9B,QAAI,UAAU,YAAY,UAAU,MAAO,QAAO;AAClD,QAAI,UAAU,WAAW,UAAU,SAAU,QAAO;AACpD,QAAI,UAAU,SAAU,QAAO;AAC/B,QAAI,UAAU,WAAY,QAAO;AACjC,WAAO,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI,GAAG,KAAK,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EACjG,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAAS,eAAe,MAAwB;AAC9C,SAAO,CAAC,GAAG,mBAAmB,QAAQ,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO;AAC3E;AAEA,SAAS,qBAAqB,OAAwB,QAAiC;AACrF,SAAO,MAAM,SAAS,OAAO,OAAO,MAAM,SAAS,OAAO,SAAS,MAAM,OAAO,OAAO;AACzF;AAEA,SAAS,oBACP,MACA,QACA,OACS;AACT,QAAM,WAAW,EAAE,MAAM,OAAO;AAChC,SAAO,qBAAqB,UAAU,MAAM,KAAK,KAAK,KAAK,qBAAqB,UAAU,MAAM,GAAG,IAAI;AACzG;AAEA,SAAS,QAAQ,MAAgB,eAAiC;AAChE,MAAI,KAAK,UAAU,cAAe,QAAO;AACzC,MAAI,iBAAiB,EAAG,QAAO,KAAK,MAAM,GAAG,CAAC;AAC9C,SAAO,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,gBAAgB,CAAC,CAAC;AACvE;AAEA,SAAS,sBAAsB,MAAsB;AACnD,SAAO,CAAC,GAAG,IAAI,EACZ,IAAI,CAAC,cAAc;AAClB,QAAI,cAAc,KAAM,QAAO;AAC/B,QAAI,cAAc,IAAM,QAAO;AAC/B,UAAM,OAAO,UAAU,WAAW,CAAC;AACnC,QAAI,QAAQ,MAAO,QAAQ,OAAO,QAAQ,KAAM;AAC9C,aAAO,MAAM,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IACjD;AACA,WAAO;AAAA,EACT,CAAC,EACA,KAAK,EAAE,EACP,QAAQ,+BAA+B,iBAAiB,EACxD,QAAQ,8BAA8B,CAAC,eAAe,WAAW,WAAW,KAAK,MAAM,EAAE,WAAW,KAAK,MAAM,CAAC;AACrH;AAEA,SAAS,uBAAuB,MAAsB;AACpD,SAAO,CAAC,GAAG,IAAI,EACZ,IAAI,CAAC,cAAc;AAClB,UAAM,OAAO,UAAU,WAAW,CAAC;AACnC,QAAI,QAAQ,MAAO,QAAQ,OAAO,QAAQ,KAAM;AAC9C,aAAO,MAAM,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IACjD;AACA,WAAO;AAAA,EACT,CAAC,EACA,KAAK,EAAE;AACZ;;;AClkBA,SAAS,aAAa;AACtB;AAAA,EACE,mBAAmB;AAAA,OAId;AACP;AAAA,EAEE,gBAAAC;AAAA,EACA,yBAAAC;AAAA,EACA,OAAAC;AAAA,EAEA;AAAA,EAEA;AAAA,EAGA,mBAAAC;AAAA,OACK;;;ACnBP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA,cAAAC;AAAA,EAEA;AAAA,OACK;;;ACRA,SAAS,mBAAmB,MAAsB;AACvD,SAAO,CAAC,GAAG,KAAK,QAAQ,cAAc,GAAG,CAAC,EACvC,OAAO,CAAC,cAAc;AACrB,UAAM,OAAO,UAAU,WAAW,CAAC;AACnC,WAAO,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,EAC5C,CAAC,EACA,KAAK,EAAE,EACP,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEO,SAASC,gBAAe,KAAqB;AAClD,QAAM,YAAY,mBAAmB,GAAG;AACxC,MAAI,CAAC,UAAW,QAAO;AACvB,SAAO,UACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AACb,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,UAAU,QAAS,QAAO;AAC9B,QAAI,UAAU,OAAQ,QAAO;AAC7B,QAAI,UAAU,MAAO,QAAO;AAC5B,QAAI,UAAU,QAAS,QAAO;AAC9B,WAAO,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI,GAAG,KAAK,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EACjG,CAAC,EACA,KAAK,GAAG;AACb;;;ADdO,IAAM,uBAAuB,CAAC,QAAQ,sBAAsB,aAAa;AAIhF,IAAM,YAAY,CAAC,SAAS,OAAO,QAAQ,OAAO;AAClD,IAAM,UAAU;AAChB,IAAM,UAAkC;AAAA,EACtC,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM;AACR;AACA,IAAM,kBAAkB,CAAC,MAAM,MAAM,MAAM,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAK/G,IAAM,gBAAgB;AAAA,EACpB,GAAG,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,SAAS,OAAO,aAAa,IAAI,CAAC;AAAA,EACrE,GAAG,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,SAAS,OAAS,OAAO,aAAa,IAAI,CAAC,EAAE;AAAA,EAChF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG,gBAAgB,IAAI,CAAC,WAAW,OAAS,MAAM,EAAE;AACtD;AAGO,SAAS,gBAAgB,OAAoC;AAClE,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,MAAM,cAAc,KAAK,KAAK,EAAG,QAAO;AACxF,QAAM,QAAQ,MAAM,YAAY,EAAE,MAAM,GAAG;AAC3C,MAAI,OAAO,MAAM,IAAI;AACrB,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,IAAI,IAAI,KAAK,EAAE,SAAS,MAAM,UAAU,MAAM,KAAK,CAAC,SAAS,CAAC,UAAU,SAAS,IAAa,CAAC;AACjG,WAAO;AACT,MACE,CAAC,OAAO,OAAO,SAAS,IAAI,KAC5B,SAAS,WACT,CAAC,uBAAuB,KAAK,IAAI,KACjC,EAAE,KAAK,WAAW,MAAM,cAAc,KAAK,IAAI,KAAK,QAAQ,SAAS,IAAI;AAEzE,WAAO;AACT,OAAK,SAAS,YAAa,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,MAAO,MAAM,OAAQ,QAAO;AAC7F,MAAI,SAAS,YAAY,MAAM,SAAS,KAAM,MAAM,WAAW,KAAK,CAAC,CAAC,QAAQ,OAAO,EAAE,SAAS,MAAM,CAAC,KAAK,EAAE;AAC5G,WAAO;AACT,SAAO,CAAC,GAAG,UAAU,OAAO,CAAC,SAAS,MAAM,SAAS,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,GAAG;AAC7E;AAGA,SAAS,UAAU,KAAuB;AACxC,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,WAAW,UAAU,OAAO,CAAC,MAAM,MAAM,QAAQ,QAAQ,MAAM,SAAS,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC;AACtG,QAAM,OAAO,QAAQ,IAAI,MAAM,KAAK,WAAW,IAAI,KAAK,WAAW,CAAC,IAAI;AACxE,QAAM,SAAS,SAAS,SAAY,gBAAgB,CAAC,GAAG,eAAe,QAAU,IAAI,IAAI,WAAW,CAAC,GAAG;AACxG,SAAO,OAAO,OAAO,CAAC,UAAUC,YAAW,OAAO,GAAY,CAAC;AACjE;AAEO,SAAS,eAAe,OAAe,QAAyB;AACrE,QAAM,aAAa,gBAAgB,KAAK;AACxC,SAAO,eAAe,UAAa,UAAU,UAAU,EAAE,KAAK,CAAC,UAAUA,YAAW,OAAO,MAAe,CAAC;AAC7G;AASA,SAAS,aAAa,aAAiC,cAAiC;AAGtF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,OAAO,KAAK,eAAe,EAAE,QAAQ,CAAC,OAAO,YAAY,QAAQ,EAAkC,CAAC;AAAA,IACvG,GAAI,CAAC,eAAe,YAAY,QAAQ,kBAAkB,IAAI,CAAC;AAAA,EACjE;AACF;AAEA,SAAS,UAAU,KAAsB;AACvC,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,OAAO,MAAM,GAAG,EAAE,KAAK;AAC7B,UAAQ,KAAK,WAAW,KAAK,SAAS,YAAY,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,OAAO,OAAO,EAAE,SAAS,IAAI,CAAC;AACjH;AAEO,SAAS,oBACd,YAAoC,CAAC,GACrC,aACA,eAAe,MACD;AACd,MAAI,OAAO,sBAAsB;AACjC,MAAI,WAAW,wBAAwB,WAAW,aAAa,YAAY;AAC3E,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS,sBAAsB,GAAG;AACpC,aAAO,sBAAsB;AAC7B,iBAAW,wBAAwB,WAAW,aAAa,YAAY;AAAA,IACzE;AACA,WAAO;AAAA,EACT;AAGA,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO,QAAQ,EAAE;AAAA,IACnB;AAAA,IACA,IAAI,WAAW;AACb,aAAO,QAAQ,EAAE;AAAA,IACnB;AAAA,IACA,SAAS,CAAC,MAAM,WAAW,QAAQ,EAAE,QAAQ,MAAM,MAAM;AAAA,IACzD,OAAO,CAAC,WAAW,QAAQ,EAAE,MAAM,MAAM;AAAA,EAC3C;AACF;AAEA,SAAS,wBACP,YAAoC,CAAC,GACrC,aACA,eAAe,MACD;AACd,QAAM,WAAW,aAAa,aAAa,YAAY;AACvD,QAAM,OAA6B,EAAE,MAAM,CAAC,QAAQ,GAAG,oBAAoB,CAAC,GAAG,aAAa,CAAC,EAAE;AAC/F,QAAM,WAAqB,CAAC;AAC5B,QAAM,WAAyD;AAAA,IAC7D,MAAM,CAAC,QAAQ;AAAA,IACf,oBAAoB,YAAY,QAAQ,oBAAoB;AAAA,IAC5D,aAAa,CAAC,QAAQ;AAAA,EACxB;AACA,QAAM,SAAS,CAAC,QAA2B,WAAmB,YAAY,UAA8B;AACtG,UAAM,MAAM,gBAAgB,SAAS;AACrC,QAAI,CAAC,OAAQ,CAAC,aAAa,UAAU,GAAG,EAAI,QAAO;AACnD,UAAM,SAAS,UAAU,GAAG;AAC5B,QAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAI,WAAW,UAAU,QAAQ,SAAU,QAAO;AAClD,QACE,SAAS,KAAK,CAAC,UAAU,OAAO,UAAU,YAAY,OAAO,KAAK,CAAC,UAAUA,YAAW,OAAO,KAAc,CAAC,CAAC;AAE/G,aAAO;AACT,WAAO;AAAA,EACT;AACA,QAAM,aAAqC,CAAC;AAC5C,QAAM,oBAAoB,EAAE,GAAG,SAAS;AACxC,aAAW,UAAU,sBAAsB;AACzC,sBAAkB,MAAM,IAAI,SAAS,MAAM,EACxC,IAAI,CAAC,QAAQ,OAAO,QAAQ,KAAK,WAAW,oBAAoB,CAAC,EACjE,OAAO,CAAC,QAAuB,QAAQ,MAAS;AACnD,UAAM,WAAW,UAAU,MAAM;AACjC,QAAI,aAAa,OAAW,YAAW,MAAM,IAAI,OAAO,QAAQ,QAAQ;AAAA,EAC1E;AAGA,aAAS;AACP,UAAM,WAAW,qBAAqB,OAAO,CAAC,WAAW;AACvD,YAAM,YAAY,WAAW,MAAM;AACnC,aACE,cAAc,UACd,qBAAqB;AAAA,QACnB,CAAC,UACC,UAAU,WACT,WAAW,KAAK,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,kBAAkB,KAAK,GAAG;AAAA,UAAK,CAAC,QACzE,eAAe,WAAW,GAAG;AAAA,QAC/B;AAAA,MACJ;AAAA,IAEJ,CAAC;AACD,QAAI,CAAC,SAAS,OAAQ;AACtB,eAAW,UAAU,SAAU,QAAO,WAAW,MAAM;AAAA,EACzD;AACA,aAAW,UAAU,sBAAsB;AACzC,UAAM,WAAW,UAAU,MAAM;AACjC,UAAM,WAAW,WAAW,MAAM;AAClC,QAAI,aAAa,UAAa,CAAC;AAC7B,eAAS;AAAA,QACP,GAAG,MAAM;AAAA,MACX;AACF,UAAM,YAAY,WACd,CAAC,QAAQ,IACT,kBAAkB,MAAM,EAAE;AAAA,MACxB,CAAC,QACC,CAAC,qBAAqB;AAAA,QACpB,CAAC,UAAU,UAAU,UAAU,KAAK,KAAK,EAAE,KAAK,CAAC,SAAS,eAAe,KAAK,IAAI,CAAC;AAAA,MACrF;AAAA,IACJ;AACJ,SAAK,MAAM,IAAI,WAAW,SAAS,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,WAAW,QAAQ,CAAC,CAAC,IAAI;AAC5E,QAAI,CAAC,KAAK,MAAM,EAAE,WAAW,aAAa,UAAa,SAAS,MAAM,EAAE,SAAS;AAC/E,eAAS,KAAK,GAAG,MAAM,iEAAiE;AAAA,EAC5F;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,CAAC,MAAM,WAAW,CAAC,aAAa,IAAI,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,QAAQA,YAAW,MAAM,GAAY,CAAC;AAAA,IAC3G,OAAO,CAAC,WAAY,KAAK,MAAM,EAAE,SAASC,gBAAe,KAAK,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI;AAAA,EACpF;AACF;AAEO,SAAS,wBACd,QACA,OACA,WACA,aACA,cACoB;AAEpB,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,CAAC,gBAAgB,KAAK,EAAG,QAAO;AACpC,QAAM,OAAO,EAAE,GAAG,WAAW,CAAC,MAAM,GAAG,MAAM;AAC7C,QAAM,WAAW,oBAAoB,MAAM,aAAa,YAAY;AACpE,QAAM,WAAW,oBAAoB,WAAW,aAAa,YAAY;AAEzE,aAAW,QAAQ,sBAAsB;AACvC,QACG,SAAS,UAAU,CAAC,SAAS,KAAK,IAAI,EAAE,SAAS,gBAAgB,KAAK,KAAK,EAAE,KAC7E,SAAS,UAAU,SAAS,KAAK,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,SAAS,GAAG,CAAC,GACxF;AACA,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,gBAAgB,oBAAI,QAA2B;AAC9C,SAAS,gBAAgB,KAAU,WAA+B;AACvE,gBAAc,IAAI,KAAK,SAAS;AAClC;AACO,SAAS,gBAAgB,KAAU,aAAgD;AACxF,SACE,cAAc,IAAI,GAAG,KACrB;AAAA,IACE,CAAC;AAAA,IACD,eACE,IAAI,mBAAmB;AAAA,MACrB,GAAG;AAAA,MACH,sBAAsB,EAAE,aAAa,YAAY;AAAA,IACnD,CAAC;AAAA,EACL;AAEJ;AAGO,IAAM,gBAAN,MAAoB;AAAA,EACjB,SAAS;AAAA,EACjB,QAAQ,MAAuB;AAC7B,UAAM,YAAY,KAAK;AACvB,UAAM,SAAS,KAAK,SAAS,WAAa;AAC1C,QAAI,OAAQ,MAAK,SAAS;AAC1B,QAAI,KAAK,UAAU,KAAK,SAAS,WAAa,EAAG,MAAK,SAAS;AAC/D,WAAO,aAAa;AAAA,EACtB;AACF;;;AD1NA,IAAM,4BAAN,cAAwC,MAAM;AAAA,EAC5C,cAAc;AACZ,UAAM,uCAAuC;AAC7C,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,iBACpB,KACA,KACA,UAAgC,CAAC,GACjC,eAA0C,CAAC,GAC/B;AACZ,QAAM,YACJ,aAAa,cACZ,CAAC,QAAa,OAAc,aAAiC,sBAC5D;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,gBAAgB;AAAA,IAClC,aAAa,gCAAgC,0BAA0B;AAAA,IACvE,aAAa,WAAW;AAAA,IACxB,aAAa,mBAAmB;AAAA,EAClC;AACJ,MAAI,iBAAiB,IAAI,GAAG,cAAc;AAC1C,MAAI,gBAAgB;AACpB,MAAI;AACJ,QAAM,UAAU,MAAM,IAAI,GAAG;AAAA,IAC3B,CAAC,QAAQ,OAAO,aAAa,SAAS;AACpC,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,UAAU;AACT,cAAI;AACF,6BAAiB,IAAI,GAAG,cAAc;AACtC,4BAAgB;AAAA,UAClB,QAAQ;AAAA,UAER;AACA,eAAK,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,WAAW,MAAM,iBAAiB,MAAM;AAAA,IACrD;AAAA,EACF;AACA,MAAI,eAAe;AACjB,QAAI;AACF,UAAI,IAAI,GAAG,cAAc,MAAM,eAAgB,KAAI,GAAG,cAAc,cAAc;AAAA,IACpF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,SAAU,OAAM,QAAQ;AAC7C,SAAO,QAAQ;AACjB;AAQA,IAAM,oBAAoB,oBAAI,QAA4C;AAE1E,SAAS,iBAAiB,WAA8B,MAAsC;AAC5F,MAAI,UAAU;AACd,aAAW,SAAS,CAAC,UAAU,WAAW,UAAU,gBAAgB,UAAU,OAAO,GAAG;AACtF,eAAW,YAAY,OAAO;AAC5B,YAAM,SAAS,SAAS,OAAO;AAC/B,UAAI,QAAQ,QAAS,QAAO;AAC5B,UAAI,QAAQ,SAAS,OAAW,WAAU,OAAO;AAAA,IACnD;AAAA,EACF;AACA,SAAO,YAAY,OAAO,SAAY,EAAE,MAAM,QAAQ;AACxD;AAEA,IAAM,kBAAN,cAA8B,aAAa;AAAA,EACzC,oBAA6B;AAC3B,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AAAA,EAES,iBAAiB,UAAwC;AAChE,QAAI,YAAY,kBAAkB,IAAI,IAAI;AAC1C,QAAI,CAAC,WAAW;AACd,YAAM,sBAAyC;AAAA,QAC7C,WAAW,oBAAI,IAAI;AAAA,QACnB,gBAAgB,oBAAI,IAAI;AAAA,QACxB,SAAS,oBAAI,IAAI;AAAA,MACnB;AACA,wBAAkB,IAAI,MAAM,mBAAmB;AAC/C,YAAM,iBAAiB,CAAC,SAAS,iBAAiB,qBAAqB,IAAI,CAAC;AAC5E,kBAAY;AAAA,IACd;AACA,cAAU,QAAQ,IAAI,QAAQ;AAC9B,WAAO,MAAM,UAAU,QAAQ,OAAO,QAAQ;AAAA,EAChD;AAAA,EAEA,0BAA0B,UAAwC;AAChE,UAAM,YAAY,kBAAkB,IAAI,IAAI;AAC5C,QAAI,CAAC,UAAW,QAAO,MAAM,iBAAiB,QAAQ;AACtD,cAAU,UAAU,IAAI,QAAQ;AAChC,WAAO,MAAM,UAAU,UAAU,OAAO,QAAQ;AAAA,EAClD;AAAA,EAEA,+BAA+B,UAAwC;AACrE,UAAM,YAAY,kBAAkB,IAAI,IAAI;AAC5C,QAAI,CAAC,UAAW,QAAO,MAAM,iBAAiB,QAAQ;AACtD,cAAU,eAAe,IAAI,QAAQ;AACrC,WAAO,MAAM,UAAU,eAAe,OAAO,QAAQ;AAAA,EACvD;AAAA,EAES,oBAAoB,UAAkC;AAC7D,UAAM,YAAY,kBAAkB,IAAI,IAAI;AAC5C,QAAI,CAAC,WAAW;AACd,YAAM,oBAAoB,QAAQ;AAClC;AAAA,IACF;AACA,cAAU,UAAU,OAAO,QAAQ;AACnC,cAAU,eAAe,OAAO,QAAQ;AACxC,cAAU,QAAQ,OAAO,QAAQ;AAAA,EACnC;AACF;AAEA,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAG5B,IAAM,mCAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,qBAAqB,CAAC,SAAS,QAAQ,OAAO,OAAO;AAC3D,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,wBAAwB,IAAI,IAAI,kCAAkC;AAExE,SAAS,gBAAgB,KAAqB;AAC5C,QAAM,QAAQ,IAAI,YAAY,EAAE,MAAM,GAAG;AACzC,QAAM,OAAO,MAAM,GAAG,EAAE;AACxB,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,iBAAiB,SAAS,QAAQ,WAAW,SAAS,WAAW,UAAU;AACjF,QAAM,YAAY,mBAAmB,OAAO,CAAC,aAAa,MAAM,SAAS,QAAQ,CAAC;AAClF,SAAO,CAAC,GAAG,WAAW,cAAc,EAAE,KAAK,GAAG;AAChD;AAEA,SAAS,wBAAwB,KAAqB;AACpD,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,OAAO,MAAM,GAAG,EAAE;AACxB,MAAI,SAAS,SAAU,OAAM,MAAM,SAAS,CAAC,IAAI;AACjD,MAAI,SAAS,WAAY,OAAM,MAAM,SAAS,CAAC,IAAI;AACnD,SAAOC,gBAAe,MAAM,KAAK,GAAG,CAAC;AACvC;AAEA,SAAS,iBAAiB,KAAsB;AAC9C,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,OAAO,MAAM,GAAG,EAAE,KAAK;AAC7B,QAAM,YAAY,MAAM,MAAM,GAAG,EAAE;AACnC,MAAI,SAAS,SAAU,QAAO,UAAU,WAAW;AACnD,MAAI,SAAS,SAAS;AACpB,WAAO,UAAU,WAAW,KAAM,UAAU,WAAW,MAAM,UAAU,CAAC,MAAM,WAAW,UAAU,CAAC,MAAM;AAAA,EAC5G;AACA,MAAI,uBAAuB,KAAK,IAAI,EAAG,QAAO,UAAU,WAAW;AACnE,SACE,uBAAuB,IAAI,IAAI,KAC9B,KAAK,WAAW,MAAM,cAAc,KAAK,IAAI,KAAK,sBAAsB,IAAI,IAAI;AAErF;AAEA,SAAS,aAAa,MAAkC;AACtD,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,UAAU,SAAS,MAAM,MAAM;AACrC,MAAI,CAAC,kCAAkC,SAAS,OAAO,EAAG,QAAO;AACjE,SAAO,OAAO,aAAa,QAAQ,WAAW,CAAC,IAAI,EAAI;AACzD;AAEA,SAAS,eAAe,KAAiC;AACvD,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,OAAO,MAAM,GAAG,EAAE,KAAK;AAC7B,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,OAAQ,QAAO,aAAa,IAAI;AACvE,MAAIC,uBAAsB,EAAG,QAAO;AACpC,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,SAAS,KAAK,WAAW,EAAG,QAAO,OAAS,IAAI;AACvF,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,MAAM,OAAO;AACnE,UAAM,QAAQ,aAAa,IAAI;AAC/B,WAAO,QAAQ,OAAS,KAAK,KAAK;AAAA,EACpC;AACA,SAAO;AACT;AAGA,SAAS,iBAAiB,KAAqB;AAC7C,QAAM,WAAW,gBAAgB,GAAG;AACpC,QAAM,QAAQ,eAAe,QAAQ;AACrC,SAAO,QAAQ,gBAAgB,SAAS,KAAK,KAAK,QAAQ,IAAI;AAChE;AAEA,SAAS,4BAAqC;AAC5C,SACE,OAAO,aAAa,UAAU,uBAAuB,cACrD,OAAO,aAAa,UAAU,mCAAmC;AAErE;AAEA,SAAS,uBACP,QACA,OACA,aACA,cACA,8BACA,SACAC,kBACkB;AAClB,MAAI,CAAC,gBAAgB,CAAC,8BAA8B;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,mBAAmB,CAAC,SAAiB,MAAM,GAAG,iBAAiB,MAAM,GAAG,mBAAmB,IAAI,CAAC;AACtG,QAAM,aAAa,IAAI,gBAAgB,OAAO,UAAU,OAAO,sBAAsB,GAAG,QAAW;AAAA,IACjG,OAAO;AAAA,IACP;AAAA,IACA,kBAAkB,CAAC,SAAS,MAAM,UAAU,iBAAiB,IAAI,CAAC;AAAA,IAClE,sBAAsB,MAAM;AAC1B,YAAM,2BAA2B,oBAAI,IAAY,CAAC,iBAAiBC,KAAI,KAAK,GAAG,CAAC,CAAC,CAAC;AAClF,iBAAW,UAAU,kCAAkC;AACrD,mBAAW,aAAa,YAAY,QAAQ,MAAM,GAAG;AACnD,mCAAyB,IAAI,iBAAiB,OAAO,SAAS,CAAC,CAAC;AAAA,QAClE;AAAA,MACF;AACA,UAAI,CAAC,cAAc;AACjB,mBAAW,WAAW,YAAY,QAAQ,kBAAkB,GAAG;AAC7D,mCAAyB,IAAI,iBAAiB,OAAO,OAAO,CAAC,CAAC;AAAA,QAChE;AAAA,MACF;AACA,YAAM,MAAM,YACT,QAAQ,sBAAsB,EAC9B,IAAI,CAAC,cAAc,iBAAiB,OAAO,SAAS,CAAC,CAAC,EACtD;AAAA,QACC,CAAC,aACC,YACA,iBAAiB,QAAQ,KACzB,CAAC,yBAAyB,IAAI,QAAQ,KACtC,wBAAwB,QAAQ;AAAA,MACpC;AACF,YAAM,QAAQ,MAAM,GAAG,QAAQ,gCAA2B;AAC1D,YAAM,WAAW,MAAM,MAAM,GAAG,SAAS,SAAM,wBAAwB,GAAG,CAAC,EAAE,IAAI;AACjF,aAAO,MAAM,GAAG,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG;AAAA,IACtD;AAAA,IACA,yBAAyB,CAAC,SAAS,MAAM,KAAK,MAAM,QAAQ,iBAAiB,IAAI,CAAC,CAAC;AAAA,IACnF;AAAA,IACA,eAAe,OAAO,SAAS;AAC7B,UAAI;AACF,cAAMD,iBAAgB,IAAI;AAC1B,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,CAAC,cAAc;AACjB,QAAI,qBAAqB;AACzB,eAAW,+BAA+B,CAAC,SAAS;AAClD,YAAM,sBAAsB;AAC5B,YAAM,uBAAuB,KAAK,SAAS,qBAAqB;AAChE,UAAI,qBAAsB,sBAAqB;AAC/C,UAAI,sBAAsB,KAAK,SAAS,mBAAmB,GAAG;AAC5D,6BAAqB;AAAA,MACvB;AACA,UACE,uBACA,wBACA,WAAW,kBAAkB,KAC7BE,cAAa,IAAI,KACjB,CAAC,YAAY,QAAQ,MAAM,kBAAkB,GAC7C;AACA,eAAO;AAAA,MACT;AACA,UAAI,CAAC,WAAW,mBAAmB,GAAG;AACpC,mBAAW,MAAM,sBAAsB;AACvC,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AACA,WAAK,WAAW,+BAA+B,EAAE,MAAM,MAAM,WAAW,MAAM,aAAa,CAAC;AAC5F,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAGA,SAAS,iBAAiB,QAAsB;AAC9C,QAAM,CAAC,SAAS,IAAI,IAClB,QAAQ,aAAa,WACjB,CAAC,QAAQ,CAAC,MAAM,CAAC,IACjB,QAAQ,aAAa,UACnB,CAAC,YAAY,CAAC,+BAA+B,MAAM,CAAC,IACpD,CAAC,YAAY,CAAC,MAAM,CAAC;AAC7B,QAAM,SAAS,MAAM,EAAE,OAAO,UAAU,UAAU,KAAK,CAAC,EACrD,GAAG,SAAS,MAAM;AAAA,EAAC,CAAC,EACpB,MAAM;AACX;AAEA,IAAM,oBAAN,MAAgD;AAAA,EAmB9C,YACmB,QACA,OACA,aACA,KACA,KACA,MACA,WACA,SACjB;AARiB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEjB,mBAAe,MAAM,KAAK,KAAK,MAAM,CAAC;AAAA,EACxC;AAAA,EAVmB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EA1BX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACS,qBAAqB,IAAI,gBAAgB;AAAA,EAe1D,iBAAiB,SAA8B;AAC7C,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,OAAO,OAAyB;AAC9B,WAAO,CAACC,iBAAgB,KAAK,MAAM,GAAG,SAAS,+BAA0B,GAAG,KAAK,CAAC;AAAA,EACpF;AAAA,EAEA,aAAmB;AAAA,EAAC;AAAA,EAEpB,UAAgB;AACd,QAAI,KAAK,YAAY,KAAK,SAAU;AACpC,SAAK,WAAW;AAChB,SAAK,mBAAmB,MAAM;AAC9B,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,MAAc,QAAuB;AACnC,QAAI,KAAK,WAAW,KAAK,SAAU;AACnC,SAAK,UAAU;AACf,SAAK,0BAA0B;AAC/B,QAAI;AACJ,QAAI;AACF,UAAI,KAAK,SAAU,OAAM,IAAI,0BAA0B;AACvD,WAAK,OAAO,KAAK,EAAE,gBAAgB,KAAK,CAAC;AACzC,WAAK,gBAAgB;AACrB,UAAI,KAAK,SAAU,OAAM,IAAI,0BAA0B;AACvD,WAAK,aAAa,KAAK,UAAU,KAAK,QAAQ,KAAK,OAAO,KAAK,aAAa,KAAK,OAAO;AACxF,WAAK,oBAAoB;AACzB,WAAK,WAAW,MAAM;AACtB,YAAM,YAAY;AAAA,QAChB,KAAK,QAAQ;AAAA,QACb,KAAK;AAAA,QACL,KAAK,QAAQ,gBAAgB;AAAA,MAC/B;AACA,sBAAgB,KAAK,YAAY,SAAS;AAG1C,UAAI,mBAAsC,CAAC;AAC3C,YAAM,iBAAiB,MAAM;AAC3B,cAAM,WAAW,UAAU;AAC3B,mBAAW,WAAW,UAAU;AAC9B,cAAI,iBAAiB,SAAS,OAAO,EAAG;AACxC,cAAI;AACF,iBAAK,IAAI,GAAG,OAAO,WAAW,OAAO,IAAI,SAAS;AAAA,UACpD,QAAQ;AAAA,UAER;AAAA,QACF;AACA,2BAAmB;AAAA,MACrB;AACA,YAAM,aAAa,IAAI,cAAc;AAErC,YAAM,wBACJ,KAAK,WAAW,2BAA2B,KAAK,KAAK,UAAU,KAC/D,KAAK,WAAW,gCAAgC,KAAK,KAAK,UAAU,KACpE,KAAK,WAAW,iBAAiB,KAAK,KAAK,UAAU;AACvD,WAAK,2BAA2B,sBAAsB,CAAC,SAAS;AAC9D,uBAAe;AACf,YAAI,WAAW,QAAQ,IAAI,KAAK,CAAC,UAAU,QAAQ,MAAM,MAAM,EAAG,QAAO;AACzE,aAAK,WAAW;AAChB,aAAK,mBAAmB,MAAM;AAC9B,YAAI;AACF,eAAK,yBAAyB;AAAA,QAChC,UAAE;AAKA,eAAK,mBAAmB;AAAA,QAC1B;AACA,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB,CAAC;AACD,gBAAU,EAAE,MAAM,aAAa,OAAO,MAAM,KAAK,IAAI,KAAK,cAAc,CAAC,EAAE;AAAA,IAC7E,SAAS,OAAO;AACd,gBAAU,EAAE,MAAM,UAAU,MAAM;AAAA,IACpC;AAEA,QAAI;AACF,WAAK,qBAAqB;AAAA,IAC5B,SAAS,OAAO;AACd,WAAK,iBAAiB;AAAA,IACxB;AACA,QAAI,KAAK,qBAAsB,OAAM,KAAK;AAAA,QACrC,MAAK,cAAc;AACxB,QAAI,KAAK,iBAAiB,OAAW,WAAU,EAAE,MAAM,UAAU,OAAO,KAAK,aAAa;AAC1F,SAAK,WAAW;AAChB,SAAK,KAAK,OAAO;AAAA,EACnB;AAAA,EAEQ,4BAAkC;AACxC,UAAM,SAAS,KAAK,IAAI;AACxB,QAAI,CAAC,OAAQ;AACb,UAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACxD,SAAK,8BAA8B,MAAM,OAAO,oBAAoB,SAAS,OAAO;AACpF,QAAI,OAAO,QAAS,SAAQ;AAAA,EAC9B;AAAA,EAEQ,qBAA2B;AACjC,QAAI,KAAK,uBAAuB,KAAK,uBAAwB;AAC7D,SAAK,sBAAsB;AAC3B,SAAK,uBAAuB,QAAQ,QAAQ,EAAE,KAAK,YAAY;AAC7D,UAAI;AACF,cAAM,KAAK,YAAY,SAAS,aAAa;AAAA,MAC/C,SAAS,OAAO;AACd,aAAK,iBAAiB;AAAA,MACxB;AACA,WAAK,sBAAsB;AAC3B,WAAK,cAAc;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAsB;AAC5B,UAAM,8BAA8B,KAAK;AACzC,SAAK,8BAA8B;AACnC,QAAI;AACF,oCAA8B;AAAA,IAChC,SAAS,OAAO;AACd,WAAK,iBAAiB;AAAA,IACxB;AACA,UAAM,2BAA2B,KAAK;AACtC,SAAK,2BAA2B;AAChC,QAAI;AACF,iCAA2B;AAAA,IAC7B,SAAS,OAAO;AACd,WAAK,iBAAiB;AAAA,IACxB;AACA,QAAI,KAAK,qBAAqB,CAAC,KAAK,mBAAmB;AACrD,WAAK,oBAAoB;AACzB,UAAI;AACF,aAAK,YAAY,KAAK,EAAE,gBAAgB,KAAK,CAAC;AAAA,MAChD,SAAS,OAAO;AACd,aAAK,iBAAiB;AAAA,MACxB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,iBAAiB,KAAK,uBAAwB;AACxD,UAAM,gBAAgB,KAAK;AAC3B,SAAK,gBAAgB;AACrB,QAAI;AACF,qBAAe,UAAU,IAAI;AAAA,IAC/B,SAAS,OAAO;AACd,WAAK,iBAAiB;AAAA,IACxB;AACA,QAAI;AACF,WAAK,yBAAyB;AAC9B,WAAK,OAAO,MAAM;AAClB,WAAK,OAAO,UAAU,KAAK;AAAA,IAC7B,SAAS,OAAO;AACd,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,gBAAyC;AAC/C,UAAM,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,MAChC,KAAK,CAAC,QAAQ,aAAa;AACzB,YAAI,aAAa,UAAU;AACzB,iBAAO,CAAQ,SAAkC,YAC/C,KAAK,WAAW,SAAS,OAAO;AAAA,QACpC;AACA,YAAI,aAAa,UAAU;AACzB,iBAAO,CAAC,SAAiB,UAAmE;AAC1F,mBAAO,OAAO,SAAS,KAAK;AAC5B,kBAAM,UAAU,mBAAmB,OAAO;AAC1C,gBAAI,QAAS,MAAK,YAAY,QAAQ,OAAO;AAAA,UAC/C;AAAA,QACF;AACA,cAAM,QAAQ,QAAQ,IAAI,QAAQ,UAAU,MAAM;AAClD,eAAO,OAAO,UAAU,aAAa,MAAM,KAAK,MAAM,IAAI;AAAA,MAC5D;AAAA,IACF,CAAC;AACD,UAAM,SAAS,KAAK,IAAI,SACpB,YAAY,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK,mBAAmB,MAAM,CAAC,IACjE,KAAK,mBAAmB;AAC5B,WAAO,IAAI,MAAM,KAAK,KAAK;AAAA,MACzB,KAAK,CAAC,QAAQ,aAAa;AACzB,YAAI,aAAa,KAAM,QAAO;AAC9B,YAAI,aAAa,SAAU,QAAO;AAClC,eAAO,QAAQ,IAAI,QAAQ,UAAU,MAAM;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,WAAkB,SAAkC,SAA4C;AACtG,UAAM,aAAa,KAAK;AACxB,QAAI,CAAC,cAAc,KAAK,YAAY,KAAK,UAAU;AACjD,aAAO,QAAQ,OAAO,IAAI,0BAA0B,CAAC;AAAA,IACvD;AACA,QAAI,KAAK,oBAAoB;AAC3B,aAAO,QAAQ,OAAO,IAAI,MAAM,iDAAiD,CAAC;AAAA,IACpF;AAEA,WAAO,IAAI,QAAe,CAAC,SAAS,WAAW;AAC7C,UAAI;AACJ,UAAI;AACJ,UAAI,UAAU;AACd,UAAI,gBAAgB;AACpB,UAAI,iBAAiB;AACrB,UAAI,SAAS;AACb,UAAI,iBAAiB;AACrB,UAAI,oBAAoB;AACxB,UAAI;AACJ,UAAI,kBAAkB;AAEtB,YAAM,mBAAmB,MAAM;AAC7B,YAAI,CAAC,aAAa,kBAAmB;AACrC,4BAAoB;AACpB,YAAI;AACF,oBAAU,UAAU;AAAA,QACtB,QAAQ;AAAA,QAER;AAAA,MACF;AACA,YAAM,UAAU,MAAM;AACpB,YAAI;AACJ,YAAI;AACF,cAAI,QAAS,SAAQ,KAAK;AAAA,mBACjB,WAAW,cAAe,YAAW,cAAc,MAAS;AAAA,mBAC5D,WAAW,UAAW,YAAW,YAAY,SAAS;AAAA,QACjE,SAAS,OAAO;AACd,yBAAe;AAAA,QACjB;AACA,YAAI,WAAW,SAAS;AACtB,cAAI;AACF,uBAAW,SAAS,IAAI;AACxB,uBAAW,cAAc;AAAA,UAC3B,SAAS,OAAO;AACd,6BAAiB;AAAA,UACnB;AAAA,QACF;AACA,yBAAiB;AACjB,YAAI,iBAAiB,OAAW,OAAM;AAAA,MACxC;AACA,YAAM,WAAW,MAAM;AACrB,YAAI,kBAAkB,CAAC,gBAAiB;AACxC,yBAAiB;AACjB,aAAK,qBAAqB;AAC1B,aAAK,yBAAyB;AAC9B,YAAI,CAAC,gBAAgB;AACnB,kBAAQ,YAAqB;AAC7B;AAAA,QACF;AACA,YAAI;AACF,kBAAQ;AACR,kBAAQ,YAAqB;AAAA,QAC/B,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AACA,YAAM,QAAQ,CAAC,UAAiB;AAC9B,YAAI,UAAU,eAAgB;AAC9B,iBAAS;AACT,uBAAe;AACf,0BAAkB;AAClB,iBAAS;AAAA,MACX;AACA,YAAM,OAAO,CAAC,UAAmB;AAC/B,YAAI,eAAgB;AACpB,iBAAS;AACT,yBAAiB;AACjB,aAAK,qBAAqB;AAC1B,aAAK,yBAAyB;AAC9B,YAAI;AACF,kBAAQ;AACR,iBAAO,KAAK;AAAA,QACd,SAAS,cAAc;AACrB,iBAAO,YAAY;AAAA,QACrB;AAAA,MACF;AACA,WAAK,qBAAqB,MAAM;AAC9B,YAAI,eAAgB;AACpB,yBAAiB;AACjB,YAAI,CAAC,eAAgB,MAAK,IAAI,0BAA0B,CAAC;AAAA,MAC3D;AACA,WAAK,yBAAyB,MAAM;AAClC,YAAI,eAAgB;AACpB,YAAI;AACF,qBAAW,cAAc,GAAQ;AAAA,QACnC,SAAS,OAAO;AACd,eAAK,KAAK;AACV;AAAA,QACF;AACA,aAAK,qBAAqB;AAAA,MAC5B;AAEA,UAAI;AACJ,UAAI;AACF,kBAAU,QAAQ,YAAY,KAAK,OAAO,KAAK,aAAa,KAAK;AAAA,MACnE,SAAS,OAAO;AACd,yBAAiB;AACjB,aAAK,KAAK;AACV;AAAA,MACF;AACA,cAAQ,QAAQ,OAAO,EACpB,KAAK,CAAC,UAAU;AACf,oBAAY;AACZ,yBAAiB;AACjB,YAAI,gBAAgB;AAClB,2BAAiB;AACjB;AAAA,QACF;AACA,YAAI,QAAQ;AACV,mBAAS;AACT;AAAA,QACF;AACA,YAAI,SAAS,SAAS;AACpB,gBAAM,iBACJ,OAAO,QAAQ,mBAAmB,aAAa,QAAQ,eAAe,IAAI,QAAQ;AACpF,oBAAU,WAAW,YAAY,WAAW,cAAc;AAC1D,kBAAQ,WAAW,OAAO;AAAA,QAC5B,OAAO;AACL,qBAAW,MAAM;AACjB,oBAAU;AACV,cAAI,4BAA4B,SAAS,GAAG;AAC1C,4BAAgB;AAChB,uBAAW,cAAc,UAAU,oBAAoB,CAAC;AAAA,UAC1D,OAAO;AACL,uBAAW,SAAS,SAAS;AAAA,UAC/B;AACA,qBAAW,SAAS,SAAS;AAC7B,qBAAW,cAAc;AAAA,QAC3B;AAAA,MACF,CAAC,EACA,MAAM,IAAI;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEA,SAAS,4BAA4B,WAAiE;AACpG,SAAO,yBAAyB,aAAa,OAAO,UAAU,wBAAwB;AACxF;;;AG9vBA;AAAA,EACE;AAAA,EAKA;AAAA,OACK;AACP,SAAyC,OAAAC,MAAK,cAAAC,mBAAkB;;;ACRhE,SAAmB,kCAA8C;AACjE;AAAA,EACE;AAAA,OAIK;;;ACNP,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAC1B,SAAS,OAAO,MAAM,QAAQ,IAAI,iBAAiB;AACnD,SAAS,UAAU,SAAS,YAAY;AACxC,SAAS,mBAAmB;;;ACOrB,IAAM,sBAAsB,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,SAAS,KAAK;AAkCtF,SAAS,iBAAiB,qBAAyC;AACxE,SAAO,EAAE,qBAAqB,OAAO,CAAC,EAAE;AAC1C;AAEO,SAAS,wBAAwB,QAAoB,UAA6B;AACvF,QAAM,gBAAgB,OAAO,MAAM;AAAA,IACjC,CAAC,SAAgE,KAAK,SAAS;AAAA,EACjF;AACA,QAAM,WAAsB,CAAC;AAE7B,MAAI,cAAc,WAAW,GAAG;AAC9B,aAAS,KAAK,kBAAkB,gBAAgB,UAAU,OAAO,mBAAmB,CAAC,CAAC;AACtF,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,WAAS,KAAK,kBAAkB,gBAAgB,MAAM,UAAU,OAAO,mBAAmB,CAAC,GAAG,MAAM,QAAQ;AAC5G,aAAW,QAAQ,MAAM;AACvB,aAAS,KAAK,kBAAkB,oBAAoB,KAAK,QAAQ,CAAC,GAAG,KAAK,QAAQ;AAAA,EACpF;AACA,WAAS,KAAK,kBAAkB,oBAAoB,QAAQ,CAAC,CAAC;AAC9D,SAAO;AACT;AAkBA,eAAsB,uBAAuB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyE;AACvE,MAAI,QAAQ,QAAS,QAAO,EAAE,MAAM,UAAU;AAC9C,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,EAAE,cAAc,eAAe,UAAU,wBAAwB,QAAQ,QAAQ,EAAE;AAAA,MACnF,mBAAmB,MAAM,EAAE,eAAe,QAAQ,OAAO,UAAU,CAAC;AAAA,IACtE;AACA,QAAI,QAAQ,WAAW,UAAU,eAAe,UAAW,QAAO,EAAE,MAAM,UAAU;AACpF,QAAI,CAAC,mBAAmB,QAAQ,GAAG;AACjC,aAAO,EAAE,MAAM,SAAS,SAAS,gDAAgD;AAAA,IACnF;AACA,QAAI,SAAS,eAAe,SAAS;AACnC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,SAAS,gBAAgB;AAAA,MACpC;AAAA,IACF;AAEA,UAAM,SAAS,qBAAqB,QAAQ,KAAK;AACjD,WAAO,MAAM,KAAK,EAAE,MAAM,YAAY,UAAU,QAAQ,SAAS,CAAC;AAClE,WAAO,EAAE,MAAM,YAAY,UAAU,OAAO;AAAA,EAC9C,SAAS,OAAgB;AACvB,QAAI,QAAQ,QAAS,QAAO,EAAE,MAAM,UAAU;AAC9C,WAAO,EAAE,MAAM,SAAS,SAAS,YAAY,KAAK,EAAE;AAAA,EACtD;AACF;AAiCO,SAAS,qBAAqB,UAAoC;AACvE,SAAO,SAAS,QACb;AAAA,IACC,CAAC,YACC,YAAY,QAAQ,OAAO,YAAY,YAAY,QAAQ,SAAS,UAAU,OAAO,QAAQ,SAAS;AAAA,EAC1G,EACC,IAAI,CAAC,YAAY,QAAQ,IAAI,EAC7B,KAAK,IAAI,EACT,KAAK;AACV;AAEA,SAAS,mBAAmB,OAA2C;AACrE,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,YAAY;AAClB,SAAO,UAAU,SAAS,eAAe,MAAM,QAAQ,UAAU,OAAO,KAAK,OAAO,UAAU,eAAe;AAC/G;AAEO,SAAS,gBAAgB,UAAkB,qBAAqC;AACrF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,IACvB;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,oBAAoB,UAA0B;AAC5D,SAAO,CAAC,wCAAwC,IAAI,mBAAmB,UAAU,kBAAkB,EAAE,KAAK,IAAI;AAChH;AAEA,SAAS,kBAAkB,MAA2B;AACpD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IAChC,WAAW,KAAK,IAAI;AAAA,EACtB;AACF;AAQA,IAAM,gBAAgB;AAEtB,SAAS,oBAAoB,SAAsC;AACjE,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,WAAO,IAAI,IAAI,OAAO,EAAE,aAAa;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,0BACP,OACA,WAC6B;AAC7B,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,MAAM,aAAa,cAAc,MAAM,aAAa,iBAAiB,CAAC,oBAAoB,MAAM,OAAO,GAAG;AAC5G,WAAO;AAAA,EACT;AACA,SAAO,EAAE,sBAAsB,WAAW,qBAAqB,KAAK;AACtE;AAEA,SAAS,oBACP,aACA,gBAC6B;AAC7B,MAAI,CAAC,kBAAkB,CAAC,YAAa,QAAO;AAE5C,SAAO,EAAE,GAAG,gBAAgB,GAAG,YAAY;AAC7C;AASA,SAAS,mBACP,MACA,EAAE,eAAe,QAAQ,OAAO,UAAU,GACrB;AACrB,QAAM,iBAAiB,QAAQ,0BAA0B,OAAO,SAAS,IAAI;AAC7E,QAAM,UAA+B;AAAA,IACnC,QAAQ,KAAK;AAAA,IACb,SAAS,oBAAoB,KAAK,SAAS,cAAc;AAAA,IACzD,KAAK,KAAK;AAAA,IACV;AAAA,EACF;AACA,MAAI,kBAAkB,MAAO,SAAQ,YAAY;AACjD,SAAO;AACT;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAEA,IAAM,gBAAgB;AAAA;AAAA;;;AD3Pf,IAAM,oBAAoB;AAC1B,IAAM,oCAAoC;AAC1C,IAAM,0CAA0C;AACvD,IAAM,qBAAqB,KAAK;AAiChC,IAAM,iBAAiB,oBAAI,IAA2B;AAE/C,SAAS,kBAA0B;AACxC,SAAO,KAAK,YAAY,GAAG,iBAAiB;AAC9C;AAEO,SAAS,qBAAqB,OAAyC;AAC5E,MAAI,CAAC,mBAAmB,KAAK,EAAG,QAAO;AAEvC,QAAM,WAAwB,CAAC;AAC/B,MAAI,OAAO,OAAO,OAAO,aAAa,GAAG;AACvC,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,mBAAmB,IAAI,EAAG,QAAO;AACtC,aAAS,cAAc,CAAC;AACxB,eAAW,UAAU,sBAAsB;AACzC,UAAI,CAAC,OAAO,OAAO,MAAM,MAAM,EAAG;AAClC,YAAM,MAAM,gBAAgB,KAAK,MAAM,CAAC;AACxC,UAAI,CAAC,IAAK,QAAO;AACjB,eAAS,YAAY,MAAM,IAAI;AAAA,IACjC;AAAA,EACF;AACA,MAAI,OAAO,OAAO,OAAO,OAAO,GAAG;AACjC,UAAM,QAAQ,QAAQ,IAAI,OAAO,OAAO;AACxC,QAAI,OAAO,UAAU,YAAY,CAAC,uBAAuB,KAAK,EAAG,QAAO;AACxE,aAAS,QAAQ;AAAA,EACnB;AACA,MAAI,OAAO,OAAO,OAAO,eAAe,GAAG;AACzC,UAAM,gBAAgB,QAAQ,IAAI,OAAO,eAAe;AACxD,QAAI,CAAC,mBAAmB,aAAa,EAAG,QAAO;AAC/C,aAAS,gBAAgB;AAAA,EAC3B;AACA,MAAI,OAAO,OAAO,OAAO,8BAA8B,GAAG;AACxD,UAAM,WAAW,QAAQ,IAAI,OAAO,8BAA8B;AAClE,QAAI,OAAO,aAAa,UAAW,QAAO;AAC1C,aAAS,+BAA+B;AAAA,EAC1C;AACA,MAAI,OAAO,OAAO,OAAO,wBAAwB,GAAG;AAClD,UAAM,eAAe,QAAQ,IAAI,OAAO,wBAAwB;AAChE,QAAI,OAAO,iBAAiB,UAAW,QAAO;AAC9C,aAAS,yBAAyB;AAAA,EACpC;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,WAAsE;AAC3G,MAAI,cAAc,KAAK,SAAS,EAAG,QAAO;AAC1C,QAAM,YAAY,UAAU,QAAQ,GAAG;AACvC,MAAI,aAAa,KAAK,cAAc,UAAU,SAAS,EAAG,QAAO;AACjE,SAAO,EAAE,UAAU,UAAU,MAAM,GAAG,SAAS,GAAG,SAAS,UAAU,MAAM,YAAY,CAAC,EAAE;AAC5F;AAEO,SAAS,gCAAgC,UAAgC;AAC9E,SAAO,SAAS,0BAA0B;AAC5C;AAEO,SAAS,sCAAsC,UAAgC;AACpF,SAAO,SAAS,gCAAgC;AAClD;AAEA,eAAsB,gBAAgB,eAAe,gBAAgB,GAAmC;AACtG,QAAM,uBAAuB,YAAY;AACzC,SAAO,6BAA6B,YAAY;AAClD;AAEO,SAAS,kBACd,OACA,UAAoC,CAAC,GACf;AACtB,QAAM,eAAe,QAAQ,gBAAgB,gBAAgB;AAC7D,SAAO,gBAAgB,cAAc,YAAY;AAC/C,YAAQ,QAAQ,eAAe;AAC/B,UAAM,UAAU,MAAM,8BAA8B,YAAY;AAChE,YAAQ,QAAQ,eAAe;AAC/B,YAAQ,kBAAkB,qBAAqB,OAAO,KAAK,CAAC,CAAC;AAC7D,UAAM,UAAU,sBAAsB,SAAS,KAAK;AACpD,UAAM,WAAW,qBAAqB,OAAO;AAC7C,QAAI,CAAC,SAAU,OAAM,qBAAqB,cAAc,wBAAwB;AAChF,UAAM,gBAAgB,cAAc,SAAS,QAAQ,QAAQ,QAAQ,YAAY;AACjF,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,uBAAuB,eAAe,gBAAgB,GAAkB;AAC5F,QAAM,eAAe,IAAI,YAAY;AACvC;AAEA,SAAS,gBAAmB,cAAsB,UAAwC;AACxF,QAAM,WAAW,eAAe,IAAI,YAAY,KAAK,QAAQ,QAAQ;AACrE,QAAM,SAAS,SAAS,KAAK,UAAU,QAAQ;AAC/C,QAAM,UAAU,OAAO;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,iBAAe,IAAI,cAAc,OAAO;AACxC,OAAK,QAAQ,QAAQ,MAAM;AACzB,QAAI,eAAe,IAAI,YAAY,MAAM,QAAS,gBAAe,OAAO,YAAY;AAAA,EACtF,CAAC;AACD,SAAO;AACT;AAEA,eAAe,6BAA6B,cAAsD;AAChG,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,qBAAqB,YAAY;AAAA,EACpD,SAAS,OAAgB;AACvB,QAAI,YAAY,KAAK,KAAK,MAAM,SAAS,SAAU,QAAO,EAAE,MAAM,UAAU;AAC5E,WAAO,EAAE,MAAM,WAAW,QAAQ,GAAG,YAAY,KAAKC,aAAY,KAAK,CAAC,GAAG;AAAA,EAC7E;AAEA,MAAI;AACF,UAAM,WAAW,qBAAqB,KAAK,MAAM,QAAQ,CAAY;AACrE,WAAO,WACH,EAAE,MAAM,UAAU,SAAS,IAC3B,EAAE,MAAM,WAAW,QAAQ,GAAG,YAAY,2BAA2B;AAAA,EAC3E,QAAQ;AACN,WAAO,EAAE,MAAM,WAAW,QAAQ,GAAG,YAAY,iBAAiB;AAAA,EACpE;AACF;AAEA,eAAe,8BAA8B,cAAiD;AAC5F,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,qBAAqB,YAAY;AAAA,EACpD,SAAS,OAAgB;AACvB,QAAI,YAAY,KAAK,KAAK,MAAM,SAAS,SAAU,QAAO,CAAC;AAC3D,UAAM,qBAAqB,cAAcA,aAAY,KAAK,CAAC;AAAA,EAC7D;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,QAAQ;AAAA,EAC9B,QAAQ;AACN,UAAM,qBAAqB,cAAc,cAAc;AAAA,EACzD;AACA,MAAI,CAAC,mBAAmB,MAAM,KAAK,CAAC,qBAAqB,MAAM,GAAG;AAChE,UAAM,qBAAqB,cAAc,wBAAwB;AAAA,EACnE;AACA,SAAO;AACT;AAEA,eAAe,qBAAqB,cAAuC;AACzE,QAAM,QAAQ,UAAU,YAAY,UAAU,cAAc;AAC5D,QAAM,SAAS,MAAM,KAAK,cAAc,KAAK;AAC7C,MAAI;AACF,UAAM,kBAAkB,MAAM,OAAO,KAAK;AAC1C,QAAI,CAAC,gBAAgB,OAAO,EAAG,OAAM,IAAI,MAAM,qCAAqC;AACpF,QAAI,gBAAgB,OAAO,oBAAoB;AAC7C,YAAM,IAAI,MAAM,yBAAyB,kBAAkB,QAAQ;AAAA,IACrE;AAEA,UAAM,SAAS,OAAO,MAAM,qBAAqB,CAAC;AAClD,QAAI,SAAS;AACb,WAAO,SAAS,OAAO,YAAY;AACjC,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,KAAK,QAAQ,QAAQ,OAAO,aAAa,QAAQ,MAAM;AAC1F,UAAI,cAAc,EAAG;AACrB,gBAAU;AAAA,IACZ;AACA,QAAI,SAAS,oBAAoB;AAC/B,YAAM,IAAI,MAAM,yBAAyB,kBAAkB,QAAQ;AAAA,IACrE;AACA,QAAI;AACF,aAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC,EAAE,OAAO,OAAO,SAAS,GAAG,MAAM,CAAC;AAAA,IACrG,QAAQ;AACN,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAAA,EACF,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;AAEA,eAAe,gBACb,cACA,UACA,QACA,cACe;AACf,UAAQ,eAAe;AACvB,QAAM,WAAW,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA;AACrD,MAAI,OAAO,WAAW,UAAU,MAAM,IAAI,oBAAoB;AAC5D,UAAM,IAAI,MAAM,6BAA6B,kBAAkB,QAAQ;AAAA,EACzE;AACA,QAAM,YAAY,QAAQ,YAAY;AACtC,QAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAQ,eAAe;AACvB,QAAM,gBAAgB,KAAK,WAAW,IAAI,SAAS,YAAY,CAAC,IAAI,QAAQ,GAAG,IAAI,WAAW,CAAC,MAAM;AACrG,MAAI;AACF,UAAM,UAAU,eAAe,UAAU;AAAA,MACvC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AACD,UAAM,eAAe,eAAe,YAAY;AAChD,YAAQ,eAAe;AACvB,UAAM,OAAO,eAAe,YAAY;AAAA,EAC1C,SAAS,OAAO;AACd,UAAM,GAAG,eAAe,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC9D,UAAM;AAAA,EACR;AACF;AAEA,SAAS,sBAAsB,SAA2B,OAA2C;AACnG,QAAM,UAA4B,EAAE,GAAG,QAAQ;AAC/C,MAAI,MAAM,aAAa;AACrB,UAAM,OAAO,mBAAmB,QAAQ,WAAW,IAAI,EAAE,GAAG,QAAQ,YAAY,IAAI,CAAC;AACrF,eAAW,UAAU,sBAAsB;AACzC,UAAI,CAAC,OAAO,OAAO,MAAM,aAAa,MAAM,EAAG;AAC/C,UAAI,MAAM,YAAY,MAAM,MAAM,OAAW,QAAO,KAAK,MAAM;AAAA,UAC1D,MAAK,MAAM,IAAI,MAAM,YAAY,MAAM;AAAA,IAC9C;AACA,QAAI,OAAO,KAAK,IAAI,EAAE,OAAQ,SAAQ,cAAc;AAAA,QAC/C,QAAO,QAAQ;AAAA,EACtB;AACA,MAAI,OAAO,OAAO,OAAO,OAAO,GAAG;AACjC,QAAI,MAAM,UAAU,OAAW,QAAO,QAAQ;AAAA,QACzC,SAAQ,QAAQ,MAAM;AAAA,EAC7B;AACA,MAAI,OAAO,OAAO,OAAO,eAAe,GAAG;AACzC,QAAI,MAAM,kBAAkB,OAAW,QAAO,QAAQ;AAAA,QACjD,SAAQ,gBAAgB,MAAM;AAAA,EACrC;AACA,MAAI,OAAO,OAAO,OAAO,8BAA8B,GAAG;AACxD,YAAQ,+BAA+B,MAAM;AAAA,EAC/C;AACA,MAAI,OAAO,OAAO,OAAO,wBAAwB,GAAG;AAClD,QAAI,MAAM,2BAA2B,OAAW,QAAO,QAAQ;AAAA,QAC1D,SAAQ,yBAAyB,MAAM;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAA2C;AACrE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,mBAAmB,OAA2C;AACrE,SAAO,oBAAoB,SAAS,KAAyB;AAC/D;AAEA,SAAS,qBAAqB,cAAsB,QAAuB;AACzE,SAAO,IAAI,MAAM,sBAAsB,YAAY,iBAAiB,MAAM,EAAE;AAC9E;AAEA,SAAS,YAAY,OAAgD;AACnE,SAAO,iBAAiB,SAAS,UAAU;AAC7C;AAEA,SAASA,aAAY,OAAwB;AAC3C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;AD/NA,IAAM,sBAAsB;AAU5B,eAAsB,mBACpB,KACA,SAC+B;AAC/B,MAAI,IAAI,SAAS,MAAO,QAAO;AAC/B,QAAM,EAAE,YAAY,SAAS,qBAAqB,IAAI,MAAM,OAAO,sBAAsB;AACzF,MAAI,IAAI,QAAQ,QAAS,QAAO;AAChC,QAAM,eAAe,QAAQ,gBAAgB,gBAAgB;AAC7D,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,eAAe,IAAI,cAAc;AACvC,QAAM,qBAAqB;AAAA,IACzB,QAAQ,oBACL,OAAO,iBAAiB,aAAa,aAAa,KAAK,IAAI,aAAa,IAAI,IAAI,cAAc,OAAO;AAAA,EAC1G;AACA,QAAM,eAAe,QAAQ,gBAAgB,IAAI;AACjD,QAAM,eAAe,QAAQ,gBAAgB,IAAI,gBAAgB,CAAC;AAClE,QAAM,mBAAmB,uBAAuB,oBAAoB,YAAY;AAChF,QAAM,eAAe,IAAI,IAAI,iBAAiB,IAAI,CAAC,OAAO,UAAU,CAAC,OAAO,sBAAsB,KAAK,EAAE,CAAC,CAAC;AAC3G,QAAM,iBAAiB,IAAI,IAAI,iBAAiB,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,KAAK,GAAa,KAAK,CAAC,CAAC;AAC1G,QAAM,oBAAoB,CAAC,OAAe,aAA6B;AACrE,UAAM,OAAO,qBAAqB,KAAK,EAAE,KAAK,KAAK;AACnD,WAAO,CAAC,GAAG,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE;AAAA,EACxC;AACA,QAAM,wBAAwB,CAAC,UAC7B,GAAG,kBAAkB,MAAM,IAAI,eAAe,CAAC,KAAK,kBAAkB,MAAM,UAAU,kBAAkB,CAAC;AAC3G,QAAM,oBAAoB,CAAC,UAAmE;AAC5F,UAAM,YAAY,GAAG,MAAM,QAAQ,IAAI,MAAM,EAAE;AAC/C,UAAM,SAAS,uBAAuB,SAAS;AAC/C,WAAO,QAAQ,aAAa,MAAM,YAAY,OAAO,YAAY,MAAM,KAAK,YAAY;AAAA,EAC1F;AACA,QAAM,sBAAsB,mBAAmB,YAAY;AAC3D,QAAM,gBAAgB,QAAQ,iBAAiB,CAAC;AAChD,MAAI,gBAAgB;AACpB,MAAI,eAAe;AACnB,MAAI;AACJ,MAAI;AACJ,MAAI,WAA8B;AAClC,QAAM,iBAAoD;AAAA,IACxD,MAAM;AAAA,IACN,oBAAoB;AAAA,IACpB,aAAa;AAAA,EACf;AACA,QAAM,gBAAgB,CAAC,UAAuB,WAAsC;AAClF,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,YAAY,oBAAoB,SAAS,aAAa,aAAa,gCAAgC,QAAQ,CAAC;AAClH,UAAM,aAAa,SAAS,cAAc,MAAM;AAChD,QAAI,eAAe,UAAa,CAAC,UAAU,KAAK,MAAM,EAAE,SAAS,UAAU,GAAG;AAC5E,aAAO,aAAa,UAAU,MAAM,MAAM,CAAC,WAAWC,gBAAe,UAAU,CAAC;AAAA,IAClF;AACA,UAAM,SAAS,eAAe,SAAa,WAAW,uBAAuB,eAAe,YAAa;AACzG,WAAO,GAAG,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EAC9C;AACA,QAAM,eAAe,OAAO,OAAqB,OAA2B,WAAwB;AAClG,QAAI,CAAC,eAAe,MAAM,SAAS,WAAW,OAAO,QAAS,QAAO,EAAE,MAAM,WAAW;AACxF,UAAM,SAAS;AACf,UAAM,UAAU;AAChB,UAAM,WAAW,CAAC,aAChB;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS,eAAe,CAAC;AAAA,MACzB;AAAA,MACA,gCAAgC,QAAQ;AAAA,IAC1C;AACF,UAAM,QAAQ,SAAS,MAAM,QAAQ;AACrC,QAAI,OAAO;AACT,mBAAa,KAAK,OAAO,OAAO;AAChC,aAAO,EAAE,MAAM,WAAW;AAAA,IAC5B;AACA,QAAI;AACF,YAAM;AAAA,QACJ,EAAE,aAAa,EAAE,CAAC,MAAM,GAAG,UAAU,SAAY,SAAY,gBAAgB,KAAK,EAAE,EAAE;AAAA,QACtF;AAAA,UACE;AAAA,UACA;AAAA,UACA,iBAAiB,CAAC,aAAa;AAC7B,kBAAM,WAAW,SAAS,QAAQ;AAClC,gBAAI,SAAU,OAAM,IAAI,MAAM,QAAQ;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,QAAS,QAAO,EAAE,MAAM,WAAW;AAC9C,mBAAa,KAAK,gEAAgE,MAAM;AACxF,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB,SAASC,QAAO;AACd,UAAI,CAAC,OAAO,QAAS,mBAAkB,KAAKA,MAAK;AACjD,aAAO,EAAE,MAAM,WAAW;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,YAAY,OAChB,OACA,WAC4F;AAC5F,UAAM,iBAAiB,QAAQ,kBAAkB,KAAK,IAAI;AAC1D,QAAI,SAAS,CAAC,eAAgB,QAAO,EAAE,MAAM,YAAY;AACzD,UAAMC,UAAS,MAAM,IAAI,GAAG;AAAA,MAC1B,CAAC,KAAK,OAAO,cAAc,SAAS;AAClC,cAAM,SAAS,IAAI,eAAe,KAAK,OAAO,wBAAwB;AACtE,cAAM,kBAAkB,IAAI,gBAAgB;AAC5C,cAAM,aAAa,YAAY,IAAI,CAAC,QAAQ,OAAO,QAAQ,gBAAgB,MAAM,CAAC;AAClF,YAAI,UAAU;AACd,cAAM,SAAS,CAAC,UAA0F;AACxG,cAAI,QAAS;AACb,oBAAU;AACV,eAAK,KAAK;AAAA,QACZ;AACA,cAAM,SAAS,MAAM,OAAO,EAAE,MAAM,YAAY,CAAC;AACjD,eAAO,UAAU;AACjB,mBAAW,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC3D,uBAAe,MAAM;AACnB,gBAAM,YAAY;AAEhB,kBAAM,QAAQ,QAAQ;AACtB,gBAAI,WAAW,QAAS;AACxB,gBAAI;AACF,oBAAM,eAAe,EAAE,OAAO,eAAe,GAAG,EAAE,cAAc,QAAQ,WAAW,CAAC;AACpF,qBAAO,EAAE,MAAM,QAAQ,CAAC;AAAA,YAC1B,SAAS,OAAO;AACd,qBAAO,WAAW,UAAU,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,UAAU,MAAM,CAAC;AAAA,YAC/E;AAAA,UACF,GAAG;AAAA,QACL,CAAC;AACD,eAAO;AAAA,UACL,QAAQ,CAAC,UAAkB,OAAO,OAAO,KAAK;AAAA,UAC9C,YAAY,MAAM,OAAO,WAAW;AAAA,UACpC,aAAa,CAAC,SAAiB,OAAO,YAAY,IAAI;AAAA,UACtD,UAAU;AACR,4BAAgB,MAAM,IAAI,aAAa,8BAA8B,YAAY,CAAC;AAClF,mBAAO,QAAQ;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAOA,WAAU,EAAE,MAAM,YAAY;AAAA,EACvC;AAEA,QAAM,YAAY,YAAmC;AACnD,UAAM,SAAS,MAAM,aAAa,YAAY;AAC9C,QAAI,OAAO,SAAS,WAAW;AAC7B,aAAO,EAAE,MAAM,WAAW,UAAU,CAAC,GAAG,QAAQ,OAAO,OAAO;AAAA,IAChE;AACA,WAAO,EAAE,MAAM,SAAS,UAAU,OAAO,SAAS,WAAW,OAAO,WAAW,CAAC,EAAE;AAAA,EACpF;AACA,QAAM,kBAAkB,CAAC,aAAkD;AACzE,QAAI,CAAC,SAAS,MAAO,QAAO;AAC5B,UAAM,YAAY,uBAAuB,SAAS,KAAK;AACvD,WAAO,YACH,mBAAmB,KAAK,CAAC,UAAU,MAAM,aAAa,UAAU,YAAY,MAAM,OAAO,UAAU,OAAO,IAC1G;AAAA,EACN;AACA,QAAM,4BAA4B,CAAC,aAAkD;AACnF,UAAM,aAAa,gBAAgB,QAAQ;AAC3C,WAAO,aAAa,iBAAiB,KAAK,CAAC,UAAU,UAAU,OAAO,UAAU,CAAC,IAAI;AAAA,EACvF;AACA,QAAM,iBAAiB,CAAC,aAA8C;AACpE,UAAM,aAAa,QAAQ;AAC3B,UAAM,iBAAiB,gBAAgB,QAAQ,KAAK;AACpD,UAAM,YACJ,cAAc,WAAW,SAAS,IAC9B,aACA,iBACE,2BAA2B,cAAc,IACzC;AACR,WAAO,UAAU,SAAS,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,KAAK;AAAA,EACvD;AACA,QAAM,2BAA2B,CAAC,aAChC,8BAA8B,QAAQ,sBAAsB,eAAe,QAAQ,CAAC;AACtF,QAAM,uBAAuB,CAAC,aAC5B,SAAS,kBAAkB,SACvB,sBACA,8BAA8B,SAAS,eAAe,eAAe,QAAQ,CAAC;AACpF,QAAM,yBAAyB,CAAC,aAC9B,SAAS,kBAAkB,SACvB,GAAG,mBAAmB,eAAe,yBAAyB,QAAQ,CAAC,MACvE,qBAAqB,QAAQ;AACnC,QAAM,yBAAyB,CAAC,aAAkC;AAChE,UAAM,QAAQ,sCAAsC,QAAQ,IAAI,OAAO;AACvE,WAAO,SAAS,kBAAkB,SAAY,GAAG,KAAK,yBAAyB;AAAA,EACjF;AACA,QAAM,oBAAoB,CAAC,aAAkC;AAC3D,QAAI,CAAC,SAAS,OAAO;AACnB,aAAO,eAAe,GAAG,mBAAmB,KAAK,sBAAsB,YAAY,CAAC,MAAM;AAAA,IAC5F;AACA,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,QAAI,CAAC,UAAW,QAAO,GAAG,mBAAmB,SAAM,kBAAkB,SAAS,OAAO,eAAe,CAAC;AACrG,UAAM,YAAY,sBAAsB,SAAS;AACjD,WAAO,0BAA0B,QAAQ,IAAI,YAAY,GAAG,SAAS;AAAA,EACvE;AACA,QAAM,aAAa,CAAC,aAA0B;AAC5C,UAAM,aAAa,gBAAgB,QAAQ;AAC3C,UAAM,aAAa,0BAA0B,QAAQ;AACrD,UAAM,WAAW,SAAS,SAAS,CAAC;AACpC,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa,eACT,aAAa,sBAAsB,YAAY,CAAC,KAChD;AAAA,MACN;AAAA,MACA,GAAG,iBAAiB,IAAI,CAAC,UAAU;AACjC,cAAM,YAAY,sBAAsB,KAAK;AAC7C,cAAM,OAAO,kBAAkB,MAAM,QAAQ,IAAI,EAAE;AACnD,cAAM,iBAAiB,kBAAkB,KAAK;AAC9C,eAAO;AAAA,UACL,IAAI,aAAa,IAAI,KAAK;AAAA,UAC1B,OAAO;AAAA,UACP,GAAI,OAAO,EAAE,SAAS,CAAC,eAAe,IAAI,EAAE,EAAE,IAAI,CAAC;AAAA,UACnD,YAAY,CAAC,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UACtD,GAAI,CAAC,iBACD;AAAA,YACE,UAAU;AAAA,YACV,gBAAgB;AAAA,UAClB,IACA,CAAC;AAAA,QACP;AAAA,MACF,CAAC;AAAA,MACD,GAAI,WACA;AAAA,QACE;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,aACH,sBAAsB,UAAU,IAChC,kBAAkB,SAAS,OAAiB,eAAe;AAAA,UAC/D,GAAI,aACA,EAAE,aAAa,sEAAsE,IACrF;AAAA,YACE,UAAU;AAAA,YACV,gBAAgB;AAAA,UAClB;AAAA,QACN;AAAA,MACF,IACA,CAAC;AAAA,IACP;AAAA,EACF;AACA,QAAM,sBAAsB,CAAC,aAAkC;AAC7D,UAAM,WAAW,0BAA0B,QAAQ;AACnD,WAAO,WAAY,aAAa,IAAI,QAAQ,IAAe,SAAS,QAAQ,qBAAqB;AAAA,EACnG;AACA,QAAM,qBAAqB,CAAC,aAC1B,SAAS,SAAS,gBAAgB,QAAQ,IAAI,oBAAoB,QAAQ,IAAI;AAEhF,QAAM,OAAO,WAAoE;AAAA,IAC/E,OAAO;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,EAAE,MAAM,OAAO;AAAA,QACpB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,UACL,UAAU,kBAAkB,MAAM,QAAQ,CAAC;AAAA,UAC3C,aAAa,uBAAuB,MAAM,QAAQ,CAAC,2BAAwB,uBAAuB,MAAM,QAAQ,CAAC;AAAA,UACjH,mBAAmB,gCAAgC,MAAM,QAAQ,IAAI,OAAO,KAAK;AAAA,QACnF;AAAA,QACA,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,QAAQ;AAAA,UACV;AAAA,UACA,GAAI,cAAc,SAAS,IACvB;AAAA,YACE;AAAA,cACE,IAAI;AAAA,cACJ,OAAO;AAAA,cACP,aAAa;AAAA,cACb,IAAI;AAAA,YACN;AAAA,UACF,IACA,CAAC;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,UAC7C;AAAA,QACF;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO;AAAA,QACb,MAAM;AAAA,QACN,OAAO;AAAA,QACP,cAAc;AAAA,QACd,OAAO,cAAc,IAAI,CAAC,YAAY;AAAA,UACpC,IAAI,OAAO;AAAA,UACX,OAAO,OAAO;AAAA,UACd,aAAa,GAAG,OAAO,aAAa,IAAI,OAAO,kBAAkB,IAAI,aAAa,WAAW;AAAA,QAC/F,EAAE;AAAA,QACF,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,MAAM;AAAA,MACR;AAAA,MACA,UAAU,CAAC,EAAE,MAAM,OAAO;AAAA,QACxB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,CAAC,sBAAmB,mBAAmB,EAAE;AAAA,QAChD,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,cAAc,kBAAkB,MAAM,QAAQ;AAAA,YAC9C,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa,oEAAoE,yBAAyB,MAAM,QAAQ,CAAC;AAAA,YACzH,cAAc,qBAAqB,MAAM,QAAQ;AAAA,YACjD,QAAQ,CAAC,qBAAqB,GAAG,eAAe,MAAM,QAAQ,CAAC;AAAA,YAC/D,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,cAAc,sCAAsC,MAAM,QAAQ,IAAI,OAAO;AAAA,YAC7E,QAAQ,CAAC,MAAM,KAAK;AAAA,YACpB,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,cAAc,gCAAgC,MAAM,QAAQ,IAAI,OAAO;AAAA,YACvE,QAAQ,CAAC,MAAM,KAAK;AAAA,YACpB,QAAQ;AAAA,UACV;AAAA,UACA,GAAG,qBAAqB,IAAI,CAAC,YAAY;AAAA,YACvC,IAAI;AAAA,YACJ,OAAO,eAAe,MAAM;AAAA,YAC5B,aAAa;AAAA,YACb,cAAc,cAAc,MAAM,UAAU,MAAM;AAAA,YAClD,QAAQ;AAAA,UACV,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OAAO,CAAC,EAAE,MAAM,OAAO;AAAA,QACrB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,UACL;AAAA,UACA,GAAI,MAAM,SAAS,SAAS,CAAC,0BAA0B,MAAM,QAAQ,IACjE,CAAC,eAAe,kBAAkB,MAAM,QAAQ,CAAC,EAAE,IACnD,CAAC;AAAA,QACP;AAAA,QACA,OAAO,WAAW,MAAM,QAAQ;AAAA,QAChC,QAAQ;AAAA,QACR,eAAe,mBAAmB,MAAM,QAAQ;AAAA,QAChD,eAAe,oBAAoB,MAAM,QAAQ;AAAA,QACjD,cAAc;AAAA,QACd,cAAc;AAAA,QACd,MAAM;AAAA,MACR;AAAA,MACA,UAAU,CAAC,EAAE,MAAM,OAAO;AAAA,QACxB,MAAM;AAAA,QACN,OAAO,eAAe,QAAQ;AAAA,QAC9B,OAAO,CAAC,cAAc,MAAM,UAAU,QAAQ,GAAG,iCAAiC;AAAA,QAClF,OAAO;AAAA,UACL,EAAE,IAAI,QAAQ,OAAO,8BAAyB,IAAI,iBAAiB;AAAA,UACnE,EAAE,IAAI,SAAS,OAAO,mBAAmB,QAAQ,iBAAiB;AAAA,QACpE;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,kBAAkB,OAAO;AAAA,QACvB,MAAM;AAAA,QACN,OAAO,eAAe,QAAQ;AAAA,QAC9B,OAAO,CAAC,sEAAsE;AAAA,QAC9E,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,SAAS,CAAC,EAAE,MAAM,OAAO;AAAA,QACvB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,UACL,8BAA8B,mBAAmB;AAAA,UACjD,mBAAmB,MAAM,UAAU,+BAA+B;AAAA,QACpE;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,iBAAiB,CAAC,EAAE,OAAO,MAAM;AAC/B,YAAI,CAAC,qBAAqB,SAAS,MAA2B,EAAG,QAAO,EAAE,MAAM,WAAW;AAC3F,mBAAW;AACX,eAAO,EAAE,MAAM,MAAM,QAAQ,WAAW;AAAA,MAC1C;AAAA,MACA,iBAAiB,CAAC,EAAE,OAAO,OAAO,OAAO,MAAM,aAAa,OAAO,OAAO,KAAK,KAAK,IAAI,MAAM;AAAA,MAC9F,kBAAkB,CAAC,EAAE,OAAO,OAAO,MAAM,aAAa,OAAO,QAAW,MAAM;AAAA,MAC9E,cAAc,aAAa,EAAE,MAAM,MAAM,QAAQ,QAAQ;AAAA,MACzD,aAAa,OAAO,EAAE,OAAO,QAAQ,OAAO,MAAM;AAChD,YAAI,WAAW,sBAAsB,gBAAgB,MAAM,QAAQ,GAAG;AACpE,iBAAO,EAAE,MAAM,OAAO;AAAA,QACxB;AACA,cAAM,QAAQ,SAAS,eAAe,IAAI,MAAM,IAAI;AACpD,YAAI,WAAW,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,KAAK,GAAI,QAAO,EAAE,MAAM,WAAW;AAClG,cAAMA,UAAS,MAAM,UAAU,OAAO,MAAM;AAC5C,YAAIA,QAAO,SAAS,UAAU;AAC5B,4BAAkB,KAAKA,QAAO,KAAK;AACnC,iBAAO,EAAE,MAAM,WAAW;AAAA,QAC5B;AACA,YAAIA,QAAO,SAAS,eAAe,OAAO,QAAS,QAAO,EAAE,MAAM,QAAQ;AAC1E;AAAA,UACE;AAAA,UACA,QAAQ,iBAAiB,sBAAsB,KAAK,CAAC,MAAM,iBAAiB,mBAAmB;AAAA,UAC/F;AAAA,QACF;AACA,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAAA,MACA,OAAO,YAAY;AACjB,wBAAgB;AAChB,eAAO,EAAE,MAAM,QAAQ;AAAA,MACzB;AAAA,MACA,cAAc,YAAY;AACxB,uBAAe;AACf,eAAO,EAAE,MAAM,QAAQ;AAAA,MACzB;AAAA,MACA,QAAQ,OAAO,EAAE,OAAO,MAA0B;AAChD,YAAI,CAAC,cAAc,KAAK,CAAC,WAAW,OAAO,OAAO,MAAM,GAAG;AACzD,iBAAO,EAAE,MAAM,WAAW;AAAA,QAC5B;AACA,0BAAkB;AAClB,eAAO,EAAE,MAAM,QAAQ;AAAA,MACzB;AAAA,MACA,gBAAgB,OAAO,EAAE,OAAO,OAAO,OAAO,MAAM;AAClD,YAAI,CAAC,MAAO,QAAO,EAAE,MAAM,WAAW;AACtC,cAAM,SAAS,eAAe,MAAM,QAAQ;AAC5C,cAAM,QACJ,UAAU,sBACL,EAAE,eAAe,OAAU,IAC5B,OAAO,SAAS,KAAyB,IACtC,EAAE,eAAe,MAA0B,IAC5C;AACR,YAAI,CAAC,MAAO,QAAO,EAAE,MAAM,WAAW;AACtC,YAAI;AACF,gBAAM,eAAe,OAAO,EAAE,cAAc,OAAO,CAAC;AACpD,cAAI,OAAO,QAAS,QAAO,EAAE,MAAM,WAAW;AAC9C,uBAAa,KAAK,0BAA0B,KAAK,KAAK,MAAM;AAC5D,iBAAO,EAAE,MAAM,OAAO;AAAA,QACxB,SAAS,OAAO;AACd,cAAI,CAAC,OAAO,QAAS,mBAAkB,KAAK,KAAK;AACjD,iBAAO,EAAE,MAAM,WAAW;AAAA,QAC5B;AAAA,MACF;AAAA,MACA,gBAAgB,OAAO,EAAE,OAAO,OAAO,MAAM;AAC3C,YAAI,UAAU,QAAQ,UAAU,MAAO,QAAO,EAAE,MAAM,WAAW;AACjE,YAAI;AACF,gBAAM,eAAe,EAAE,8BAA8B,UAAU,KAAK,GAAG,EAAE,cAAc,OAAO,CAAC;AAC/F,cAAI,OAAO,QAAS,QAAO,EAAE,MAAM,WAAW;AAC9C,uBAAa,KAAK,oCAAoC,KAAK,KAAK,MAAM;AACtE,iBAAO,EAAE,MAAM,OAAO;AAAA,QACxB,SAAS,OAAO;AACd,cAAI,CAAC,OAAO,QAAS,mBAAkB,KAAK,KAAK;AACjD,iBAAO,EAAE,MAAM,WAAW;AAAA,QAC5B;AAAA,MACF;AAAA,MACA,uBAAuB,OAAO,EAAE,OAAO,OAAO,MAAM;AAClD,YAAI,UAAU,QAAQ,UAAU,MAAO,QAAO,EAAE,MAAM,WAAW;AACjE,YAAI;AACF,gBAAM,eAAe,EAAE,wBAAwB,UAAU,KAAK,GAAG,EAAE,cAAc,OAAO,CAAC;AACzF,cAAI,OAAO,QAAS,QAAO,EAAE,MAAM,WAAW;AAC9C,uBAAa,KAAK,iCAAiC,KAAK,KAAK,MAAM;AACnE,iBAAO,EAAE,MAAM,OAAO;AAAA,QACxB,SAAS,OAAO;AACd,cAAI,CAAC,OAAO,QAAS,mBAAkB,KAAK,KAAK;AACjD,iBAAO,EAAE,MAAM,WAAW;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,CAAC,gBAAgB,QAAQ,aAAa,MAAM,EAAE,UAAU,UAAU,CAAC;AAAA,IACnE,CAAC,YAAY;AACX,oBAAc;AAAA,IAChB;AAAA,EACF;AACA,MAAI,OAAO,SAAS,YAAY,OAAO,WAAW,QAAS,QAAO;AAClE,MAAI,gBAAiB,QAAO,EAAE,MAAM,UAAU,UAAU,gBAAgB;AACxE,MAAI,aAAc,QAAO;AACzB,SAAO,gBAAgB,UAAU;AACnC;AAEA,eAAsB,8BACpB,KACA,SACwB;AACxB,MAAI,iBAAiB,IAAI,GAAG,cAAc;AAC1C,MAAI,YAAY;AAChB,QAAM,SAAS,MAAM,IAAI,GAAG;AAAA,IAAU,CAAC,KAAK,OAAO,aAAa,SAC9D,QAAQ,KAAK,OAAO,aAAa,CAAC,UAAU;AAC1C,UAAI;AACF,yBAAiB,IAAI,GAAG,cAAc;AAAA,MACxC,QAAQ;AAAA,MAER;AACA,kBAAY;AACZ,WAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH;AACA,MAAI,WAAW;AACb,QAAI;AACF,UAAI,IAAI,GAAG,cAAc,MAAM,eAAgB,KAAI,GAAG,cAAc,cAAc;AAAA,IACpF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,2BACpB,KACA,KACA,eACwB;AACxB,MAAI,iBAAiB,IAAI,GAAG,cAAc;AAC1C,MAAI,YAAY;AAChB,QAAM,KAAK,IAAI,MAAM,IAAI,IAAI;AAAA,IAC3B,IAAI,QAAQ,UAAU;AACpB,UAAI,aAAa,UAAU;AACzB,eAAO,CAAQ,SAAkC,kBAC/C,OAAO,OAAc,CAAC,KAAK,OAAO,aAAa,SAAS;AACtD,0BAAgB,WAAW;AAC3B,iBAAO,QAAQ,KAAK,OAAO,aAAa,CAACC,WAAU;AACjD,gBAAI;AACF,+BAAiB,OAAO,cAAc;AAAA,YACxC,QAAQ;AAAA,YAER;AACA,wBAAY;AACZ,iBAAKA,MAAK;AAAA,UACZ,CAAC;AAAA,QACH,GAAG,aAAa;AAAA,MACpB;AACA,YAAM,QAAQ,QAAQ,IAAI,QAAQ,UAAU,MAAM;AAClD,aAAO,OAAO,UAAU,aAAa,MAAM,KAAK,MAAM,IAAI;AAAA,IAC5D;AAAA,EACF,CAAC;AACD,QAAM,SAAS,MAAM,IAAI,EAAE,MAAM,IAAI,MAAM,OAAO,IAAI,OAAO,GAAG,CAAC;AACjE,MAAI,OAAO,SAAS,WAAW,WAAW;AACxC,QAAI;AACF,UAAI,IAAI,GAAG,cAAc,MAAM,eAAgB,KAAI,GAAG,cAAc,cAAc;AAAA,IACpF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAA6C;AACtE,SAAO,OAAO,OAAO,CAAC,OAAO,UAAU,OAAO,UAAU,CAAC,cAAc,UAAU,WAAW,KAAK,CAAC,MAAM,KAAK;AAC/G;AAEA,SAAS,uBACP,iBACA,cACc;AACd,MAAI,aAAa,WAAW,EAAG,QAAO,CAAC,GAAG,eAAe;AACzD,SAAO;AAAA,IACL,aAAa,QAAQ,CAAC,UAAU;AAC9B,YAAM,YAAY,gBAAgB,KAAK,CAAC,UAAU,UAAU,OAAO,MAAM,KAAK,CAAC;AAC/E,aAAO,YAAY,CAAC,SAAS,IAAI,CAAC;AAAA,IACpC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,UAAU,MAA2C,OAAqD;AACjH,SAAO,KAAK,aAAa,MAAM,YAAY,KAAK,OAAO,MAAM;AAC/D;AAEA,SAAS,8BACP,WACA,WACkB;AAClB,MAAI,UAAU,SAAS,SAAS,EAAG,QAAO;AAC1C,QAAM,iBAAiB,oBAAoB,QAAQ,SAAS;AAC5D,WAAS,QAAQ,gBAAgB,QAAQ,oBAAoB,QAAQ,SAAS,GAAG;AAC/E,UAAM,YAAY,oBAAoB,KAAK;AAC3C,QAAI,aAAa,UAAU,SAAS,SAAS,EAAG,QAAO;AAAA,EACzD;AACA,WAAS,QAAQ,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG;AAC3D,UAAM,YAAY,oBAAoB,KAAK;AAC3C,QAAI,aAAa,UAAU,SAAS,SAAS,EAAG,QAAO;AAAA,EACzD;AACA,SAAO,UAAU,CAAC,KAAK;AACzB;AAEA,SAAS,kBAAkB,KAA8B,OAAsB;AAC7E;AAAA,IACE;AAAA,IACA,sEAAsEC,aAAY,KAAK,CAAC;AAAA,IACxF;AAAA,EACF;AACF;AAEA,SAAS,aACP,KACA,SACA,OACM;AACN,MAAI;AACF,QAAI,GAAG,OAAO,mBAAmB,OAAO,GAAG,KAAK;AAAA,EAClD,QAAQ;AAAA,EAER;AACF;AAEA,SAASA,aAAY,OAAwB;AAC3C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;ADxpBA,IAAM,gCAAN,MAAoE;AAAA,EAClE,YACmB,UACA,SACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,IAAI,UAAmB;AACrB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,QAAQ,OAAgB;AAC1B,SAAK,SAAS,UAAU;AAAA,EAC1B;AAAA,EAEA,IAAI,kBAAuC;AACzC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,OAAO,OAAyB;AAC9B,WAAO,KAAK,SAAS,OAAO,KAAK;AAAA,EACnC;AAAA,EAEA,YAAY,MAAoB;AAC9B,QAAIC,YAAW,MAAMC,KAAI,KAAK,GAAG,CAAC,GAAG;AACnC,WAAK,QAAQ;AACb;AAAA,IACF;AACA,SAAK,SAAS,cAAc,IAAI;AAAA,EAClC;AAAA,EAEA,aAAmB;AACjB,SAAK,SAAS,WAAW;AAAA,EAC3B;AAAA,EAEA,UAAgB;AACd,SAAK,SAAS,UAAU;AACxB,SAAK,QAAQ;AAAA,EACf;AACF;AAEA,eAAsB,cACpB,IACA,KACA,eAAiD,CAAC,GACpB;AAC9B,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,cAAU,IAAI,eAAe,QAAQ;AACrC,oBAAgB,IAAI,eAAe,UAAU;AAAA,EAC/C,QAAQ;AACN,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,IAAAC,cAAa,KAAK,wCAAwC,SAAS;AACnE,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AAEA,QAAM,OAAO,uBAAuB,OAAO;AAC3C,QAAM,cAAc,mBAAmB,OAAO;AAC9C,QAAM,cAAc,mBAAmB,OAAO;AAC9C,QAAM,iBAAiB,aAAa,kBAAkB;AACtD,QAAM,OAAO,aAAa,mBAAmB;AAC7C,QAAM,kBAAkB,oBAAI,IAAqB;AACjD,QAAM,YAAY,oBAAI,IAAmB;AACzC,QAAM,cAAc,MAAM;AACxB,eAAW,cAAc,iBAAiB;AACxC,iBAAW,MAAM,IAAI,MAAM,oCAAoC,CAAC;AAAA,IAClE;AAAA,EACF;AACA,QAAM,SAAS,MAAM,8BAAmD,KAAK,CAAC,KAAK,QAAQ,cAAc,SAAS;AAChH,QAAI,UAAU;AACd,QAAI;AACJ,UAAM,SAAS,CAAC,UAA+B;AAC7C,UAAI,QAAS;AACb,gBAAU;AACV,kBAAY;AACZ,WAAK,KAAK;AAAA,IACZ;AACA,UAAM,SAAS,CAAC,SAA6B,gBAAoC;AAC/E,UAAI,QAAS;AACb,YAAM,OAAO,UAAU,YAAY,IAAI,OAAO,IAAI;AAClD,UAAI,CAAC,MAAM;AACT,QAAAA,cAAa,KAAK,sCAAsC,SAAS;AACjE;AAAA,MACF;AACA,YAAM,aAAa,IAAI,gBAAgB;AACvC,sBAAgB,IAAI,UAAU;AAC9B,UAAI;AACJ,UAAI;AACF,oBAAY,KAAK,MAAM,WAAW,MAAM;AAAA,MAC1C,SAAS,OAAgB;AACvB,oBAAY,QAAQ,OAAO,KAAK;AAAA,MAClC;AACA,UAAI;AACJ,aAAO,UACJ,KAAK,MAAM;AACV,YAAI,CAAC,QAAS,CAAAA,cAAa,KAAK,2BAA2B,MAAM;AAAA,MACnE,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,YAAI,CAAC,WAAW,CAAC,WAAW,OAAO,SAAS;AAC1C,UAAAA,cAAa,KAAK,oCAAoCC,aAAY,KAAK,CAAC,IAAI,OAAO;AAAA,QACrF;AAAA,MACF,CAAC,EACA,QAAQ,MAAM;AACb,wBAAgB,OAAO,UAAU;AACjC,kBAAU,OAAO,IAAI;AAAA,MACvB,CAAC;AACH,gBAAU,IAAI,IAAI;AAAA,IACpB;AACA,UAAM,eAAe,CAAC,YAAoB;AACxC,YAAM,WAAW,YAAY,IAAI,OAAO;AACxC,gBAAU,eAAe,SAAS,UAAU,OAAO,UAAU,cAAc;AAC3E,UAAI,cAAc;AAAA,IACpB;AACA,UAAM,gBAAgB,CAAC,SAAiB,UAA8B;AACpE,UAAI,QAAS;AACb,UAAI;AACF,YAAI,CAAC,IAAI,eAAe,SAAS,OAAO,GAAG;AACzC,uBAAa,OAAO;AACpB,UAAAD,cAAa,KAAK,yDAAyD,SAAS;AACpF;AAAA,QACF;AACA,cAAM,iBAAiB,UAAU,SAAY,SAAY,mBAAmB,KAAK;AACjF,WAAG,SAAS,SAAS,cAAc;AACnC,oBAAY,IAAI,SAAS,EAAE,OAAO,eAAe,CAAC;AAClD,kBAAU,eAAe,SAAS,cAAc;AAChD,YAAI,cAAc;AAAA,MACpB,SAAS,OAAgB;AACvB,qBAAa,OAAO;AACpB,QAAAA,cAAa,KAAK,gCAAgCC,aAAY,KAAK,CAAC,IAAI,OAAO;AAAA,MACjF;AAAA,IACF;AACA,eAAW,eAAe;AAAA,MACxB;AAAA,MACA;AAAA,MACA,cAAc,IAAI,SAAS;AAAA,MAC3B,UAAU,CAAC,YAAY,OAAO,EAAE,MAAM,YAAY,QAAQ,CAAC;AAAA,MAC3D,UAAU,MAAM,OAAO,EAAE,MAAM,OAAO,CAAC;AAAA,MACvC;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,IAAI,8BAA8B,UAAU,MAAM,OAAO,EAAE,MAAM,SAAS,CAAC,CAAC;AAAA,EACrF,CAAC;AACD,cAAY;AACZ,QAAM,QAAQ,WAAW,CAAC,GAAG,SAAS,CAAC;AAEvC,SAAO,UAAU,EAAE,MAAM,SAAS;AACpC;AAEA,SAAS,yBAAyB,SAAgE;AAChG,QAAM,WAAW,IAAI;AAAA,IACnB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,WAAS,SAAS,CAAC,gBAAgB,QAAQ,OAAO,SAAS,YAAY,EAAE,gBAAgB,GAAG,MAAM,IAAI,WAAW;AACjH,QAAM,SAAS;AACf,SAAO,eAAe,CAAC,SAAS,OAAO,mBACrC,SAAS,YAAY,EAAE,gBAAgB,SAAS,OAAO,cAAc;AACvE,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAqD;AACnF,SAAO,KAAK,IAAI,CAAC,SAAS;AACxB,UAAM,SAA0B;AAAA,MAC9B,OAAO,wBAAwB,KAAK,KAAK;AAAA,MACzC,UAAU,uBAAuB,KAAK,QAAQ;AAAA,IAChD;AACA,QAAI,KAAK,UAAU,OAAW,QAAO,QAAQ,mBAAmB,KAAK,KAAK;AAC1E,QAAI,KAAK,mBAAmB,QAAW;AACrC,aAAO,iBAAiB,mBAAmB,KAAK,cAAc;AAAA,IAChE;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,wBAAwB,OAAmC;AAClE,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK,WAAW;AACd,YAAM,UAAU,EAAE,GAAG,MAAM,QAAQ;AACnC,UAAI,aAAa,MAAM,QAAS,SAAQ,UAAU,uBAAuB,MAAM,QAAQ,OAAO;AAC9F,iBAAW,OAAO,CAAC,QAAQ,gBAAgB,WAAW,UAAU,GAAY;AAC1E,cAAM,QAAQ,QAAQ,GAAG;AACzB,YAAI,OAAO,UAAU,SAAU,SAAQ,GAAG,IAAI,mBAAmB,KAAK;AAAA,MACxE;AACA,aAAO,EAAE,GAAG,OAAO,QAAQ;AAAA,IAC7B;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,mBAAmB,MAAM,UAAU;AAAA,QAC/C,SAAS,uBAAuB,MAAM,OAAO;AAAA,MAC/C;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,SAAS,mBAAmB,MAAM,OAAO,EAAE;AAAA,IAChE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,SAAS,mBAAmB,MAAM,OAAO,EAAE;AAAA,IAChE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,mBAAmB,MAAM,QAAQ;AAAA,QAC3C,SAAS,mBAAmB,MAAM,OAAO;AAAA,MAC3C;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,eAAe,mBAAmB,MAAM,aAAa,EAAE;AAAA,IAC5E,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,YAAY,mBAAmB,MAAM,UAAU,EAAE;AAAA,IACtE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,MAAM,UAAU,SAAY,SAAY,mBAAmB,MAAM,KAAK;AAAA,MAC/E;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,MAAM,SAAS,SAAY,SAAY,mBAAmB,MAAM,IAAI;AAAA,MAC5E;AAAA,EACJ;AACF;AAEA,SAAS,uBAAuB,SAA2B;AACzD,MAAI,OAAO,YAAY,SAAU,QAAO,mBAAmB,OAAO;AAClE,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QAAQ,IAAI,CAAC,UAAU;AAC5B,QAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,EAAE,UAAU,OAAQ,QAAO;AAC9E,QAAI,MAAM,SAAS,UAAU,UAAU,SAAS,OAAO,MAAM,SAAS,UAAU;AAC9E,aAAO,EAAE,GAAG,OAAO,MAAM,mBAAmB,MAAM,IAAI,EAAE;AAAA,IAC1D;AACA,QAAI,MAAM,SAAS,YAAY;AAC7B,YAAM,OAAO,EAAE,GAAG,MAAM;AACxB,UAAI,OAAO,KAAK,SAAS,SAAU,MAAK,OAAO,mBAAmB,KAAK,IAAI;AAC3E,WAAK,YAAY,sBAAsB,KAAK,WAAW,oBAAI,QAAQ,CAAC;AACpE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,sBAAsB,OAAgB,MAAyC;AACtF,MAAI,OAAO,UAAU,SAAU,QAAO,mBAAmB,KAAK;AAC9D,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,WAAW,KAAK,IAAI,KAAK;AAC/B,MAAI,aAAa,OAAW,QAAO;AACnC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAMC,UAAoB,CAAC;AAC3B,SAAK,IAAI,OAAOA,OAAM;AACtB,eAAW,QAAQ,MAAO,CAAAA,QAAO,KAAK,sBAAsB,MAAM,IAAI,CAAC;AACvE,WAAOA;AAAA,EACT;AACA,QAAM,SAAkC,CAAC;AACzC,OAAK,IAAI,OAAO,MAAM;AACtB,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,WAAO,GAAG,IAAI,sBAAsB,MAAM,IAAI;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAuD;AACjF,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,QAAQ,CAAC,UAAsC;AACnD,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,eAAe,KAAK,KAAK;AACtC,UAAI,SAAS,OAAW,QAAO,IAAI,KAAK,MAAM,IAAI,IAAI;AACtD,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AACA,QAAM,IAAI;AACV,SAAO;AACT;AAEA,SAAS,eAAe,OAAyC;AAC/D,MAAI;AACJ,MAAI,MAAM,SAAS,WAAW;AAC5B,QAAI,MAAM,QAAQ,SAAS,gBAAiB,QAAO,MAAM,QAAQ;AAAA,aACxD,aAAa,MAAM,SAAS;AACnC,aAAO,eAAe,MAAM,QAAQ,OAAO;AAC3C,UAAI,CAAC,QAAQ,MAAM,QAAQ,SAAS,YAAa,QAAO,MAAM,QAAQ;AAAA,IACxE;AAAA,EACF,WAAW,MAAM,SAAS,iBAAkB,QAAO,eAAe,MAAM,OAAO;AAAA,WACtE,MAAM,SAAS,gBAAgB,MAAM,SAAS,iBAAkB,QAAO,MAAM;AACtF,SAAO,MAAM,KAAK,IAAI,OAAO;AAC/B;AAEA,SAAS,eAAe,SAA0B;AAChD,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QACJ;AAAA,IACC,CAAC,UACC,UAAU,QACV,OAAO,UAAU,YACjB,UAAU,SACV,MAAM,SAAS,UACf,UAAU,SACV,OAAO,MAAM,SAAS;AAAA,EAC1B,EACC,IAAI,CAAC,UAAU,MAAM,IAAI,EACzB,KAAK,EAAE;AACZ;AAOA,SAAS,mBAAmB,MAA2D;AACrF,QAAM,SAAS,oBAAI,IAAwB;AAC3C,QAAM,QAAQ,CAAC,UAAsC;AACnD,eAAW,QAAQ,OAAO;AACxB,aAAO,IAAI,KAAK,MAAM,IAAI;AAAA,QACxB,OAAO,KAAK,UAAU,SAAY,SAAY,mBAAmB,KAAK,KAAK;AAAA,QAC3E,gBAAgB,KAAK,mBAAmB,SAAY,SAAY,mBAAmB,KAAK,cAAc;AAAA,MACxG,CAAC;AACD,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AACA,QAAM,IAAI;AACV,SAAO;AACT;AAEA,eAAe,SAAS,MAAc,QAAoC;AACxE,SAAO,eAAe;AACtB,QAAM,gBAAgB,IAAI;AAC1B,SAAO,eAAe;AACxB;AAEA,SAASF,cACP,KACA,SACA,OACM;AACN,MAAI;AACF,QAAI,GAAG,OAAO,mBAAmB,OAAO,GAAG,KAAK;AAAA,EAClD,QAAQ;AAAA,EAER;AACF;AAEA,SAASC,aAAY,OAAwB;AAC3C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;AIrXA,IAAM,0BAA0B;AAChC,IAAM,yBAAkD,MAAM,CAAC;AAW/D,eAAsB,6BACpB,OACA,iBACA,QAC8C;AAC9C,QAAM,YAAY,MAAM;AAAA,IAAQ,CAAC,SAC/B,KAAK,SAAS,aAAa,CAAC,KAAK,UAAU,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ;AAAA,EAC1E;AACA,MAAI,gBAAiB,WAAU,KAAK,eAAe;AACnD,MAAI,CAAC,UAAU,KAAK,CAAC,aAAa,YAAY,KAAK,QAAQ,CAAC,EAAG,QAAO;AACtE,MAAI,QAAQ,QAAS,QAAO;AAE5B,QAAM,iBAAiB,MAAM;AAAA,IAC3B,OAAO;AAAA,IACP;AAAA,EACF;AACA,MAAI,CAAC,kBAAkB,QAAQ,QAAS,QAAO;AAC/C,QAAM,EAAE,kCAAkC,+BAA+B,IAAI;AAC7E,QAAM,eAAe,oBAAI,IAAmB;AAC5C,aAAW,YAAY,WAAW;AAChC,UAAM,cAAc,+BAA+B,QAAQ;AAC3D,QAAI,YAAa,cAAa,IAAI,WAAW;AAAA,EAC/C;AACA,MAAI,aAAa,OAAO,KAAK,CAAE,MAAM,oBAAoB,QAAQ,IAAI,YAAY,GAAG,MAAM,EAAI,QAAO;AACrG,MAAI,QAAQ,QAAS,QAAO;AAE5B,SAAO,CAAC,UAAU;AAChB,UAAM,cAAc,iCAAiC,KAAK;AAC1D,WAAO,cAAc,CAAC,WAAW,IAAI,CAAC;AAAA,EACxC;AACF;AAEA,eAAe,oBAAuB,WAAuB,QAA8C;AACzG,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI;AACJ,QAAM,UAAU,IAAI,QAAmB,CAAC,YAAY;AAClD,cAAU,MAAM,QAAQ,MAAS;AACjC,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACxD,QAAI,OAAO,QAAS,SAAQ;AAAA,EAC9B,CAAC;AACD,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,CAAC;AAAA,EAChD,UAAE;AACA,QAAI,QAAS,QAAO,oBAAoB,SAAS,OAAO;AAAA,EAC1D;AACF;;;AC/DA;AAAA,EACE;AAAA,EACA;AAAA,EAIA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EAGA,OAAAE;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EAEA,mBAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,OACK;AAMP,IAAM,0BAA0B;AAChC,IAAM,6BAA6B;AACnC,IAAM,iBAAiB,CAAC,kBAAsB,kBAAsB,gBAAoB;AAExF,IAAM,qBAAqB;AAG3B,IAAM,uBAAN,cAAmC,WAAW;AAAA,EACnC,aAAa,eAAuB,gBAAwB,eAAiC;AACpG,UAAM,yBAAyB,CAAC,KAAK;AACrC,UAAM,aAAa,eAAe,gBAAgB,aAAa;AAC/D,QAAI,0BAA0B,KAAK,gBAAgB;AACjD,WAAK,SAAS,KAAK,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,IACvD;AAAA,EACF;AACF;AAuBO,IAAM,qBAAN,MAA4E;AAAA,EAcjF,YACmB,KACA,OACjB,OACiB,UACA,UAKb,CAAC,GACL;AAViB;AACA;AAEA;AACA;AAOjB,SAAK,YAAY,gBAAgB,KAAK,QAAQ,UAAU,WAAW;AACnE,SAAK,uBAAuB,0BAA0B,OAAO,KAAK,OAAO,QAAW,QAAQ,oBAAoB;AAChH,SAAK,iBAAiB,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,UAAU;AACnE,SAAK,gBAAgB,QAAQ,UAAU;AACvC,UAAM,cAA2B;AAAA,MAC/B,aAAa,CAAC,SAAS,KAAK,MAAM,GAAG,UAAU,IAAI;AAAA,MACnD,YAAY;AAAA,QACV,gBAAgB,CAAC,SAAS,KAAK,MAAM,GAAG,UAAU,IAAI;AAAA,QACtD,cAAc,CAAC,SAAS,KAAK,MAAM,GAAG,UAAU,IAAI;AAAA,QACpD,aAAa,CAAC,SAAS,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,QAClD,YAAY,CAAC,SAAS,KAAK,MAAM,GAAG,OAAO,IAAI;AAAA,QAC/C,SAAS,CAAC,SAAS,KAAK,MAAM,GAAG,WAAW,IAAI;AAAA,MAClD;AAAA,IACF;AACA,SAAK,SAAS,IAAI,OAAO,KAAK,KAAK,WAAW;AAC9C,QAAI,QAAQ,gBAAiB,MAAK,OAAO,QAAQ,QAAQ,eAAe;AACxE,SAAK,OAAO,WAAW,MAAM;AAC3B,WAAK,UAAU;AAAA,IACjB;AACA,SAAK,OAAO,WAAW,CAAC,SAAS;AAC/B,YAAM,WAAW,KAAK,KAAK;AAC3B,UAAI,CAAC,UAAU;AACb,aAAK,UAAU;AACf;AAAA,MACF;AACA,WAAK,WAAW;AAChB,WAAK,SAAS,EAAE,MAAM,UAAU,SAAS,CAAC;AAAA,IAC5C;AACA,UAAM,aAAa,KAAK,0BAA0B;AAClD,SAAK,aAAa,IAAI,qBAAqB,YAAY;AAAA,MACrD,QAAQ,QAAQ,gBAAgB,QAAQ;AAAA,MACxC,SAAS;AAAA,IACX,CAAC;AACD,SAAK,aAAa,IAAI,OAAO;AAAA,MAC3B,EAAE,WAAW,KAAK,sBAAsB,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,EAAE;AAAA,MAC3E,EAAE,WAAW,KAAK,YAAY,OAAO,GAAG,MAAM,GAAG,SAAS,EAAE;AAAA,MAC5D,EAAE,WAAW,KAAK,sBAAsB,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,EAAE;AAAA,MAC3E,EAAE,WAAW,KAAK,QAAQ,OAAO,QAAQ,QAAQ,GAAG,SAAS,EAAE;AAAA,IACjE,CAAC;AAAA,EACH;AAAA,EAlDmB;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAlBF;AAAA,EACA,aAAa,IAAI,cAAc;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,uBAAuB;AAAA,EACvB;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EAuDR,IAAI,UAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,QAAQ,OAAgB;AAC1B,SAAK,YAAY;AACjB,SAAK,OAAO,UAAU;AAAA,EACxB;AAAA,EAEA,sBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,OAAyB;AAC9B,QAAI,SAAS,EAAG,QAAO,CAAC;AACxB,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK;AACnC,UAAM,cAAc,KAAK,OAAO,OAAO,SAAS;AAChD,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,OAAO,kBAAkB;AAC7E,UAAM,iBAAiB,KAAK,IAAI,GAAG,gBAAgB,YAAY,SAAS,uBAAuB;AAC/F,UAAM,eAAe,sBAAsB,KAAK,sBAAsB,SAAS;AAC/E,SAAK,uBAAuB,aAAa;AACzC,SAAK,WAAW,aAAa,aAAa,QAAQ,gBAAgB,MAAM,KAAK,IAAI,cAAc,CAAC;AAEhG,WAAO;AAAA,MACL,uBAAuB,WAAW,KAAK,OAAO,KAAK,aAAa;AAAA,MAChE,aAAa,MAAM,KAAK,WAAW,WAAW,KAAK,WAAW,YAAY,cAAc;AAAA,MACxF,KAAK,aAAa,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,IACF,EAAE,IAAI,CAAC,SAASC,iBAAgB,MAAM,SAAS,CAAC;AAAA,EAClD;AAAA,EAEA,YAAY,MAAoB;AAC9B,QAAI,KAAK,SAAU;AACnB,QAAI,KAAK,WAAW,QAAQ,IAAI,GAAG;AACjC,WAAK,OAAO,YAAY,IAAI;AAC5B,WAAK,IAAI,cAAc;AACvB;AAAA,IACF;AACA,QAAI,KAAK,UAAU,QAAQ,MAAM,MAAM,GAAG;AACxC,WAAK,WAAW;AAChB,WAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC/B;AAAA,IACF;AACA,QAAI,KAAK,kBAAkB,KAAK,UAAU,QAAQ,MAAM,aAAa,GAAG;AACtE,WAAK,WAAW;AAChB,WAAK,SAAS,EAAE,MAAM,eAAe,eAAe,KAAK,OAAO,gBAAgB,EAAE,CAAC;AACnF;AAAA,IACF;AACA,UAAM,WAAW,KAAK,QAAQ;AAC9B,QAAI,YAAY,SAAS,OAAO,SAAS,KAAK,KAAK,UAAU,QAAQ,MAAM,oBAAoB,GAAG;AAChG,YAAM,eAAe,SAAS,OAAO,QAAQ,KAAK,iBAAiB,SAAS,KAAK;AACjF,YAAM,YAAY,SAAS,QAAQ,eAAe,KAAK,SAAS,OAAO,MAAM;AAC7E,UAAI,WAAW;AACb,aAAK,gBAAgB;AACrB,iBAAS,SAAS,SAAS;AAC3B,aAAK,UAAU;AACf,aAAK,IAAI,cAAc;AAAA,MACzB;AACA;AAAA,IACF;AACA,QAAIC,YAAW,MAAMC,KAAI,MAAM,GAAG;AAChC,WAAK,WAAW,SAAS,CAAC,KAAK,IAAI,GAAG,KAAK,WAAW,cAAc,CAAC;AACrE,WAAK,IAAI,cAAc;AACvB;AAAA,IACF;AACA,QAAID,YAAW,MAAMC,KAAI,QAAQ,GAAG;AAClC,WAAK,WAAW,SAAS,KAAK,IAAI,GAAG,KAAK,WAAW,cAAc,CAAC;AACpE,WAAK,IAAI,cAAc;AACvB;AAAA,IACF;AACA,SAAK,OAAO,YAAY,IAAI;AAC5B,QAAI,CAAC,KAAK,SAAU,MAAK,IAAI,cAAc;AAAA,EAC7C;AAAA,EAEA,aAAmB;AACjB,SAAK,WAAW,WAAW;AAAA,EAC7B;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,SAAU;AACnB,SAAK,WAAW;AAChB,SAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,EACjC;AAAA,EAEQ,aAAa,OAAuB;AAC1C,UAAM,OAAO,KAAK,UAAU,MAAM,MAAM;AACxC,UAAM,QAAQ,KAAK,kBAAkB,KAAK,UAAU,KAAK,YAAY,SAAS;AAC9E,UAAM,WAAW,KAAK,UAAU,MAAM,aAAa;AACnD,QAAI,KAAK,SAAS;AAChB,YAAM,UAAU,QAAQ,KAAK,gBAAW,IAAI,KAAK,GAAG,KAAK,OAAO,WAAM,IAAI;AAC1E,aAAOF,iBAAgB,KAAK,MAAM,GAAG,WAAW,OAAO,GAAG,KAAK;AAAA,IACjE;AACA,UAAM,aAAa,KAAK,mBAAmB,IAAI;AAC/C,UAAM,WAAW,KAAK,QAAQ;AAC9B,UAAM,YACJ,YAAY,SAAS,OAAO,SAAS,KAAK,KAAK,iBAAiB,KAAK,UAAU,KAAK,mBAAmB,SACnG,oBAAe,KAAK,aAAa,WAAM,KAAK,UAAU,MAAM,oBAAoB,CAAC,WACjF;AACN,UAAM,OAAO,QACT,gCAAsB,QAAQ,yBAAoB,IAAI,UACtD,gCAAsB,IAAI;AAC9B,UAAM,WAAW,GAAG,IAAI,GAAG,SAAS;AACpC,UAAM,eAAe,2BAAiB,IAAI;AAC1C,UAAM,cAAc,QAAQ,2BAAiB,QAAQ,WAAM,IAAI,KAAK;AACpE,UAAM,sBAAsB,GAAG,WAAW,GAAG,SAAS;AACtD,QAAI,QACFG,cAAa,QAAQ,KAAK,QACtB,WACAA,cAAa,mBAAmB,KAAK,QACnC,sBACAA,cAAa,WAAW,KAAK,QAC3B,cACA;AACV,QAAI,YAAY;AACd,YAAM,UAAU,WAAM,KAAK,WAAW,YAAY,IAAI,iBAAY,cAAS;AAC3E,YAAM,iBAAiB;AACvB,YAAM,oBAAoB,QACtB,gBAAW,QAAQ,WAAM,IAAI,sBAC7B,GAAG,YAAY,GAAG,cAAc;AACpC,UAAIA,cAAa,GAAG,KAAK,GAAG,OAAO,EAAE,KAAK,OAAO;AAC/C,iBAAS;AAAA,MACX,WAAWA,cAAa,GAAG,WAAW,GAAG,OAAO,EAAE,KAAK,OAAO;AAC5D,gBAAQ,GAAG,WAAW,GAAG,OAAO;AAAA,MAClC,WAAWA,cAAa,GAAG,KAAK,GAAG,cAAc,EAAE,KAAK,OAAO;AAC7D,iBAAS;AAAA,MACX,WAAWA,cAAa,GAAG,WAAW,GAAG,cAAc,EAAE,KAAK,OAAO;AACnE,gBAAQ,GAAG,WAAW,GAAG,cAAc;AAAA,MACzC,WAAWA,cAAa,iBAAiB,KAAK,OAAO;AACnD,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAOH,iBAAgB,KAAK,MAAM,GAAG,SAAS,KAAK,GAAG,KAAK;AAAA,EAC7D;AAAA,EAEQ,wBAAmC;AACzC,WAAO;AAAA,MACL,QAAQ,CAAC,UAAU,CAAC,uBAAuB,OAAO,KAAK,OAAO,KAAK,aAAa,CAAC;AAAA,MACjF,aAAa;AAAA,MAAC;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,4BAAuC;AAC7C,WAAO;AAAA,MACL,QAAQ,CAAC,UAAU;AACjB,cAAM,QAAQ,sBAAsB,KAAK,sBAAsB,KAAK;AACpE,aAAK,uBAAuB,MAAM;AAClC,eAAO;AAAA,MACT;AAAA,MACA,YAAY,MAAM;AAChB,mBAAW,aAAa,KAAK,qBAAsB,WAAU,WAAW;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBAAmC;AACzC,WAAO;AAAA,MACL,QAAQ,CAAC,UAAU,CAAC,KAAK,aAAa,KAAK,CAAC;AAAA,MAC5C,aAAa;AAAA,MAAC;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,qBAA6B;AACnC,WAAO,KAAK,IAAI,GAAG,KAAK,uBAAuB,KAAK,WAAW,cAAc;AAAA,EAC/E;AACF;AAEO,IAAM,mBAAN,MAA0E;AAAA,EAe/E,YACmB,KACA,OACjB,OACA,iBACiB,UACjB,eACiB,UAAmC,CAAC,GACrD;AAPiB;AACA;AAGA;AAEA;AAEjB,SAAK,YAAY,gBAAgB,KAAK,QAAQ,UAAU,UAAU,WAAW;AAC7E,SAAK,uBAAuB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,IACV;AACA,SAAK,gBAAgB,QAAQ,UAAU,UAAU,SAAS;AAC1D,SAAK,SAAS,IAAI;AAAA,MAChB,KAAK;AAAA,MACL,CAAC,SAAS,KAAK,MAAM,GAAG,UAAU,IAAI;AAAA,MACtC,CAAC,SAAS,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,MACrC;AAAA,IACF;AACA,QAAI,QAAQ,UAAU;AACpB,YAAM,cAA2B;AAAA,QAC/B,aAAa,CAAC,SAAS,KAAK,MAAM,GAAG,UAAU,IAAI;AAAA,QACnD,YAAY;AAAA,UACV,gBAAgB,CAAC,SAAS,KAAK,MAAM,GAAG,UAAU,IAAI;AAAA,UACtD,cAAc,CAAC,SAAS,KAAK,MAAM,GAAG,UAAU,IAAI;AAAA,UACpD,aAAa,CAAC,SAAS,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,UAClD,YAAY,CAAC,SAAS,KAAK,MAAM,GAAG,OAAO,IAAI;AAAA,UAC/C,SAAS,CAAC,SAAS,KAAK,MAAM,GAAG,WAAW,IAAI;AAAA,QAClD;AAAA,MACF;AACA,WAAK,SAAS,IAAI,OAAO,KAAK,KAAK,WAAW;AAC9C,WAAK,OAAO,WAAW,MAAM;AAC3B,aAAK,UAAU;AAAA,MACjB;AACA,WAAK,OAAO,WAAW,CAAC,SAAS;AAC/B,cAAM,WAAW,KAAK,KAAK;AAC3B,YAAI,CAAC,UAAU;AACb,eAAK,UAAU;AACf;AAAA,QACF;AACA,gBAAQ,UAAU,SAAS,QAAQ;AACnC,aAAK,UAAU;AAAA,MACjB;AAAA,IACF;AACA,UAAM,aAAa,KAAK,0BAA0B;AAClD,SAAK,aAAa,IAAI,qBAAqB,YAAY,EAAE,QAAQ,OAAO,SAAS,KAAK,CAAC;AACvF,SAAK,aAAa,IAAI,OAAO;AAAA,MAC3B,EAAE,WAAW,KAAK,sBAAsB,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,EAAE;AAAA,MAC3E,EAAE,WAAW,KAAK,YAAY,OAAO,GAAG,MAAM,GAAG,SAAS,EAAE;AAAA,MAC5D;AAAA,QACE,WAAW,KAAK,wBAAwB;AAAA,QACxC,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,EAAE,WAAW,KAAK,sBAAsB,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,EAAE;AAAA,MAC3E,GAAI,KAAK,SAAS,CAAC,EAAE,WAAW,KAAK,QAAQ,OAAO,QAAiB,QAAQ,GAAG,SAAS,EAAE,CAAC,IAAI,CAAC;AAAA,IACnG,CAAC;AAAA,EACH;AAAA,EA9DmB;AAAA,EACA;AAAA,EAGA;AAAA,EAEA;AAAA,EArBF;AAAA,EACA,aAAa,IAAI,cAAc;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,IAAI,gBAAgB;AAAA,EACjC;AAAA,EACA;AAAA,EACT,uBAAuB;AAAA,EACvB;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EAmER,IAAI,UAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,QAAQ,OAAgB;AAC1B,SAAK,YAAY;AACjB,QAAI,KAAK,OAAQ,MAAK,OAAO,UAAU;AAAA,EACzC;AAAA,EAEA,IAAI,SAAsB;AACxB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,sBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,OAAyB;AAC9B,QAAI,SAAS,EAAG,QAAO,CAAC;AACxB,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK;AACnC,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,OAAO,kBAAkB;AAC7E,UAAM,cAAc,KAAK,QAAQ,OAAO,SAAS,KAAK,CAAC;AACvD,UAAM,mBAAmB,KAAK,IAAI,GAAG,gBAAgB,YAAY,SAAS,uBAAuB;AACjG,UAAM,gBAAgB;AAAA,MACpB,KAAK,QAAQ,UAAU,aAAa,CAAC;AAAA,MACrC;AAAA,MACA,KAAK;AAAA,MACL,KAAK,IAAI,4BAA4B,gBAAgB;AAAA,IACvD;AACA,UAAM,iBAAiB,KAAK;AAAA,MAC1B;AAAA,MACA,gBAAgB,YAAY,SAAS,0BAA0B,cAAc;AAAA,IAC/E;AACA,UAAM,eAAe,sBAAsB,KAAK,sBAAsB,SAAS;AAC/E,SAAK,uBAAuB,aAAa;AACzC,SAAK,WAAW,aAAa,aAAa,QAAQ,gBAAgB,MAAM,KAAK,IAAI,cAAc,CAAC;AAEhG,WAAO;AAAA,MACL,uBAAuB,WAAW,KAAK,OAAO,KAAK,aAAa;AAAA,MAChE,aAAa,MAAM,KAAK,WAAW,WAAW,KAAK,WAAW,YAAY,cAAc;AAAA,MACxF,KAAK,aAAa,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,IAAI,CAAC,SAASA,iBAAgB,MAAM,SAAS,CAAC;AAAA,EAClD;AAAA,EAEA,YAAY,MAAoB;AAC9B,QAAI,KAAK,SAAU;AACnB,QAAI,KAAK,WAAW,QAAQ,IAAI,GAAG;AACjC,WAAK,QAAQ,YAAY,IAAI;AAC7B,WAAK,IAAI,cAAc;AACvB;AAAA,IACF;AACA,QAAI,KAAK,UAAU,QAAQ,MAAM,MAAM,GAAG;AACxC,WAAK,WAAW;AAChB,WAAK,OAAO,KAAK;AACjB,WAAK,WAAW,MAAM;AACtB,WAAK,SAAS;AACd;AAAA,IACF;AACA,UAAM,WAAW,KAAK,QAAQ,UAAU;AACxC,QAAI,YAAY,SAAS,OAAO,SAAS,KAAK,KAAK,UAAU,QAAQ,MAAM,oBAAoB,GAAG;AAChG,YAAM,eAAe,SAAS,OAAO,QAAQ,KAAK,iBAAiB,SAAS,KAAK;AACjF,YAAM,YAAY,SAAS,QAAQ,eAAe,KAAK,SAAS,OAAO,MAAM;AAC7E,UAAI,WAAW;AACb,aAAK,gBAAgB;AACrB,iBAAS,SAAS,SAAS;AAC3B,aAAK,UAAU;AACf,aAAK,IAAI,cAAc;AAAA,MACzB;AACA;AAAA,IACF;AACA,QAAIC,YAAW,MAAMC,KAAI,MAAM,GAAG;AAChC,WAAK,WAAW,SAAS,CAAC,KAAK,IAAI,GAAG,KAAK,WAAW,cAAc,CAAC;AACrE,WAAK,IAAI,cAAc;AACvB;AAAA,IACF;AACA,QAAID,YAAW,MAAMC,KAAI,QAAQ,GAAG;AAClC,WAAK,WAAW,SAAS,KAAK,IAAI,GAAG,KAAK,WAAW,cAAc,CAAC;AACpE,WAAK,IAAI,cAAc;AACvB;AAAA,IACF;AACA,SAAK,QAAQ,YAAY,IAAI;AAC7B,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA,EAEA,aAAmB;AACjB,SAAK,WAAW,WAAW;AAAA,EAC7B;AAAA,EAEA,SAAe;AACb,SAAK,WAAW;AAChB,SAAK,OAAO,KAAK;AAAA,EACnB;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,UAAU;AACjB,WAAK,OAAO,KAAK;AACjB,WAAK,WAAW,MAAM;AACtB;AAAA,IACF;AACA,SAAK,WAAW;AAChB,SAAK,OAAO,KAAK;AACjB,SAAK,WAAW,MAAM;AACtB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,aAAa,OAAuB;AAC1C,UAAM,OAAO,KAAK,UAAU,MAAM,MAAM;AACxC,QAAI,KAAK,SAAS;AAChB,YAAM,UAAU,QAAQ,KAAK,gBAAW,IAAI,KAAK,GAAG,KAAK,OAAO,WAAM,IAAI;AAC1E,aAAOF,iBAAgB,KAAK,MAAM,GAAG,WAAW,OAAO,GAAG,KAAK;AAAA,IACjE;AACA,UAAM,WAAW,KAAK,SAAS,sBAAiB,IAAI,YAAY,GAAG,IAAI;AACvE,UAAM,WAAW,KAAK,QAAQ,UAAU;AACxC,UAAM,YACJ,YAAY,SAAS,OAAO,SAAS,KAAK,KAAK,iBAAiB,KAAK,UAAU,KAAK,mBAAmB,SACnG,oBAAe,KAAK,aAAa,WAAM,KAAK,UAAU,MAAM,oBAAoB,CAAC,WACjF;AACN,UAAM,aAAa,KAAK,mBAAmB,IAAI,IAAI,8BAAyB;AAC5E,UAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU;AAClD,UAAM,eAAe,KAAK,SAAS,gBAAW,IAAI,KAAK;AACvD,UAAM,gBAAgBG,cAAa,KAAK,KAAK,QAAQ,QAAQ;AAC7D,UAAM,cAAc,KAAK,IAAI,GAAG,QAAQA,cAAa,aAAa,IAAI,CAAC;AACvE,UAAM,aAAa,KAAK,OAAO,OAAO,WAAW,EAAE,GAAG,EAAE,KAAK;AAC7D,WAAOH,iBAAgB,GAAG,UAAU,WAAM,KAAK,MAAM,GAAG,SAAS,aAAa,CAAC,IAAI,KAAK;AAAA,EAC1F;AAAA,EAEQ,wBAAmC;AACzC,WAAO;AAAA,MACL,QAAQ,CAAC,UAAU,CAAC,uBAAuB,OAAO,KAAK,OAAO,KAAK,aAAa,CAAC;AAAA,MACjF,aAAa;AAAA,MAAC;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,4BAAuC;AAC7C,WAAO;AAAA,MACL,QAAQ,CAAC,UAAU;AACjB,cAAM,QAAQ,sBAAsB,KAAK,sBAAsB,KAAK;AACpE,aAAK,uBAAuB,MAAM;AAClC,eAAO;AAAA,MACT;AAAA,MACA,YAAY,MAAM;AAChB,mBAAW,aAAa,KAAK,qBAAsB,WAAU,WAAW;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,0BAAqC;AAC3C,WAAO;AAAA,MACL,QAAQ,CAAC,UACP,oBAAoB,KAAK,QAAQ,UAAU,aAAa,CAAC,GAAG,OAAO,KAAK,OAAO,0BAA0B;AAAA,MAC3G,aAAa;AAAA,MAAC;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,wBAAmC;AACzC,WAAO;AAAA,MACL,QAAQ,CAAC,UAAU,CAAC,KAAK,aAAa,KAAK,CAAC;AAAA,MAC5C,YAAY,MAAM,KAAK,OAAO,WAAW;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,qBAA6B;AACnC,WAAO,KAAK,IAAI,GAAG,KAAK,uBAAuB,KAAK,WAAW,cAAc;AAAA,EAC/E;AACF;AAaA,SAAS,0BACP,OACA,OACA,iBACA,uBAAuD,CAAC,GAC3C;AACb,QAAM,aAAa,MAAM,QAAQ,CAAC,SAAsB;AACtD,UAAM,WAAW,IAAI;AAAA,MACnBI,wBAAuB,KAAK,QAAQ;AAAA,MACpC,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AACA,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,QAAQ,IAAI,SAAS,UAAUA,wBAAuB,KAAK,MAAM,CAAC,IAAI,GAAG,GAAG,iBAAiB,GAAG;AAAA,QACpG,OAAO,CAAC,SAAS,MAAM,GAAG,SAAS,IAAI;AAAA,MACzC,CAAC;AACD,aAAO,CAAC,UAAU,KAAK;AAAA,IACzB;AACA,UAAM,WAA6B;AAAA,MACjC,GAAG,KAAK;AAAA,MACR,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAMA,wBAAuB,KAAK,MAAM,EAAE,CAAC;AAAA,MACrE,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AACA,WAAO,CAAC,UAAU,IAAI,0BAA0B,UAAU,MAAM,iBAAiB,GAAG,IAAI,GAAG,oBAAoB,CAAC;AAAA,EAClH,CAAC;AACD,MAAI,iBAAiB;AACnB,eAAW;AAAA,MACT,IAAI,qBAAqBA,wBAAuB,eAAe,GAAG,iBAAiB,GAAG,GAAG,oBAAoB;AAAA,IAC/G;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,YAAkC,OAAyB;AACxF,SAAO,WAAW,QAAQ,CAAC,cAAc,UAAU,OAAO,KAAK,CAAC,EAAE,IAAI,4BAA4B;AACpG;AAEA,SAAS,uBAAuB,OAAe,OAAc,eAA0C;AACrG,QAAM,WAAW,gBAAgB,kBAAe,aAAa,KAAK;AAClE,QAAM,QAAQC,iBAAgB,8BAAsB,QAAQ,KAAK,KAAK;AACtE,QAAM,YAAY,KAAK,IAAI,GAAG,QAAQC,cAAa,KAAK,CAAC;AACzD,SAAO,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,SAAI,OAAO,SAAS,CAAC,EAAE;AAC7D;AAEA,SAAS,kBACP,QACA,cACA,QACA,aACA,eACA,cAAwB,CAAC,GACf;AACV,QAAM,QAAQ,CAAC,QAAQ,GAAG,cAAc,GAAG,aAAa,QAAQ,GAAG,WAAW;AAC9E,MAAI,MAAM,UAAU,cAAe,QAAO;AAC1C,MAAI,iBAAiB,EAAG,QAAO,CAAC,MAAM;AACtC,QAAM,eAAe,KAAK,IAAI,GAAG,gBAAgB,CAAC;AAClD,SAAO,CAAC,QAAQ,QAAQ,GAAG,eAAe,aAAa,YAAY,CAAC;AACtE;AAEA,SAAS,eAAe,aAAuB,QAA0B;AACvE,MAAI,UAAU,EAAG,QAAO,CAAC;AACzB,MAAI,YAAY,UAAU,OAAQ,QAAO;AACzC,QAAM,cAAc,YAAY,UAAU,CAAC,SAAS,KAAK,SAAS,aAAa,CAAC;AAChF,MAAI,cAAc,EAAG,QAAO,YAAY,MAAM,CAAC,MAAM;AACrD,QAAM,QAAQ,KAAK,IAAI,aAAa,YAAY,SAAS,MAAM;AAC/D,SAAO,YAAY,MAAM,OAAO,QAAQ,MAAM;AAChD;AAEA,SAAS,oBAAoB,WAA8B,OAAe,OAAc,UAA4B;AAClH,MAAI,UAAU,WAAW,KAAK,YAAY,EAAG,QAAO,CAAC;AACrD,QAAM,iBAAiB,CAAC,aAAqB,mBAAmB,QAAQ,KAAK;AAC7E,MAAI,aAAa,KAAK,UAAU,SAAS,GAAG;AAC1C,WAAO;AAAA,MACLD;AAAA,QACE,MAAM,GAAG,OAAO,cAAc,UAAU,SAAS,CAAC,WAAW,eAAe,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE;AAAA,QACjG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,cAAc,UAAU,SAAS;AACvC,QAAM,gBAAgB,cAAc,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI;AAChE,QAAM,QAAQ,UACX,MAAM,GAAG,aAAa,EACtB,IAAI,CAAC,aAAaA,iBAAgB,MAAM,GAAG,OAAO,aAAa,eAAe,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC;AACrG,MAAI,aAAa;AACf,UAAM,KAAKA,iBAAgB,MAAM,GAAG,OAAO,qBAAgB,UAAU,SAAS,aAAa,OAAO,GAAG,KAAK,CAAC;AAAA,EAC7G;AACA,SAAO;AACT;AAEA,SAAS,6BAA6B,MAAsB;AAC1D,SAAO,eAAe,OAAO,CAAC,QAAQ,WAAW,OAAO,WAAW,QAAQ,EAAE,GAAG,IAAI;AACtF;AAEA,SAASD,wBAAuB,MAAsB;AACpD,SAAO,CAAC,GAAG,IAAI,EACZ,IAAI,CAAC,cAAc;AAClB,QAAI,cAAc,KAAM,QAAO;AAC/B,QAAI,cAAc,IAAM,QAAO;AAC/B,UAAM,OAAO,UAAU,WAAW,CAAC;AACnC,QAAI,QAAQ,MAAO,QAAQ,OAAO,QAAQ,KAAM;AAC9C,aAAO,MAAM,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IACjD;AACA,WAAO;AAAA,EACT,CAAC,EACA,KAAK,EAAE;AACZ;;;AVvlBA,IAAM,oBAAoB;AAWnB,SAAS,kCAAkC,eAA4D;AAC5G,SAAO,OAAO,OAAO,SAAS,YAAY;AACxC,UAAM,WAAW,cAAc,YAAY,MAAM,QAAQ;AACzD,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,8CAA8C,MAAM,QAAQ,EAAE;AAC7F,WAAO,SAAS,aAAa,OAAO,SAAS,OAAO,EAAE,OAAO;AAAA,EAC/D;AACF;AAuBA,eAAsB,gBAAgB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkE;AAChE,QAAM,gBAAgB,CAAC,YAAoB,OAAO,mBAAmB,OAAO,CAAC;AAC7E,MAAI,SAAS,OAAO;AAClB,UAAM,WAAW,eAAe,GAAG,aAAa,QAAQ,IAAI,aAAa,EAAE,KAAK;AAChF,UAAM,YAAY,uBAAuB,SAAS,KAAK;AACvD,QAAI,CAAC,WAAW;AACd,oBAAc,gBAAgB,SAAS,KAAK,gCAAgC,QAAQ,GAAG;AACvF,aAAO,gBAAgB,EAAE,UAAU,CAAC,GAAG,cAAc,eAAe,MAAM,cAAc,CAAC;AAAA,IAC3F;AACA,UAAM,kBAAkB,cAAc,KAAK,UAAU,UAAU,UAAU,OAAO;AAChF,QAAI,CAAC,iBAAiB;AACpB,oBAAc,gBAAgB,SAAS,KAAK,mCAAmC,QAAQ,GAAG;AAAA,IAC5F,OAAO;AACL,YAAM,gBACJ,oBAAoB,gBACnB,gBAAgB,aAAa,cAAc,YAAY,gBAAgB,OAAO,aAAa;AAC9F,YAAM,iBAAiB,gBAAgB,2CAA2C,mBAAmB,QAAQ;AAC7G,UAAI;AACF,cAAM,OAAO,MAAM,cAAc,oBAAoB,eAAe;AACpE,YAAI,KAAK,MAAM,eAAe,IAAI,GAAG;AACnC,iBAAO;AAAA,YACL,OAAO,KAAK,UAAU,EAAE,GAAG,iBAAiB,SAAS,KAAK,QAAQ,IAAI;AAAA,YACtE;AAAA,UACF;AAAA,QACF;AACA,cAAM,SAAS,KAAK,KAAK,+BAA+B,KAAK;AAC7D,sBAAc,gBAAgB,SAAS,KAAK,oBAAoB,MAAM,MAAM,cAAc,GAAG;AAAA,MAC/F,SAAS,OAAgB;AACvB,sBAAc,gBAAgB,SAAS,KAAK,wBAAwBG,aAAY,KAAK,CAAC,MAAM,cAAc,GAAG;AAAA,MAC/G;AACA,UAAI,cAAe,QAAO;AAAA,IAC5B;AAAA,EACF;AAEA,MAAI,CAAC,aAAc,QAAO;AAC1B,MAAI;AACF,UAAM,OAAO,MAAM,cAAc,oBAAoB,YAAY;AACjE,QAAI,KAAK,MAAM,eAAe,IAAI,GAAG;AAEnC,aAAO;AAAA,QACL,OAAO,KAAK,UAAU,EAAE,GAAG,cAAc,SAAS,KAAK,QAAQ,IAAI;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAiC;AACvD,SAAO;AAAA,IACL,KAAK,UAAU,yBAAyB,KAAK,OAAO,KAAM,KAAK,OAAO,OAAO,KAAK,KAAK,GAAG,EAAE,SAAS;AAAA,EACvG;AACF;AAEA,SAAS,yBAAyB,SAA+C;AAC/E,SAAO,YAAY,UAAa,OAAO,OAAO,OAAO,EAAE,KAAK,CAAC,UAAU,UAAU,IAAI;AACvF;AAoBA,SAASC,aAAY,OAAwB;AAC3C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAEA,SAAS,iBAAiB,KAAkD;AAC1E,QAAM,eAAe,IAAI,eAAe;AACxC,MAAI,OAAO,iBAAiB,WAAY,QAAO;AAC/C,QAAM,YAAY,aAAa,KAAK,IAAI,cAAc;AACtD,SAAO,UAAU,SAAS,IAAI,YAAY;AAC5C;AAEA,SAASC,cACP,KACA,SACA,OACM;AACN,MAAI;AACF,QAAI,GAAG,OAAO,mBAAmB,OAAO,GAAG,KAAK;AAAA,EAClD,QAAQ;AAAA,EAER;AACF;AAkBe,SAAR,IAAqB,IAAkB,eAAyC,CAAC,GAAG;AACzF,QAAM,kBAAkB,aAAa,mBAAmB;AACxD,QAAM,YAAY,aAAa,iBAAiB;AAChD,QAAM,eAAe,aAAa,gBAAgB;AAClD,QAAM,eAAe,aAAa,gBAAgB;AAClD,QAAM,YAAY,aAAa,aAAa;AAC5C,QAAM,gBAAgB,aAAa,iBAAiB;AAEpD,QAAM,mBAAmB,oBAAI,IAA4B;AACzD,MAAI,mBAAmB;AACvB,QAAM,oBAAoB,MACxB,CAAC,GAAG,iBAAiB,OAAO,CAAC,EAC1B,QAAQ,EACR,OAAO,CAAC,UAAU,MAAM,OAAO,MAAM,SAAS,KAAK,MAAM,KAAK,EAC9D,KAAK,CAAC,OAAO,WAAW,OAAO,YAAY,MAAM,aAAa,OAAO,YAAY,MAAM,SAAS,EAChG,IAAI,CAAC,WAAW;AAAA,IACf,IAAI,MAAM;AAAA,IACV,OAAO,MAAM,SAAS;AAAA,IACtB,eAAe,MAAM,OAAO,MAAM;AAAA,EACpC,EAAE;AACN,KAAG,gBAAgB,OAAO;AAAA,IACxB,aAAa;AAAA,IACb,SAAS,OAAO,MAAM,QAAQ;AAC5B,YAAM,WAAW,KAAK,KAAK;AAC3B,UAAI,IAAI,SAAS,OAAO;AACtB,YAAI,GAAG,OAAO,sCAAsC,OAAO;AAC3D;AAAA,MACF;AAEA,UAAI,aAAmC;AACvC,UAAI;AACJ,UAAI,CAAC,UAAU;AACb,eAAO,MAAM;AACX,uBAAa,MAAM,gBAAgB,IAAI,KAAK,kBAAkB,CAAC;AAC/D,cAAI,eAAe,SAAU;AAC7B,cAAI,eAAe,OAAQ;AAE3B,gBAAM,aAAa,MAAM,UAAU,IAAI,GAAG;AAC1C,cAAI,WAAW,SAAS,SAAU;AAClC,cAAI,WAAW,SAAS,OAAQ;AAChC,cAAI;AACF,gBAAI,CAAC,IAAI,eAAe,SAAS,WAAW,OAAO,GAAG;AACpD,cAAAA,cAAa,KAAK,yDAAyD,SAAS;AACpF;AAAA,YACF;AACA,kBAAM,SAAS,IAAI,eAAe,UAAU,WAAW,OAAO;AAC9D,gBAAI,OAAO,GAAG,EAAE,GAAG,OAAO,WAAW,SAAS;AAC5C,cAAAA,cAAa,KAAK,0DAA0D,SAAS;AACrF;AAAA,YACF;AACA,0CAA8B,yBAAyB,MAAM;AAC7D,yBAAa;AACb;AAAA,UACF,QAAQ;AACN;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,aAAa,GAAG;AACvC,YAAM,0BAA0B,SAAS,kBAAkB;AAC3D,YAAM,aAAa,MAAM,aAAa,UAAU,GAAG;AACnD,UAAI,WAAW,SAAS,aAAa;AACnC,QAAAA,cAAa,KAAK,aAAa,MAAM;AACrC;AAAA,MACF;AACA,UAAI,WAAW,SAAS,eAAe;AACrC,QAAAA,cAAa,KAAK,+BAA+B,OAAO;AACxD;AAAA,MACF;AAEA,UAAI,QAAQ,OAAO,eAAe,WAAW,iBAAiB,IAAI,WAAW,QAAQ,IAAI;AACzF,UAAI,OAAO,eAAe,YAAY,CAAC,OAAO;AAC5C,QAAAA,cAAa,KAAK,wDAAwD,SAAS;AACnF;AAAA,MACF;AACA,YAAM,oBAAoB,OAAO,OAAO,MAAM,UAAU;AAExD,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA,CAAC,kBAAkB;AACjB,gBAAI,CAAC,OAAO;AACV,oBAAM,YAAY,KAAK,IAAI;AAC3B,sBAAQ;AAAA,gBACN,IAAI,OAAO,gBAAgB;AAAA,gBAC3B,QAAQ;AAAA,kBACN,+BAA+B,yBAAyB,cAAc,eAAe,UAAU,CAAC;AAAA,gBAClG;AAAA,gBACA,eAAe,SAAS,iBAAiB,GAAG,iBAAiB;AAAA,gBAC7D;AAAA,gBACA,WAAW;AAAA,cACb;AACA,kCAAoB;AAAA,YACtB;AACA,mBAAO,UAAU;AAAA,cACf,iBAAiB,YAAY;AAAA,cAC7B,UAAU,WAAW;AAAA,cACrB,eAAe,MAAM;AAAA,cACrB,8BAA8B,CAAC,2BAA2B,sCAAsC,QAAQ;AAAA,cACxG;AAAA,cACA,KAAK;AAAA,YACP,CAAC;AAAA,UACH;AAAA,UACA;AAAA,YACE,cAAc,gCAAgC,QAAQ;AAAA,YACtD,GAAI,SAAS,cAAc,EAAE,aAAa,SAAS,YAAY,IAAI,CAAC;AAAA,UACtE;AAAA,QACF;AAAA,MACF,UAAE;AACA,YAAI,OAAO,SAAS,MAAM,OAAO,MAAM,SAAS,GAAG;AACjD,cAAI,MAAM,OAAO,MAAM,SAAS,mBAAmB;AACjD,6BAAiB,OAAO,MAAM,EAAE;AAAA,UAClC;AACA,2BAAiB,IAAI,MAAM,IAAI,KAAK;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,eAAe,sBACb,IACA,KACA,eAC+B;AAC/B,SAAO,mBAAmB,KAAK;AAAA,IAC7B,sBAAsB,GAAG,iBAAiB;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AAEA,eAAe,uBAAuB,KAAoD;AACxF,QAAM,iBAAiB,MAAM,gBAAgB;AAC7C,MAAI,eAAe,SAAS,SAAU,QAAO,eAAe;AAC5D,MAAI,eAAe,SAAS,WAAW;AACrC,IAAAA,cAAa,KAAK,4BAA4B,eAAe,MAAM,IAAI,SAAS;AAAA,EAClF;AACA,SAAO,CAAC;AACV;AAOA,eAAe,0BACb,UACA,KACiC;AACjC,SAAO,IAAI,GAAG,OAA+B,CAAC,KAAK,OAAO,cAAc,SAAS;AAC/E,UAAM,SAAS,IAAIC,gBAAe,KAAK,OAAO,qCAAqC;AACnF,QAAI,UAAU;AACd,WAAO,UAAU,MAAM;AACrB,UAAI,QAAS;AACb,gBAAU;AACV,WAAK,EAAE,MAAM,YAAY,CAAC;AAAA,IAC5B;AAEA,oBAAgB;AAAA,MACd;AAAA,MACA,cAAc,IAAI;AAAA,MAClB,eAAe,IAAI;AAAA,MACnB,MAAM,CAAC,YAAY;AACjB,YAAI,CAAC,QAAS,CAAAD,cAAa,KAAK,SAAS,SAAS;AAAA,MACpD;AAAA,IACF,CAAC,EACE,KAAK,CAAC,aAAa;AAClB,UAAI,QAAS;AACb,gBAAU;AACV,WAAK,WAAW,EAAE,MAAM,YAAY,SAAS,IAAI,EAAE,MAAM,cAAc,CAAC;AAAA,IAC1E,CAAC,EACA,MAAM,MAAM;AACX,UAAI,QAAS;AACb,gBAAU;AACV,WAAK,EAAE,MAAM,cAAc,CAAC;AAAA,IAC9B,CAAC;AAEH,WAAO;AAAA,EACT,CAAC;AACH;AA4CA,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,+BAA+B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,CAAC;AAClB,GAAkD;AAChD,QAAM,MAAM,aAAa,OAAO;AAChC,QAAM,WAAW,aAAa,YAAY;AAC1C,QAAM,0BAA0B,aAAa,qBAAqB;AAClE,QAAM,0BAA0B,aAAa,sBAAsB;AACnE,QAAM,uBACJ,aAAa,yBACZ,CAAC,UAA4B,kBAAkB,EAAE,eAAe,MAAM,GAAG,EAAE,aAAa,CAAC;AAC5F,QAAM,MAAM,aAAa,OAAO,KAAK;AACrC,QAAM,SAAS,OAAO,UAAU,iBAAiB,yBAAyB,IAAI,eAAe,UAAU,CAAC,CAAC;AACzG,QAAM,iBAAiBE,4BAA2B,SAAS,KAAK;AAChE,QAAM,gBAAgB,oBAAI,IAAmB;AAC7C,QAAM,oBAA8B,CAAC;AACrC,MAAI,sBAAsB,mBAAmB,SAAS,OAAO,OAAO,iBAAiB,aAAa;AAClG,MAAI,MAAO,OAAM,gBAAgB;AACjC,MAAI,kBAAkB;AACtB,MAAI;AACJ,QAAM,wBAAwB,OAAiC;AAAA,IAC7D,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU,CAAC,UAAU;AACnB,UAAI,CAAC,eAAe,SAAS,KAAK,EAAG;AACrC,4BAAsB;AACtB,UAAI,MAAO,OAAM,gBAAgB;AACjC,UAAI,CAAC,6BAA8B;AACnC,UAAI;AACJ,cAAQ,QAAQ,QAAQ,EACrB,KAAK,MAAM,qBAAqB,KAAK,CAAC,EACtC,KAAK,MAAM,MAAS,EACpB,MAAM,CAAC,UAAmB;AACzB,QAAAF;AAAA,UACE;AAAA,UACA,6BAA6B,KAAK,iDAAiDD,aAAY,KAAK,CAAC;AAAA,UACrG;AAAA,QACF;AAAA,MACF,CAAC,EACA,QAAQ,MAAM,cAAc,OAAO,KAAK,CAAC;AAC5C,oBAAc,IAAI,KAAK;AAAA,IACzB;AAAA,EACF;AAEA,MAAI;AACF,WAAO,MAAM;AACX,UAAI,CAAC,iBAAiB;AACpB,cAAM,SAAS,MAAM,SAAS,QAAQ,OAAO,MAAM,SAAS,GAAG,KAAK,eAAe,sBAAsB,CAAC;AAC1G,YAAI,OAAO,SAAS,QAAS,QAAO,EAAE,MAAM,SAAS;AACrD,YAAI,OAAO,SAAS,eAAe;AACjC,gBAAM,SAAS,MAAM,wBAAwB,QAAQ,GAAG;AACxD,cAAI,OAAO,SAAS,SAAU,QAAO;AACrC,cAAI,OAAO,SAAS,QAAQ;AAC1B,4BAAgB,OAAO;AACvB;AAAA,UACF;AACA,gBAAM,WAAW,MAAM,wBAAwB,OAAO,OAAO,KAAK,OAAO,OAAO;AAChF,cAAI,aAAa,YAAY,aAAa,SAAU,QAAO,EAAE,MAAM,SAAS;AAC5E,0BAAgB,OAAO;AACvB;AAAA,QACF;AACA,wBAAgB;AAChB,0BAAkB,OAAO;AAAA,MAC3B;AAEA,YAAM,SAAS,MAAM,IAAI,QAAQ,iBAAiB,UAAU,qBAAqB,KAAK;AAAA,QACpF,WAAW;AAAA,QACX,QAAQ,CAAC,aAAa,kBAAkB,KAAK,QAAQ;AAAA,QACrD,UAAU,sBAAsB;AAAA,MAClC,CAAC;AACD,UAAI,OAAO,SAAS,WAAW;AAC7B,QAAAC,cAAa,KAAK,aAAa,MAAM;AACrC,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AACA,UAAI,OAAO,SAAS,SAAS;AAC3B,eAAO,MAAM,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ,OAAO;AAAA,QACjB,CAAC;AAAA,MACH;AACA,UAAI,OAAO;AACT,cAAM,UAAU,mBAAmB,eAAe,KAAK;AACvD,cAAM,YAAY,IAAI;AAAA,MACxB;AAEA,wBAAkB,kBAAkB,MAAM;AAAA,IAC5C;AAAA,EACF,UAAE;AACA,UAAM,QAAQ,WAAW,CAAC,GAAG,aAAa,CAAC;AAAA,EAC7C;AACF;AAOA,eAAsB,kBACpB,QACA,KACA,eAA8C,CAAC,GAChB;AAC/B,QAAM,WAAW,iBAAiB,OAAO,KAAK;AAC9C,MAAI,SAAS,WAAW,EAAG,QAAO,EAAE,MAAM,OAAO;AACjD,QAAM,WAAW,aAAa,YAAY;AAC1C,QAAM,cAAc,aAAa,eAAe;AAChD,QAAM,aAAa,CAAC,cAAgD;AAAA,IAClE,MAAM;AAAA,IACN,OAAO,qBAAqB,QAAQ;AAAA,IACpC,SAAS,qBAAqB,QAAQ;AAAA,EACxC;AAEA,QAAM,iBAAiB,8BAA8B,OAAO,OAAO,EAAE,MAAM,SAAS,CAAC;AACrF,QAAM,iBAAiB,8BAA8B,OAAO,OAAO,EAAE,MAAM,SAAS,CAAC;AACrF,QAAM,eAAe,2CAAwC,0BAA0B,cAAc,CAAC;AACtG,QAAM,aAAa;AACnB,QAAM,cAAc;AACpB,QAAM,eAAe,uBAAuB,SAAS,MAAM,cAAW,0BAA0B,cAAc,CAAC;AAC/G,QAAM,eAAe;AACrB,MAAI;AAEJ,SAAO,MAAM;AACX,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA,CAAC,cAAc,YAAY,aAAa,cAAc,YAAY;AAAA,MAClE;AAAA,IACF;AACA,QAAI,YAAY,SAAS,QAAS,QAAO,EAAE,MAAM,SAAS;AAC1D,QAAI,YAAY,SAAS,UAAU,YAAY,UAAU,aAAc,QAAO,EAAE,MAAM,OAAO;AAC7F,UAAM,QAAQ,YAAY;AAC1B,oBAAgB;AAChB,QAAI,UAAU,aAAc,QAAO,WAAW,cAAc;AAC5D,QAAI,UAAU,cAAc;AAC1B,YAAM,SAAS,WAAW,cAAc;AACxC,YAAM,UAAU,MAAM,YAAY,KAAK,OAAO,OAAO,OAAO,OAAO;AACnE,UAAI,QAAQ,SAAS,QAAS,QAAO,EAAE,MAAM,SAAS;AACtD,UAAI,QAAQ,SAAS,OAAQ;AAC7B,aAAO;AAAA,IACT;AACA,QAAI,UAAU,YAAY;AACxB,YAAM,YAAY,SAAS;AAAA,QACzB,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,gBAAgB,mBAAmB,KAAK,QAAQ,CAAC,CAAC;AAAA,MACtF;AACA,UAAI;AACJ,aAAO,MAAM;AACX,cAAM,iBAAiB,MAAM,SAAS,KAAK,8BAA8B,WAAW,gBAAgB;AACpG,YAAI,eAAe,SAAS,QAAS,QAAO,EAAE,MAAM,SAAS;AAC7D,YAAI,eAAe,SAAS,OAAQ;AACpC,cAAM,oBAAoB,UAAU,QAAQ,eAAe,KAAK;AAChE,YAAI,oBAAoB,EAAG;AAC3B,2BAAmB,eAAe;AAClC,cAAM,SAAS,WAAW,8BAA8B,OAAO,OAAO,EAAE,MAAM,QAAQ,kBAAkB,CAAC,CAAC;AAC1G,cAAM,UAAU,MAAM,YAAY,KAAK,OAAO,OAAO,OAAO,OAAO;AACnE,YAAI,QAAQ,SAAS,QAAS,QAAO,EAAE,MAAM,SAAS;AACtD,YAAI,QAAQ,SAAS,OAAQ;AAC7B,eAAO;AAAA,MACT;AACA;AAAA,IACF;AAEA,QAAI,UAAU,YAAa;AAC3B,QAAI;AACJ,WAAO,MAAM;AACX,YAAM,gBAAgB,MAAM;AAAA,QAC1B;AAAA,QACA,CAAC,KAAK,OAAO,aAAa,SAAS;AACjC,cAAI;AACJ,qBAAW,IAAI;AAAA,YACb;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACP,CAAC,WAAW;AACV,kBAAI,OAAO,SAAS,OAAQ,MAAK,EAAE,MAAM,OAAO,CAAC;AAAA,uBACxC,OAAO,SAAS,QAAS,MAAK,EAAE,MAAM,SAAS,CAAC;AAAA,kBACpD,MAAK,EAAE,GAAG,WAAW,OAAO,QAAQ,GAAG,gBAAgB,SAAS,SAAS,EAAE,CAAC;AAAA,YACnF;AAAA,YACA;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,CAAC,cAAe,QAAO,EAAE,MAAM,SAAS;AAC5C,UAAI,cAAc,SAAS,SAAU,QAAO;AAC5C,UAAI,cAAc,SAAS,OAAQ;AACnC,YAAM,UAAU,MAAM,YAAY,KAAK,cAAc,OAAO,cAAc,OAAO;AACjF,UAAI,QAAQ,SAAS,QAAS,QAAO,EAAE,MAAM,SAAS;AACtD,UAAI,QAAQ,SAAS,QAAQ;AAC3B,yBAAiB,cAAc;AAC/B;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,cAAc;AAAA,QACrB,SAAS,cAAc;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;AAMA,eAAe,uBACb,KACA,OACA,SACsC;AACtC,QAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,OAAO,sBAAsB;AACnE,MAAI,IAAI,QAAQ,QAAS,QAAO,EAAE,MAAM,QAAQ;AAChD,MAAI,YAAY;AAChB,QAAM,QAAQ,QAAQ,aAAa,IAAI,cAAc,GAAG,QAAQ,QAAQ;AACxE,QAAM,YAAY,QAAQ,UAAU,IAAI,WAAW,GAAG,QAAQ,KAAK;AACnE,QAAM,OAAO,WAAkD;AAAA,IAC7D,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS,OAAO;AAAA,QACd,MAAM;AAAA,QACN,OAAO,gBAAa,KAAK,SAAM,SAAS,UAAO,QAAQ,MAAM;AAAA,QAC7D,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,SAAS,EAAE,IAAI,SAAS,OAAO,SAAS,QAAQ,QAAQ;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,OAAO,YAAY;AACjB,oBAAY;AACZ,eAAO,EAAE,MAAM,QAAQ;AAAA,MACzB;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,SAAS,MAAM;AAAA,IAA2B;AAAA,IAAK,CAAC,gBACpD,QAAQ,aAAa,MAAM,EAAE,UAAU,MAAM,OAAU,CAAC;AAAA,EAC1D;AACA,MAAI,aAAa,OAAO,SAAS,YAAY,OAAO,WAAW,SAAS;AACtE,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB;AACA,SAAO,sBAAsB,MAAM;AACrC;AAEA,eAAe,YACb,KACA,OACA,SACA,cACgC;AAChC,QAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,OAAO,sBAAsB;AACnE,MAAI,IAAI,QAAQ,QAAS,QAAO,EAAE,MAAM,QAAQ;AAChD,QAAM,QAAQ,QAAQ,IAAI,CAAC,OAAO,WAAW,EAAE,IAAI,UAAU,KAAK,IAAI,MAAM,EAAE;AAC9E,QAAM,eAAe,iBAAiB,SAAY,KAAK,QAAQ,QAAQ,YAAY;AACnF,MAAI;AACJ,QAAM,OAAO,WAAmD;AAAA,IAC9D,OAAO;AAAA,IACP,SAAS;AAAA,MACP,SAAS,OAAO;AAAA,QACd,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,eAAe,gBAAgB,IAAI,UAAU,YAAY,KAAK;AAAA,QAC9D,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,QAAQ,OAAO,EAAE,OAAO,MAA0B;AAChD,cAAM,QAAQ,OAAO,SAAS,OAAO,MAAM,UAAU,MAAM,GAAG,EAAE;AAChE,wBAAgB,QAAQ,KAAK;AAC7B,eAAO,kBAAkB,SAAa,EAAE,MAAM,OAAO,IAAe,EAAE,MAAM,QAAQ;AAAA,MACtF;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,SAAS,MAAM;AAAA,IAA2B;AAAA,IAAK,CAAC,gBACpD,QAAQ,aAAa,MAAM,EAAE,UAAU,MAAM,OAAU,CAAC;AAAA,EAC1D;AACA,SAAO,kBAAkB,UAAa,OAAO,SAAS,YAAY,OAAO,WAAW,UAChF,EAAE,MAAM,UAAU,OAAO,cAAc,IACvC,sBAAsB,MAAM;AAClC;AAEA,SAAS,sBAAsB,QAA6D;AAC1F,MAAI,OAAO,SAAS,SAAU,QAAO,EAAE,MAAM,OAAO,OAAO;AAC3D,MAAI,OAAO,SAAS,QAAS,OAAM,OAAO;AAC1C,SAAO,EAAE,MAAM,QAAQ;AACzB;AAEA,eAAsB,qBACpB,OACA,KACA,SACiC;AACjC,QAAM,kBAAkB,MACtB,GAAG,QAAQ,QAAQ,IAAI,QAAQ,aAAa,IAAI,YAAY,UAAU,MAAM,QAAQ,MAAM,IAAI,QAAQ,WAAW,IAAI,UAAU,QAAQ;AACzI,QAAM,WAAW,IAAI,GAAG,cAAc;AACtC,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,QAAI,GAAG,cAAc,KAAK;AAC1B,QAAI,GAAG,OAAO,WAAW,gBAAgB,CAAC,sDAAsD,MAAM;AACtG,WAAO;AAAA,EACT;AAEA,QAAM,eAAe;AACrB,QAAM,gBAAgB;AACtB,QAAM,eAAe;AACrB,SAAO,MAAM;AACX,UAAM,SAAS,MAAM,YAAY,KAAK,uCAAuC;AAAA,MAC3E;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,SAAS,QAAS,QAAO;AACpC,QAAI,OAAO,SAAS,UAAU,OAAO,UAAU,aAAc,QAAO;AACpE,QAAI,OAAO,UAAU,cAAc;AACjC,UAAI,GAAG,cAAc,GAAG,IAAI,GAAG,cAAc,CAAC;AAAA;AAAA,EAAO,KAAK,EAAE;AAC5D,UAAI,GAAG;AAAA,QACL,YAAY,gBAAgB,CAAC;AAAA,QAC7B;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,QAAI,OAAO,UAAU,cAAe;AAEpC,UAAM,UAAU,IAAI,GAAG,cAAc;AACrC,UAAM,aAAa,CAAC,GAAG,OAAO,EAAE;AAChC,UAAM,YAAY,MAAM,YAAY,KAAK,uBAAuB,UAAU,4BAA4B;AAAA,MACpG;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,UAAU,SAAS,QAAS,QAAO;AACvC,QAAI,UAAU,SAAS,UAAU,UAAU,UAAU,iCAAkC;AACvF,QAAI,UAAU,UAAU,iDAA6C;AACrE,QAAI,IAAI,GAAG,cAAc,MAAM,SAAS;AACtC,UAAI,GAAG;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,GAAG,cAAc,KAAK;AAC1B,QAAI,GAAG,OAAO,uCAAuC,gBAAgB,CAAC,mCAAmC,MAAM;AAC/G,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KAAK,UAAU,KAAK,OAAO,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC;AACxD;AAEA,eAAe,iCACb,QACA,iBACA,KAC8C;AAC9C,SAAO,MAAM;AACX,UAAM,YAAY,OAAO,MAAM;AAC/B,UAAM,6BAA6B,IAAI,SACnC,MAAM,6BAA6B,OAAO,OAAO,iBAAiB,IAAI,MAAM,IAC5E,MAAM,6BAA6B,OAAO,OAAO,eAAe;AACpE,QAAI,CAAC,8BAA8B,IAAI,QAAQ,QAAS,QAAO;AAC/D,QAAI,OAAO,MAAM,WAAW,UAAW,QAAO;AAAA,EAChD;AACF;AAEA,eAAe,kBACb,QACA,UACA,UACA,eACA,KACA,UACA;AACA,QAAM,6BAA6B,MAAM,iCAAiC,QAAQ,UAAU,GAAG;AAC/F,MAAI,CAAC,2BAA4B,QAAO,EAAE,MAAM,UAAmB;AACnE,SAAO,IAAI,GAAG,OAA2D,CAAC,KAAK,OAAO,aAAa,SAAS;AAC1G,QAAI,UAAU;AACd,UAAM,OAAO,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,MAAM;AACJ,YAAI,QAAS;AACb,kBAAU;AACV,aAAK,EAAE,MAAM,UAAU,CAAC;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,QACE,sBAAsB,2BAA2B,KAAK;AAAA,QACtD,UAAU;AAAA,UACR,WAAW,SAAS;AAAA,UACpB,UAAU,SAAS;AAAA,UACnB,UAAU,EAAE,GAAG,SAAS,UAAU,YAAY;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AACA,2BAAuB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,MAChB;AAAA,MACA,MAAM,SAAS;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,gBAAgB,kCAAkC,IAAI,aAAa;AAAA,MACnE,WAAW,iBAAiB,GAAG;AAAA,IACjC,CAAC,EAAE,KAAK,CAAC,WAAW;AAClB,UAAI,QAAS;AACb,gBAAU;AACV,WAAK,OAAO;AACZ,WAAK,MAAM;AAAA,IACb,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAe,mBACb,QACA,eACA,KACA,iBACA,UACgC;AAChC,QAAM,6BAA6B,MAAM,iCAAiC,QAAQ,iBAAiB,GAAG;AACtG,MAAI,CAAC,2BAA4B,QAAO,EAAE,MAAM,QAAQ;AACxD,SAAO,IAAI,GAAG;AAAA,IACZ,CAAC,KAAK,OAAO,aAAa,SACxB,IAAI,mBAAmB,KAAK,OAAO,OAAO,OAAO,MAAM;AAAA,MACrD;AAAA,MACA;AAAA,MACA,sBAAsB,2BAA2B,KAAK;AAAA,MACtD,UAAU,EAAE,GAAG,UAAU,YAAY;AAAA,IACvC,CAAC;AAAA,EACL;AACF;AAqBO,SAAS,yBAAyB,SAAkC;AACzE,QAAM,WAAqB,CAAC;AAE5B,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,aAAa,CAAC,MAAM,SAAS,KAAM;AAEtD,UAAM,OAAO,MAAM,QAAQ;AAC3B,QAAI,SAAS,UAAU,SAAS,YAAa;AAE7C,UAAM,eAAe,oBAAoB,MAAM,QAAQ,OAAO;AAC9D,QAAI,aAAa,WAAW,EAAG;AAE/B,UAAM,QAAQ,SAAS,SAAS,SAAS;AACzC,UAAM,SACJ,MAAM,QAAQ,cAAc,MAAM,QAAQ,eAAe,SAAS,KAAK,MAAM,QAAQ,UAAU,MAAM;AACvG,aAAS,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,EAC/D;AAEA,SAAO,kBAAkB,SAAS,KAAK,MAAM,GAAG,iBAAiB;AACnE;AAEA,SAAS,oBAAoB,SAA4B;AACvD,MAAI,OAAO,YAAY,SAAU,QAAO,CAAC,QAAQ,KAAK,CAAC,EAAE,OAAO,OAAO;AACvE,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO,CAAC;AAErC,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAM,QAAQ;AACd,QAAI,MAAM,SAAS,UAAU,OAAO,MAAM,SAAS,UAAU;AAC3D,YAAM,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,IAC9B,WAAW,MAAM,SAAS,cAAc,OAAO,MAAM,SAAS,UAAU;AACtE,YAAM,KAAK,cAAc,MAAM,IAAI,IAAI,WAAW,MAAM,SAAS,CAAC,GAAG;AAAA,IACvE,WAAW,MAAM,SAAS,gBAAgB,OAAO,MAAM,SAAS,UAAU;AACxE,YAAM,KAAK,oBAAoB,MAAM,IAAI,KAAK,WAAW,MAAM,MAAM,CAAC,EAAE;AAAA,IAC1E;AAAA,EACF;AACA,SAAO,MAAM,OAAO,OAAO;AAC7B;AAEA,SAAS,WAAW,OAAgB;AAClC,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,kBAAkB,MAAc,UAAkB;AACzD,MAAI,KAAK,UAAU,SAAU,QAAO;AACpC,SAAO,8CAA8C,QAAQ;AAAA,EAAkB,KAAK,MAAM,CAAC,QAAQ,CAAC;AACtG;",
|
|
6
|
+
"names": ["getSupportedThinkingLevels", "BorderedLoader", "isKeyRelease", "isKittyProtocolActive", "Key", "truncateToWidth", "matchesKey", "formatKeyLabel", "matchesKey", "formatKeyLabel", "formatKeyLabel", "isKittyProtocolActive", "copyToClipboard", "Key", "isKeyRelease", "truncateToWidth", "Key", "matchesKey", "formatError", "formatKeyLabel", "error", "result", "value", "formatError", "matchesKey", "Key", "notifySafely", "formatError", "result", "Key", "matchesKey", "truncateToWidth", "visibleWidth", "truncateToWidth", "matchesKey", "Key", "visibleWidth", "escapeTerminalControls", "truncateToWidth", "visibleWidth", "formatError", "formatError", "notifySafely", "BorderedLoader", "getSupportedThinkingLevels"]
|
|
7
7
|
}
|