Crash when using theme with ANSI color indexes (terminal palette numbers) #2928

Closed
opened 2026-02-16 17:37:50 -05:00 by yindo · 4 comments
Owner

Originally created by @graelo on GitHub (Nov 17, 2025).

Originally assigned to: @rekram1-node on GitHub.

Description

Hallo, I believe I found a bug that affects switching to themes using ANSI color indexes in the defs block (like 0-15 numbers, as per the OpenCode docs and theme schema).

I created a custom theme according to the documentation, referencing ANSI indexes inside the defs and using those in the rest of the theme. The theme is accepted by the schema and matches the docs' requirements for terminal support. However, as soon as I switch to this theme in the tui, OpenCode crashes immediately with the following error:

A fatal error occurred!   Reset TUI    Exit


TypeError: undefined is not an object (evaluating 'c3[mode2]')
    at resolveColor (src/cli/cmd/tui/context/theme.tsx:69:25)
    at <anonymous> (src/cli/cmd/tui/context/theme.tsx:72:18)
    at map (native:1:11)
    at resolveTheme (src/cli/cmd/tui/context/theme.tsx:71:57)
    at runComputation (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:742:22)
    at updateComputation (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:724:3)
    at runTop (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:833:7)
    at runQueue (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:904:42)
    at completeUpdates (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:860:84)
    at runUpdates (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:850:5)
    at setStore (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/store/dist/dev.js:221:5)
    at set (src/cli/cmd/tui/context/theme.tsx:128:9)
    at onMove (src/cli/cmd/tui/component/dialog-theme-list.tsx:26:13)
    at moveTo (src/cli/cmd/tui/ui/dialog-select.tsx:64:11)
    at move (src/cli/cmd/tui/ui/dialog-select.tsx:60:5)
    at <anonymous> (src/cli/cmd/tui/ui/dialog-select.tsx:83:62)
    at emit (node:events:95:22)
    at emitWithPriority (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:2353:38)
    at processInput (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:2315:14)
    at <anonymous> (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:13549:13)
    at emit (node:events:95:22)
    at process (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:4617:12)
    at <anonymous> (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:13491:23)
    at emit (node:events:95:22)
    at addChunk (internal:streams/readable:264:47)
    at readableAddChunkPushByteMode (internal:streams/readable:242:18)
    at internalRead (native:38:40)
    at processTicksAndRejections (native:7:39)

undefined is not an object (evaluating 'c3[mode2]')

Switching back to official or other string-based themes works as expected, so it appears related to the use of numeric indexes.

If you require my theme JSON or other technical info, I am happy to provide.

Best!

OpenCode version

1.0.68

Steps to reproduce

  1. Create a theme using numbers (ANSI indexes) as values in the defs section, per the OpenCode docs (https://opencode.ai/docs/themes/#terminal-requirements)
  2. Enable or switch to that theme in the tui (OpenCode terminal interface)
  3. OpenCode instantly crashes (terminal window closes)
  4. Switching back to a theme with only string values in defs, everything works again.

Here's my theme:

{
  "$schema": "https://opencode.ai/theme.json",
  "defs": {
    "base03": 8,
    "base02": 0,
    "base01": 10,
    "base00": 11,
    "base0": 12,
    "base1": 14,
    "base2": 7,
    "base3": 15,
    "yellow": 3,
    "orange": 9,
    "red": 1,
    "magenta": 5,
    "violet": 13,
    "blue": 4,
    "cyan": 6,
    "green": 2
  },
  "theme": {
    "primary": {
      "dark": "blue",
      "light": "blue"
    },
    "secondary": {
      "dark": "violet",
      "light": "violet"
    },
    "accent": {
      "dark": "cyan",
      "light": "cyan"
    },
    "error": {
      "dark": "red",
      "light": "red"
    },
    "warning": {
      "dark": "yellow",
      "light": "yellow"
    },
    "success": {
      "dark": "green",
      "light": "green"
    },
    "info": {
      "dark": "orange",
      "light": "orange"
    },
    "text": {
      "dark": "base0",
      "light": "base00"
    },
    "textMuted": {
      "dark": "base01",
      "light": "base1"
    },
    "background": {
      "dark": "base03",
      "light": "base3"
    },
    "backgroundPanel": {
      "dark": "base02",
      "light": "base2"
    },
    "backgroundElement": {
      "dark": "black",
      "light": "white"
    },
    "border": {
      "dark": "base02",
      "light": "base2"
    },
    "borderActive": {
      "dark": "base01",
      "light": "base1"
    },
    "borderSubtle": {
      "dark": "black",
      "light": "white"
    },
    "diffAdded": {
      "dark": "green",
      "light": "green"
    },
    "diffRemoved": {
      "dark": "red",
      "light": "red"
    },
    "diffContext": {
      "dark": "base01",
      "light": "base1"
    },
    "diffHunkHeader": {
      "dark": "base01",
      "light": "base1"
    },
    "diffHighlightAdded": {
      "dark": "green",
      "light": "green"
    },
    "diffHighlightRemoved": {
      "dark": "red",
      "light": "red"
    },
    "diffAddedBg": {
      "dark": "black",
      "light": "white"
    },
    "diffRemovedBg": {
      "dark": "black",
      "light": "white"
    },
    "diffContextBg": {
      "dark": "base02",
      "light": "base2"
    },
    "diffLineNumber": {
      "dark": "base01",
      "light": "base1"
    },
    "diffAddedLineNumberBg": {
      "dark": "black",
      "light": "white"
    },
    "diffRemovedLineNumberBg": {
      "dark": "black",
      "light": "white"
    },
    "markdownText": {
      "dark": "base0",
      "light": "base00"
    },
    "markdownHeading": {
      "dark": "blue",
      "light": "blue"
    },
    "markdownLink": {
      "dark": "cyan",
      "light": "cyan"
    },
    "markdownLinkText": {
      "dark": "violet",
      "light": "violet"
    },
    "markdownCode": {
      "dark": "green",
      "light": "green"
    },
    "markdownBlockQuote": {
      "dark": "base01",
      "light": "base1"
    },
    "markdownEmph": {
      "dark": "yellow",
      "light": "yellow"
    },
    "markdownStrong": {
      "dark": "orange",
      "light": "orange"
    },
    "markdownHorizontalRule": {
      "dark": "base01",
      "light": "base1"
    },
    "markdownListItem": {
      "dark": "blue",
      "light": "blue"
    },
    "markdownListEnumeration": {
      "dark": "cyan",
      "light": "cyan"
    },
    "markdownImage": {
      "dark": "cyan",
      "light": "cyan"
    },
    "markdownImageText": {
      "dark": "violet",
      "light": "violet"
    },
    "markdownCodeBlock": {
      "dark": "base0",
      "light": "base00"
    },
    "syntaxComment": {
      "dark": "base01",
      "light": "base1"
    },
    "syntaxKeyword": {
      "dark": "green",
      "light": "green"
    },
    "syntaxFunction": {
      "dark": "blue",
      "light": "blue"
    },
    "syntaxVariable": {
      "dark": "cyan",
      "light": "cyan"
    },
    "syntaxString": {
      "dark": "cyan",
      "light": "cyan"
    },
    "syntaxNumber": {
      "dark": "magenta",
      "light": "magenta"
    },
    "syntaxType": {
      "dark": "yellow",
      "light": "yellow"
    },
    "syntaxOperator": {
      "dark": "green",
      "light": "green"
    },
    "syntaxPunctuation": {
      "dark": "base0",
      "light": "base00"
    }
  }
}

Screenshot and/or share link

Image and the error shared above.

Operating System

macOS

Terminal

Alacritty 256-color

Originally created by @graelo on GitHub (Nov 17, 2025). Originally assigned to: @rekram1-node on GitHub. ### Description Hallo, I believe I found a bug that affects switching to themes using ANSI color indexes in the defs block (like 0-15 numbers, as per the OpenCode docs and theme schema). I created a custom theme according to the documentation, referencing ANSI indexes inside the defs and using those in the rest of the theme. The theme is accepted by the schema and matches the docs' requirements for terminal support. However, as soon as I switch to this theme in the tui, OpenCode crashes immediately with the following error: ``` A fatal error occurred! Reset TUI Exit TypeError: undefined is not an object (evaluating 'c3[mode2]') at resolveColor (src/cli/cmd/tui/context/theme.tsx:69:25) at <anonymous> (src/cli/cmd/tui/context/theme.tsx:72:18) at map (native:1:11) at resolveTheme (src/cli/cmd/tui/context/theme.tsx:71:57) at runComputation (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:742:22) at updateComputation (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:724:3) at runTop (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:833:7) at runQueue (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:904:42) at completeUpdates (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:860:84) at runUpdates (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/dist/dev.js:850:5) at setStore (../../node_modules/.bun/solid-js@1.9.9/node_modules/solid-js/store/dist/dev.js:221:5) at set (src/cli/cmd/tui/context/theme.tsx:128:9) at onMove (src/cli/cmd/tui/component/dialog-theme-list.tsx:26:13) at moveTo (src/cli/cmd/tui/ui/dialog-select.tsx:64:11) at move (src/cli/cmd/tui/ui/dialog-select.tsx:60:5) at <anonymous> (src/cli/cmd/tui/ui/dialog-select.tsx:83:62) at emit (node:events:95:22) at emitWithPriority (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:2353:38) at processInput (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:2315:14) at <anonymous> (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:13549:13) at emit (node:events:95:22) at process (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:4617:12) at <anonymous> (../../node_modules/.bun/@opentui+core@0.1.42+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:13491:23) at emit (node:events:95:22) at addChunk (internal:streams/readable:264:47) at readableAddChunkPushByteMode (internal:streams/readable:242:18) at internalRead (native:38:40) at processTicksAndRejections (native:7:39) undefined is not an object (evaluating 'c3[mode2]') ``` Switching back to official or other string-based themes works as expected, so it appears related to the use of numeric indexes. If you require my theme JSON or other technical info, I am happy to provide. Best! ### OpenCode version 1.0.68 ### Steps to reproduce 1. Create a theme using numbers (ANSI indexes) as values in the defs section, per the OpenCode docs (https://opencode.ai/docs/themes/#terminal-requirements) 2. Enable or switch to that theme in the tui (OpenCode terminal interface) 3. OpenCode instantly crashes (terminal window closes) 4. Switching back to a theme with only string values in defs, everything works again. Here's my theme: ```json { "$schema": "https://opencode.ai/theme.json", "defs": { "base03": 8, "base02": 0, "base01": 10, "base00": 11, "base0": 12, "base1": 14, "base2": 7, "base3": 15, "yellow": 3, "orange": 9, "red": 1, "magenta": 5, "violet": 13, "blue": 4, "cyan": 6, "green": 2 }, "theme": { "primary": { "dark": "blue", "light": "blue" }, "secondary": { "dark": "violet", "light": "violet" }, "accent": { "dark": "cyan", "light": "cyan" }, "error": { "dark": "red", "light": "red" }, "warning": { "dark": "yellow", "light": "yellow" }, "success": { "dark": "green", "light": "green" }, "info": { "dark": "orange", "light": "orange" }, "text": { "dark": "base0", "light": "base00" }, "textMuted": { "dark": "base01", "light": "base1" }, "background": { "dark": "base03", "light": "base3" }, "backgroundPanel": { "dark": "base02", "light": "base2" }, "backgroundElement": { "dark": "black", "light": "white" }, "border": { "dark": "base02", "light": "base2" }, "borderActive": { "dark": "base01", "light": "base1" }, "borderSubtle": { "dark": "black", "light": "white" }, "diffAdded": { "dark": "green", "light": "green" }, "diffRemoved": { "dark": "red", "light": "red" }, "diffContext": { "dark": "base01", "light": "base1" }, "diffHunkHeader": { "dark": "base01", "light": "base1" }, "diffHighlightAdded": { "dark": "green", "light": "green" }, "diffHighlightRemoved": { "dark": "red", "light": "red" }, "diffAddedBg": { "dark": "black", "light": "white" }, "diffRemovedBg": { "dark": "black", "light": "white" }, "diffContextBg": { "dark": "base02", "light": "base2" }, "diffLineNumber": { "dark": "base01", "light": "base1" }, "diffAddedLineNumberBg": { "dark": "black", "light": "white" }, "diffRemovedLineNumberBg": { "dark": "black", "light": "white" }, "markdownText": { "dark": "base0", "light": "base00" }, "markdownHeading": { "dark": "blue", "light": "blue" }, "markdownLink": { "dark": "cyan", "light": "cyan" }, "markdownLinkText": { "dark": "violet", "light": "violet" }, "markdownCode": { "dark": "green", "light": "green" }, "markdownBlockQuote": { "dark": "base01", "light": "base1" }, "markdownEmph": { "dark": "yellow", "light": "yellow" }, "markdownStrong": { "dark": "orange", "light": "orange" }, "markdownHorizontalRule": { "dark": "base01", "light": "base1" }, "markdownListItem": { "dark": "blue", "light": "blue" }, "markdownListEnumeration": { "dark": "cyan", "light": "cyan" }, "markdownImage": { "dark": "cyan", "light": "cyan" }, "markdownImageText": { "dark": "violet", "light": "violet" }, "markdownCodeBlock": { "dark": "base0", "light": "base00" }, "syntaxComment": { "dark": "base01", "light": "base1" }, "syntaxKeyword": { "dark": "green", "light": "green" }, "syntaxFunction": { "dark": "blue", "light": "blue" }, "syntaxVariable": { "dark": "cyan", "light": "cyan" }, "syntaxString": { "dark": "cyan", "light": "cyan" }, "syntaxNumber": { "dark": "magenta", "light": "magenta" }, "syntaxType": { "dark": "yellow", "light": "yellow" }, "syntaxOperator": { "dark": "green", "light": "green" }, "syntaxPunctuation": { "dark": "base0", "light": "base00" } } } ``` ### Screenshot and/or share link <img width="481" height="145" alt="Image" src="https://github.com/user-attachments/assets/7a97db5c-00fc-4d5c-a00c-3d248b901b54" /> and the error shared above. ### Operating System macOS ### Terminal Alacritty 256-color
yindo added the help-wantedopentuibuggood first issue labels 2026-02-16 17:37:50 -05:00
yindo closed this issue 2026-02-16 17:37:50 -05:00
Author
Owner

@OpeOginni commented on GitHub (Nov 19, 2025):

Was able to get it working with ANSI color indexes

Image
@OpeOginni commented on GitHub (Nov 19, 2025): Was able to get it working with ANSI color indexes <img width="797" height="628" alt="Image" src="https://github.com/user-attachments/assets/fa3a7a6c-0c42-4221-8638-0ca16a1ac1c9" />
Author
Owner

@OpeOginni commented on GitHub (Nov 19, 2025):

@rekram1-node I am planning to push it in with my other PR related to themes, is this okay or a fresh one would be preferred?

@OpeOginni commented on GitHub (Nov 19, 2025): @rekram1-node I am planning to push it in with my other [PR](https://github.com/sst/opencode/pull/4502) related to themes, is this okay or a fresh one would be preferred?
Author
Owner

@rekram1-node commented on GitHub (Nov 19, 2025):

split up if it is easy for u otherwise dw about it, Ig you could always branch off

That PR looks good to go tho so ill prolly merge it with some others tonight

@rekram1-node commented on GitHub (Nov 19, 2025): split up if it is easy for u otherwise dw about it, Ig you could always branch off That PR looks good to go tho so ill prolly merge it with some others tonight
Author
Owner

@graelo commented on GitHub (Nov 19, 2025):

Lovely, thanks!

@graelo commented on GitHub (Nov 19, 2025): Lovely, thanks!
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: anomalyco/opencode#2928