@ponythewhite/base-context 1.0.2 → 1.0.5

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/base-context-runtime/pyproject.toml +1 -1
  3. package/dist/base-context-runtime/src/rlm/mcp.py +39 -17
  4. package/dist/base-context-runtime/test/test_mcp.py +87 -1
  5. package/dist/base-context-runtime/uv.lock +1 -1
  6. package/dist/build-info.json +1 -1
  7. package/dist/bundle/amazon-bedrock.js +2 -2
  8. package/dist/bundle/{bundled-modules-PWOGKUQQ.js → bundled-modules-UVCJPNFC.js} +4 -4
  9. package/dist/bundle/{chunk-IADCPVEI.js → chunk-6FZM46AU.js} +27 -12
  10. package/dist/bundle/{chunk-HKINIBP4.js → chunk-LFPWHI42.js} +1 -1
  11. package/dist/bundle/{chunk-27QCJ2AZ.js → chunk-UPVDERMD.js} +0 -12
  12. package/dist/bundle/{chunk-44PEHPOG.js → chunk-WFJRFQGG.js} +402 -277
  13. package/dist/bundle/{cli-main-4DS7Y3PI.js → cli-main-OYVMMJUO.js} +3 -3
  14. package/dist/bundle/cli.js +1 -1
  15. package/dist/bundle/{main-SV7JLVEB.js → main-AVMYOTHF.js} +4 -4
  16. package/dist/cli/daemon-ps.d.ts.map +1 -1
  17. package/dist/cli/daemon-ps.js +1 -0
  18. package/dist/cli/daemon-ps.js.map +1 -1
  19. package/dist/core/auth-storage.d.ts +4 -0
  20. package/dist/core/auth-storage.d.ts.map +1 -1
  21. package/dist/core/auth-storage.js +77 -19
  22. package/dist/core/auth-storage.js.map +1 -1
  23. package/dist/core/kernel/bootstrap.d.ts.map +1 -1
  24. package/dist/core/kernel/bootstrap.js +5 -2
  25. package/dist/core/kernel/bootstrap.js.map +1 -1
  26. package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
  27. package/dist/core/mcp/mcp-manager.js +2 -2
  28. package/dist/core/mcp/mcp-manager.js.map +1 -1
  29. package/dist/installer.mjs +5 -2
  30. package/dist/modes/daemon/daemon-supervisor-ownership.d.ts.map +1 -1
  31. package/dist/modes/daemon/daemon-supervisor-ownership.js +16 -16
  32. package/dist/modes/daemon/daemon-supervisor-ownership.js.map +1 -1
  33. package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
  34. package/dist/modes/interactive/auth-flows.js +7 -6
  35. package/dist/modes/interactive/auth-flows.js.map +1 -1
  36. package/dist/modes/interactive/components/brand-announcement.d.ts +5 -0
  37. package/dist/modes/interactive/components/brand-announcement.d.ts.map +1 -0
  38. package/dist/modes/interactive/components/brand-announcement.js +14 -0
  39. package/dist/modes/interactive/components/brand-announcement.js.map +1 -0
  40. package/dist/modes/interactive/components/login-dialog.d.ts +3 -1
  41. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  42. package/dist/modes/interactive/components/login-dialog.js +3 -1
  43. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  44. package/dist/modes/interactive/components/menu-panel.d.ts +1 -0
  45. package/dist/modes/interactive/components/menu-panel.d.ts.map +1 -1
  46. package/dist/modes/interactive/components/menu-panel.js +3 -0
  47. package/dist/modes/interactive/components/menu-panel.js.map +1 -1
  48. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  49. package/dist/modes/interactive/components/settings-selector.js +9 -6
  50. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  51. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  52. package/dist/modes/interactive/interactive-mode.js +11 -9
  53. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  54. package/dist/modes/shared/startup-notices.d.ts.map +1 -1
  55. package/dist/modes/shared/startup-notices.js +1 -1
  56. package/dist/modes/shared/startup-notices.js.map +1 -1
  57. package/dist/themes/synerise-logo.d.ts +3 -0
  58. package/dist/themes/synerise-logo.d.ts.map +1 -0
  59. package/dist/themes/synerise-logo.js +9 -0
  60. package/dist/themes/synerise-logo.js.map +1 -0
  61. package/package.json +6 -6
  62. package/dist/modes/interactive/assets/clankolas.png +0 -0
  63. package/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  64. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +0 -1
  65. package/dist/modes/interactive/components/earendil-announcement.js +0 -40
  66. package/dist/modes/interactive/components/earendil-announcement.js.map +0 -1
  67. package/dist/themes/prime-logo.d.ts +0 -9
  68. package/dist/themes/prime-logo.d.ts.map +0 -1
  69. package/dist/themes/prime-logo.js +0 -18
  70. package/dist/themes/prime-logo.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"menu-panel.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/menu-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tInput,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@ponythewhite/base-context-tui\";\nimport { theme } from \"../theme/theme.js\";\n\ninterface MenuPanelOptions {\n\ttitle: string;\n\tsubtitle?: string;\n}\n\nexport interface MenuViewportProvider {\n\tgetRows?: () => number;\n}\n\ninterface MenuListOptions {\n\tcompact?: boolean | (() => boolean);\n}\n\ninterface MenuListLayoutOptions extends MenuViewportProvider {\n\tpreferredVisibleItems: number;\n\tminVisibleItems?: number;\n\ttotalItems?: number;\n\treservedRows: number;\n\tcomfortableItemRows: number;\n\tcompactItemRows?: number;\n\tscrollIndicatorRows?: number;\n\tcomfortableListPaddingRows?: number;\n\tcompactListPaddingRows?: number;\n}\n\nexport interface MenuListLayout {\n\tcompact: boolean;\n\tvisibleItems: number;\n}\n\nconst PANEL_PADDING_X = 2;\nconst PANEL_PADDING_Y = 1;\nconst FIELD_PADDING_X = 2;\nconst ROW_PADDING_X = 2;\nconst ROW_PADDING_Y = 1;\nconst ANSI_RESET = \"\\x1b[0m\";\n\nexport function getMenuPanelInnerWidth(width: number): number {\n\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\treturn Math.max(1, safeWidth - PANEL_PADDING_X * 2);\n}\n\ninterface FullWidthMenuComponent {\n\treadonly fillsMenuPanel: true;\n}\n\nfunction fillsMenuPanel(component: Component): component is Component & FullWidthMenuComponent {\n\treturn (component as { fillsMenuPanel?: unknown }).fillsMenuPanel === true;\n}\n\nfunction getViewportRows(getRows: (() => number) | undefined): number | undefined {\n\tconst rows = getRows?.();\n\tif (rows === undefined || !Number.isFinite(rows) || rows <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.floor(rows);\n}\n\nfunction visibleItemCount(\n\trows: number,\n\toptions: {\n\t\tpreferredVisibleItems: number;\n\t\tminVisibleItems: number;\n\t\treservedRows: number;\n\t\titemRows: number;\n\t\tlistPaddingRows: number;\n\t\textraRows: number;\n\t},\n): number {\n\tconst capacityRows = Math.max(0, rows - options.reservedRows - options.listPaddingRows - options.extraRows);\n\tconst itemCapacity = Math.floor(capacityRows / options.itemRows);\n\treturn Math.max(options.minVisibleItems, Math.min(options.preferredVisibleItems, itemCapacity));\n}\n\nfunction listRowsUsed(options: {\n\treservedRows: number;\n\tlistPaddingRows: number;\n\tvisibleItems: number;\n\titemRows: number;\n\textraRows: number;\n}): number {\n\treturn options.reservedRows + options.listPaddingRows + options.extraRows + options.visibleItems * options.itemRows;\n}\n\nfunction scrollIndicatorRows(options: {\n\ttotalItems: number | undefined;\n\tvisibleItems: number;\n\tscrollIndicatorRows: number;\n}): number {\n\tif (options.totalItems === undefined || options.scrollIndicatorRows <= 0) {\n\t\treturn 0;\n\t}\n\treturn options.totalItems > options.visibleItems ? options.scrollIndicatorRows : 0;\n}\n\nfunction getLayoutCandidate(\n\trows: number,\n\toptions: MenuListLayoutOptions,\n\titemRows: number,\n\tlistPaddingRows: number,\n\tcompact: boolean,\n): MenuListLayout & { rowsUsed: number; fits: boolean } {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst visibleItemsWithoutScroll = visibleItemCount(rows, {\n\t\tpreferredVisibleItems,\n\t\tminVisibleItems,\n\t\treservedRows: options.reservedRows,\n\t\titemRows,\n\t\tlistPaddingRows,\n\t\textraRows: 0,\n\t});\n\tconst extraRows = scrollIndicatorRows({\n\t\ttotalItems: options.totalItems,\n\t\tvisibleItems: visibleItemsWithoutScroll,\n\t\tscrollIndicatorRows: options.scrollIndicatorRows ?? 0,\n\t});\n\tconst visibleItems =\n\t\textraRows > 0\n\t\t\t? visibleItemCount(rows, {\n\t\t\t\t\tpreferredVisibleItems,\n\t\t\t\t\tminVisibleItems,\n\t\t\t\t\treservedRows: options.reservedRows,\n\t\t\t\t\titemRows,\n\t\t\t\t\tlistPaddingRows,\n\t\t\t\t\textraRows,\n\t\t\t\t})\n\t\t\t: visibleItemsWithoutScroll;\n\tconst rowsUsed = listRowsUsed({\n\t\treservedRows: options.reservedRows,\n\t\tlistPaddingRows,\n\t\tvisibleItems,\n\t\titemRows,\n\t\textraRows,\n\t});\n\treturn {\n\t\tcompact,\n\t\tvisibleItems,\n\t\trowsUsed,\n\t\tfits: rowsUsed <= rows,\n\t};\n}\n\nexport function getMenuListLayout(options: MenuListLayoutOptions): MenuListLayout {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst rows = getViewportRows(options.getRows);\n\tif (rows === undefined) {\n\t\treturn { compact: false, visibleItems: preferredVisibleItems };\n\t}\n\n\tconst comfortableLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.comfortableItemRows),\n\t\toptions.comfortableListPaddingRows ?? 1,\n\t\tfalse,\n\t);\n\tif (options.compactItemRows === undefined) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\n\tconst compactLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.compactItemRows),\n\t\toptions.compactListPaddingRows ?? 0,\n\t\ttrue,\n\t);\n\tif (compactLayout.fits && (!comfortableLayout.fits || compactLayout.visibleItems > comfortableLayout.visibleItems)) {\n\t\treturn { compact: true, visibleItems: compactLayout.visibleItems };\n\t}\n\tif (comfortableLayout.fits) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\treturn compactLayout.rowsUsed <= comfortableLayout.rowsUsed\n\t\t? { compact: true, visibleItems: compactLayout.visibleItems }\n\t\t: { compact: false, visibleItems: comfortableLayout.visibleItems };\n}\n\nfunction paddedBackgroundLine(\n\ttext: string,\n\twidth: number,\n\tpaddingX: number,\n\tbackground: ((text: string) => string) | undefined,\n): string {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\tconst content = truncateToWidth(text, innerWidth, \"\");\n\tconst rightPadding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(content)));\n\tconst contentSpan = \" \".repeat(paddingX) + content;\n\tconst trailingSpan = rightPadding + \" \".repeat(paddingX);\n\tif (!background) {\n\t\treturn contentSpan + trailingSpan;\n\t}\n\treturn applyBackground(contentSpan, background) + background(trailingSpan);\n}\n\nfunction applyBackground(text: string, background: (text: string) => string): string {\n\treturn text\n\t\t.split(ANSI_RESET)\n\t\t.map((segment) => background(segment))\n\t\t.join(ANSI_RESET);\n}\n\nfunction surfaceLine(text: string, width: number, paddingX = PANEL_PADDING_X): string {\n\treturn paddedBackgroundLine(text, width, paddingX, theme.getEditorBackgroundColor());\n}\n\nfunction surfaceWrappedLines(text: string, width: number, paddingX = PANEL_PADDING_X): string[] {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\treturn wrapTextWithAnsi(text, innerWidth).map((content) => surfaceLine(content, width, paddingX));\n}\n\nexport class MenuPanel extends Container {\n\tprivate title: string;\n\n\tconstructor(private readonly options: MenuPanelOptions) {\n\t\tsuper();\n\t\tthis.title = options.title;\n\t}\n\n\tsetTitle(title: string): void {\n\t\tthis.title = title;\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = getMenuPanelInnerWidth(width);\n\t\tconst lines: string[] = [];\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\tconst hasTitle = this.title.trim().length > 0;\n\t\tconst subtitle = this.options.subtitle?.trim();\n\t\tconst hasSubtitle = subtitle !== undefined && subtitle.length > 0;\n\t\tconst hasHeader = hasTitle || hasSubtitle;\n\t\tif (hasTitle) {\n\t\t\tlines.push(surfaceLine(theme.bold(theme.fg(\"text\", this.title)), safeWidth));\n\t\t}\n\t\tif (hasSubtitle) {\n\t\t\tlines.push(...surfaceWrappedLines(theme.fg(\"muted\", subtitle), safeWidth));\n\t\t}\n\t\tif (hasHeader) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\n\t\tfor (const child of this.children) {\n\t\t\tconst childLines = fillsMenuPanel(child) ? child.render(safeWidth) : child.render(innerWidth);\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, safeWidth));\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class MenuSearchInput implements Component, Focusable, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\tprivate readonly input = new Input();\n\n\tconstructor(private readonly placeholder: string) {}\n\n\tget focused(): boolean {\n\t\treturn this.input.focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis.input.focused = value;\n\t}\n\n\tset onSubmit(handler: ((value: string) => void) | undefined) {\n\t\tthis.input.onSubmit = handler;\n\t}\n\n\tgetValue(): string {\n\t\treturn this.input.getValue();\n\t}\n\n\tgetCursor(): number {\n\t\treturn this.input.getCursor();\n\t}\n\n\tsetValue(value: string): void {\n\t\tthis.input.setValue(value);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.input.handleInput(data);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.input.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(FIELD_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = Math.max(1, safeWidth - FIELD_PADDING_X * 2);\n\t\tconst content =\n\t\t\tthis.getValue() === \"\" && !this.focused\n\t\t\t\t? theme.fg(\"dim\", this.placeholder)\n\t\t\t\t: this.stripInputPrompt(this.input.render(innerWidth + 2)[0] ?? \"\");\n\t\treturn [paddedBackgroundLine(content, safeWidth, FIELD_PADDING_X, theme.getEditorBackgroundColor())];\n\t}\n\n\tprivate stripInputPrompt(line: string): string {\n\t\treturn line.startsWith(\"> \") ? line.slice(2) : line;\n\t}\n}\n\ninterface MenuRowOptions {\n\tprimary: string;\n\tsecondary?: string;\n\tmeta?: string;\n\tselected: boolean;\n}\n\nexport class MenuRow implements Component, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuRowOptions) {}\n\n\tget selected(): boolean {\n\t\treturn this.options.selected;\n\t}\n\n\tinvalidate(): void {\n\t\t// Row render is derived from constructor options.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\treturn [\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t\t...this.renderContent(safeWidth),\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t];\n\t}\n\n\trenderContent(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst meta = this.options.meta ? theme.fg(\"muted\", this.options.meta) : \"\";\n\t\tconst secondary = this.options.secondary ? theme.fg(\"muted\", this.options.secondary) : \"\";\n\t\tconst primary = this.options.selected\n\t\t\t? theme.bold(theme.fg(\"text\", this.options.primary))\n\t\t\t: theme.fg(\"text\", this.options.primary);\n\t\tconst innerWidth = Math.max(1, safeWidth - ROW_PADDING_X * 2);\n\t\tconst metaWidth = visibleWidth(meta);\n\t\tconst gap = meta ? 2 : 0;\n\t\tconst primaryWidth = Math.max(1, innerWidth - metaWidth - gap);\n\t\tconst primaryText = truncateToWidth(primary, primaryWidth, \"\", true);\n\t\tconst primaryLine = meta ? primaryText + \" \".repeat(gap) + meta : primaryText;\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.rowLine(primaryLine, safeWidth, this.selected));\n\t\tif (secondary) {\n\t\t\tlines.push(this.rowLine(truncateToWidth(secondary, innerWidth, \"\", true), safeWidth, this.selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\trenderPadding(width: number, selected: boolean): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst lines: string[] = [];\n\t\tfor (let i = 0; i < ROW_PADDING_Y; i++) {\n\t\t\tlines.push(this.rowLine(\"\", safeWidth, selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate rowLine(text: string, width: number, selected: boolean): string {\n\t\tconst background = selected ? theme.getSelectionBackgroundColor() : theme.getEditorBackgroundColor();\n\t\treturn paddedBackgroundLine(text, width, ROW_PADDING_X, background);\n\t}\n}\n\nexport class MenuList extends Container implements FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuListOptions = {}) {\n\t\tsuper();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst compact = this.isCompact();\n\t\tfor (let index = 0; index < this.children.length; index++) {\n\t\t\tconst child = this.children[index];\n\t\t\tif (child instanceof MenuRow) {\n\t\t\t\tif (compact) {\n\t\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previousChild = this.children[index - 1];\n\t\t\t\tconst nextChild = this.children[index + 1];\n\t\t\t\tconst previousRow = previousChild instanceof MenuRow ? previousChild : undefined;\n\t\t\t\tconst nextRow = nextChild instanceof MenuRow ? nextChild : undefined;\n\t\t\t\tlines.push(...child.renderPadding(width, child.selected || previousRow?.selected === true));\n\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\tif (!nextRow) {\n\t\t\t\t\tlines.push(...child.renderPadding(width, child.selected));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst childLines = fillsMenuPanel(child)\n\t\t\t\t? child.render(width)\n\t\t\t\t: child.render(Math.max(1, width - PANEL_PADDING_X * 2));\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, width));\n\t\t\t}\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate isCompact(): boolean {\n\t\tconst compact = this.options.compact;\n\t\treturn typeof compact === \"function\" ? compact() : compact === true;\n\t}\n}\n"]}
1
+ {"version":3,"file":"menu-panel.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/menu-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tInput,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@ponythewhite/base-context-tui\";\nimport { theme } from \"../theme/theme.js\";\n\ninterface MenuPanelOptions {\n\ttitle: string;\n\tsubtitle?: string;\n}\n\nexport interface MenuViewportProvider {\n\tgetRows?: () => number;\n}\n\ninterface MenuListOptions {\n\tcompact?: boolean | (() => boolean);\n}\n\ninterface MenuListLayoutOptions extends MenuViewportProvider {\n\tpreferredVisibleItems: number;\n\tminVisibleItems?: number;\n\ttotalItems?: number;\n\treservedRows: number;\n\tcomfortableItemRows: number;\n\tcompactItemRows?: number;\n\tscrollIndicatorRows?: number;\n\tcomfortableListPaddingRows?: number;\n\tcompactListPaddingRows?: number;\n}\n\nexport interface MenuListLayout {\n\tcompact: boolean;\n\tvisibleItems: number;\n}\n\nconst PANEL_PADDING_X = 2;\nconst PANEL_PADDING_Y = 1;\nconst FIELD_PADDING_X = 2;\nconst ROW_PADDING_X = 2;\nconst ROW_PADDING_Y = 1;\nconst ANSI_RESET = \"\\x1b[0m\";\n\nexport function getMenuPanelInnerWidth(width: number): number {\n\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\treturn Math.max(1, safeWidth - PANEL_PADDING_X * 2);\n}\n\ninterface FullWidthMenuComponent {\n\treadonly fillsMenuPanel: true;\n}\n\nfunction fillsMenuPanel(component: Component): component is Component & FullWidthMenuComponent {\n\treturn (component as { fillsMenuPanel?: unknown }).fillsMenuPanel === true;\n}\n\nfunction getViewportRows(getRows: (() => number) | undefined): number | undefined {\n\tconst rows = getRows?.();\n\tif (rows === undefined || !Number.isFinite(rows) || rows <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.floor(rows);\n}\n\nfunction visibleItemCount(\n\trows: number,\n\toptions: {\n\t\tpreferredVisibleItems: number;\n\t\tminVisibleItems: number;\n\t\treservedRows: number;\n\t\titemRows: number;\n\t\tlistPaddingRows: number;\n\t\textraRows: number;\n\t},\n): number {\n\tconst capacityRows = Math.max(0, rows - options.reservedRows - options.listPaddingRows - options.extraRows);\n\tconst itemCapacity = Math.floor(capacityRows / options.itemRows);\n\treturn Math.max(options.minVisibleItems, Math.min(options.preferredVisibleItems, itemCapacity));\n}\n\nfunction listRowsUsed(options: {\n\treservedRows: number;\n\tlistPaddingRows: number;\n\tvisibleItems: number;\n\titemRows: number;\n\textraRows: number;\n}): number {\n\treturn options.reservedRows + options.listPaddingRows + options.extraRows + options.visibleItems * options.itemRows;\n}\n\nfunction scrollIndicatorRows(options: {\n\ttotalItems: number | undefined;\n\tvisibleItems: number;\n\tscrollIndicatorRows: number;\n}): number {\n\tif (options.totalItems === undefined || options.scrollIndicatorRows <= 0) {\n\t\treturn 0;\n\t}\n\treturn options.totalItems > options.visibleItems ? options.scrollIndicatorRows : 0;\n}\n\nfunction getLayoutCandidate(\n\trows: number,\n\toptions: MenuListLayoutOptions,\n\titemRows: number,\n\tlistPaddingRows: number,\n\tcompact: boolean,\n): MenuListLayout & { rowsUsed: number; fits: boolean } {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst visibleItemsWithoutScroll = visibleItemCount(rows, {\n\t\tpreferredVisibleItems,\n\t\tminVisibleItems,\n\t\treservedRows: options.reservedRows,\n\t\titemRows,\n\t\tlistPaddingRows,\n\t\textraRows: 0,\n\t});\n\tconst extraRows = scrollIndicatorRows({\n\t\ttotalItems: options.totalItems,\n\t\tvisibleItems: visibleItemsWithoutScroll,\n\t\tscrollIndicatorRows: options.scrollIndicatorRows ?? 0,\n\t});\n\tconst visibleItems =\n\t\textraRows > 0\n\t\t\t? visibleItemCount(rows, {\n\t\t\t\t\tpreferredVisibleItems,\n\t\t\t\t\tminVisibleItems,\n\t\t\t\t\treservedRows: options.reservedRows,\n\t\t\t\t\titemRows,\n\t\t\t\t\tlistPaddingRows,\n\t\t\t\t\textraRows,\n\t\t\t\t})\n\t\t\t: visibleItemsWithoutScroll;\n\tconst rowsUsed = listRowsUsed({\n\t\treservedRows: options.reservedRows,\n\t\tlistPaddingRows,\n\t\tvisibleItems,\n\t\titemRows,\n\t\textraRows,\n\t});\n\treturn {\n\t\tcompact,\n\t\tvisibleItems,\n\t\trowsUsed,\n\t\tfits: rowsUsed <= rows,\n\t};\n}\n\nexport function getMenuListLayout(options: MenuListLayoutOptions): MenuListLayout {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst rows = getViewportRows(options.getRows);\n\tif (rows === undefined) {\n\t\treturn { compact: false, visibleItems: preferredVisibleItems };\n\t}\n\n\tconst comfortableLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.comfortableItemRows),\n\t\toptions.comfortableListPaddingRows ?? 1,\n\t\tfalse,\n\t);\n\tif (options.compactItemRows === undefined) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\n\tconst compactLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.compactItemRows),\n\t\toptions.compactListPaddingRows ?? 0,\n\t\ttrue,\n\t);\n\tif (compactLayout.fits && (!comfortableLayout.fits || compactLayout.visibleItems > comfortableLayout.visibleItems)) {\n\t\treturn { compact: true, visibleItems: compactLayout.visibleItems };\n\t}\n\tif (comfortableLayout.fits) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\treturn compactLayout.rowsUsed <= comfortableLayout.rowsUsed\n\t\t? { compact: true, visibleItems: compactLayout.visibleItems }\n\t\t: { compact: false, visibleItems: comfortableLayout.visibleItems };\n}\n\nfunction paddedBackgroundLine(\n\ttext: string,\n\twidth: number,\n\tpaddingX: number,\n\tbackground: ((text: string) => string) | undefined,\n): string {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\tconst content = truncateToWidth(text, innerWidth, \"\");\n\tconst rightPadding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(content)));\n\tconst contentSpan = \" \".repeat(paddingX) + content;\n\tconst trailingSpan = rightPadding + \" \".repeat(paddingX);\n\tif (!background) {\n\t\treturn contentSpan + trailingSpan;\n\t}\n\treturn applyBackground(contentSpan, background) + background(trailingSpan);\n}\n\nfunction applyBackground(text: string, background: (text: string) => string): string {\n\treturn text\n\t\t.split(ANSI_RESET)\n\t\t.map((segment) => background(segment))\n\t\t.join(ANSI_RESET);\n}\n\nfunction surfaceLine(text: string, width: number, paddingX = PANEL_PADDING_X): string {\n\treturn paddedBackgroundLine(text, width, paddingX, theme.getEditorBackgroundColor());\n}\n\nfunction surfaceWrappedLines(text: string, width: number, paddingX = PANEL_PADDING_X): string[] {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\treturn wrapTextWithAnsi(text, innerWidth).map((content) => surfaceLine(content, width, paddingX));\n}\n\nexport class MenuPanel extends Container {\n\tprivate title: string;\n\n\tconstructor(private readonly options: MenuPanelOptions) {\n\t\tsuper();\n\t\tthis.title = options.title;\n\t}\n\n\tsetTitle(title: string): void {\n\t\tthis.title = title;\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = getMenuPanelInnerWidth(width);\n\t\tconst lines: string[] = [];\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\tconst hasTitle = this.title.trim().length > 0;\n\t\tconst subtitle = this.options.subtitle?.trim();\n\t\tconst hasSubtitle = subtitle !== undefined && subtitle.length > 0;\n\t\tconst hasHeader = hasTitle || hasSubtitle;\n\t\tif (hasTitle) {\n\t\t\tlines.push(surfaceLine(theme.bold(theme.fg(\"text\", this.title)), safeWidth));\n\t\t}\n\t\tif (hasSubtitle) {\n\t\t\tlines.push(...surfaceWrappedLines(theme.fg(\"muted\", subtitle), safeWidth));\n\t\t}\n\t\tif (hasHeader) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\n\t\tfor (const child of this.children) {\n\t\t\tconst childLines = fillsMenuPanel(child) ? child.render(safeWidth) : child.render(innerWidth);\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, safeWidth));\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class MenuSearchInput implements Component, Focusable, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\tprivate readonly input = new Input();\n\n\tconstructor(private readonly placeholder: string) {}\n\n\tget focused(): boolean {\n\t\treturn this.input.focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis.input.focused = value;\n\t}\n\n\tset onSubmit(handler: ((value: string) => void) | undefined) {\n\t\tthis.input.onSubmit = handler;\n\t}\n\n\tgetValue(): string {\n\t\treturn this.input.getValue();\n\t}\n\n\tgetCursor(): number {\n\t\treturn this.input.getCursor();\n\t}\n\n\tsetValue(value: string): void {\n\t\tthis.input.setValue(value);\n\t}\n\n\tsetMasked(masked: boolean): void {\n\t\tthis.input.setMasked(masked);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.input.handleInput(data);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.input.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(FIELD_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = Math.max(1, safeWidth - FIELD_PADDING_X * 2);\n\t\tconst content =\n\t\t\tthis.getValue() === \"\" && !this.focused\n\t\t\t\t? theme.fg(\"dim\", this.placeholder)\n\t\t\t\t: this.stripInputPrompt(this.input.render(innerWidth + 2)[0] ?? \"\");\n\t\treturn [paddedBackgroundLine(content, safeWidth, FIELD_PADDING_X, theme.getEditorBackgroundColor())];\n\t}\n\n\tprivate stripInputPrompt(line: string): string {\n\t\treturn line.startsWith(\"> \") ? line.slice(2) : line;\n\t}\n}\n\ninterface MenuRowOptions {\n\tprimary: string;\n\tsecondary?: string;\n\tmeta?: string;\n\tselected: boolean;\n}\n\nexport class MenuRow implements Component, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuRowOptions) {}\n\n\tget selected(): boolean {\n\t\treturn this.options.selected;\n\t}\n\n\tinvalidate(): void {\n\t\t// Row render is derived from constructor options.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\treturn [\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t\t...this.renderContent(safeWidth),\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t];\n\t}\n\n\trenderContent(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst meta = this.options.meta ? theme.fg(\"muted\", this.options.meta) : \"\";\n\t\tconst secondary = this.options.secondary ? theme.fg(\"muted\", this.options.secondary) : \"\";\n\t\tconst primary = this.options.selected\n\t\t\t? theme.bold(theme.fg(\"text\", this.options.primary))\n\t\t\t: theme.fg(\"text\", this.options.primary);\n\t\tconst innerWidth = Math.max(1, safeWidth - ROW_PADDING_X * 2);\n\t\tconst metaWidth = visibleWidth(meta);\n\t\tconst gap = meta ? 2 : 0;\n\t\tconst primaryWidth = Math.max(1, innerWidth - metaWidth - gap);\n\t\tconst primaryText = truncateToWidth(primary, primaryWidth, \"\", true);\n\t\tconst primaryLine = meta ? primaryText + \" \".repeat(gap) + meta : primaryText;\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.rowLine(primaryLine, safeWidth, this.selected));\n\t\tif (secondary) {\n\t\t\tlines.push(this.rowLine(truncateToWidth(secondary, innerWidth, \"\", true), safeWidth, this.selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\trenderPadding(width: number, selected: boolean): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst lines: string[] = [];\n\t\tfor (let i = 0; i < ROW_PADDING_Y; i++) {\n\t\t\tlines.push(this.rowLine(\"\", safeWidth, selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate rowLine(text: string, width: number, selected: boolean): string {\n\t\tconst background = selected ? theme.getSelectionBackgroundColor() : theme.getEditorBackgroundColor();\n\t\treturn paddedBackgroundLine(text, width, ROW_PADDING_X, background);\n\t}\n}\n\nexport class MenuList extends Container implements FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuListOptions = {}) {\n\t\tsuper();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst compact = this.isCompact();\n\t\tfor (let index = 0; index < this.children.length; index++) {\n\t\t\tconst child = this.children[index];\n\t\t\tif (child instanceof MenuRow) {\n\t\t\t\tif (compact) {\n\t\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previousChild = this.children[index - 1];\n\t\t\t\tconst nextChild = this.children[index + 1];\n\t\t\t\tconst previousRow = previousChild instanceof MenuRow ? previousChild : undefined;\n\t\t\t\tconst nextRow = nextChild instanceof MenuRow ? nextChild : undefined;\n\t\t\t\tlines.push(...child.renderPadding(width, child.selected || previousRow?.selected === true));\n\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\tif (!nextRow) {\n\t\t\t\t\tlines.push(...child.renderPadding(width, child.selected));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst childLines = fillsMenuPanel(child)\n\t\t\t\t? child.render(width)\n\t\t\t\t: child.render(Math.max(1, width - PANEL_PADDING_X * 2));\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, width));\n\t\t\t}\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate isCompact(): boolean {\n\t\tconst compact = this.options.compact;\n\t\treturn typeof compact === \"function\" ? compact() : compact === true;\n\t}\n}\n"]}
@@ -188,6 +188,9 @@ export class MenuSearchInput {
188
188
  setValue(value) {
189
189
  this.input.setValue(value);
190
190
  }
191
+ setMasked(masked) {
192
+ this.input.setMasked(masked);
193
+ }
191
194
  handleInput(data) {
192
195
  this.input.handleInput(data);
193
196
  }
@@ -1 +1 @@
1
- {"version":3,"file":"menu-panel.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/menu-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,SAAS,EAET,KAAK,EACL,eAAe,EACf,YAAY,EACZ,gBAAgB,GAChB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAgC1C,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,UAAU,GAAG,SAAS,CAAC;AAE7B,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAU;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC;AAAA,CACpD;AAMD,SAAS,cAAc,CAAC,SAAoB,EAAmD;IAC9F,OAAQ,SAA0C,CAAC,cAAc,KAAK,IAAI,CAAC;AAAA,CAC3E;AAED,SAAS,eAAe,CAAC,OAAmC,EAAsB;IACjF,MAAM,IAAI,GAAG,OAAO,EAAE,EAAE,CAAC;IACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QAC/D,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAAA,CACxB;AAED,SAAS,gBAAgB,CACxB,IAAY,EACZ,OAOC,EACQ;IACT,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5G,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC,CAAC;AAAA,CAChG;AAED,SAAS,YAAY,CAAC,OAMrB,EAAU;IACV,OAAO,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;AAAA,CACpH;AAED,SAAS,mBAAmB,CAAC,OAI5B,EAAU;IACV,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,mBAAmB,IAAI,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,CAAC;IACV,CAAC;IACD,OAAO,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,CACnF;AAED,SAAS,kBAAkB,CAC1B,IAAY,EACZ,OAA8B,EAC9B,QAAgB,EAChB,eAAuB,EACvB,OAAgB,EACuC;IACvD,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;IACrD,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACvF,MAAM,yBAAyB,GAAG,gBAAgB,CAAC,IAAI,EAAE;QACxD,qBAAqB;QACrB,eAAe;QACf,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ;QACR,eAAe;QACf,SAAS,EAAE,CAAC;KACZ,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,mBAAmB,CAAC;QACrC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,yBAAyB;QACvC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,IAAI,CAAC;KACrD,CAAC,CAAC;IACH,MAAM,YAAY,GACjB,SAAS,GAAG,CAAC;QACZ,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE;YACvB,qBAAqB;YACrB,eAAe;YACf,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,QAAQ;YACR,eAAe;YACf,SAAS;SACT,CAAC;QACH,CAAC,CAAC,yBAAyB,CAAC;IAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC7B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,eAAe;QACf,YAAY;QACZ,QAAQ;QACR,SAAS;KACT,CAAC,CAAC;IACH,OAAO;QACN,OAAO;QACP,YAAY;QACZ,QAAQ;QACR,IAAI,EAAE,QAAQ,IAAI,IAAI;KACtB,CAAC;AAAA,CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA8B,EAAkB;IACjF,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;IACrD,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,iBAAiB,GAAG,kBAAkB,CAC3C,IAAI,EACJ,OAAO,EACP,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACxC,OAAO,CAAC,0BAA0B,IAAI,CAAC,EACvC,KAAK,CACL,CAAC;IACF,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,CAAC,YAAY,EAAE,CAAC;IACzE,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CACvC,IAAI,EACJ,OAAO,EACP,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACpC,OAAO,CAAC,sBAAsB,IAAI,CAAC,EACnC,IAAI,CACJ,CAAC;IACF,IAAI,aAAa,CAAC,IAAI,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,IAAI,aAAa,CAAC,YAAY,GAAG,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;QACpH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,YAAY,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,CAAC,YAAY,EAAE,CAAC;IACzE,CAAC;IACD,OAAO,aAAa,CAAC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ;QAC1D,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,YAAY,EAAE;QAC7D,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,CAAC,YAAY,EAAE,CAAC;AAAA,CACpE;AAED,SAAS,oBAAoB,CAC5B,IAAY,EACZ,KAAa,EACb,QAAgB,EAChB,UAAkD,EACzC;IACT,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IACnD,MAAM,YAAY,GAAG,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,WAAW,GAAG,YAAY,CAAC;IACnC,CAAC;IACD,OAAO,eAAe,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;AAAA,CAC3E;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,UAAoC,EAAU;IACpF,OAAO,IAAI;SACT,KAAK,CAAC,UAAU,CAAC;SACjB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SACrC,IAAI,CAAC,UAAU,CAAC,CAAC;AAAA,CACnB;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa,EAAE,QAAQ,GAAG,eAAe,EAAU;IACrF,OAAO,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;AAAA,CACrF;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,KAAa,EAAE,QAAQ,GAAG,eAAe,EAAY;IAC/F,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA,CAClG;AAED,MAAM,OAAO,SAAU,SAAQ,SAAS;IAGV,OAAO;IAF5B,KAAK,CAAS;IAEtB,YAA6B,OAAyB,EAAE;QACvD,KAAK,EAAE,CAAC;uBADoB,OAAO;QAEnC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAAA,CAC3B;IAED,QAAQ,CAAC,KAAa,EAAQ;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAAA,CACnB;IAEQ,MAAM,CAAC,KAAa,EAAY;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC/C,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,QAAQ,IAAI,WAAW,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9F,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;YACzE,CAAC;QACF,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;CACD;AAED,MAAM,OAAO,eAAe;IAIE,WAAW;IAH/B,cAAc,GAAG,IAAI,CAAC;IACd,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAErC,YAA6B,WAAmB,EAAE;2BAArB,WAAW;IAAW,CAAC;IAEpD,IAAI,OAAO,GAAY;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAAA,CAC1B;IAED,IAAI,OAAO,CAAC,KAAc,EAAE;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IAAA,CAC3B;IAED,IAAI,QAAQ,CAAC,OAA8C,EAAE;QAC5D,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;IAAA,CAC9B;IAED,QAAQ,GAAW;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAAA,CAC7B;IAED,SAAS,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IAAA,CAC9B;IAED,QAAQ,CAAC,KAAa,EAAQ;QAC7B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAAA,CAC3B;IAED,WAAW,CAAC,IAAY,EAAQ;QAC/B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAAA,CAC7B;IAED,UAAU,GAAS;QAClB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAAA,CACxB;IAED,MAAM,CAAC,KAAa,EAAY;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,OAAO,GACZ,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;YACtC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;YACnC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,oBAAoB,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;IAAA,CACrG;IAEO,gBAAgB,CAAC,IAAY,EAAU;QAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAAA,CACpD;CACD;AASD,MAAM,OAAO,OAAO;IAGU,OAAO;IAF3B,cAAc,GAAG,IAAI,CAAC;IAE/B,YAA6B,OAAuB,EAAE;uBAAzB,OAAO;IAAmB,CAAC;IAExD,IAAI,QAAQ,GAAY;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAAA,CAC7B;IAED,UAAU,GAAS;QAClB,kDAAkD;IAD/B,CAEnB;IAED,MAAM,CAAC,KAAa,EAAY;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO;YACN,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC/C,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;YAChC,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC;SAC/C,CAAC;IAAA,CACF;IAED,aAAa,CAAC,KAAa,EAAY;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ;YACpC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpD,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;QAC9E,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChE,IAAI,SAAS,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;IAED,aAAa,CAAC,KAAa,EAAE,QAAiB,EAAY;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,QAAiB,EAAU;QACvE,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC;QACrG,OAAO,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAAA,CACpE;CACD;AAED,MAAM,OAAO,QAAS,SAAQ,SAAS;IAGT,OAAO;IAF3B,cAAc,GAAG,IAAI,CAAC;IAE/B,YAA6B,OAAO,GAAoB,EAAE,EAAE;QAC3D,KAAK,EAAE,CAAC;uBADoB,OAAO;IAC3B,CACR;IAEQ,MAAM,CAAC,KAAa,EAAY;QACxC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;gBAC9B,IAAI,OAAO,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC1C,SAAS;gBACV,CAAC;gBACD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC3C,MAAM,WAAW,GAAG,aAAa,YAAY,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjF,MAAM,OAAO,GAAG,SAAS,YAAY,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBACrE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,IAAI,WAAW,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC;gBAC5F,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC3D,CAAC;gBACD,SAAS;YACV,CAAC;YACD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC;gBACvC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;gBACrB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1D,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACrE,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,SAAS,GAAY;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QACrC,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;IAAA,CACpE;CACD","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tInput,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@ponythewhite/base-context-tui\";\nimport { theme } from \"../theme/theme.js\";\n\ninterface MenuPanelOptions {\n\ttitle: string;\n\tsubtitle?: string;\n}\n\nexport interface MenuViewportProvider {\n\tgetRows?: () => number;\n}\n\ninterface MenuListOptions {\n\tcompact?: boolean | (() => boolean);\n}\n\ninterface MenuListLayoutOptions extends MenuViewportProvider {\n\tpreferredVisibleItems: number;\n\tminVisibleItems?: number;\n\ttotalItems?: number;\n\treservedRows: number;\n\tcomfortableItemRows: number;\n\tcompactItemRows?: number;\n\tscrollIndicatorRows?: number;\n\tcomfortableListPaddingRows?: number;\n\tcompactListPaddingRows?: number;\n}\n\nexport interface MenuListLayout {\n\tcompact: boolean;\n\tvisibleItems: number;\n}\n\nconst PANEL_PADDING_X = 2;\nconst PANEL_PADDING_Y = 1;\nconst FIELD_PADDING_X = 2;\nconst ROW_PADDING_X = 2;\nconst ROW_PADDING_Y = 1;\nconst ANSI_RESET = \"\\x1b[0m\";\n\nexport function getMenuPanelInnerWidth(width: number): number {\n\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\treturn Math.max(1, safeWidth - PANEL_PADDING_X * 2);\n}\n\ninterface FullWidthMenuComponent {\n\treadonly fillsMenuPanel: true;\n}\n\nfunction fillsMenuPanel(component: Component): component is Component & FullWidthMenuComponent {\n\treturn (component as { fillsMenuPanel?: unknown }).fillsMenuPanel === true;\n}\n\nfunction getViewportRows(getRows: (() => number) | undefined): number | undefined {\n\tconst rows = getRows?.();\n\tif (rows === undefined || !Number.isFinite(rows) || rows <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.floor(rows);\n}\n\nfunction visibleItemCount(\n\trows: number,\n\toptions: {\n\t\tpreferredVisibleItems: number;\n\t\tminVisibleItems: number;\n\t\treservedRows: number;\n\t\titemRows: number;\n\t\tlistPaddingRows: number;\n\t\textraRows: number;\n\t},\n): number {\n\tconst capacityRows = Math.max(0, rows - options.reservedRows - options.listPaddingRows - options.extraRows);\n\tconst itemCapacity = Math.floor(capacityRows / options.itemRows);\n\treturn Math.max(options.minVisibleItems, Math.min(options.preferredVisibleItems, itemCapacity));\n}\n\nfunction listRowsUsed(options: {\n\treservedRows: number;\n\tlistPaddingRows: number;\n\tvisibleItems: number;\n\titemRows: number;\n\textraRows: number;\n}): number {\n\treturn options.reservedRows + options.listPaddingRows + options.extraRows + options.visibleItems * options.itemRows;\n}\n\nfunction scrollIndicatorRows(options: {\n\ttotalItems: number | undefined;\n\tvisibleItems: number;\n\tscrollIndicatorRows: number;\n}): number {\n\tif (options.totalItems === undefined || options.scrollIndicatorRows <= 0) {\n\t\treturn 0;\n\t}\n\treturn options.totalItems > options.visibleItems ? options.scrollIndicatorRows : 0;\n}\n\nfunction getLayoutCandidate(\n\trows: number,\n\toptions: MenuListLayoutOptions,\n\titemRows: number,\n\tlistPaddingRows: number,\n\tcompact: boolean,\n): MenuListLayout & { rowsUsed: number; fits: boolean } {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst visibleItemsWithoutScroll = visibleItemCount(rows, {\n\t\tpreferredVisibleItems,\n\t\tminVisibleItems,\n\t\treservedRows: options.reservedRows,\n\t\titemRows,\n\t\tlistPaddingRows,\n\t\textraRows: 0,\n\t});\n\tconst extraRows = scrollIndicatorRows({\n\t\ttotalItems: options.totalItems,\n\t\tvisibleItems: visibleItemsWithoutScroll,\n\t\tscrollIndicatorRows: options.scrollIndicatorRows ?? 0,\n\t});\n\tconst visibleItems =\n\t\textraRows > 0\n\t\t\t? visibleItemCount(rows, {\n\t\t\t\t\tpreferredVisibleItems,\n\t\t\t\t\tminVisibleItems,\n\t\t\t\t\treservedRows: options.reservedRows,\n\t\t\t\t\titemRows,\n\t\t\t\t\tlistPaddingRows,\n\t\t\t\t\textraRows,\n\t\t\t\t})\n\t\t\t: visibleItemsWithoutScroll;\n\tconst rowsUsed = listRowsUsed({\n\t\treservedRows: options.reservedRows,\n\t\tlistPaddingRows,\n\t\tvisibleItems,\n\t\titemRows,\n\t\textraRows,\n\t});\n\treturn {\n\t\tcompact,\n\t\tvisibleItems,\n\t\trowsUsed,\n\t\tfits: rowsUsed <= rows,\n\t};\n}\n\nexport function getMenuListLayout(options: MenuListLayoutOptions): MenuListLayout {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst rows = getViewportRows(options.getRows);\n\tif (rows === undefined) {\n\t\treturn { compact: false, visibleItems: preferredVisibleItems };\n\t}\n\n\tconst comfortableLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.comfortableItemRows),\n\t\toptions.comfortableListPaddingRows ?? 1,\n\t\tfalse,\n\t);\n\tif (options.compactItemRows === undefined) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\n\tconst compactLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.compactItemRows),\n\t\toptions.compactListPaddingRows ?? 0,\n\t\ttrue,\n\t);\n\tif (compactLayout.fits && (!comfortableLayout.fits || compactLayout.visibleItems > comfortableLayout.visibleItems)) {\n\t\treturn { compact: true, visibleItems: compactLayout.visibleItems };\n\t}\n\tif (comfortableLayout.fits) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\treturn compactLayout.rowsUsed <= comfortableLayout.rowsUsed\n\t\t? { compact: true, visibleItems: compactLayout.visibleItems }\n\t\t: { compact: false, visibleItems: comfortableLayout.visibleItems };\n}\n\nfunction paddedBackgroundLine(\n\ttext: string,\n\twidth: number,\n\tpaddingX: number,\n\tbackground: ((text: string) => string) | undefined,\n): string {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\tconst content = truncateToWidth(text, innerWidth, \"\");\n\tconst rightPadding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(content)));\n\tconst contentSpan = \" \".repeat(paddingX) + content;\n\tconst trailingSpan = rightPadding + \" \".repeat(paddingX);\n\tif (!background) {\n\t\treturn contentSpan + trailingSpan;\n\t}\n\treturn applyBackground(contentSpan, background) + background(trailingSpan);\n}\n\nfunction applyBackground(text: string, background: (text: string) => string): string {\n\treturn text\n\t\t.split(ANSI_RESET)\n\t\t.map((segment) => background(segment))\n\t\t.join(ANSI_RESET);\n}\n\nfunction surfaceLine(text: string, width: number, paddingX = PANEL_PADDING_X): string {\n\treturn paddedBackgroundLine(text, width, paddingX, theme.getEditorBackgroundColor());\n}\n\nfunction surfaceWrappedLines(text: string, width: number, paddingX = PANEL_PADDING_X): string[] {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\treturn wrapTextWithAnsi(text, innerWidth).map((content) => surfaceLine(content, width, paddingX));\n}\n\nexport class MenuPanel extends Container {\n\tprivate title: string;\n\n\tconstructor(private readonly options: MenuPanelOptions) {\n\t\tsuper();\n\t\tthis.title = options.title;\n\t}\n\n\tsetTitle(title: string): void {\n\t\tthis.title = title;\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = getMenuPanelInnerWidth(width);\n\t\tconst lines: string[] = [];\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\tconst hasTitle = this.title.trim().length > 0;\n\t\tconst subtitle = this.options.subtitle?.trim();\n\t\tconst hasSubtitle = subtitle !== undefined && subtitle.length > 0;\n\t\tconst hasHeader = hasTitle || hasSubtitle;\n\t\tif (hasTitle) {\n\t\t\tlines.push(surfaceLine(theme.bold(theme.fg(\"text\", this.title)), safeWidth));\n\t\t}\n\t\tif (hasSubtitle) {\n\t\t\tlines.push(...surfaceWrappedLines(theme.fg(\"muted\", subtitle), safeWidth));\n\t\t}\n\t\tif (hasHeader) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\n\t\tfor (const child of this.children) {\n\t\t\tconst childLines = fillsMenuPanel(child) ? child.render(safeWidth) : child.render(innerWidth);\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, safeWidth));\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class MenuSearchInput implements Component, Focusable, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\tprivate readonly input = new Input();\n\n\tconstructor(private readonly placeholder: string) {}\n\n\tget focused(): boolean {\n\t\treturn this.input.focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis.input.focused = value;\n\t}\n\n\tset onSubmit(handler: ((value: string) => void) | undefined) {\n\t\tthis.input.onSubmit = handler;\n\t}\n\n\tgetValue(): string {\n\t\treturn this.input.getValue();\n\t}\n\n\tgetCursor(): number {\n\t\treturn this.input.getCursor();\n\t}\n\n\tsetValue(value: string): void {\n\t\tthis.input.setValue(value);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.input.handleInput(data);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.input.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(FIELD_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = Math.max(1, safeWidth - FIELD_PADDING_X * 2);\n\t\tconst content =\n\t\t\tthis.getValue() === \"\" && !this.focused\n\t\t\t\t? theme.fg(\"dim\", this.placeholder)\n\t\t\t\t: this.stripInputPrompt(this.input.render(innerWidth + 2)[0] ?? \"\");\n\t\treturn [paddedBackgroundLine(content, safeWidth, FIELD_PADDING_X, theme.getEditorBackgroundColor())];\n\t}\n\n\tprivate stripInputPrompt(line: string): string {\n\t\treturn line.startsWith(\"> \") ? line.slice(2) : line;\n\t}\n}\n\ninterface MenuRowOptions {\n\tprimary: string;\n\tsecondary?: string;\n\tmeta?: string;\n\tselected: boolean;\n}\n\nexport class MenuRow implements Component, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuRowOptions) {}\n\n\tget selected(): boolean {\n\t\treturn this.options.selected;\n\t}\n\n\tinvalidate(): void {\n\t\t// Row render is derived from constructor options.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\treturn [\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t\t...this.renderContent(safeWidth),\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t];\n\t}\n\n\trenderContent(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst meta = this.options.meta ? theme.fg(\"muted\", this.options.meta) : \"\";\n\t\tconst secondary = this.options.secondary ? theme.fg(\"muted\", this.options.secondary) : \"\";\n\t\tconst primary = this.options.selected\n\t\t\t? theme.bold(theme.fg(\"text\", this.options.primary))\n\t\t\t: theme.fg(\"text\", this.options.primary);\n\t\tconst innerWidth = Math.max(1, safeWidth - ROW_PADDING_X * 2);\n\t\tconst metaWidth = visibleWidth(meta);\n\t\tconst gap = meta ? 2 : 0;\n\t\tconst primaryWidth = Math.max(1, innerWidth - metaWidth - gap);\n\t\tconst primaryText = truncateToWidth(primary, primaryWidth, \"\", true);\n\t\tconst primaryLine = meta ? primaryText + \" \".repeat(gap) + meta : primaryText;\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.rowLine(primaryLine, safeWidth, this.selected));\n\t\tif (secondary) {\n\t\t\tlines.push(this.rowLine(truncateToWidth(secondary, innerWidth, \"\", true), safeWidth, this.selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\trenderPadding(width: number, selected: boolean): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst lines: string[] = [];\n\t\tfor (let i = 0; i < ROW_PADDING_Y; i++) {\n\t\t\tlines.push(this.rowLine(\"\", safeWidth, selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate rowLine(text: string, width: number, selected: boolean): string {\n\t\tconst background = selected ? theme.getSelectionBackgroundColor() : theme.getEditorBackgroundColor();\n\t\treturn paddedBackgroundLine(text, width, ROW_PADDING_X, background);\n\t}\n}\n\nexport class MenuList extends Container implements FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuListOptions = {}) {\n\t\tsuper();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst compact = this.isCompact();\n\t\tfor (let index = 0; index < this.children.length; index++) {\n\t\t\tconst child = this.children[index];\n\t\t\tif (child instanceof MenuRow) {\n\t\t\t\tif (compact) {\n\t\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previousChild = this.children[index - 1];\n\t\t\t\tconst nextChild = this.children[index + 1];\n\t\t\t\tconst previousRow = previousChild instanceof MenuRow ? previousChild : undefined;\n\t\t\t\tconst nextRow = nextChild instanceof MenuRow ? nextChild : undefined;\n\t\t\t\tlines.push(...child.renderPadding(width, child.selected || previousRow?.selected === true));\n\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\tif (!nextRow) {\n\t\t\t\t\tlines.push(...child.renderPadding(width, child.selected));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst childLines = fillsMenuPanel(child)\n\t\t\t\t? child.render(width)\n\t\t\t\t: child.render(Math.max(1, width - PANEL_PADDING_X * 2));\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, width));\n\t\t\t}\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate isCompact(): boolean {\n\t\tconst compact = this.options.compact;\n\t\treturn typeof compact === \"function\" ? compact() : compact === true;\n\t}\n}\n"]}
1
+ {"version":3,"file":"menu-panel.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/menu-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tInput,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@ponythewhite/base-context-tui\";\nimport { theme } from \"../theme/theme.js\";\n\ninterface MenuPanelOptions {\n\ttitle: string;\n\tsubtitle?: string;\n}\n\nexport interface MenuViewportProvider {\n\tgetRows?: () => number;\n}\n\ninterface MenuListOptions {\n\tcompact?: boolean | (() => boolean);\n}\n\ninterface MenuListLayoutOptions extends MenuViewportProvider {\n\tpreferredVisibleItems: number;\n\tminVisibleItems?: number;\n\ttotalItems?: number;\n\treservedRows: number;\n\tcomfortableItemRows: number;\n\tcompactItemRows?: number;\n\tscrollIndicatorRows?: number;\n\tcomfortableListPaddingRows?: number;\n\tcompactListPaddingRows?: number;\n}\n\nexport interface MenuListLayout {\n\tcompact: boolean;\n\tvisibleItems: number;\n}\n\nconst PANEL_PADDING_X = 2;\nconst PANEL_PADDING_Y = 1;\nconst FIELD_PADDING_X = 2;\nconst ROW_PADDING_X = 2;\nconst ROW_PADDING_Y = 1;\nconst ANSI_RESET = \"\\x1b[0m\";\n\nexport function getMenuPanelInnerWidth(width: number): number {\n\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\treturn Math.max(1, safeWidth - PANEL_PADDING_X * 2);\n}\n\ninterface FullWidthMenuComponent {\n\treadonly fillsMenuPanel: true;\n}\n\nfunction fillsMenuPanel(component: Component): component is Component & FullWidthMenuComponent {\n\treturn (component as { fillsMenuPanel?: unknown }).fillsMenuPanel === true;\n}\n\nfunction getViewportRows(getRows: (() => number) | undefined): number | undefined {\n\tconst rows = getRows?.();\n\tif (rows === undefined || !Number.isFinite(rows) || rows <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.floor(rows);\n}\n\nfunction visibleItemCount(\n\trows: number,\n\toptions: {\n\t\tpreferredVisibleItems: number;\n\t\tminVisibleItems: number;\n\t\treservedRows: number;\n\t\titemRows: number;\n\t\tlistPaddingRows: number;\n\t\textraRows: number;\n\t},\n): number {\n\tconst capacityRows = Math.max(0, rows - options.reservedRows - options.listPaddingRows - options.extraRows);\n\tconst itemCapacity = Math.floor(capacityRows / options.itemRows);\n\treturn Math.max(options.minVisibleItems, Math.min(options.preferredVisibleItems, itemCapacity));\n}\n\nfunction listRowsUsed(options: {\n\treservedRows: number;\n\tlistPaddingRows: number;\n\tvisibleItems: number;\n\titemRows: number;\n\textraRows: number;\n}): number {\n\treturn options.reservedRows + options.listPaddingRows + options.extraRows + options.visibleItems * options.itemRows;\n}\n\nfunction scrollIndicatorRows(options: {\n\ttotalItems: number | undefined;\n\tvisibleItems: number;\n\tscrollIndicatorRows: number;\n}): number {\n\tif (options.totalItems === undefined || options.scrollIndicatorRows <= 0) {\n\t\treturn 0;\n\t}\n\treturn options.totalItems > options.visibleItems ? options.scrollIndicatorRows : 0;\n}\n\nfunction getLayoutCandidate(\n\trows: number,\n\toptions: MenuListLayoutOptions,\n\titemRows: number,\n\tlistPaddingRows: number,\n\tcompact: boolean,\n): MenuListLayout & { rowsUsed: number; fits: boolean } {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst visibleItemsWithoutScroll = visibleItemCount(rows, {\n\t\tpreferredVisibleItems,\n\t\tminVisibleItems,\n\t\treservedRows: options.reservedRows,\n\t\titemRows,\n\t\tlistPaddingRows,\n\t\textraRows: 0,\n\t});\n\tconst extraRows = scrollIndicatorRows({\n\t\ttotalItems: options.totalItems,\n\t\tvisibleItems: visibleItemsWithoutScroll,\n\t\tscrollIndicatorRows: options.scrollIndicatorRows ?? 0,\n\t});\n\tconst visibleItems =\n\t\textraRows > 0\n\t\t\t? visibleItemCount(rows, {\n\t\t\t\t\tpreferredVisibleItems,\n\t\t\t\t\tminVisibleItems,\n\t\t\t\t\treservedRows: options.reservedRows,\n\t\t\t\t\titemRows,\n\t\t\t\t\tlistPaddingRows,\n\t\t\t\t\textraRows,\n\t\t\t\t})\n\t\t\t: visibleItemsWithoutScroll;\n\tconst rowsUsed = listRowsUsed({\n\t\treservedRows: options.reservedRows,\n\t\tlistPaddingRows,\n\t\tvisibleItems,\n\t\titemRows,\n\t\textraRows,\n\t});\n\treturn {\n\t\tcompact,\n\t\tvisibleItems,\n\t\trowsUsed,\n\t\tfits: rowsUsed <= rows,\n\t};\n}\n\nexport function getMenuListLayout(options: MenuListLayoutOptions): MenuListLayout {\n\tconst minVisibleItems = options.minVisibleItems ?? 1;\n\tconst preferredVisibleItems = Math.max(minVisibleItems, options.preferredVisibleItems);\n\tconst rows = getViewportRows(options.getRows);\n\tif (rows === undefined) {\n\t\treturn { compact: false, visibleItems: preferredVisibleItems };\n\t}\n\n\tconst comfortableLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.comfortableItemRows),\n\t\toptions.comfortableListPaddingRows ?? 1,\n\t\tfalse,\n\t);\n\tif (options.compactItemRows === undefined) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\n\tconst compactLayout = getLayoutCandidate(\n\t\trows,\n\t\toptions,\n\t\tMath.max(1, options.compactItemRows),\n\t\toptions.compactListPaddingRows ?? 0,\n\t\ttrue,\n\t);\n\tif (compactLayout.fits && (!comfortableLayout.fits || compactLayout.visibleItems > comfortableLayout.visibleItems)) {\n\t\treturn { compact: true, visibleItems: compactLayout.visibleItems };\n\t}\n\tif (comfortableLayout.fits) {\n\t\treturn { compact: false, visibleItems: comfortableLayout.visibleItems };\n\t}\n\treturn compactLayout.rowsUsed <= comfortableLayout.rowsUsed\n\t\t? { compact: true, visibleItems: compactLayout.visibleItems }\n\t\t: { compact: false, visibleItems: comfortableLayout.visibleItems };\n}\n\nfunction paddedBackgroundLine(\n\ttext: string,\n\twidth: number,\n\tpaddingX: number,\n\tbackground: ((text: string) => string) | undefined,\n): string {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\tconst content = truncateToWidth(text, innerWidth, \"\");\n\tconst rightPadding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(content)));\n\tconst contentSpan = \" \".repeat(paddingX) + content;\n\tconst trailingSpan = rightPadding + \" \".repeat(paddingX);\n\tif (!background) {\n\t\treturn contentSpan + trailingSpan;\n\t}\n\treturn applyBackground(contentSpan, background) + background(trailingSpan);\n}\n\nfunction applyBackground(text: string, background: (text: string) => string): string {\n\treturn text\n\t\t.split(ANSI_RESET)\n\t\t.map((segment) => background(segment))\n\t\t.join(ANSI_RESET);\n}\n\nfunction surfaceLine(text: string, width: number, paddingX = PANEL_PADDING_X): string {\n\treturn paddedBackgroundLine(text, width, paddingX, theme.getEditorBackgroundColor());\n}\n\nfunction surfaceWrappedLines(text: string, width: number, paddingX = PANEL_PADDING_X): string[] {\n\tconst innerWidth = Math.max(1, width - paddingX * 2);\n\treturn wrapTextWithAnsi(text, innerWidth).map((content) => surfaceLine(content, width, paddingX));\n}\n\nexport class MenuPanel extends Container {\n\tprivate title: string;\n\n\tconstructor(private readonly options: MenuPanelOptions) {\n\t\tsuper();\n\t\tthis.title = options.title;\n\t}\n\n\tsetTitle(title: string): void {\n\t\tthis.title = title;\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst safeWidth = Math.max(PANEL_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = getMenuPanelInnerWidth(width);\n\t\tconst lines: string[] = [];\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\tconst hasTitle = this.title.trim().length > 0;\n\t\tconst subtitle = this.options.subtitle?.trim();\n\t\tconst hasSubtitle = subtitle !== undefined && subtitle.length > 0;\n\t\tconst hasHeader = hasTitle || hasSubtitle;\n\t\tif (hasTitle) {\n\t\t\tlines.push(surfaceLine(theme.bold(theme.fg(\"text\", this.title)), safeWidth));\n\t\t}\n\t\tif (hasSubtitle) {\n\t\t\tlines.push(...surfaceWrappedLines(theme.fg(\"muted\", subtitle), safeWidth));\n\t\t}\n\t\tif (hasHeader) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\n\t\tfor (const child of this.children) {\n\t\t\tconst childLines = fillsMenuPanel(child) ? child.render(safeWidth) : child.render(innerWidth);\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, safeWidth));\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < PANEL_PADDING_Y; i++) {\n\t\t\tlines.push(surfaceLine(\"\", safeWidth));\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class MenuSearchInput implements Component, Focusable, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\tprivate readonly input = new Input();\n\n\tconstructor(private readonly placeholder: string) {}\n\n\tget focused(): boolean {\n\t\treturn this.input.focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis.input.focused = value;\n\t}\n\n\tset onSubmit(handler: ((value: string) => void) | undefined) {\n\t\tthis.input.onSubmit = handler;\n\t}\n\n\tgetValue(): string {\n\t\treturn this.input.getValue();\n\t}\n\n\tgetCursor(): number {\n\t\treturn this.input.getCursor();\n\t}\n\n\tsetValue(value: string): void {\n\t\tthis.input.setValue(value);\n\t}\n\n\tsetMasked(masked: boolean): void {\n\t\tthis.input.setMasked(masked);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.input.handleInput(data);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.input.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(FIELD_PADDING_X * 2 + 1, width);\n\t\tconst innerWidth = Math.max(1, safeWidth - FIELD_PADDING_X * 2);\n\t\tconst content =\n\t\t\tthis.getValue() === \"\" && !this.focused\n\t\t\t\t? theme.fg(\"dim\", this.placeholder)\n\t\t\t\t: this.stripInputPrompt(this.input.render(innerWidth + 2)[0] ?? \"\");\n\t\treturn [paddedBackgroundLine(content, safeWidth, FIELD_PADDING_X, theme.getEditorBackgroundColor())];\n\t}\n\n\tprivate stripInputPrompt(line: string): string {\n\t\treturn line.startsWith(\"> \") ? line.slice(2) : line;\n\t}\n}\n\ninterface MenuRowOptions {\n\tprimary: string;\n\tsecondary?: string;\n\tmeta?: string;\n\tselected: boolean;\n}\n\nexport class MenuRow implements Component, FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuRowOptions) {}\n\n\tget selected(): boolean {\n\t\treturn this.options.selected;\n\t}\n\n\tinvalidate(): void {\n\t\t// Row render is derived from constructor options.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\treturn [\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t\t...this.renderContent(safeWidth),\n\t\t\t...this.renderPadding(safeWidth, this.selected),\n\t\t];\n\t}\n\n\trenderContent(width: number): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst meta = this.options.meta ? theme.fg(\"muted\", this.options.meta) : \"\";\n\t\tconst secondary = this.options.secondary ? theme.fg(\"muted\", this.options.secondary) : \"\";\n\t\tconst primary = this.options.selected\n\t\t\t? theme.bold(theme.fg(\"text\", this.options.primary))\n\t\t\t: theme.fg(\"text\", this.options.primary);\n\t\tconst innerWidth = Math.max(1, safeWidth - ROW_PADDING_X * 2);\n\t\tconst metaWidth = visibleWidth(meta);\n\t\tconst gap = meta ? 2 : 0;\n\t\tconst primaryWidth = Math.max(1, innerWidth - metaWidth - gap);\n\t\tconst primaryText = truncateToWidth(primary, primaryWidth, \"\", true);\n\t\tconst primaryLine = meta ? primaryText + \" \".repeat(gap) + meta : primaryText;\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.rowLine(primaryLine, safeWidth, this.selected));\n\t\tif (secondary) {\n\t\t\tlines.push(this.rowLine(truncateToWidth(secondary, innerWidth, \"\", true), safeWidth, this.selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\trenderPadding(width: number, selected: boolean): string[] {\n\t\tconst safeWidth = Math.max(ROW_PADDING_X * 2 + 1, width);\n\t\tconst lines: string[] = [];\n\t\tfor (let i = 0; i < ROW_PADDING_Y; i++) {\n\t\t\tlines.push(this.rowLine(\"\", safeWidth, selected));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate rowLine(text: string, width: number, selected: boolean): string {\n\t\tconst background = selected ? theme.getSelectionBackgroundColor() : theme.getEditorBackgroundColor();\n\t\treturn paddedBackgroundLine(text, width, ROW_PADDING_X, background);\n\t}\n}\n\nexport class MenuList extends Container implements FullWidthMenuComponent {\n\treadonly fillsMenuPanel = true;\n\n\tconstructor(private readonly options: MenuListOptions = {}) {\n\t\tsuper();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst compact = this.isCompact();\n\t\tfor (let index = 0; index < this.children.length; index++) {\n\t\t\tconst child = this.children[index];\n\t\t\tif (child instanceof MenuRow) {\n\t\t\t\tif (compact) {\n\t\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previousChild = this.children[index - 1];\n\t\t\t\tconst nextChild = this.children[index + 1];\n\t\t\t\tconst previousRow = previousChild instanceof MenuRow ? previousChild : undefined;\n\t\t\t\tconst nextRow = nextChild instanceof MenuRow ? nextChild : undefined;\n\t\t\t\tlines.push(...child.renderPadding(width, child.selected || previousRow?.selected === true));\n\t\t\t\tlines.push(...child.renderContent(width));\n\t\t\t\tif (!nextRow) {\n\t\t\t\t\tlines.push(...child.renderPadding(width, child.selected));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst childLines = fillsMenuPanel(child)\n\t\t\t\t? child.render(width)\n\t\t\t\t: child.render(Math.max(1, width - PANEL_PADDING_X * 2));\n\t\t\tfor (const line of childLines) {\n\t\t\t\tlines.push(fillsMenuPanel(child) ? line : surfaceLine(line, width));\n\t\t\t}\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate isCompact(): boolean {\n\t\tconst compact = this.options.compact;\n\t\treturn typeof compact === \"function\" ? compact() : compact === true;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"settings-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { Transport } from \"@ponythewhite/base-context-ai\";\nimport {\n\tContainer,\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SettingItem,\n\tSettingsList,\n\tSpacer,\n\tText,\n} from \"@ponythewhite/base-context-tui\";\nimport type { IdleEvictionMinutes } from \"../../../core/session-action-store.js\";\nimport type { MermaidRenderingMode, WarningSettings } from \"../../../core/settings-manager.js\";\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SETTINGS_SUBMENU_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\n\toff: \"No reasoning\",\n\tminimal: \"Very brief reasoning\",\n\tlow: \"Light reasoning\",\n\tmedium: \"Moderate reasoning\",\n\thigh: \"Deep reasoning\",\n\txhigh: \"Very deep reasoning\",\n\tmax: \"Maximum reasoning\",\n};\n\nexport interface SettingsConfig {\n\tautoCompact: boolean;\n\tidleEvictionMinutes: IdleEvictionMinutes;\n\tshowImages: boolean;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\tenableSkillCommands: boolean;\n\tenableBuiltinSkills: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\ttransport: Transport;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: ThinkingLevel[];\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\tmermaidRenderingMode: MermaidRenderingMode;\n\ttreeFilterMode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\tclearOnShrink: boolean;\n\tshowTerminalProgress: boolean;\n\tfullscreen: boolean;\n\twarnings: WarningSettings;\n}\n\nexport interface SettingsCallbacks {\n\tonAutoCompactChange: (enabled: boolean) => void;\n\tonIdleEvictionMinutesChange: (value: IdleEvictionMinutes) => void;\n\tonShowImagesChange: (enabled: boolean) => void;\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\n\tonBlockImagesChange: (blocked: boolean) => void;\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\n\tonEnableBuiltinSkillsChange: (enabled: boolean) => void;\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonTransportChange: (transport: Transport) => void;\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\n\tonThemeChange: (theme: string) => void;\n\tonThemePreview?: (theme: string) => void;\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\n\tonMermaidRenderingModeChange: (mode: MermaidRenderingMode) => void;\n\tonTreeFilterModeChange: (mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\") => void;\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\n\tonEditorPaddingXChange: (padding: number) => void;\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\n\tonQuietStartupChange: (enabled: boolean) => void;\n\tonClearOnShrinkChange: (enabled: boolean) => void;\n\tonShowTerminalProgressChange: (enabled: boolean) => void;\n\tonFullscreenChange: (enabled: boolean) => void;\n\tonWarningsChange: (warnings: WarningSettings) => void;\n\tonCancel: () => void;\n}\n\nclass WarningSettingsSubmenu extends Container {\n\tprivate settingsList: SettingsList;\n\tprivate state: WarningSettings;\n\n\tconstructor(warnings: WarningSettings, onChange: (warnings: WarningSettings) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tthis.state = { ...warnings };\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"anthropic-extra-usage\",\n\t\t\t\tlabel: \"Anthropic extra usage\",\n\t\t\t\tdescription: \"Warn when Anthropic subscription auth may use paid extra usage\",\n\t\t\t\tcurrentValue: (this.state.anthropicExtraUsage ?? true) ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t];\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\tMath.min(items.length, 10),\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"anthropic-extra-usage\":\n\t\t\t\t\t\tthis.state = { ...this.state, anthropicExtraUsage: newValue === \"true\" };\n\t\t\t\t\t\tonChange({ ...this.state });\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel,\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.settingsList.handleInput(data);\n\t}\n}\n\nclass SelectSubmenu extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\toptions: SelectItem[],\n\t\tcurrentValue: string,\n\t\tonSelect: (value: string) => void,\n\t\tonCancel: () => void,\n\t\tonSelectionChange?: (value: string) => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\n\t\tif (description) {\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\t}\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.selectList = new SelectList(\n\t\t\toptions,\n\t\t\tMath.min(options.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = onCancel;\n\n\t\tif (onSelectionChange) {\n\t\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\t\tonSelectionChange(item.value);\n\t\t\t};\n\t\t}\n\n\t\tthis.addChild(this.selectList);\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n\nexport class SettingsSelectorComponent extends Container {\n\tprivate settingsList: SettingsList;\n\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n\t\tsuper();\n\n\t\tlet currentWarnings = { ...config.warnings };\n\t\tconst idleEvictionValues = [30, 60, 90, 180, 360];\n\t\tif (typeof config.idleEvictionMinutes === \"number\" && !idleEvictionValues.includes(config.idleEvictionMinutes)) {\n\t\t\tidleEvictionValues.push(config.idleEvictionMinutes);\n\t\t\tidleEvictionValues.sort((a, b) => a - b);\n\t\t}\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"autocompact\",\n\t\t\t\tlabel: \"Auto-compact\",\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"idle-eviction-minutes\",\n\t\t\t\tlabel: \"Idle worker eviction\",\n\t\t\t\tdescription: \"Stop fully idle agent trees after this many minutes (global daemon policy)\",\n\t\t\t\tcurrentValue: String(config.idleEvictionMinutes),\n\t\t\t\tvalues: [\"off\", ...idleEvictionValues.map(String)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"steering-mode\",\n\t\t\t\tlabel: \"Steering mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.steeringMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"follow-up-mode\",\n\t\t\t\tlabel: \"Follow-up mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.followUpMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"transport\",\n\t\t\t\tlabel: \"Transport\",\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\n\t\t\t\tcurrentValue: config.transport,\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"websocket-cached\", \"auto\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"hide-thinking\",\n\t\t\t\tlabel: \"Hide thinking\",\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"mermaid-rendering\",\n\t\t\t\tlabel: \"Mermaid diagrams\",\n\t\t\t\tdescription: \"Render Mermaid code blocks as Unicode diagrams\",\n\t\t\t\tcurrentValue: config.mermaidRenderingMode,\n\t\t\t\tvalues: [\"off\", \"final\", \"streaming\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"quiet-startup\",\n\t\t\t\tlabel: \"Quiet startup\",\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"tree-filter-mode\",\n\t\t\t\tlabel: \"Tree filter mode\",\n\t\t\t\tdescription: \"Default filter when opening /tree\",\n\t\t\t\tcurrentValue: config.treeFilterMode,\n\t\t\t\tvalues: [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"warnings\",\n\t\t\t\tlabel: \"Warnings\",\n\t\t\t\tdescription: \"Enable or disable individual warnings\",\n\t\t\t\tcurrentValue: \"configure\",\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew WarningSettingsSubmenu(\n\t\t\t\t\t\tcurrentWarnings,\n\t\t\t\t\t\t(warnings) => {\n\t\t\t\t\t\t\tcurrentWarnings = warnings;\n\t\t\t\t\t\t\tcallbacks.onWarningsChange(warnings);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"thinking\",\n\t\t\t\tlabel: \"Thinking level\",\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\n\t\t\t\tcurrentValue: config.thinkingLevel,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Thinking Level\",\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"theme\",\n\t\t\t\tlabel: \"Theme\",\n\t\t\t\tdescription: \"Color theme for the interface\",\n\t\t\t\tcurrentValue: config.currentTheme,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Theme\",\n\t\t\t\t\t\t\"Select color theme\",\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\n\t\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\t\tlabel: t,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// Restore original theme on cancel\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentValue);\n\t\t\t\t\t\t\tdone();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\t// Preview theme on selection change\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t},\n\t\t];\n\n\t\titems.splice(1, 0, {\n\t\t\tid: \"show-images\",\n\t\t\tlabel: \"Show image metadata\",\n\t\t\tdescription: \"Show image type and dimensions in terminal\",\n\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\n\t\titems.splice(2, 0, {\n\t\t\tid: \"auto-resize-images\",\n\t\t\tlabel: \"Auto-resize images\",\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Block images toggle (always available, insert after auto-resize-images)\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\n\t\titems.splice(autoResizeIndex + 1, 0, {\n\t\t\tid: \"block-images\",\n\t\t\tlabel: \"Block images\",\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Skill commands toggle (insert after block-images)\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\n\t\titems.splice(blockImagesIndex + 1, 0, {\n\t\t\tid: \"skill-commands\",\n\t\t\tlabel: \"Skill commands\",\n\t\t\tdescription: \"Register skills as /skill:name commands\",\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Built-in skills toggle (insert after skill-commands)\n\t\tconst skillCommandsItemIndex = items.findIndex((item) => item.id === \"skill-commands\");\n\t\titems.splice(skillCommandsItemIndex + 1, 0, {\n\t\t\tid: \"builtin-skills\",\n\t\t\tlabel: \"Built-in skills\",\n\t\t\tdescription: \"Load built-in skills shipped with base-context (takes effect after reload)\",\n\t\t\tcurrentValue: config.enableBuiltinSkills ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Hardware cursor toggle (insert after builtin-skills)\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"builtin-skills\");\n\t\titems.splice(skillCommandsIndex + 1, 0, {\n\t\t\tid: \"show-hardware-cursor\",\n\t\t\tlabel: \"Show hardware cursor\",\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\n\t\t\tid: \"editor-padding\",\n\t\t\tlabel: \"Editor padding\",\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\n\t\t\tcurrentValue: String(config.editorPaddingX),\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\n\t\t});\n\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\n\t\titems.splice(editorPaddingIndex + 1, 0, {\n\t\t\tid: \"autocomplete-max-visible\",\n\t\t\tlabel: \"Autocomplete max items\",\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\n\t\t});\n\n\t\t// Clear on shrink toggle (insert after autocomplete-max-visible)\n\t\tconst autocompleteIndex = items.findIndex((item) => item.id === \"autocomplete-max-visible\");\n\t\titems.splice(autocompleteIndex + 1, 0, {\n\t\t\tid: \"clear-on-shrink\",\n\t\t\tlabel: \"Clear on shrink\",\n\t\t\tdescription: \"Clear empty rows when content shrinks (may cause flicker)\",\n\t\t\tcurrentValue: config.clearOnShrink ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Terminal progress toggle (insert after clear-on-shrink)\n\t\tconst clearOnShrinkIndex = items.findIndex((item) => item.id === \"clear-on-shrink\");\n\t\titems.splice(clearOnShrinkIndex + 1, 0, {\n\t\t\tid: \"terminal-progress\",\n\t\t\tlabel: \"Terminal progress\",\n\t\t\tdescription: \"Show OSC 9;4 progress indicators in the terminal tab bar\",\n\t\t\tcurrentValue: config.showTerminalProgress ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Fullscreen toggle (insert after terminal-progress)\n\t\tconst terminalProgressIndex = items.findIndex((item) => item.id === \"terminal-progress\");\n\t\titems.splice(terminalProgressIndex + 1, 0, {\n\t\t\tid: \"fullscreen\",\n\t\t\tlabel: \"Fullscreen rendering\",\n\t\t\tdescription: \"Alternate-screen UI with scrollable transcript and pinned prompt\",\n\t\t\tcurrentValue: config.fullscreen ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\t10,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"autocompact\":\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"idle-eviction-minutes\":\n\t\t\t\t\t\tcallbacks.onIdleEvictionMinutesChange(newValue === \"off\" ? \"off\" : Number(newValue));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-images\":\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-resize-images\":\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"block-images\":\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"skill-commands\":\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"builtin-skills\":\n\t\t\t\t\t\tcallbacks.onEnableBuiltinSkillsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"steering-mode\":\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"follow-up-mode\":\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transport\":\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hide-thinking\":\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"mermaid-rendering\":\n\t\t\t\t\t\tcallbacks.onMermaidRenderingModeChange(newValue as MermaidRenderingMode);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"quiet-startup\":\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tree-filter-mode\":\n\t\t\t\t\t\tcallbacks.onTreeFilterModeChange(\n\t\t\t\t\t\t\tnewValue as \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-hardware-cursor\":\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"editor-padding\":\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"autocomplete-max-visible\":\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"clear-on-shrink\":\n\t\t\t\t\t\tcallbacks.onClearOnShrinkChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"terminal-progress\":\n\t\t\t\t\t\tcallbacks.onShowTerminalProgressChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"fullscreen\":\n\t\t\t\t\t\tcallbacks.onFullscreenChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallbacks.onCancel,\n\t\t\t{ enableSearch: true },\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSettingsList(): SettingsList {\n\t\treturn this.settingsList;\n\t}\n}\n"]}
1
+ {"version":3,"file":"settings-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { Transport } from \"@ponythewhite/base-context-ai\";\nimport {\n\tContainer,\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SettingItem,\n\tSettingsList,\n\tSpacer,\n\tText,\n} from \"@ponythewhite/base-context-tui\";\nimport type { IdleEvictionMinutes } from \"../../../core/session-action-store.js\";\nimport type { MermaidRenderingMode, WarningSettings } from \"../../../core/settings-manager.js\";\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SETTINGS_SUBMENU_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\n\toff: \"No reasoning\",\n\tminimal: \"Very brief reasoning\",\n\tlow: \"Light reasoning\",\n\tmedium: \"Moderate reasoning\",\n\thigh: \"Deep reasoning\",\n\txhigh: \"Very deep reasoning\",\n\tmax: \"Maximum reasoning\",\n};\n\nexport interface SettingsConfig {\n\tautoCompact: boolean;\n\tidleEvictionMinutes: IdleEvictionMinutes;\n\tshowImages: boolean;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\tenableSkillCommands: boolean;\n\tenableBuiltinSkills: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\ttransport: Transport;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: ThinkingLevel[];\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\tmermaidRenderingMode: MermaidRenderingMode;\n\ttreeFilterMode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\tclearOnShrink: boolean;\n\tshowTerminalProgress: boolean;\n\tfullscreen: boolean;\n\twarnings: WarningSettings;\n}\n\nexport interface SettingsCallbacks {\n\tonAutoCompactChange: (enabled: boolean) => void;\n\tonIdleEvictionMinutesChange: (value: IdleEvictionMinutes) => void;\n\tonShowImagesChange: (enabled: boolean) => void;\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\n\tonBlockImagesChange: (blocked: boolean) => void;\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\n\tonEnableBuiltinSkillsChange: (enabled: boolean) => void;\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonTransportChange: (transport: Transport) => void;\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\n\tonThemeChange: (theme: string) => void;\n\tonThemePreview?: (theme: string) => void;\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\n\tonMermaidRenderingModeChange: (mode: MermaidRenderingMode) => void;\n\tonTreeFilterModeChange: (mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\") => void;\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\n\tonEditorPaddingXChange: (padding: number) => void;\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\n\tonQuietStartupChange: (enabled: boolean) => void;\n\tonClearOnShrinkChange: (enabled: boolean) => void;\n\tonShowTerminalProgressChange: (enabled: boolean) => void;\n\tonFullscreenChange: (enabled: boolean) => void;\n\tonWarningsChange: (warnings: WarningSettings) => void;\n\tonCancel: () => void;\n}\n\nclass WarningSettingsSubmenu extends Container {\n\tprivate settingsList: SettingsList;\n\tprivate state: WarningSettings;\n\n\tconstructor(warnings: WarningSettings, onChange: (warnings: WarningSettings) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tthis.state = { ...warnings };\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"anthropic-extra-usage\",\n\t\t\t\tlabel: \"Anthropic extra usage\",\n\t\t\t\tdescription: \"Warn when Anthropic subscription auth may use paid extra usage\",\n\t\t\t\tcurrentValue: (this.state.anthropicExtraUsage ?? true) ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t];\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\tMath.min(items.length, 10),\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"anthropic-extra-usage\":\n\t\t\t\t\t\tthis.state = { ...this.state, anthropicExtraUsage: newValue === \"true\" };\n\t\t\t\t\t\tonChange({ ...this.state });\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel,\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.settingsList.handleInput(data);\n\t}\n}\n\nclass SelectSubmenu extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\toptions: SelectItem[],\n\t\tcurrentValue: string,\n\t\tonSelect: (value: string) => void,\n\t\tonCancel: () => void,\n\t\tonSelectionChange?: (value: string) => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\n\t\tif (description) {\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\t}\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.selectList = new SelectList(\n\t\t\toptions,\n\t\t\tMath.min(options.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = onCancel;\n\n\t\tif (onSelectionChange) {\n\t\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\t\tonSelectionChange(item.value);\n\t\t\t};\n\t\t}\n\n\t\tthis.addChild(this.selectList);\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n\nexport class SettingsSelectorComponent extends Container {\n\tprivate settingsList: SettingsList;\n\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n\t\tsuper();\n\n\t\tlet currentWarnings = { ...config.warnings };\n\t\tlet currentTheme = config.currentTheme;\n\t\tconst themeLabel = (name: string) => (name === \"prime\" ? \"Synerise\" : name);\n\t\tconst idleEvictionValues = [30, 60, 90, 180, 360];\n\t\tif (typeof config.idleEvictionMinutes === \"number\" && !idleEvictionValues.includes(config.idleEvictionMinutes)) {\n\t\t\tidleEvictionValues.push(config.idleEvictionMinutes);\n\t\t\tidleEvictionValues.sort((a, b) => a - b);\n\t\t}\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"autocompact\",\n\t\t\t\tlabel: \"Auto-compact\",\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"idle-eviction-minutes\",\n\t\t\t\tlabel: \"Idle worker eviction\",\n\t\t\t\tdescription: \"Stop fully idle agent trees after this many minutes (global daemon policy)\",\n\t\t\t\tcurrentValue: String(config.idleEvictionMinutes),\n\t\t\t\tvalues: [\"off\", ...idleEvictionValues.map(String)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"steering-mode\",\n\t\t\t\tlabel: \"Steering mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.steeringMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"follow-up-mode\",\n\t\t\t\tlabel: \"Follow-up mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.followUpMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"transport\",\n\t\t\t\tlabel: \"Transport\",\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\n\t\t\t\tcurrentValue: config.transport,\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"websocket-cached\", \"auto\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"hide-thinking\",\n\t\t\t\tlabel: \"Hide thinking\",\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"mermaid-rendering\",\n\t\t\t\tlabel: \"Mermaid diagrams\",\n\t\t\t\tdescription: \"Render Mermaid code blocks as Unicode diagrams\",\n\t\t\t\tcurrentValue: config.mermaidRenderingMode,\n\t\t\t\tvalues: [\"off\", \"final\", \"streaming\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"quiet-startup\",\n\t\t\t\tlabel: \"Quiet startup\",\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"tree-filter-mode\",\n\t\t\t\tlabel: \"Tree filter mode\",\n\t\t\t\tdescription: \"Default filter when opening /tree\",\n\t\t\t\tcurrentValue: config.treeFilterMode,\n\t\t\t\tvalues: [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"warnings\",\n\t\t\t\tlabel: \"Warnings\",\n\t\t\t\tdescription: \"Enable or disable individual warnings\",\n\t\t\t\tcurrentValue: \"configure\",\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew WarningSettingsSubmenu(\n\t\t\t\t\t\tcurrentWarnings,\n\t\t\t\t\t\t(warnings) => {\n\t\t\t\t\t\t\tcurrentWarnings = warnings;\n\t\t\t\t\t\t\tcallbacks.onWarningsChange(warnings);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"thinking\",\n\t\t\t\tlabel: \"Thinking level\",\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\n\t\t\t\tcurrentValue: config.thinkingLevel,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Thinking Level\",\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"theme\",\n\t\t\t\tlabel: \"Theme\",\n\t\t\t\tdescription: \"Color theme for the interface\",\n\t\t\t\tcurrentValue: themeLabel(currentTheme),\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Theme\",\n\t\t\t\t\t\t\"Select color theme\",\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\n\t\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\t\tlabel: themeLabel(t),\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentTheme,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcurrentTheme = value;\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\n\t\t\t\t\t\t\tdone(themeLabel(value));\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// Restore original theme on cancel\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentTheme);\n\t\t\t\t\t\t\tdone();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\t// Preview theme on selection change\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t},\n\t\t];\n\n\t\titems.splice(1, 0, {\n\t\t\tid: \"show-images\",\n\t\t\tlabel: \"Show image metadata\",\n\t\t\tdescription: \"Show image type and dimensions in terminal\",\n\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\n\t\titems.splice(2, 0, {\n\t\t\tid: \"auto-resize-images\",\n\t\t\tlabel: \"Auto-resize images\",\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Block images toggle (always available, insert after auto-resize-images)\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\n\t\titems.splice(autoResizeIndex + 1, 0, {\n\t\t\tid: \"block-images\",\n\t\t\tlabel: \"Block images\",\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Skill commands toggle (insert after block-images)\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\n\t\titems.splice(blockImagesIndex + 1, 0, {\n\t\t\tid: \"skill-commands\",\n\t\t\tlabel: \"Skill commands\",\n\t\t\tdescription: \"Register skills as /skill:name commands\",\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Built-in skills toggle (insert after skill-commands)\n\t\tconst skillCommandsItemIndex = items.findIndex((item) => item.id === \"skill-commands\");\n\t\titems.splice(skillCommandsItemIndex + 1, 0, {\n\t\t\tid: \"builtin-skills\",\n\t\t\tlabel: \"Built-in skills\",\n\t\t\tdescription: \"Load built-in skills shipped with base-context (takes effect after reload)\",\n\t\t\tcurrentValue: config.enableBuiltinSkills ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Hardware cursor toggle (insert after builtin-skills)\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"builtin-skills\");\n\t\titems.splice(skillCommandsIndex + 1, 0, {\n\t\t\tid: \"show-hardware-cursor\",\n\t\t\tlabel: \"Show hardware cursor\",\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\n\t\t\tid: \"editor-padding\",\n\t\t\tlabel: \"Editor padding\",\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\n\t\t\tcurrentValue: String(config.editorPaddingX),\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\n\t\t});\n\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\n\t\titems.splice(editorPaddingIndex + 1, 0, {\n\t\t\tid: \"autocomplete-max-visible\",\n\t\t\tlabel: \"Autocomplete max items\",\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\n\t\t});\n\n\t\t// Clear on shrink toggle (insert after autocomplete-max-visible)\n\t\tconst autocompleteIndex = items.findIndex((item) => item.id === \"autocomplete-max-visible\");\n\t\titems.splice(autocompleteIndex + 1, 0, {\n\t\t\tid: \"clear-on-shrink\",\n\t\t\tlabel: \"Clear on shrink\",\n\t\t\tdescription: \"Clear empty rows when content shrinks (may cause flicker)\",\n\t\t\tcurrentValue: config.clearOnShrink ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Terminal progress toggle (insert after clear-on-shrink)\n\t\tconst clearOnShrinkIndex = items.findIndex((item) => item.id === \"clear-on-shrink\");\n\t\titems.splice(clearOnShrinkIndex + 1, 0, {\n\t\t\tid: \"terminal-progress\",\n\t\t\tlabel: \"Terminal progress\",\n\t\t\tdescription: \"Show OSC 9;4 progress indicators in the terminal tab bar\",\n\t\t\tcurrentValue: config.showTerminalProgress ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Fullscreen toggle (insert after terminal-progress)\n\t\tconst terminalProgressIndex = items.findIndex((item) => item.id === \"terminal-progress\");\n\t\titems.splice(terminalProgressIndex + 1, 0, {\n\t\t\tid: \"fullscreen\",\n\t\t\tlabel: \"Fullscreen rendering\",\n\t\t\tdescription: \"Alternate-screen UI with scrollable transcript and pinned prompt\",\n\t\t\tcurrentValue: config.fullscreen ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\t10,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"autocompact\":\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"idle-eviction-minutes\":\n\t\t\t\t\t\tcallbacks.onIdleEvictionMinutesChange(newValue === \"off\" ? \"off\" : Number(newValue));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-images\":\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-resize-images\":\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"block-images\":\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"skill-commands\":\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"builtin-skills\":\n\t\t\t\t\t\tcallbacks.onEnableBuiltinSkillsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"steering-mode\":\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"follow-up-mode\":\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transport\":\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hide-thinking\":\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"mermaid-rendering\":\n\t\t\t\t\t\tcallbacks.onMermaidRenderingModeChange(newValue as MermaidRenderingMode);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"quiet-startup\":\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tree-filter-mode\":\n\t\t\t\t\t\tcallbacks.onTreeFilterModeChange(\n\t\t\t\t\t\t\tnewValue as \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-hardware-cursor\":\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"editor-padding\":\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"autocomplete-max-visible\":\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"clear-on-shrink\":\n\t\t\t\t\t\tcallbacks.onClearOnShrinkChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"terminal-progress\":\n\t\t\t\t\t\tcallbacks.onShowTerminalProgressChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"fullscreen\":\n\t\t\t\t\t\tcallbacks.onFullscreenChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallbacks.onCancel,\n\t\t\t{ enableSearch: true },\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSettingsList(): SettingsList {\n\t\treturn this.settingsList;\n\t}\n}\n"]}
@@ -80,6 +80,8 @@ export class SettingsSelectorComponent extends Container {
80
80
  constructor(config, callbacks) {
81
81
  super();
82
82
  let currentWarnings = { ...config.warnings };
83
+ let currentTheme = config.currentTheme;
84
+ const themeLabel = (name) => (name === "prime" ? "Synerise" : name);
83
85
  const idleEvictionValues = [30, 60, 90, 180, 360];
84
86
  if (typeof config.idleEvictionMinutes === "number" && !idleEvictionValues.includes(config.idleEvictionMinutes)) {
85
87
  idleEvictionValues.push(config.idleEvictionMinutes);
@@ -177,16 +179,17 @@ export class SettingsSelectorComponent extends Container {
177
179
  id: "theme",
178
180
  label: "Theme",
179
181
  description: "Color theme for the interface",
180
- currentValue: config.currentTheme,
181
- submenu: (currentValue, done) => new SelectSubmenu("Theme", "Select color theme", config.availableThemes.map((t) => ({
182
+ currentValue: themeLabel(currentTheme),
183
+ submenu: (_currentValue, done) => new SelectSubmenu("Theme", "Select color theme", config.availableThemes.map((t) => ({
182
184
  value: t,
183
- label: t,
184
- })), currentValue, (value) => {
185
+ label: themeLabel(t),
186
+ })), currentTheme, (value) => {
187
+ currentTheme = value;
185
188
  callbacks.onThemeChange(value);
186
- done(value);
189
+ done(themeLabel(value));
187
190
  }, () => {
188
191
  // Restore original theme on cancel
189
- callbacks.onThemePreview?.(currentValue);
192
+ callbacks.onThemePreview?.(currentTheme);
190
193
  done();
191
194
  }, (value) => {
192
195
  // Preview theme on selection change
@@ -1 +1 @@
1
- {"version":3,"file":"settings-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { Transport } from \"@ponythewhite/base-context-ai\";\nimport {\n\tContainer,\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SettingItem,\n\tSettingsList,\n\tSpacer,\n\tText,\n} from \"@ponythewhite/base-context-tui\";\nimport type { IdleEvictionMinutes } from \"../../../core/session-action-store.js\";\nimport type { MermaidRenderingMode, WarningSettings } from \"../../../core/settings-manager.js\";\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SETTINGS_SUBMENU_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\n\toff: \"No reasoning\",\n\tminimal: \"Very brief reasoning\",\n\tlow: \"Light reasoning\",\n\tmedium: \"Moderate reasoning\",\n\thigh: \"Deep reasoning\",\n\txhigh: \"Very deep reasoning\",\n\tmax: \"Maximum reasoning\",\n};\n\nexport interface SettingsConfig {\n\tautoCompact: boolean;\n\tidleEvictionMinutes: IdleEvictionMinutes;\n\tshowImages: boolean;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\tenableSkillCommands: boolean;\n\tenableBuiltinSkills: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\ttransport: Transport;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: ThinkingLevel[];\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\tmermaidRenderingMode: MermaidRenderingMode;\n\ttreeFilterMode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\tclearOnShrink: boolean;\n\tshowTerminalProgress: boolean;\n\tfullscreen: boolean;\n\twarnings: WarningSettings;\n}\n\nexport interface SettingsCallbacks {\n\tonAutoCompactChange: (enabled: boolean) => void;\n\tonIdleEvictionMinutesChange: (value: IdleEvictionMinutes) => void;\n\tonShowImagesChange: (enabled: boolean) => void;\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\n\tonBlockImagesChange: (blocked: boolean) => void;\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\n\tonEnableBuiltinSkillsChange: (enabled: boolean) => void;\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonTransportChange: (transport: Transport) => void;\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\n\tonThemeChange: (theme: string) => void;\n\tonThemePreview?: (theme: string) => void;\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\n\tonMermaidRenderingModeChange: (mode: MermaidRenderingMode) => void;\n\tonTreeFilterModeChange: (mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\") => void;\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\n\tonEditorPaddingXChange: (padding: number) => void;\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\n\tonQuietStartupChange: (enabled: boolean) => void;\n\tonClearOnShrinkChange: (enabled: boolean) => void;\n\tonShowTerminalProgressChange: (enabled: boolean) => void;\n\tonFullscreenChange: (enabled: boolean) => void;\n\tonWarningsChange: (warnings: WarningSettings) => void;\n\tonCancel: () => void;\n}\n\nclass WarningSettingsSubmenu extends Container {\n\tprivate settingsList: SettingsList;\n\tprivate state: WarningSettings;\n\n\tconstructor(warnings: WarningSettings, onChange: (warnings: WarningSettings) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tthis.state = { ...warnings };\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"anthropic-extra-usage\",\n\t\t\t\tlabel: \"Anthropic extra usage\",\n\t\t\t\tdescription: \"Warn when Anthropic subscription auth may use paid extra usage\",\n\t\t\t\tcurrentValue: (this.state.anthropicExtraUsage ?? true) ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t];\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\tMath.min(items.length, 10),\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"anthropic-extra-usage\":\n\t\t\t\t\t\tthis.state = { ...this.state, anthropicExtraUsage: newValue === \"true\" };\n\t\t\t\t\t\tonChange({ ...this.state });\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel,\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.settingsList.handleInput(data);\n\t}\n}\n\nclass SelectSubmenu extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\toptions: SelectItem[],\n\t\tcurrentValue: string,\n\t\tonSelect: (value: string) => void,\n\t\tonCancel: () => void,\n\t\tonSelectionChange?: (value: string) => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\n\t\tif (description) {\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\t}\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.selectList = new SelectList(\n\t\t\toptions,\n\t\t\tMath.min(options.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = onCancel;\n\n\t\tif (onSelectionChange) {\n\t\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\t\tonSelectionChange(item.value);\n\t\t\t};\n\t\t}\n\n\t\tthis.addChild(this.selectList);\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n\nexport class SettingsSelectorComponent extends Container {\n\tprivate settingsList: SettingsList;\n\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n\t\tsuper();\n\n\t\tlet currentWarnings = { ...config.warnings };\n\t\tconst idleEvictionValues = [30, 60, 90, 180, 360];\n\t\tif (typeof config.idleEvictionMinutes === \"number\" && !idleEvictionValues.includes(config.idleEvictionMinutes)) {\n\t\t\tidleEvictionValues.push(config.idleEvictionMinutes);\n\t\t\tidleEvictionValues.sort((a, b) => a - b);\n\t\t}\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"autocompact\",\n\t\t\t\tlabel: \"Auto-compact\",\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"idle-eviction-minutes\",\n\t\t\t\tlabel: \"Idle worker eviction\",\n\t\t\t\tdescription: \"Stop fully idle agent trees after this many minutes (global daemon policy)\",\n\t\t\t\tcurrentValue: String(config.idleEvictionMinutes),\n\t\t\t\tvalues: [\"off\", ...idleEvictionValues.map(String)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"steering-mode\",\n\t\t\t\tlabel: \"Steering mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.steeringMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"follow-up-mode\",\n\t\t\t\tlabel: \"Follow-up mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.followUpMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"transport\",\n\t\t\t\tlabel: \"Transport\",\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\n\t\t\t\tcurrentValue: config.transport,\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"websocket-cached\", \"auto\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"hide-thinking\",\n\t\t\t\tlabel: \"Hide thinking\",\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"mermaid-rendering\",\n\t\t\t\tlabel: \"Mermaid diagrams\",\n\t\t\t\tdescription: \"Render Mermaid code blocks as Unicode diagrams\",\n\t\t\t\tcurrentValue: config.mermaidRenderingMode,\n\t\t\t\tvalues: [\"off\", \"final\", \"streaming\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"quiet-startup\",\n\t\t\t\tlabel: \"Quiet startup\",\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"tree-filter-mode\",\n\t\t\t\tlabel: \"Tree filter mode\",\n\t\t\t\tdescription: \"Default filter when opening /tree\",\n\t\t\t\tcurrentValue: config.treeFilterMode,\n\t\t\t\tvalues: [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"warnings\",\n\t\t\t\tlabel: \"Warnings\",\n\t\t\t\tdescription: \"Enable or disable individual warnings\",\n\t\t\t\tcurrentValue: \"configure\",\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew WarningSettingsSubmenu(\n\t\t\t\t\t\tcurrentWarnings,\n\t\t\t\t\t\t(warnings) => {\n\t\t\t\t\t\t\tcurrentWarnings = warnings;\n\t\t\t\t\t\t\tcallbacks.onWarningsChange(warnings);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"thinking\",\n\t\t\t\tlabel: \"Thinking level\",\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\n\t\t\t\tcurrentValue: config.thinkingLevel,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Thinking Level\",\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"theme\",\n\t\t\t\tlabel: \"Theme\",\n\t\t\t\tdescription: \"Color theme for the interface\",\n\t\t\t\tcurrentValue: config.currentTheme,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Theme\",\n\t\t\t\t\t\t\"Select color theme\",\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\n\t\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\t\tlabel: t,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// Restore original theme on cancel\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentValue);\n\t\t\t\t\t\t\tdone();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\t// Preview theme on selection change\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t},\n\t\t];\n\n\t\titems.splice(1, 0, {\n\t\t\tid: \"show-images\",\n\t\t\tlabel: \"Show image metadata\",\n\t\t\tdescription: \"Show image type and dimensions in terminal\",\n\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\n\t\titems.splice(2, 0, {\n\t\t\tid: \"auto-resize-images\",\n\t\t\tlabel: \"Auto-resize images\",\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Block images toggle (always available, insert after auto-resize-images)\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\n\t\titems.splice(autoResizeIndex + 1, 0, {\n\t\t\tid: \"block-images\",\n\t\t\tlabel: \"Block images\",\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Skill commands toggle (insert after block-images)\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\n\t\titems.splice(blockImagesIndex + 1, 0, {\n\t\t\tid: \"skill-commands\",\n\t\t\tlabel: \"Skill commands\",\n\t\t\tdescription: \"Register skills as /skill:name commands\",\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Built-in skills toggle (insert after skill-commands)\n\t\tconst skillCommandsItemIndex = items.findIndex((item) => item.id === \"skill-commands\");\n\t\titems.splice(skillCommandsItemIndex + 1, 0, {\n\t\t\tid: \"builtin-skills\",\n\t\t\tlabel: \"Built-in skills\",\n\t\t\tdescription: \"Load built-in skills shipped with base-context (takes effect after reload)\",\n\t\t\tcurrentValue: config.enableBuiltinSkills ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Hardware cursor toggle (insert after builtin-skills)\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"builtin-skills\");\n\t\titems.splice(skillCommandsIndex + 1, 0, {\n\t\t\tid: \"show-hardware-cursor\",\n\t\t\tlabel: \"Show hardware cursor\",\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\n\t\t\tid: \"editor-padding\",\n\t\t\tlabel: \"Editor padding\",\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\n\t\t\tcurrentValue: String(config.editorPaddingX),\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\n\t\t});\n\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\n\t\titems.splice(editorPaddingIndex + 1, 0, {\n\t\t\tid: \"autocomplete-max-visible\",\n\t\t\tlabel: \"Autocomplete max items\",\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\n\t\t});\n\n\t\t// Clear on shrink toggle (insert after autocomplete-max-visible)\n\t\tconst autocompleteIndex = items.findIndex((item) => item.id === \"autocomplete-max-visible\");\n\t\titems.splice(autocompleteIndex + 1, 0, {\n\t\t\tid: \"clear-on-shrink\",\n\t\t\tlabel: \"Clear on shrink\",\n\t\t\tdescription: \"Clear empty rows when content shrinks (may cause flicker)\",\n\t\t\tcurrentValue: config.clearOnShrink ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Terminal progress toggle (insert after clear-on-shrink)\n\t\tconst clearOnShrinkIndex = items.findIndex((item) => item.id === \"clear-on-shrink\");\n\t\titems.splice(clearOnShrinkIndex + 1, 0, {\n\t\t\tid: \"terminal-progress\",\n\t\t\tlabel: \"Terminal progress\",\n\t\t\tdescription: \"Show OSC 9;4 progress indicators in the terminal tab bar\",\n\t\t\tcurrentValue: config.showTerminalProgress ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Fullscreen toggle (insert after terminal-progress)\n\t\tconst terminalProgressIndex = items.findIndex((item) => item.id === \"terminal-progress\");\n\t\titems.splice(terminalProgressIndex + 1, 0, {\n\t\t\tid: \"fullscreen\",\n\t\t\tlabel: \"Fullscreen rendering\",\n\t\t\tdescription: \"Alternate-screen UI with scrollable transcript and pinned prompt\",\n\t\t\tcurrentValue: config.fullscreen ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\t10,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"autocompact\":\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"idle-eviction-minutes\":\n\t\t\t\t\t\tcallbacks.onIdleEvictionMinutesChange(newValue === \"off\" ? \"off\" : Number(newValue));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-images\":\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-resize-images\":\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"block-images\":\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"skill-commands\":\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"builtin-skills\":\n\t\t\t\t\t\tcallbacks.onEnableBuiltinSkillsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"steering-mode\":\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"follow-up-mode\":\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transport\":\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hide-thinking\":\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"mermaid-rendering\":\n\t\t\t\t\t\tcallbacks.onMermaidRenderingModeChange(newValue as MermaidRenderingMode);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"quiet-startup\":\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tree-filter-mode\":\n\t\t\t\t\t\tcallbacks.onTreeFilterModeChange(\n\t\t\t\t\t\t\tnewValue as \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-hardware-cursor\":\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"editor-padding\":\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"autocomplete-max-visible\":\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"clear-on-shrink\":\n\t\t\t\t\t\tcallbacks.onClearOnShrinkChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"terminal-progress\":\n\t\t\t\t\t\tcallbacks.onShowTerminalProgressChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"fullscreen\":\n\t\t\t\t\t\tcallbacks.onFullscreenChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallbacks.onCancel,\n\t\t\t{ enableSearch: true },\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSettingsList(): SettingsList {\n\t\treturn this.settingsList;\n\t}\n}\n"]}
1
+ {"version":3,"file":"settings-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { Transport } from \"@ponythewhite/base-context-ai\";\nimport {\n\tContainer,\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SettingItem,\n\tSettingsList,\n\tSpacer,\n\tText,\n} from \"@ponythewhite/base-context-tui\";\nimport type { IdleEvictionMinutes } from \"../../../core/session-action-store.js\";\nimport type { MermaidRenderingMode, WarningSettings } from \"../../../core/settings-manager.js\";\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SETTINGS_SUBMENU_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\n\toff: \"No reasoning\",\n\tminimal: \"Very brief reasoning\",\n\tlow: \"Light reasoning\",\n\tmedium: \"Moderate reasoning\",\n\thigh: \"Deep reasoning\",\n\txhigh: \"Very deep reasoning\",\n\tmax: \"Maximum reasoning\",\n};\n\nexport interface SettingsConfig {\n\tautoCompact: boolean;\n\tidleEvictionMinutes: IdleEvictionMinutes;\n\tshowImages: boolean;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\tenableSkillCommands: boolean;\n\tenableBuiltinSkills: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\ttransport: Transport;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: ThinkingLevel[];\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\tmermaidRenderingMode: MermaidRenderingMode;\n\ttreeFilterMode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\tclearOnShrink: boolean;\n\tshowTerminalProgress: boolean;\n\tfullscreen: boolean;\n\twarnings: WarningSettings;\n}\n\nexport interface SettingsCallbacks {\n\tonAutoCompactChange: (enabled: boolean) => void;\n\tonIdleEvictionMinutesChange: (value: IdleEvictionMinutes) => void;\n\tonShowImagesChange: (enabled: boolean) => void;\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\n\tonBlockImagesChange: (blocked: boolean) => void;\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\n\tonEnableBuiltinSkillsChange: (enabled: boolean) => void;\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonTransportChange: (transport: Transport) => void;\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\n\tonThemeChange: (theme: string) => void;\n\tonThemePreview?: (theme: string) => void;\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\n\tonMermaidRenderingModeChange: (mode: MermaidRenderingMode) => void;\n\tonTreeFilterModeChange: (mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\") => void;\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\n\tonEditorPaddingXChange: (padding: number) => void;\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\n\tonQuietStartupChange: (enabled: boolean) => void;\n\tonClearOnShrinkChange: (enabled: boolean) => void;\n\tonShowTerminalProgressChange: (enabled: boolean) => void;\n\tonFullscreenChange: (enabled: boolean) => void;\n\tonWarningsChange: (warnings: WarningSettings) => void;\n\tonCancel: () => void;\n}\n\nclass WarningSettingsSubmenu extends Container {\n\tprivate settingsList: SettingsList;\n\tprivate state: WarningSettings;\n\n\tconstructor(warnings: WarningSettings, onChange: (warnings: WarningSettings) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tthis.state = { ...warnings };\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"anthropic-extra-usage\",\n\t\t\t\tlabel: \"Anthropic extra usage\",\n\t\t\t\tdescription: \"Warn when Anthropic subscription auth may use paid extra usage\",\n\t\t\t\tcurrentValue: (this.state.anthropicExtraUsage ?? true) ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t];\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\tMath.min(items.length, 10),\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"anthropic-extra-usage\":\n\t\t\t\t\t\tthis.state = { ...this.state, anthropicExtraUsage: newValue === \"true\" };\n\t\t\t\t\t\tonChange({ ...this.state });\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel,\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.settingsList.handleInput(data);\n\t}\n}\n\nclass SelectSubmenu extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\toptions: SelectItem[],\n\t\tcurrentValue: string,\n\t\tonSelect: (value: string) => void,\n\t\tonCancel: () => void,\n\t\tonSelectionChange?: (value: string) => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\n\t\tif (description) {\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\t}\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.selectList = new SelectList(\n\t\t\toptions,\n\t\t\tMath.min(options.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = onCancel;\n\n\t\tif (onSelectionChange) {\n\t\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\t\tonSelectionChange(item.value);\n\t\t\t};\n\t\t}\n\n\t\tthis.addChild(this.selectList);\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n\nexport class SettingsSelectorComponent extends Container {\n\tprivate settingsList: SettingsList;\n\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n\t\tsuper();\n\n\t\tlet currentWarnings = { ...config.warnings };\n\t\tlet currentTheme = config.currentTheme;\n\t\tconst themeLabel = (name: string) => (name === \"prime\" ? \"Synerise\" : name);\n\t\tconst idleEvictionValues = [30, 60, 90, 180, 360];\n\t\tif (typeof config.idleEvictionMinutes === \"number\" && !idleEvictionValues.includes(config.idleEvictionMinutes)) {\n\t\t\tidleEvictionValues.push(config.idleEvictionMinutes);\n\t\t\tidleEvictionValues.sort((a, b) => a - b);\n\t\t}\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"autocompact\",\n\t\t\t\tlabel: \"Auto-compact\",\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"idle-eviction-minutes\",\n\t\t\t\tlabel: \"Idle worker eviction\",\n\t\t\t\tdescription: \"Stop fully idle agent trees after this many minutes (global daemon policy)\",\n\t\t\t\tcurrentValue: String(config.idleEvictionMinutes),\n\t\t\t\tvalues: [\"off\", ...idleEvictionValues.map(String)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"steering-mode\",\n\t\t\t\tlabel: \"Steering mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.steeringMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"follow-up-mode\",\n\t\t\t\tlabel: \"Follow-up mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.followUpMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"transport\",\n\t\t\t\tlabel: \"Transport\",\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\n\t\t\t\tcurrentValue: config.transport,\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"websocket-cached\", \"auto\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"hide-thinking\",\n\t\t\t\tlabel: \"Hide thinking\",\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"mermaid-rendering\",\n\t\t\t\tlabel: \"Mermaid diagrams\",\n\t\t\t\tdescription: \"Render Mermaid code blocks as Unicode diagrams\",\n\t\t\t\tcurrentValue: config.mermaidRenderingMode,\n\t\t\t\tvalues: [\"off\", \"final\", \"streaming\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"quiet-startup\",\n\t\t\t\tlabel: \"Quiet startup\",\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"tree-filter-mode\",\n\t\t\t\tlabel: \"Tree filter mode\",\n\t\t\t\tdescription: \"Default filter when opening /tree\",\n\t\t\t\tcurrentValue: config.treeFilterMode,\n\t\t\t\tvalues: [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"warnings\",\n\t\t\t\tlabel: \"Warnings\",\n\t\t\t\tdescription: \"Enable or disable individual warnings\",\n\t\t\t\tcurrentValue: \"configure\",\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew WarningSettingsSubmenu(\n\t\t\t\t\t\tcurrentWarnings,\n\t\t\t\t\t\t(warnings) => {\n\t\t\t\t\t\t\tcurrentWarnings = warnings;\n\t\t\t\t\t\t\tcallbacks.onWarningsChange(warnings);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"thinking\",\n\t\t\t\tlabel: \"Thinking level\",\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\n\t\t\t\tcurrentValue: config.thinkingLevel,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Thinking Level\",\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"theme\",\n\t\t\t\tlabel: \"Theme\",\n\t\t\t\tdescription: \"Color theme for the interface\",\n\t\t\t\tcurrentValue: themeLabel(currentTheme),\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Theme\",\n\t\t\t\t\t\t\"Select color theme\",\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\n\t\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\t\tlabel: themeLabel(t),\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentTheme,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcurrentTheme = value;\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\n\t\t\t\t\t\t\tdone(themeLabel(value));\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// Restore original theme on cancel\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentTheme);\n\t\t\t\t\t\t\tdone();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\t// Preview theme on selection change\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t},\n\t\t];\n\n\t\titems.splice(1, 0, {\n\t\t\tid: \"show-images\",\n\t\t\tlabel: \"Show image metadata\",\n\t\t\tdescription: \"Show image type and dimensions in terminal\",\n\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\n\t\titems.splice(2, 0, {\n\t\t\tid: \"auto-resize-images\",\n\t\t\tlabel: \"Auto-resize images\",\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Block images toggle (always available, insert after auto-resize-images)\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\n\t\titems.splice(autoResizeIndex + 1, 0, {\n\t\t\tid: \"block-images\",\n\t\t\tlabel: \"Block images\",\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Skill commands toggle (insert after block-images)\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\n\t\titems.splice(blockImagesIndex + 1, 0, {\n\t\t\tid: \"skill-commands\",\n\t\t\tlabel: \"Skill commands\",\n\t\t\tdescription: \"Register skills as /skill:name commands\",\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Built-in skills toggle (insert after skill-commands)\n\t\tconst skillCommandsItemIndex = items.findIndex((item) => item.id === \"skill-commands\");\n\t\titems.splice(skillCommandsItemIndex + 1, 0, {\n\t\t\tid: \"builtin-skills\",\n\t\t\tlabel: \"Built-in skills\",\n\t\t\tdescription: \"Load built-in skills shipped with base-context (takes effect after reload)\",\n\t\t\tcurrentValue: config.enableBuiltinSkills ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Hardware cursor toggle (insert after builtin-skills)\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"builtin-skills\");\n\t\titems.splice(skillCommandsIndex + 1, 0, {\n\t\t\tid: \"show-hardware-cursor\",\n\t\t\tlabel: \"Show hardware cursor\",\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\n\t\t\tid: \"editor-padding\",\n\t\t\tlabel: \"Editor padding\",\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\n\t\t\tcurrentValue: String(config.editorPaddingX),\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\n\t\t});\n\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\n\t\titems.splice(editorPaddingIndex + 1, 0, {\n\t\t\tid: \"autocomplete-max-visible\",\n\t\t\tlabel: \"Autocomplete max items\",\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\n\t\t});\n\n\t\t// Clear on shrink toggle (insert after autocomplete-max-visible)\n\t\tconst autocompleteIndex = items.findIndex((item) => item.id === \"autocomplete-max-visible\");\n\t\titems.splice(autocompleteIndex + 1, 0, {\n\t\t\tid: \"clear-on-shrink\",\n\t\t\tlabel: \"Clear on shrink\",\n\t\t\tdescription: \"Clear empty rows when content shrinks (may cause flicker)\",\n\t\t\tcurrentValue: config.clearOnShrink ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Terminal progress toggle (insert after clear-on-shrink)\n\t\tconst clearOnShrinkIndex = items.findIndex((item) => item.id === \"clear-on-shrink\");\n\t\titems.splice(clearOnShrinkIndex + 1, 0, {\n\t\t\tid: \"terminal-progress\",\n\t\t\tlabel: \"Terminal progress\",\n\t\t\tdescription: \"Show OSC 9;4 progress indicators in the terminal tab bar\",\n\t\t\tcurrentValue: config.showTerminalProgress ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Fullscreen toggle (insert after terminal-progress)\n\t\tconst terminalProgressIndex = items.findIndex((item) => item.id === \"terminal-progress\");\n\t\titems.splice(terminalProgressIndex + 1, 0, {\n\t\t\tid: \"fullscreen\",\n\t\t\tlabel: \"Fullscreen rendering\",\n\t\t\tdescription: \"Alternate-screen UI with scrollable transcript and pinned prompt\",\n\t\t\tcurrentValue: config.fullscreen ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\t10,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"autocompact\":\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"idle-eviction-minutes\":\n\t\t\t\t\t\tcallbacks.onIdleEvictionMinutesChange(newValue === \"off\" ? \"off\" : Number(newValue));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-images\":\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-resize-images\":\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"block-images\":\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"skill-commands\":\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"builtin-skills\":\n\t\t\t\t\t\tcallbacks.onEnableBuiltinSkillsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"steering-mode\":\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"follow-up-mode\":\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transport\":\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hide-thinking\":\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"mermaid-rendering\":\n\t\t\t\t\t\tcallbacks.onMermaidRenderingModeChange(newValue as MermaidRenderingMode);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"quiet-startup\":\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tree-filter-mode\":\n\t\t\t\t\t\tcallbacks.onTreeFilterModeChange(\n\t\t\t\t\t\t\tnewValue as \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-hardware-cursor\":\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"editor-padding\":\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"autocomplete-max-visible\":\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"clear-on-shrink\":\n\t\t\t\t\t\tcallbacks.onClearOnShrinkChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"terminal-progress\":\n\t\t\t\t\t\tcallbacks.onShowTerminalProgressChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"fullscreen\":\n\t\t\t\t\t\tcallbacks.onFullscreenChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallbacks.onCancel,\n\t\t\t{ enableSearch: true },\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSettingsList(): SettingsList {\n\t\treturn this.settingsList;\n\t}\n}\n"]}