mixdog 0.9.1 → 0.9.2

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 (214) hide show
  1. package/package.json +8 -1
  2. package/scripts/_bench-cwc.json +20 -0
  3. package/scripts/agent-loop-policy-test.mjs +37 -0
  4. package/scripts/agent-parallel-smoke.mjs +54 -10
  5. package/scripts/background-task-meta-smoke.mjs +1 -1
  6. package/scripts/bench-run.mjs +262 -0
  7. package/scripts/compact-smoke.mjs +12 -0
  8. package/scripts/compact-trigger-migration-smoke.mjs +67 -1
  9. package/scripts/ingest-pure-conversation-smoke.mjs +148 -0
  10. package/scripts/internal-comms-bench.mjs +727 -0
  11. package/scripts/internal-comms-smoke.mjs +75 -0
  12. package/scripts/lead-workflow-smoke.mjs +4 -4
  13. package/scripts/live-worker-smoke.mjs +9 -9
  14. package/scripts/output-style-bench.mjs +285 -0
  15. package/scripts/output-style-smoke.mjs +13 -10
  16. package/scripts/patch-replay.mjs +90 -0
  17. package/scripts/provider-stream-stall-test.mjs +276 -0
  18. package/scripts/provider-toolcall-test.mjs +599 -1
  19. package/scripts/routing-corpus.mjs +281 -0
  20. package/scripts/session-bench.mjs +1526 -0
  21. package/scripts/session-diag.mjs +595 -0
  22. package/scripts/task-bench.mjs +207 -0
  23. package/scripts/tool-failures.mjs +6 -6
  24. package/scripts/tool-smoke.mjs +306 -66
  25. package/scripts/toolcall-args-test.mjs +81 -0
  26. package/src/agents/debugger/AGENT.md +4 -4
  27. package/src/agents/heavy-worker/AGENT.md +4 -2
  28. package/src/agents/reviewer/AGENT.md +4 -4
  29. package/src/agents/worker/AGENT.md +4 -2
  30. package/src/app.mjs +10 -6
  31. package/src/defaults/{hidden-roles.json → agents.json} +7 -7
  32. package/src/examples/schedules/SCHEDULE.example.md +32 -0
  33. package/src/examples/webhooks/WEBHOOK.example.md +40 -0
  34. package/src/headless-role.mjs +14 -14
  35. package/src/help.mjs +1 -0
  36. package/src/lib/rules-builder.cjs +32 -54
  37. package/src/mixdog-session-runtime.mjs +710 -318
  38. package/src/output-styles/default.md +12 -7
  39. package/src/output-styles/minimal.md +25 -0
  40. package/src/output-styles/oneline.md +21 -0
  41. package/src/output-styles/simple.md +10 -9
  42. package/src/repl.mjs +12 -2
  43. package/src/rules/agent/00-common.md +7 -5
  44. package/src/rules/agent/30-explorer.md +7 -8
  45. package/src/rules/lead/01-general.md +3 -1
  46. package/src/rules/lead/lead-tool.md +7 -0
  47. package/src/rules/shared/01-tool.md +17 -12
  48. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +90 -32
  49. package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +32 -0
  50. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +18 -6
  51. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +23 -20
  52. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +48 -14
  53. package/src/runtime/agent/orchestrator/agent-trace.mjs +87 -12
  54. package/src/runtime/agent/orchestrator/config.mjs +3 -0
  55. package/src/runtime/agent/orchestrator/context/collect.mjs +131 -67
  56. package/src/runtime/agent/orchestrator/{internal-roles.mjs → internal-agents.mjs} +72 -72
  57. package/src/runtime/agent/orchestrator/internal-tools.mjs +13 -26
  58. package/src/runtime/agent/orchestrator/mcp/client.mjs +94 -16
  59. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +7 -0
  60. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +188 -0
  61. package/src/runtime/agent/orchestrator/providers/anthropic-leaked-toolcall.mjs +444 -0
  62. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +332 -57
  63. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +59 -32
  64. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +27 -20
  65. package/src/runtime/agent/orchestrator/providers/gemini.mjs +184 -17
  66. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +8 -1
  67. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +18 -8
  68. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +210 -21
  69. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +78 -3
  70. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +202 -98
  71. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +183 -20
  72. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -0
  73. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +11 -5
  74. package/src/runtime/agent/orchestrator/providers/registry.mjs +2 -1
  75. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +15 -9
  76. package/src/runtime/agent/orchestrator/session/compact.mjs +560 -51
  77. package/src/runtime/agent/orchestrator/session/context-utils.mjs +250 -3
  78. package/src/runtime/agent/orchestrator/session/loop.mjs +394 -132
  79. package/src/runtime/agent/orchestrator/session/manager.mjs +217 -170
  80. package/src/runtime/agent/orchestrator/session/store.mjs +4 -4
  81. package/src/runtime/agent/orchestrator/session/tool-envelope.mjs +61 -0
  82. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +5 -0
  83. package/src/runtime/agent/orchestrator/stall-policy.mjs +63 -15
  84. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +194 -24
  85. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +143 -0
  86. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +34 -18
  87. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +0 -0
  88. package/src/runtime/agent/orchestrator/tools/builtin/list-formatting.mjs +10 -0
  89. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +5 -4
  90. package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +15 -0
  91. package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +9 -44
  92. package/src/runtime/agent/orchestrator/tools/builtin/read-constants.mjs +2 -1
  93. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +13 -4
  94. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +10 -17
  95. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +18 -2
  96. package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +3 -2
  97. package/src/runtime/agent/orchestrator/tools/builtin/tool-output-limit.mjs +10 -0
  98. package/src/runtime/agent/orchestrator/tools/builtin.mjs +59 -1
  99. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +5 -5
  100. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4076 -3985
  101. package/src/runtime/agent/orchestrator/tools/patch.mjs +116 -2
  102. package/src/runtime/channels/backends/discord.mjs +99 -9
  103. package/src/runtime/channels/backends/telegram.mjs +501 -0
  104. package/src/runtime/channels/index.mjs +441 -1224
  105. package/src/runtime/channels/lib/config.mjs +54 -2
  106. package/src/runtime/channels/lib/format.mjs +4 -2
  107. package/src/runtime/channels/lib/output-forwarder.mjs +80 -67
  108. package/src/runtime/channels/lib/runtime-paths.mjs +29 -0
  109. package/src/runtime/channels/lib/scheduler.mjs +1 -1
  110. package/src/runtime/channels/lib/telegram-format.mjs +283 -0
  111. package/src/runtime/channels/lib/tool-format.mjs +1 -1
  112. package/src/runtime/channels/lib/transcript-discovery.mjs +19 -1
  113. package/src/runtime/channels/lib/webhook.mjs +59 -31
  114. package/src/runtime/channels/tool-defs.mjs +1 -1
  115. package/src/runtime/memory/index.mjs +184 -19
  116. package/src/runtime/memory/lib/agent-ipc.mjs +2 -2
  117. package/src/runtime/memory/lib/core-memory-store.mjs +1 -1
  118. package/src/runtime/memory/lib/memory-cycle1.mjs +1 -1
  119. package/src/runtime/memory/lib/memory-cycle2.mjs +9 -6
  120. package/src/runtime/memory/lib/memory-cycle3.mjs +1 -1
  121. package/src/runtime/memory/lib/memory.mjs +101 -4
  122. package/src/runtime/memory/lib/pg/adapter.mjs +139 -15
  123. package/src/runtime/memory/lib/session-ingest.mjs +107 -0
  124. package/src/runtime/memory/lib/trace-store.mjs +69 -22
  125. package/src/runtime/memory/tool-defs.mjs +6 -3
  126. package/src/runtime/shared/channel-notification-routing.mjs +12 -0
  127. package/src/runtime/shared/channel-notification-routing.test.mjs +45 -0
  128. package/src/runtime/shared/config.mjs +9 -0
  129. package/src/runtime/shared/llm/http-agent.mjs +12 -5
  130. package/src/runtime/shared/schedules-store.mjs +21 -19
  131. package/src/runtime/shared/tool-surface.mjs +98 -13
  132. package/src/runtime/shared/transcript-writer.mjs +129 -0
  133. package/src/runtime/shared/update-checker.mjs +214 -0
  134. package/src/standalone/agent-tool.mjs +255 -109
  135. package/src/standalone/channel-admin.mjs +133 -40
  136. package/src/standalone/channel-worker.mjs +8 -291
  137. package/src/standalone/explore-tool.mjs +2 -2
  138. package/src/standalone/memory-runtime-proxy.mjs +3 -1
  139. package/src/standalone/provider-admin.mjs +11 -0
  140. package/src/standalone/usage-dashboard.mjs +1 -1
  141. package/src/tui/App.jsx +2096 -732
  142. package/src/tui/components/ConfirmBar.jsx +47 -0
  143. package/src/tui/components/ContextPanel.jsx +5 -3
  144. package/src/tui/components/ItemRightHintOverprint.jsx +54 -0
  145. package/src/tui/components/Markdown.jsx +22 -98
  146. package/src/tui/components/Message.jsx +14 -35
  147. package/src/tui/components/Picker.jsx +87 -12
  148. package/src/tui/components/PromptInput.jsx +83 -7
  149. package/src/tui/components/QueuedCommands.jsx +1 -1
  150. package/src/tui/components/SlashCommandPalette.jsx +8 -5
  151. package/src/tui/components/Spinner.jsx +7 -7
  152. package/src/tui/components/StatusLine.jsx +40 -21
  153. package/src/tui/components/TextEntryPanel.jsx +51 -7
  154. package/src/tui/components/ToolExecution.jsx +170 -98
  155. package/src/tui/components/TurnDone.jsx +4 -4
  156. package/src/tui/components/UsagePanel.jsx +1 -1
  157. package/src/tui/components/tool-output-format.mjs +159 -21
  158. package/src/tui/components/tool-output-format.test.mjs +87 -0
  159. package/src/tui/display-width.mjs +69 -0
  160. package/src/tui/display-width.test.mjs +35 -0
  161. package/src/tui/dist/index.mjs +6965 -2391
  162. package/src/tui/engine.mjs +287 -126
  163. package/src/tui/index.jsx +117 -7
  164. package/src/tui/keyboard-protocol.mjs +42 -0
  165. package/src/tui/lib/voice-recorder.mjs +453 -0
  166. package/src/tui/markdown/format-token.mjs +129 -76
  167. package/src/tui/markdown/format-token.test.mjs +61 -19
  168. package/src/tui/markdown/measure-rendered-rows.mjs +85 -0
  169. package/src/tui/markdown/render-ansi.test.mjs +1 -1
  170. package/src/tui/markdown/streaming-markdown.mjs +167 -0
  171. package/src/tui/markdown/streaming-markdown.test.mjs +70 -0
  172. package/src/tui/markdown/table-layout.mjs +9 -9
  173. package/src/tui/paste-attachments.mjs +0 -11
  174. package/src/tui/prompt-history-store.mjs +129 -0
  175. package/src/tui/prompt-history-store.test.mjs +52 -0
  176. package/src/tui/statusline-ansi-bridge.test.mjs +3 -3
  177. package/src/tui/theme.mjs +41 -657
  178. package/src/tui/themes/base.mjs +86 -0
  179. package/src/tui/themes/basic.mjs +85 -0
  180. package/src/tui/themes/catppuccin.mjs +72 -0
  181. package/src/tui/themes/dracula.mjs +70 -0
  182. package/src/tui/themes/everforest.mjs +71 -0
  183. package/src/tui/themes/gruvbox.mjs +71 -0
  184. package/src/tui/themes/index.mjs +71 -0
  185. package/src/tui/themes/indigo.mjs +78 -0
  186. package/src/tui/themes/kanagawa.mjs +80 -0
  187. package/src/tui/themes/light.mjs +81 -0
  188. package/src/tui/themes/nord.mjs +72 -0
  189. package/src/tui/themes/onedark.mjs +16 -0
  190. package/src/tui/themes/rosepine.mjs +70 -0
  191. package/src/tui/themes/teal.mjs +81 -0
  192. package/src/tui/themes/tokyonight.mjs +79 -0
  193. package/src/tui/themes/utils.mjs +106 -0
  194. package/src/tui/themes/warm.mjs +79 -0
  195. package/src/tui/transcript-tool-failures.mjs +13 -2
  196. package/src/ui/markdown.mjs +1 -1
  197. package/src/ui/model-display.mjs +2 -2
  198. package/src/ui/statusline.mjs +26 -27
  199. package/src/vendor/statusline/bin/statusline-route.mjs +5 -12
  200. package/src/vendor/statusline/src/gateway/claude-current.mjs +3 -3
  201. package/src/vendor/statusline/src/gateway/route-meta.mjs +30 -16
  202. package/src/workflows/default/WORKFLOW.md +39 -12
  203. package/src/workflows/sequential/WORKFLOW.md +46 -0
  204. package/src/workflows/solo/WORKFLOW.md +7 -0
  205. package/vendor/ink/build/display-width.js +62 -0
  206. package/vendor/ink/build/ink.js +100 -12
  207. package/vendor/ink/build/measure-text.js +4 -1
  208. package/vendor/ink/build/output.js +115 -9
  209. package/vendor/ink/build/render-node-to-output.js +4 -1
  210. package/vendor/ink/build/render.js +4 -0
  211. package/src/output-styles/extreme-simple.md +0 -20
  212. package/src/rules/lead/04-workflow.md +0 -51
  213. package/src/workflows/default/workflow.json +0 -13
  214. package/src/workflows/solo/workflow.json +0 -7
@@ -0,0 +1,86 @@
1
+ /**
2
+ * src/tui/themes/base.mjs — One Dark base palette (the full key set).
3
+ *
4
+ * Every TUI theme is defined as a COMPLETE set of `rgb(r,g,b)` string keys.
5
+ * Non-default palettes spread this base first (`{ ...basePalette, ...overrides }`)
6
+ * so a missing key can never leak the previous theme's color through the live
7
+ * `Object.assign(theme, palette)` switch in theme.mjs.
8
+ *
9
+ * Source: One Dark (atom/joshdick) — bg0 #282c34, fg #abb2bf, blue #61afef
10
+ * (signature accent), purple #c678dd, green #98c379, orange #d19a66,
11
+ * yellow #e5c07b, cyan #56b6c2, red #e86671, grey #5c6370.
12
+ */
13
+
14
+ /** One Dark — full key set; signature accent is blue (#61afef). */
15
+ export const basePalette = {
16
+ background: 'transparent', // bg0 #282c34
17
+ claude: 'rgb(97,175,239)', // blue accent
18
+ logo: 'rgb(120,195,255)', // welcome banner — brighter than the accent
19
+ claudeShimmer: 'rgb(140,200,245)', // lighter blue
20
+ mixdogOrange: 'rgb(97,175,239)', // signature accent (blue)
21
+ mixdogAmber: 'rgb(140,200,245)', // lighter accent
22
+ mixdogIvory: 'rgb(171,178,191)', // fg #abb2bf
23
+ spinnerGlyph: 'rgb(97,175,239)',
24
+ spinnerText: 'rgb(97,175,239)',
25
+ spinnerShimmer: 'rgb(140,200,245)',
26
+ thinkingAccent: 'rgb(132,139,152)', // light_grey #848b98
27
+ thinkingText: 'rgb(171,178,191)', // fg
28
+ thinkingBase: 'rgb(92,99,112)', // grey #5c6370
29
+ thinkingGlow: 'rgb(200,206,216)', // brighter fg
30
+ statusText: 'rgb(171,178,191)', // fg
31
+ statusSubtle: 'rgb(132,139,152)', // light_grey
32
+ timerText: 'rgb(132,139,152)', // light_grey
33
+ text: 'rgb(171,178,191)', // fg
34
+ inverseText: 'rgb(40,44,52)', // background
35
+ // Picker/list focus row. This is intentionally stronger than text selection.
36
+ selectionText: 'rgb(230,238,255)', // readable on selectionBackground
37
+ selectionBackground: 'rgb(38,79,120)', // classic dark-mode selection blue
38
+ // Mouse/drag text-selection overlay. Claude Code keeps this role separate:
39
+ // it replaces the cell background while text remains copy-highlight readable.
40
+ selectionHighlightText: 'rgb(255,255,255)',
41
+ selectionHighlightBackground: 'rgb(38,79,120)',
42
+ inactive: 'rgb(132,139,152)', // light_grey
43
+ subtle: 'rgb(132,139,152)', // light_grey
44
+ promptBorder: 'rgb(92,99,112)', // grey
45
+ success: 'rgb(152,195,121)', // green #98c379
46
+ error: 'rgb(224,108,117)', // red #e06c75
47
+ warning: 'rgb(229,192,123)', // yellow #e5c07b
48
+ suggestion: 'rgb(97,175,239)', // blue
49
+ panelTitle: 'rgb(97,175,239)', // blue
50
+ permission: 'rgb(224,108,117)', // red
51
+ code: 'rgb(97,175,239)', // blue
52
+ codeBlock: 'rgb(171,178,191)', // fg
53
+ mdHeading: 'rgb(229,192,123)', // yellow
54
+ mdCode: 'rgb(152,195,121)', // green
55
+ mdCodeBlock: 'rgb(171,178,191)', // fg
56
+ mdQuote: 'rgb(132,139,152)', // light_grey
57
+ mdQuoteBorder: 'rgb(132,139,152)', // light_grey
58
+ mdHr: 'rgb(132,139,152)', // light_grey
59
+ mdListBullet: 'rgb(97,175,239)', // blue accent
60
+ mdCodeBlockBorder: 'rgb(59,63,76)', // bg3 #3b3f4c
61
+ mdCodeBlockBg: 'rgb(49,53,63)', // bg1 #31353f
62
+ mdCodeSpanBg: 'rgb(57,63,74)', // bg2 #393f4a
63
+ mdLink: 'rgb(97,175,239)', // blue
64
+ mdLinkText: 'rgb(86,182,194)', // cyan #56b6c2
65
+ mdStrong: 'rgb(209,154,102)', // orange #d19a66
66
+ mdEmph: 'rgb(229,192,123)', // yellow
67
+ mdDiffAdded: 'rgb(152,195,121)', // green
68
+ mdDiffRemoved: 'rgb(224,108,117)', // red
69
+ mdDiffHunk: 'rgb(92,99,112)', // grey
70
+ mdDiffHeader: 'rgb(198,120,221)', // purple #c678dd
71
+ mdDiffContext: 'rgb(132,139,152)', // light_grey
72
+ mdDiffAddedBg: 'rgb(49,57,43)', // diff_add #31392b
73
+ mdDiffRemovedBg: 'rgb(56,43,44)', // diff_delete #382b2c
74
+ syntaxComment: 'rgb(92,99,112)', // grey
75
+ syntaxKeyword: 'rgb(198,120,221)', // purple
76
+ syntaxFunction: 'rgb(97,175,239)', // blue
77
+ syntaxVariable: 'rgb(224,108,117)', // red
78
+ syntaxString: 'rgb(152,195,121)', // green
79
+ syntaxNumber: 'rgb(209,154,102)', // orange
80
+ syntaxType: 'rgb(229,192,123)', // yellow
81
+ syntaxOperator: 'rgb(86,182,194)', // cyan
82
+ syntaxPunctuation: 'rgb(171,178,191)', // fg
83
+ userMessageBackground: 'rgb(49,53,63)', // bg1
84
+ userMessageBackgroundHover: 'rgb(57,63,74)', // bg2
85
+ fastMode: 'rgb(255,140,60)', // vivid in-theme orange
86
+ };
@@ -0,0 +1,85 @@
1
+ /**
2
+ * src/tui/themes/basic.mjs — Basic (amber-gold default dark).
3
+ *
4
+ * A clean amber / golden-orange accent carries the default theme identity
5
+ * (titles, headings, links, code), with a slightly hotter orange live spinner.
6
+ * Body text stays neutral/cool for readability so the theme does not feel
7
+ * muddy or yellowed. Warm stays more terracotta / cream, while Indigo owns the
8
+ * cool violet-blue family. Spreads `basePalette` first so the full key set is
9
+ * always present.
10
+ */
11
+ import { basePalette } from './base.mjs';
12
+
13
+ /** Basic — amber-gold default dark with a hot orange live state. */
14
+ export const basicPalette = {
15
+ ...basePalette,
16
+ background: 'transparent',
17
+ text: 'rgb(232,234,238)',
18
+ statusText: 'rgb(232,234,238)',
19
+ // Thinking + spinner run a hotter orange than the golden UI accent.
20
+ thinkingText: 'rgb(238,184,122)',
21
+ thinkingGlow: 'rgb(255,214,158)',
22
+ mixdogIvory: 'rgb(232,234,238)',
23
+ inactive: 'rgb(142,144,150)',
24
+ subtle: 'rgb(124,126,132)',
25
+ thinkingAccent: 'rgb(242,136,48)',
26
+ thinkingBase: 'rgb(242,136,48)',
27
+ statusSubtle: 'rgb(154,156,162)',
28
+ timerText: 'rgb(154,156,162)',
29
+ promptBorder: 'rgb(112,112,118)',
30
+ // Accent: bright orange across titles, headings, links and code.
31
+ claude: 'rgb(255,150,58)',
32
+ logo: 'rgb(238,150,64)', // welcome banner — slightly deeper than the accent
33
+ mixdogOrange: 'rgb(255,150,58)',
34
+ panelTitle: 'rgb(255,150,58)',
35
+ mdHeading: 'rgb(255,150,58)',
36
+ claudeShimmer: 'rgb(255,210,118)',
37
+ mixdogAmber: 'rgb(255,210,118)',
38
+ suggestion: 'rgb(255,196,92)',
39
+ code: 'rgb(246,184,78)',
40
+ mdLink: 'rgb(255,196,92)',
41
+ mdListBullet: 'rgb(184,140,74)', // muted amber structural marker
42
+ mdCode: 'rgb(246,184,78)',
43
+ mdLinkText: 'rgb(255,218,138)',
44
+ // Spinner glyph/text/shimmer run a warm orange (a touch hotter than the gold
45
+ // accent, but no longer strongly red) so they harmonize with the thinking tone.
46
+ spinnerGlyph: 'rgb(244,120,58)',
47
+ spinnerText: 'rgb(244,120,58)',
48
+ spinnerShimmer: 'rgb(255,164,110)',
49
+ codeBlock: 'rgb(224,226,230)',
50
+ mdCodeBlock: 'rgb(224,226,230)',
51
+ success: 'rgb(140,190,118)',
52
+ error: 'rgb(224,92,96)',
53
+ warning: 'rgb(236,170,90)',
54
+ permission: 'rgb(224,92,96)',
55
+ mdStrong: 'rgb(255,196,92)',
56
+ mdEmph: 'rgb(255,218,138)',
57
+ inverseText: 'rgb(24,18,18)',
58
+ selectionText: 'rgb(255,238,208)',
59
+ selectionBackground: 'rgb(96,58,28)',
60
+ mdCodeBlockBg: 'rgb(27,27,30)',
61
+ mdCodeSpanBg: 'rgb(38,37,38)',
62
+ mdCodeBlockBorder: 'rgb(50,49,50)',
63
+ userMessageBackground: 'rgb(36,35,36)',
64
+ userMessageBackgroundHover: 'rgb(48,46,46)',
65
+ mdQuote: 'rgb(124,126,132)',
66
+ mdQuoteBorder: 'rgb(124,126,132)',
67
+ mdHr: 'rgb(124,126,132)',
68
+ syntaxComment: 'rgb(124,126,132)',
69
+ mdDiffContext: 'rgb(124,126,132)',
70
+ mdDiffAdded: 'rgb(140,190,118)',
71
+ mdDiffRemoved: 'rgb(224,92,96)',
72
+ mdDiffHunk: 'rgb(255,196,92)',
73
+ mdDiffHeader: 'rgb(255,210,118)',
74
+ mdDiffAddedBg: 'rgb(28,42,28)',
75
+ mdDiffRemovedBg: 'rgb(52,28,30)',
76
+ syntaxKeyword: 'rgb(232,156,48)',
77
+ syntaxFunction: 'rgb(255,196,92)',
78
+ syntaxString: 'rgb(170,194,128)',
79
+ syntaxNumber: 'rgb(236,170,90)',
80
+ syntaxType: 'rgb(255,218,138)',
81
+ syntaxVariable: 'rgb(232,234,238)',
82
+ syntaxOperator: 'rgb(255,196,92)',
83
+ syntaxPunctuation: 'rgb(224,226,230)',
84
+ fastMode: 'rgb(255,140,40)',
85
+ };
@@ -0,0 +1,72 @@
1
+ import { basePalette } from './base.mjs';
2
+
3
+ /** Catppuccin Mocha — https://github.com/catppuccin/catppuccin */
4
+ export const catppuccinPalette = {
5
+ ...basePalette,
6
+ background: 'transparent',
7
+ claude: 'rgb(137,180,250)',
8
+ logo: 'rgb(170,202,255)', // welcome banner — brighter than accent
9
+ claudeShimmer: 'rgb(180,190,254)',
10
+ mixdogOrange: 'rgb(137,180,250)',
11
+ mixdogAmber: 'rgb(180,190,254)',
12
+ mixdogIvory: 'rgb(205,214,244)',
13
+ spinnerGlyph: 'rgb(250,179,135)', // most-emphasized: peach
14
+ spinnerText: 'rgb(250,179,135)',
15
+ spinnerShimmer: 'rgb(252,200,170)',
16
+ thinkingAccent: 'rgb(108,112,134)',
17
+ thinkingText: 'rgb(205,214,244)',
18
+ thinkingBase: 'rgb(147,153,178)',
19
+ thinkingGlow: 'rgb(215,222,250)',
20
+ statusText: 'rgb(205,214,244)',
21
+ statusSubtle: 'rgb(147,153,178)',
22
+ timerText: 'rgb(147,153,178)',
23
+ text: 'rgb(205,214,244)',
24
+ inverseText: 'rgb(30,30,46)',
25
+ selectionText: 'rgb(226,232,255)',
26
+ selectionBackground: 'rgb(69,71,120)',
27
+ inactive: 'rgb(147,153,178)',
28
+ subtle: 'rgb(127,132,156)',
29
+ promptBorder: 'rgb(127,132,156)',
30
+ success: 'rgb(166,227,161)',
31
+ error: 'rgb(243,139,168)',
32
+ warning: 'rgb(249,226,175)',
33
+ suggestion: 'rgb(137,180,250)',
34
+ panelTitle: 'rgb(137,180,250)',
35
+ permission: 'rgb(243,139,168)',
36
+ code: 'rgb(137,180,250)',
37
+ codeBlock: 'rgb(205,214,244)',
38
+ mdHeading: 'rgb(203,166,247)',
39
+ mdCode: 'rgb(166,227,161)',
40
+ mdCodeBlock: 'rgb(205,214,244)',
41
+ mdQuote: 'rgb(147,153,178)',
42
+ mdQuoteBorder: 'rgb(147,153,178)',
43
+ mdHr: 'rgb(147,153,178)',
44
+ mdListBullet: 'rgb(137,180,250)',
45
+ mdCodeBlockBorder: 'rgb(69,71,90)',
46
+ mdCodeBlockBg: 'rgb(49,50,68)',
47
+ mdCodeSpanBg: 'rgb(69,71,90)',
48
+ mdLink: 'rgb(137,180,250)',
49
+ mdLinkText: 'rgb(137,220,235)',
50
+ mdStrong: 'rgb(250,179,135)',
51
+ mdEmph: 'rgb(249,226,175)',
52
+ mdDiffAdded: 'rgb(166,227,161)',
53
+ mdDiffRemoved: 'rgb(243,139,168)',
54
+ mdDiffHunk: 'rgb(250,179,135)',
55
+ mdDiffHeader: 'rgb(203,166,247)',
56
+ mdDiffContext: 'rgb(147,153,178)',
57
+ mdDiffAddedBg: 'rgb(36,49,43)',
58
+ mdDiffRemovedBg: 'rgb(60,42,50)',
59
+ syntaxComment: 'rgb(147,153,178)',
60
+ syntaxKeyword: 'rgb(203,166,247)',
61
+ syntaxFunction: 'rgb(137,180,250)',
62
+ syntaxVariable: 'rgb(243,139,168)',
63
+ syntaxString: 'rgb(166,227,161)',
64
+ syntaxNumber: 'rgb(250,179,135)',
65
+ syntaxType: 'rgb(249,226,175)',
66
+ syntaxOperator: 'rgb(137,220,235)',
67
+ syntaxPunctuation: 'rgb(205,214,244)',
68
+ userMessageBackground: 'rgb(49,50,68)',
69
+ userMessageBackgroundHover: 'rgb(69,71,90)',
70
+ fastMode: 'rgb(250,179,135)',
71
+ };
72
+
@@ -0,0 +1,70 @@
1
+ import { basePalette } from './base.mjs';
2
+ /** Dracula — https://draculatheme.com/contribute */
3
+ export const draculaPalette = {
4
+ ...basePalette,
5
+ background: 'transparent',
6
+ text: 'rgb(248,248,242)',
7
+ inverseText: 'rgb(40,42,54)',
8
+ selectionText: 'rgb(248,248,242)',
9
+ selectionBackground: 'rgb(68,71,120)',
10
+ claude: 'rgb(189,147,249)',
11
+ logo: 'rgb(214,180,255)', // welcome banner — brighter than accent
12
+ claudeShimmer: 'rgb(212,182,251)',
13
+ mixdogOrange: 'rgb(189,147,249)',
14
+ mixdogAmber: 'rgb(212,182,251)',
15
+ mixdogIvory: 'rgb(248,248,242)',
16
+ spinnerGlyph: 'rgb(255,121,198)', // most-emphasized: pink
17
+ spinnerText: 'rgb(255,121,198)',
18
+ spinnerShimmer: 'rgb(255,160,215)',
19
+ thinkingAccent: 'rgb(98,114,164)',
20
+ thinkingText: 'rgb(248,248,242)',
21
+ thinkingBase: 'rgb(98,114,164)',
22
+ thinkingGlow: 'rgb(220,220,235)',
23
+ statusText: 'rgb(248,248,242)',
24
+ statusSubtle: 'rgb(98,114,164)',
25
+ timerText: 'rgb(98,114,164)',
26
+ inactive: 'rgb(98,114,164)',
27
+ subtle: 'rgb(98,114,164)',
28
+ promptBorder: 'rgb(98,114,164)',
29
+ success: 'rgb(80,250,123)',
30
+ error: 'rgb(255,85,85)',
31
+ warning: 'rgb(241,250,140)',
32
+ suggestion: 'rgb(139,233,253)',
33
+ panelTitle: 'rgb(189,147,249)',
34
+ permission: 'rgb(255,85,85)',
35
+ code: 'rgb(139,233,253)',
36
+ codeBlock: 'rgb(248,248,242)',
37
+ mdHeading: 'rgb(189,147,249)',
38
+ mdCode: 'rgb(80,250,123)',
39
+ mdCodeBlock: 'rgb(248,248,242)',
40
+ mdQuote: 'rgb(145,154,195)',
41
+ mdQuoteBorder: 'rgb(145,154,195)',
42
+ mdHr: 'rgb(98,114,164)',
43
+ mdListBullet: 'rgb(189,147,249)',
44
+ mdCodeBlockBorder: 'rgb(68,71,90)',
45
+ mdCodeBlockBg: 'rgb(45,47,61)',
46
+ mdCodeSpanBg: 'rgb(52,55,70)',
47
+ mdLink: 'rgb(139,233,253)',
48
+ mdLinkText: 'rgb(255,121,198)',
49
+ mdStrong: 'rgb(255,184,108)',
50
+ mdEmph: 'rgb(241,250,140)',
51
+ mdDiffAdded: 'rgb(80,250,123)',
52
+ mdDiffRemoved: 'rgb(255,85,85)',
53
+ mdDiffHunk: 'rgb(98,114,164)',
54
+ mdDiffHeader: 'rgb(255,121,198)',
55
+ mdDiffContext: 'rgb(98,114,164)',
56
+ mdDiffAddedBg: 'rgb(26,58,26)',
57
+ mdDiffRemovedBg: 'rgb(58,26,26)',
58
+ syntaxComment: 'rgb(125,135,175)',
59
+ syntaxKeyword: 'rgb(255,121,198)',
60
+ syntaxFunction: 'rgb(80,250,123)',
61
+ syntaxVariable: 'rgb(248,248,242)',
62
+ syntaxString: 'rgb(241,250,140)',
63
+ syntaxNumber: 'rgb(189,147,249)',
64
+ syntaxType: 'rgb(139,233,253)',
65
+ syntaxOperator: 'rgb(255,121,198)',
66
+ syntaxPunctuation: 'rgb(248,248,242)',
67
+ userMessageBackground: 'rgb(68,71,90)',
68
+ userMessageBackgroundHover: 'rgb(86,89,114)',
69
+ fastMode: 'rgb(255,184,108)',
70
+ };
@@ -0,0 +1,71 @@
1
+ import { basePalette } from './base.mjs';
2
+
3
+ /** Everforest dark medium (sainnhe/everforest) */
4
+ export const everforestPalette = {
5
+ ...basePalette,
6
+ background: 'transparent',
7
+ text: 'rgb(211,198,170)',
8
+ inverseText: 'rgb(45,53,59)',
9
+ selectionText: 'rgb(230,220,195)',
10
+ selectionBackground: 'rgb(72,88,76)',
11
+ inactive: 'rgb(133,146,137)',
12
+ subtle: 'rgb(133,146,137)',
13
+ promptBorder: 'rgb(133,146,137)',
14
+ statusText: 'rgb(211,198,170)',
15
+ statusSubtle: 'rgb(133,146,137)',
16
+ timerText: 'rgb(133,146,137)',
17
+ thinkingText: 'rgb(211,198,170)',
18
+ thinkingBase: 'rgb(133,146,137)',
19
+ thinkingAccent: 'rgb(133,146,137)',
20
+ thinkingGlow: 'rgb(230,220,195)',
21
+ claude: 'rgb(214,153,182)',
22
+ logo: 'rgb(232,180,205)', // welcome banner — brighter than accent
23
+ claudeShimmer: 'rgb(131,192,146)',
24
+ mixdogOrange: 'rgb(214,153,182)',
25
+ mixdogAmber: 'rgb(131,192,146)',
26
+ mixdogIvory: 'rgb(211,198,170)',
27
+ spinnerGlyph: 'rgb(230,152,117)', // most-emphasized: earthy orange (fits muted green)
28
+ spinnerText: 'rgb(230,152,117)',
29
+ spinnerShimmer: 'rgb(243,180,150)',
30
+ panelTitle: 'rgb(214,153,182)',
31
+ success: 'rgb(167,192,128)',
32
+ error: 'rgb(230,126,128)',
33
+ warning: 'rgb(230,152,117)',
34
+ permission: 'rgb(230,126,128)',
35
+ suggestion: 'rgb(127,187,179)',
36
+ code: 'rgb(127,187,179)',
37
+ codeBlock: 'rgb(211,198,170)',
38
+ userMessageBackground: 'rgb(52,63,68)',
39
+ userMessageBackgroundHover: 'rgb(61,72,77)',
40
+ fastMode: 'rgb(230,152,117)',
41
+ mdHeading: 'rgb(214,153,182)',
42
+ mdCode: 'rgb(167,192,128)',
43
+ mdCodeBlock: 'rgb(211,198,170)',
44
+ mdQuote: 'rgb(219,188,127)',
45
+ mdQuoteBorder: 'rgb(133,146,137)',
46
+ mdHr: 'rgb(133,146,137)',
47
+ mdListBullet: 'rgb(167,192,128)',
48
+ mdCodeBlockBorder: 'rgb(61,72,77)',
49
+ mdCodeBlockBg: 'rgb(52,63,68)',
50
+ mdCodeSpanBg: 'rgb(61,72,77)',
51
+ mdLink: 'rgb(167,192,128)',
52
+ mdLinkText: 'rgb(131,192,146)',
53
+ mdStrong: 'rgb(230,152,117)',
54
+ mdEmph: 'rgb(219,188,127)',
55
+ mdDiffAdded: 'rgb(167,192,128)',
56
+ mdDiffRemoved: 'rgb(230,126,128)',
57
+ mdDiffHunk: 'rgb(127,187,179)',
58
+ mdDiffHeader: 'rgb(214,153,182)',
59
+ mdDiffContext: 'rgb(133,146,137)',
60
+ mdDiffAddedBg: 'rgb(32,48,59)',
61
+ mdDiffRemovedBg: 'rgb(55,34,44)',
62
+ syntaxComment: 'rgb(133,146,137)',
63
+ syntaxKeyword: 'rgb(214,153,182)',
64
+ syntaxFunction: 'rgb(167,192,128)',
65
+ syntaxVariable: 'rgb(230,126,128)',
66
+ syntaxString: 'rgb(167,192,128)',
67
+ syntaxNumber: 'rgb(230,152,117)',
68
+ syntaxType: 'rgb(219,188,127)',
69
+ syntaxOperator: 'rgb(131,192,146)',
70
+ syntaxPunctuation: 'rgb(211,198,170)',
71
+ };
@@ -0,0 +1,71 @@
1
+ import { basePalette } from './base.mjs';
2
+
3
+ /** Gruvbox dark medium (morhetz/gruvbox) */
4
+ export const gruvboxPalette = {
5
+ ...basePalette,
6
+ background: 'transparent',
7
+ text: 'rgb(235,219,178)',
8
+ inverseText: 'rgb(40,40,40)',
9
+ selectionText: 'rgb(251,241,199)',
10
+ selectionBackground: 'rgb(92,70,42)',
11
+ inactive: 'rgb(146,131,116)',
12
+ subtle: 'rgb(146,131,116)',
13
+ promptBorder: 'rgb(146,131,116)',
14
+ statusText: 'rgb(235,219,178)',
15
+ statusSubtle: 'rgb(146,131,116)',
16
+ timerText: 'rgb(146,131,116)',
17
+ thinkingText: 'rgb(235,219,178)',
18
+ thinkingBase: 'rgb(146,131,116)',
19
+ thinkingAccent: 'rgb(146,131,116)',
20
+ thinkingGlow: 'rgb(251,241,199)',
21
+ claude: 'rgb(142,192,124)',
22
+ logo: 'rgb(176,216,152)', // welcome banner — brighter than accent
23
+ claudeShimmer: 'rgb(184,187,38)',
24
+ mixdogOrange: 'rgb(142,192,124)',
25
+ mixdogAmber: 'rgb(184,187,38)',
26
+ mixdogIvory: 'rgb(235,219,178)',
27
+ spinnerGlyph: 'rgb(214,93,14)', // most-emphasized: gruvbox neutral orange (retro-fit)
28
+ spinnerText: 'rgb(214,93,14)',
29
+ spinnerShimmer: 'rgb(244,135,50)',
30
+ panelTitle: 'rgb(142,192,124)',
31
+ success: 'rgb(184,187,38)',
32
+ error: 'rgb(251,73,52)',
33
+ warning: 'rgb(254,128,25)',
34
+ permission: 'rgb(251,73,52)',
35
+ suggestion: 'rgb(131,165,152)',
36
+ code: 'rgb(131,165,152)',
37
+ codeBlock: 'rgb(235,219,178)',
38
+ userMessageBackground: 'rgb(60,56,54)',
39
+ userMessageBackgroundHover: 'rgb(80,73,69)',
40
+ fastMode: 'rgb(254,128,25)',
41
+ mdHeading: 'rgb(131,165,152)',
42
+ mdCode: 'rgb(250,189,47)',
43
+ mdCodeBlock: 'rgb(235,219,178)',
44
+ mdQuote: 'rgb(146,131,116)',
45
+ mdQuoteBorder: 'rgb(146,131,116)',
46
+ mdHr: 'rgb(146,131,116)',
47
+ mdListBullet: 'rgb(131,165,152)',
48
+ mdCodeBlockBorder: 'rgb(80,73,69)',
49
+ mdCodeBlockBg: 'rgb(60,56,54)',
50
+ mdCodeSpanBg: 'rgb(80,73,69)',
51
+ mdLink: 'rgb(142,192,124)',
52
+ mdLinkText: 'rgb(184,187,38)',
53
+ mdStrong: 'rgb(254,128,25)',
54
+ mdEmph: 'rgb(211,134,155)',
55
+ mdDiffAdded: 'rgb(152,151,26)',
56
+ mdDiffRemoved: 'rgb(204,36,29)',
57
+ mdDiffHunk: 'rgb(131,165,152)',
58
+ mdDiffHeader: 'rgb(211,134,155)',
59
+ mdDiffContext: 'rgb(146,131,116)',
60
+ mdDiffAddedBg: 'rgb(50,48,47)',
61
+ mdDiffRemovedBg: 'rgb(50,41,41)',
62
+ syntaxComment: 'rgb(146,131,116)',
63
+ syntaxKeyword: 'rgb(251,73,52)',
64
+ syntaxFunction: 'rgb(184,187,38)',
65
+ syntaxVariable: 'rgb(131,165,152)',
66
+ syntaxString: 'rgb(250,189,47)',
67
+ syntaxNumber: 'rgb(211,134,155)',
68
+ syntaxType: 'rgb(142,192,124)',
69
+ syntaxOperator: 'rgb(254,128,25)',
70
+ syntaxPunctuation: 'rgb(235,219,178)',
71
+ };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * src/tui/themes/index.mjs — theme registry, order, and default id.
3
+ *
4
+ * Each theme lives in its own module and exports a COMPLETE palette built on
5
+ * `basePalette` (One Dark). This index wires them into the registry consumed by
6
+ * theme.mjs. The runtime singleton (`theme`) is seeded from the softened
7
+ * `basicPalette` export below.
8
+ */
9
+ import { basePalette } from './base.mjs';
10
+ import { basicPalette as rawBasicPalette } from './basic.mjs';
11
+ import { indigoPalette as rawIndigoPalette } from './indigo.mjs';
12
+ import { warmPalette as rawWarmPalette } from './warm.mjs';
13
+ import { lightPalette as rawLightPalette } from './light.mjs';
14
+ import { tealPalette as rawTealPalette } from './teal.mjs';
15
+ import { onedarkPalette as rawOnedarkPalette } from './onedark.mjs';
16
+ import { tokyonightPalette as rawTokyonightPalette } from './tokyonight.mjs';
17
+ import { kanagawaPalette as rawKanagawaPalette } from './kanagawa.mjs';
18
+ import { catppuccinPalette as rawCatppuccinPalette } from './catppuccin.mjs';
19
+ import { draculaPalette as rawDraculaPalette } from './dracula.mjs';
20
+ import { rosepinePalette as rawRosepinePalette } from './rosepine.mjs';
21
+ import { nordPalette as rawNordPalette } from './nord.mjs';
22
+ import { gruvboxPalette as rawGruvboxPalette } from './gruvbox.mjs';
23
+ import { everforestPalette as rawEverforestPalette } from './everforest.mjs';
24
+ import { softenTypographyColors } from './utils.mjs';
25
+
26
+ /** Default theme id (Basic — amber-gold default dark). */
27
+ export const DEFAULT_THEME_ID = 'basic';
28
+
29
+ /** Backward-compatible ids accepted from older persisted configs. */
30
+ export const THEME_ALIASES = {
31
+ basicIndigo: 'indigo',
32
+ };
33
+
34
+ export const basicPalette = softenTypographyColors(rawBasicPalette);
35
+ const indigoPalette = softenTypographyColors(rawIndigoPalette);
36
+ const warmPalette = softenTypographyColors(rawWarmPalette);
37
+ // Light is terminal high-contrast; skip soften so syntax/accents stay saturated.
38
+ const lightPalette = rawLightPalette;
39
+ const tealPalette = softenTypographyColors(rawTealPalette);
40
+ const onedarkPalette = softenTypographyColors(rawOnedarkPalette);
41
+ const tokyonightPalette = softenTypographyColors(rawTokyonightPalette);
42
+ const kanagawaPalette = softenTypographyColors(rawKanagawaPalette);
43
+ const catppuccinPalette = softenTypographyColors(rawCatppuccinPalette);
44
+ const draculaPalette = softenTypographyColors(rawDraculaPalette);
45
+ const rosepinePalette = softenTypographyColors(rawRosepinePalette);
46
+ const nordPalette = softenTypographyColors(rawNordPalette);
47
+ const gruvboxPalette = softenTypographyColors(rawGruvboxPalette);
48
+ const everforestPalette = softenTypographyColors(rawEverforestPalette);
49
+
50
+ /** Theme registry: id -> { id, label, description, palette }. */
51
+ export const THEME_REGISTRY = {
52
+ basic: { id: 'basic', label: 'Basic', description: 'Amber-gold default dark with a hot orange live state.', palette: basicPalette },
53
+ indigo: { id: 'indigo', label: 'Indigo', description: 'Cool blue-indigo brand dark with orange live state.', palette: indigoPalette },
54
+ warm: { id: 'warm', label: 'Warm', description: 'Soft sunset coral on neutral charcoal.', palette: warmPalette },
55
+ teal: { id: 'teal', label: 'Teal', description: 'pi-style teal accent with soft body text.', palette: tealPalette },
56
+ onedark: { id: 'onedark', label: 'One Dark', description: 'Atom One Dark — blue accent on slate, balanced syntax.', palette: onedarkPalette },
57
+ tokyonight: { id: 'tokyonight', label: 'Tokyo Night', description: 'Storm variant — soft blue/purple dark with neon markdown.', palette: tokyonightPalette },
58
+ kanagawa: { id: 'kanagawa', label: 'Kanagawa', description: 'Wave variant — muted ink dark with crystal-blue accent.', palette: kanagawaPalette },
59
+ catppuccin: { id: 'catppuccin', label: 'Catppuccin', description: 'Mocha — gentle pastel violet/blue dark.', palette: catppuccinPalette },
60
+ dracula: { id: 'dracula', label: 'Dracula', description: 'Classic purple/pink accents with cyan links.', palette: draculaPalette },
61
+ rosepine: { id: 'rosepine', label: 'Rosé Pine', description: 'Muted rose/pine dark with soho elegance.', palette: rosepinePalette },
62
+ nord: { id: 'nord', label: 'Nord', description: 'Cool arctic blue/teal frost dark.', palette: nordPalette },
63
+ gruvbox: { id: 'gruvbox', label: 'Gruvbox', description: 'Retro warm earthy dark with green/orange accents.', palette: gruvboxPalette },
64
+ everforest: { id: 'everforest', label: 'Everforest', description: 'Soft natural green dark, easy on the eyes.', palette: everforestPalette },
65
+ light: { id: 'light', label: 'Light', description: 'GitHub Light high-contrast — solid blue selection, terminal-ready chrome.', palette: lightPalette },
66
+ };
67
+
68
+ /** Display order for the theme picker. */
69
+ export const THEME_ORDER = ['basic', 'indigo', 'warm', 'teal', 'onedark', 'tokyonight', 'kanagawa', 'catppuccin', 'dracula', 'rosepine', 'nord', 'gruvbox', 'everforest', 'light'];
70
+
71
+ export { basePalette };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * src/tui/themes/indigo.mjs — Indigo (cool blue-indigo brand dark).
3
+ *
4
+ * Mixdog brand theme: saturated blue-indigo primary (#5B7CFF family) with
5
+ * cyan secondary on lifted blue-black surfaces — not violet/purple. Spreads
6
+ * `basePalette` first so the full key set is always present.
7
+ */
8
+ import { basePalette } from './base.mjs';
9
+
10
+ /** Indigo — true blue-indigo brand dark. */
11
+ export const indigoPalette = {
12
+ ...basePalette,
13
+ background: 'transparent',
14
+ text: 'rgb(226,228,242)',
15
+ statusText: 'rgb(226,228,242)',
16
+ thinkingText: 'rgb(188,194,222)',
17
+ thinkingGlow: 'rgb(210,220,255)',
18
+ mixdogIvory: 'rgb(226,228,242)',
19
+ inactive: 'rgb(132,140,172)',
20
+ subtle: 'rgb(108,118,152)',
21
+ thinkingAccent: 'rgb(100,124,190)',
22
+ thinkingBase: 'rgb(72,88,140)',
23
+ statusSubtle: 'rgb(132,140,172)',
24
+ timerText: 'rgb(132,140,172)',
25
+ promptBorder: 'rgb(72,82,124)',
26
+ claude: 'rgb(91,124,255)',
27
+ logo: 'rgb(110,168,255)',
28
+ mixdogOrange: 'rgb(91,124,255)',
29
+ spinnerGlyph: 'rgb(255,126,26)',
30
+ spinnerText: 'rgb(255,126,26)',
31
+ panelTitle: 'rgb(91,124,255)',
32
+ mdHeading: 'rgb(110,168,255)',
33
+ claudeShimmer: 'rgb(130,160,255)',
34
+ spinnerShimmer: 'rgb(255,165,90)',
35
+ mixdogAmber: 'rgb(130,160,255)',
36
+ suggestion: 'rgb(150,175,255)',
37
+ code: 'rgb(110,168,255)',
38
+ mdLink: 'rgb(150,175,255)',
39
+ mdListBullet: 'rgb(91,124,255)',
40
+ mdCode: 'rgb(110,168,255)',
41
+ mdLinkText: 'rgb(100,200,230)',
42
+ codeBlock: 'rgb(214,218,232)',
43
+ mdCodeBlock: 'rgb(214,218,232)',
44
+ success: 'rgb(86,180,110)',
45
+ error: 'rgb(225,95,95)',
46
+ warning: 'rgb(231,172,78)',
47
+ permission: 'rgb(225,95,95)',
48
+ mdStrong: 'rgb(130,160,255)',
49
+ mdEmph: 'rgb(100,200,230)',
50
+ inverseText: 'rgb(16,18,28)',
51
+ selectionText: 'rgb(232,236,255)',
52
+ selectionBackground: 'rgb(48,62,120)',
53
+ mdCodeBlockBg: 'rgb(22,24,40)',
54
+ mdCodeSpanBg: 'rgb(32,34,54)',
55
+ mdCodeBlockBorder: 'rgb(48,54,88)',
56
+ userMessageBackground: 'rgb(28,30,48)',
57
+ userMessageBackgroundHover: 'rgb(40,44,68)',
58
+ mdQuote: 'rgb(108,118,152)',
59
+ mdQuoteBorder: 'rgb(108,118,152)',
60
+ mdHr: 'rgb(108,118,152)',
61
+ syntaxComment: 'rgb(108,118,152)',
62
+ mdDiffContext: 'rgb(108,118,152)',
63
+ mdDiffAdded: 'rgb(86,180,110)',
64
+ mdDiffRemoved: 'rgb(225,95,95)',
65
+ mdDiffHunk: 'rgb(91,124,255)',
66
+ mdDiffHeader: 'rgb(130,160,255)',
67
+ mdDiffAddedBg: 'rgb(24,46,38)',
68
+ mdDiffRemovedBg: 'rgb(48,28,38)',
69
+ syntaxKeyword: 'rgb(150,175,255)',
70
+ syntaxFunction: 'rgb(100,200,230)',
71
+ syntaxString: 'rgb(150,190,120)',
72
+ syntaxNumber: 'rgb(255,176,92)',
73
+ syntaxType: 'rgb(100,200,230)',
74
+ syntaxVariable: 'rgb(226,228,242)',
75
+ syntaxOperator: 'rgb(150,175,255)',
76
+ syntaxPunctuation: 'rgb(214,218,232)',
77
+ fastMode: 'rgb(255,126,26)',
78
+ };