Skip to content

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

Closed

Description

@graelo

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/[email protected]/node_modules/solid-js/dist/dev.js:742:22)
    at updateComputation (../../node_modules/.bun/[email protected]/node_modules/solid-js/dist/dev.js:724:3)
    at runTop (../../node_modules/.bun/[email protected]/node_modules/solid-js/dist/dev.js:833:7)
    at runQueue (../../node_modules/.bun/[email protected]/node_modules/solid-js/dist/dev.js:904:42)
    at completeUpdates (../../node_modules/.bun/[email protected]/node_modules/solid-js/dist/dev.js:860:84)
    at runUpdates (../../node_modules/.bun/[email protected]/node_modules/solid-js/dist/dev.js:850:5)
    at setStore (../../node_modules/.bun/[email protected]/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/@[email protected]+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:2353:38)
    at processInput (../../node_modules/.bun/@[email protected]+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:2315:14)
    at <anonymous> (../../node_modules/.bun/@[email protected]+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:13549:13)
    at emit (node:events:95:22)
    at process (../../node_modules/.bun/@[email protected]+81ecd8642a1892ca/node_modules/@opentui/core/index-y49e47t2.js:4617:12)
    at <anonymous> (../../node_modules/.bun/@[email protected]+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

Activity

  1. added
    opentuiThis relates to changes in v1.0, now that opencode uses opentui
    on Nov 17, 2025
  2. self-assigned this
    on Nov 18, 2025
  3. OpeOginni commented on Nov 19, 2025

    @OpeOginni
    Contributor

    Was able to get it working with ANSI color indexes

    Image
  4. OpeOginni commented on Nov 19, 2025

    @OpeOginni
    Contributor

    @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?

  5. rekram1-node commented on Nov 19, 2025

    @rekram1-node
    Collaborator

    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

  6. graelo commented on Nov 19, 2025

    @graelo
    Author

    Lovely, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinggood first issueGood for newcomershelp-wantedopentuiThis relates to changes in v1.0, now that opencode uses opentui

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions