@rosetears/aili-pi 0.1.7 → 0.1.9

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.
@@ -213,7 +213,8 @@ export const FOOTER_FORMAT_ALIASES: Record<string, string> = {
213
213
  separator: "sep",
214
214
  };
215
215
 
216
- export const configPath = join(getAgentDir(), "rem-cyberdeck-zentui.json");
216
+ export const configPath = join(getAgentDir(), "rose-cyberdeck-zentui.json");
217
+ export const legacyConfigPath = join(getAgentDir(), "rem-cyberdeck-zentui.json");
217
218
 
218
219
  export const defaultConfig: PolishedTuiConfig = {
219
220
  projectRefreshIntervalMs: 60_000,
@@ -234,27 +235,27 @@ export const defaultConfig: PolishedTuiConfig = {
234
235
  cwd: "bold #88B8FF",
235
236
  gitBranch: "bold #BCA7FF",
236
237
  gitStatus: "bold #D6F4FF",
237
- contextNormal: "#8CE6C2",
238
- contextWarning: "bold #F3CE83",
239
- contextError: "bold #FF93B1",
238
+ contextNormal: "#7DE4FF",
239
+ contextWarning: "bold #BCA7FF",
240
+ contextError: "bold #C75B7A",
240
241
  tokens: "#9DA9C8",
241
- cost: "bold #8CE6C2",
242
+ cost: "bold #7DE4FF",
242
243
  separator: "#64708F",
243
244
  runtimePrefix: "#7DE4FF",
244
245
  extensionStatus: "#BCA7FF",
245
- sessionDuration: "#F3CE83",
246
+ sessionDuration: "#BCA7FF",
246
247
  packageVersion: "#D6F4FF",
247
- gitCommit: "#8CE6C2",
248
- gitMetricsAdded: "#8CE6C2",
249
- gitMetricsDeleted: "#FF93B1",
250
- username: "#F3CE83",
251
- time: "#F3CE83",
252
- os: "#F7EEF8",
248
+ gitCommit: "#7DE4FF",
249
+ gitMetricsAdded: "#7DE4FF",
250
+ gitMetricsDeleted: "#C75B7A",
251
+ username: "#BCA7FF",
252
+ time: "#BCA7FF",
253
+ os: "#D6F4FF",
253
254
  editorAccent: "bold #88B8FF",
254
255
  editorPrompt: "bold #88B8FF",
255
- editorBorder: "sakura-macaron-gradient",
256
+ editorBorder: "rose-cyberdeck-gradient",
256
257
  editorModel: "bold #88B8FF",
257
- editorProvider: "#B8BEDD",
258
+ editorProvider: "#D6F4FF",
258
259
  editorThinking: "#BCA7FF",
259
260
  editorThinkingMinimal: "#64708F",
260
261
  editorThinkingLow: "#7DE4FF",
@@ -263,7 +264,7 @@ export const defaultConfig: PolishedTuiConfig = {
263
264
  editorThinkingXhigh: "bold #BCA7FF",
264
265
  },
265
266
  colorSources: {
266
- starship: "terminal",
267
+ starship: "theme",
267
268
  editor: "terminal",
268
269
  userMessages: "theme",
269
270
  },
@@ -405,7 +406,8 @@ function stringValue(record: Record<string, unknown>, key: string): string | und
405
406
 
406
407
  function colorValue(record: Record<string, unknown>, key: string): string | undefined {
407
408
  const value = stringValue(record, key);
408
- if (key === "editorBorder" && value === "sakura-macaron-gradient") return value;
409
+ if (key === "editorBorder" && value === "rose-cyberdeck-gradient") return value;
410
+ if (key === "editorBorder" && value === "sakura-macaron-gradient") return "rose-cyberdeck-gradient";
409
411
  return value !== undefined && isSupportedColorSpec(value) ? value : undefined;
410
412
  }
411
413
 
@@ -821,10 +823,10 @@ export function getExtensionStatusColorMode(
821
823
  return config.extensionStatuses.colorModes[key] ?? DEFAULT_EXTENSION_STATUS_COLOR_MODE;
822
824
  }
823
825
 
824
- export function loadConfig(): PolishedTuiConfig {
826
+ export function loadConfig(path = configPath, legacyPath = legacyConfigPath): PolishedTuiConfig {
825
827
  try {
826
- if (!existsSync(configPath)) return mergeConfig({});
827
- return mergeConfig(JSON.parse(readFileSync(configPath, "utf8")));
828
+ const selected = existsSync(path) ? path : existsSync(legacyPath) ? legacyPath : undefined;
829
+ return selected ? mergeConfig(JSON.parse(readFileSync(selected, "utf8"))) : mergeConfig({});
828
830
  } catch {
829
831
  return mergeConfig({});
830
832
  }
@@ -288,6 +288,20 @@ export function buildContextLabel(ctx: ExtensionContext): string {
288
288
  return formatContextPercentLabel(usage?.percent, contextWindow);
289
289
  }
290
290
 
291
+ /**
292
+ * Normalize inherited Starship runtime hints into Rose-owned semantic colors.
293
+ * The source strings remain detection metadata; package rendering never emits
294
+ * their traffic-light or indexed terminal colors.
295
+ */
296
+ export function roseRuntimeStyle(style: string): ColorSpec {
297
+ const normalized = style.toLowerCase();
298
+ if (/(?:red|202|208|orange)/.test(normalized)) return "rose";
299
+ if (/(?:yellow|purple|105|147)/.test(normalized)) return "violet";
300
+ if (/(?:white|149)/.test(normalized)) return "ice";
301
+ if (/(?:green|cyan|blue|0093a7)/.test(normalized)) return "cyan";
302
+ return "blue";
303
+ }
304
+
291
305
  export function formatRuntimeSegment(
292
306
  theme: Pick<Theme, "fg">,
293
307
  runtime: RuntimeInfo | undefined,
@@ -298,7 +312,7 @@ export function formatRuntimeSegment(
298
312
  if (!runtime) return "";
299
313
  const symbol = resolveRuntimeSymbol(runtime.name, runtime.symbol, mode);
300
314
  const label = runtime.version ? `${symbol} ${runtime.version}` : symbol;
301
- return `${renderStyleForSource(theme, colorSource, prefixStyle, "via")} ${renderStyleForSource(theme, colorSource, runtime.style, label)}`;
315
+ return `${renderStyleForSource(theme, colorSource, prefixStyle, "via")} ${renderStyleForSource(theme, colorSource, roseRuntimeStyle(runtime.style), label)}`;
302
316
  }
303
317
 
304
318
  /**
@@ -2,13 +2,18 @@ import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
2
2
 
3
3
  export type RGB = readonly [number, number, number];
4
4
 
5
- export const SAKURA_MACARON_GRADIENT = "sakura-macaron-gradient";
6
- export const SAKURA_MACARON_STOPS: readonly RGB[] = [
7
- [242, 167, 198], // sakura pink #F2A7C6
8
- [252, 201, 185], // sakura-iro #FCC9B9
9
- [239, 195, 230], // petal #EFC3E6
10
- [199, 184, 245], // lavender #C7B8F5
11
- [159, 211, 242], // sky macaron #9FD3F2
5
+ export const ROSE_GRADIENT = "rose-cyberdeck-gradient";
6
+ export const ROSE_GRADIENT_STOPS: readonly RGB[] = [
7
+ [199, 91, 122], // brand Rose #C75B7A
8
+ [232, 167, 184], // soft Rose #E8A7B8
9
+ [188, 167, 255], // violet #BCA7FF
10
+ [136, 184, 255], // blue #88B8FF
11
+ [125, 228, 255], // cyan #7DE4FF
12
+ [214, 244, 255], // ice #D6F4FF
13
+ ];
14
+ /** Completed tool frames use a cool, restrained completion gradient. */
15
+ export const ROSE_TOOL_COMPLETE_STOPS: readonly RGB[] = [
16
+ [136, 184, 255], [125, 228, 255], [214, 244, 255],
12
17
  ];
13
18
 
14
19
  const RESET = "\x1b[0m";
@@ -16,55 +21,49 @@ const GRADIENT_CACHE_LIMIT = 128;
16
21
  const gradientCache = new Map<string, string>();
17
22
 
18
23
  function mix(from: RGB, to: RGB, amount: number): RGB {
19
- const t = Math.max(0, Math.min(1, amount));
20
- return [
21
- Math.round(from[0] + (to[0] - from[0]) * t),
22
- Math.round(from[1] + (to[1] - from[1]) * t),
23
- Math.round(from[2] + (to[2] - from[2]) * t),
24
- ];
24
+ const t = Math.max(0, Math.min(1, amount));
25
+ return [
26
+ Math.round(from[0] + (to[0] - from[0]) * t),
27
+ Math.round(from[1] + (to[1] - from[1]) * t),
28
+ Math.round(from[2] + (to[2] - from[2]) * t),
29
+ ];
25
30
  }
26
31
 
27
- function sampleGradient(position: number): RGB {
28
- const stops = SAKURA_MACARON_STOPS;
29
- const normalized = Math.max(0, Math.min(1, position));
30
- const scaled = normalized * (stops.length - 1);
31
- const index = Math.min(stops.length - 2, Math.floor(scaled));
32
- const from = stops[index] ?? SAKURA_MACARON_STOPS[0] ?? [242, 167, 198];
33
- const to = stops[index + 1] ?? from;
34
- return mix(from, to, scaled - index);
32
+ function foreground(color: RGB, text: string): string {
33
+ return `\x1b[38;2;${color[0]};${color[1]};${color[2]}m${text}`;
35
34
  }
36
35
 
37
- function foreground(color: RGB, text: string): string {
38
- return `\x1b[38;2;${color[0]};${color[1]};${color[2]}m${text}`;
36
+ /** Render the stable Rose-to-ice gradient for Zentui chrome and markers. */
37
+ function renderGradient(text: string, stops: readonly RGB[]): string {
38
+ const cacheKey = `${stops.flat().join(",")}:${text}`;
39
+ const cached = gradientCache.get(cacheKey);
40
+ if (cached !== undefined) return cached;
41
+ const chars = [...text];
42
+ if (chars.length === 0) return text;
43
+ const span = Math.max(1, chars.length - 1);
44
+ const rendered = `${chars.map((char, index) => {
45
+ const position = Math.max(0, Math.min(1, index / span));
46
+ const scaled = position * (stops.length - 1);
47
+ const stop = Math.min(stops.length - 2, Math.floor(scaled));
48
+ return foreground(mix(stops[stop] ?? stops[0]!, stops[stop + 1] ?? stops[stop] ?? stops[0]!, scaled - stop), char);
49
+ }).join("")}${RESET}`;
50
+ if (gradientCache.size >= GRADIENT_CACHE_LIMIT) gradientCache.delete(gradientCache.keys().next().value ?? "");
51
+ gradientCache.set(cacheKey, rendered);
52
+ return rendered;
53
+ }
54
+
55
+ export function renderRoseGradient(text: string): string {
56
+ return renderGradient(text, ROSE_GRADIENT_STOPS);
39
57
  }
40
58
 
41
- /** Render the stable Sakura → sky gradient used by the editor and sent prompts. */
42
- export function renderSakuraGradient(text: string): string {
43
- const cached = gradientCache.get(text);
44
- if (cached !== undefined) return cached;
45
- const chars = [...text];
46
- if (chars.length === 0) return text;
47
- const span = Math.max(1, chars.length - 1);
48
- const rendered = `${chars.map((char, index) => foreground(sampleGradient(index / span), char)).join("")}${RESET}`;
49
- if (gradientCache.size >= GRADIENT_CACHE_LIMIT) {
50
- gradientCache.delete(gradientCache.keys().next().value ?? "");
51
- }
52
- gradientCache.set(text, rendered);
53
- return rendered;
59
+ export function renderRoseToolCompleteGradient(text: string): string {
60
+ return renderGradient(text, ROSE_TOOL_COMPLETE_STOPS);
54
61
  }
55
62
 
56
63
  /** Add symmetric colored side rails while preserving the terminal width contract. */
57
- export function renderBoxedLine(
58
- line: string,
59
- width: number,
60
- leftRail: string,
61
- rightRail: string,
62
- ): string {
63
- if (width <= 0) return "";
64
- const leftWidth = visibleWidth(leftRail);
65
- const rightWidth = visibleWidth(rightRail);
66
- const innerWidth = Math.max(0, width - leftWidth - rightWidth);
67
- const content = truncateToWidth(line, innerWidth, "");
68
- const padding = " ".repeat(Math.max(0, innerWidth - visibleWidth(content)));
69
- return truncateToWidth(`${leftRail}${content}${padding}${rightRail}`, width, "");
64
+ export function renderBoxedLine(line: string, width: number, leftRail: string, rightRail: string): string {
65
+ if (width <= 0) return "";
66
+ const innerWidth = Math.max(0, width - visibleWidth(leftRail) - visibleWidth(rightRail));
67
+ const content = truncateToWidth(line, innerWidth, "");
68
+ return truncateToWidth(`${leftRail}${content}${" ".repeat(Math.max(0, innerWidth - visibleWidth(content)))}${rightRail}`, width, "");
70
69
  }
@@ -1,6 +1,6 @@
1
1
  import { AssistantMessageComponent, type Theme } from "@earendil-works/pi-coding-agent";
2
2
  import { type Component, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
3
- import { renderSakuraGradient } from "./gradient.js";
3
+ import { renderRoseGradient } from "./gradient.js";
4
4
  import { installPrototypePatch } from "./prototype-patch-registry.js";
5
5
 
6
6
  type Cleanup = () => void;
@@ -121,14 +121,14 @@ class ThinkingTrailComponent implements Component {
121
121
  const theme = this.getTheme();
122
122
  if (!theme) return rawLines;
123
123
  const count = theme.fg("muted", ` · ${stepCount} ${stepCount === 1 ? "STEP" : "STEPS"}`);
124
- const title = `${renderSakuraGradient("✦ REASONING")}${count}`;
124
+ const title = `${renderRoseGradient("✦ REASONING")}${count}`;
125
125
  let currentStep = 0;
126
126
  const body = rows.map(({ line, step }) => {
127
127
  if (step) currentStep += 1;
128
128
  const isLastStep = currentStep === stepCount;
129
129
  const branchText = step ? (isLastStep ? "╰─ " : "├─ ") : isLastStep ? " " : "│ ";
130
130
  const branch = theme.fg("thinkingXhigh", branchText);
131
- const marker = step ? renderSakuraGradient("◇ ") : " ";
131
+ const marker = step ? renderRoseGradient("◇ ") : " ";
132
132
  return truncateToWidth(`${branch}${marker}${line}`, width, "");
133
133
  });
134
134
 
@@ -1,6 +1,6 @@
1
1
  import { type Theme, ToolExecutionComponent } from "@earendil-works/pi-coding-agent";
2
2
  import { visibleWidth } from "@earendil-works/pi-tui";
3
- import { renderBoxedLine, renderSakuraGradient } from "./gradient.js";
3
+ import { renderBoxedLine, renderRoseGradient, renderRoseToolCompleteGradient } from "./gradient.js";
4
4
  import { installPrototypePatch } from "./prototype-patch-registry.js";
5
5
 
6
6
  const SETTLED_CACHE_MAX_LINES = 80;
@@ -141,17 +141,20 @@ export function installToolExecutionStyle(getTheme: () => Theme | undefined): Cl
141
141
  if (blank !== undefined) prefix.push(blank);
142
142
  }
143
143
  const label = fitBorderLabel(statusLabel(runtime), width);
144
- const top = renderSakuraGradient(label);
144
+ const completeGradient = !pending && !runtime.result?.isError
145
+ ? renderRoseToolCompleteGradient
146
+ : renderRoseGradient;
147
+ const top = completeGradient(label);
145
148
  // Keep only the status rail slightly heavier. State is expressed in the
146
- // native macaron palette rather than traffic-light red/green: lavender
147
- // while running, sky blue when complete, and Sakura pink when failed.
149
+ // Rose palette rather than traffic-light red/green: violet while running,
150
+ // ice blue when complete, and Rose when failed.
148
151
  const leftRail = pending
149
152
  ? theme.fg("thinkingXhigh", "┃ ")
150
153
  : runtime.result?.isError
151
154
  ? theme.fg("accent", "┃ ")
152
155
  : theme.fg("syntaxFunction", "┃ ");
153
- const rightRail = renderSakuraGradient(" │");
154
- const bottom = renderSakuraGradient(bottomBorder(width));
156
+ const rightRail = completeGradient(" │");
157
+ const bottom = completeGradient(bottomBorder(width));
155
158
 
156
159
  const boxed = [
157
160
  ...prefix,
@@ -10,7 +10,7 @@ import {
10
10
  } from "@earendil-works/pi-tui";
11
11
  import type { PolishedTuiConfig } from "./config.js";
12
12
  import { formatTimeLabel } from "./format.js";
13
- import { renderSakuraGradient, SAKURA_MACARON_GRADIENT } from "./gradient.js";
13
+ import { renderRoseGradient, ROSE_GRADIENT } from "./gradient.js";
14
14
  import {
15
15
  EDITOR_ACCENT_FALLBACK,
16
16
  EDITOR_BORDER_FALLBACK,
@@ -83,8 +83,8 @@ export function renderEditorFrameBorder(
83
83
  uiTheme: Theme,
84
84
  colorSource: PolishedTuiConfig["colorSources"]["editor"],
85
85
  ): string {
86
- if (config.colors.editorBorder === SAKURA_MACARON_GRADIENT) {
87
- return renderSakuraGradient(text);
86
+ if (config.colors.editorBorder === ROSE_GRADIENT) {
87
+ return renderRoseGradient(text);
88
88
  }
89
89
  return renderStyleForSourceOrFallback(
90
90
  uiTheme,
@@ -113,7 +113,7 @@
113
113
  "status": "adapted",
114
114
  "sourceFiles": ["extensions/header/index.ts", "extensions/matrix/index.ts", "extensions/zentui/**"],
115
115
  "symbols": ["header", "matrix animation", "Zentui footer", "fixed editor compositor"],
116
- "localChanges": ["registered as three additional Pi Package Extensions", "header avatar loads the supplied Rem asset", "Zentui shell palette uses Rem while Matrix and the reasoning trail retain the upstream Sakura palette", "overflowing Matrix tracks are sampled deterministically across the complete terminal width while retaining the 96-track budget and ordinary-width behavior", "relative import specifiers and session lifecycle event are adapted for this package's NodeNext TypeScript contract"],
116
+ "localChanges": ["registered as three additional Pi Package Extensions", "Rose header loads a package-owned renamed artwork asset without changing upstream identity", "Rose Shimmer, Rose Code Rain, and Zentui use the Rose-owned palette and gradient", "overflowing Matrix tracks remain deterministic across the complete terminal width with the 96-track budget, while each rain row receives a structural blank-row repair", "relative import specifiers and session lifecycle event are adapted for this package's NodeNext TypeScript contract"],
117
117
  "verification": ["tests/unit/matrix.test.ts", "tests/unit/zentui-gradient.test.ts", "npm run typecheck", "npm test", "npm pack --dry-run --json"]
118
118
  }
119
119
  ]
@@ -3,7 +3,7 @@
3
3
  "dataLicense": "CC0-1.0",
4
4
  "SPDXID": "SPDXRef-DOCUMENT",
5
5
  "name": "@rosetears/aili-pi-0.0.0-development",
6
- "documentNamespace": "https://github.com/Rosetears520/aili-pi/sbom/a9e5a3e4d1076b3179dd8cca5ef89f9f",
6
+ "documentNamespace": "https://github.com/Rosetears520/aili-pi/sbom/01e1201c78bfb1b604ad872b36621ba1",
7
7
  "creationInfo": {
8
8
  "creators": [
9
9
  "Tool: @rosetears/aili-pi scripts/generate-provenance.ts"
@@ -126,7 +126,7 @@
126
126
  "licenseDeclared": "MIT",
127
127
  "checksums": [],
128
128
  "primaryPackagePurpose": "SOURCE",
129
- "comment": "revision=165a1f8011a12a58a6409b56b8a6c0416cd9b589; files=extensions/header/index.ts, extensions/matrix/index.ts, extensions/zentui/**; symbols=header, matrix animation, Zentui footer, fixed editor compositor; local changes=registered as three additional Pi Package Extensions | header avatar loads the supplied Rem asset | Zentui shell palette uses Rem while Matrix and the reasoning trail retain the upstream Sakura palette | overflowing Matrix tracks are sampled deterministically across the complete terminal width while retaining the 96-track budget and ordinary-width behavior | relative import specifiers and session lifecycle event are adapted for this package's NodeNext TypeScript contract"
129
+ "comment": "revision=165a1f8011a12a58a6409b56b8a6c0416cd9b589; files=extensions/header/index.ts, extensions/matrix/index.ts, extensions/zentui/**; symbols=header, matrix animation, Zentui footer, fixed editor compositor; local changes=registered as three additional Pi Package Extensions | Rose header loads a package-owned renamed artwork asset without changing upstream identity | Rose Shimmer, Rose Code Rain, and Zentui use the Rose-owned palette and gradient | overflowing Matrix tracks remain deterministic across the complete terminal width with the 96-track budget, while each rain row receives a structural blank-row repair | relative import specifiers and session lifecycle event are adapted for this package's NodeNext TypeScript contract"
130
130
  },
131
131
  {
132
132
  "SPDXID": "SPDXRef-node-modules-agent-base-e28bede7a2",
@@ -2,6 +2,6 @@ This package includes a modified copy of pi-zentui by Luka.
2
2
  Original project: https://github.com/lmilojevicc/pi-zentui
3
3
  License: MIT. Full license text: licenses/pi-zentui-MIT.txt
4
4
 
5
- Modifications include the Rem shell palette, retained Sakura Matrix/reasoning
6
- palette, responsive bounded Matrix track selection, package-specific defaults,
7
- and package-specific configuration path.
5
+ Modifications include Rose Cyberdeck branding, Rose Shimmer and Rose Code Rain,
6
+ Rose Zentui gradients, responsive bounded Matrix track selection, package-specific
7
+ defaults, and package-specific configuration paths.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rosetears/aili-pi",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "AILI and ROSE distribution for official Pi",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -50,7 +50,7 @@
50
50
  "./prompts/local-review.md"
51
51
  ],
52
52
  "themes": [
53
- "./themes/rem-cyberdeck.json"
53
+ "./themes/rose-cyberdeck.json"
54
54
  ]
55
55
  },
56
56
  "engines": {
@@ -0,0 +1,26 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+
3
+ const LEGACY_THEME = "rem-cyberdeck";
4
+ const ROSE_THEME = "rose-cyberdeck";
5
+
6
+ /** Return non-mutating exact-token guidance for a legacy Pi theme setting. */
7
+ export function legacyRoseThemeGuidance(theme: unknown): string | undefined {
8
+ if (typeof theme !== "string") return undefined;
9
+ const parts = theme.split("/");
10
+ if (!parts.some((part) => part === LEGACY_THEME)) return undefined;
11
+ const replacement = parts.map((part) => part === LEGACY_THEME ? ROSE_THEME : part).join("/");
12
+ return `Rose Cyberdeck renamed ${LEGACY_THEME} to ${ROSE_THEME}. Use /settings or edit settings.json: \"theme\": \"${replacement}\".`;
13
+ }
14
+
15
+ /** Read-only startup compatibility detector; malformed settings are intentionally silent. */
16
+ export function legacyRoseThemeGuidanceFromSettings(path: string): string | undefined {
17
+ try {
18
+ if (!existsSync(path)) return undefined;
19
+ const parsed: unknown = JSON.parse(readFileSync(path, "utf8"));
20
+ return parsed !== null && typeof parsed === "object" && "theme" in parsed
21
+ ? legacyRoseThemeGuidance((parsed as { theme?: unknown }).theme)
22
+ : undefined;
23
+ } catch {
24
+ return undefined;
25
+ }
26
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
- "name": "rem-cyberdeck",
3
+ "name": "rose-cyberdeck",
4
4
  "vars": {
5
5
  "void": "#10121D",
6
6
  "panel": "#191D2E",
@@ -8,25 +8,24 @@
8
8
  "text": "#E8EEFF",
9
9
  "muted": "#9DA9C8",
10
10
  "dim": "#64708F",
11
- "rem": "#88B8FF",
11
+ "blue": "#88B8FF",
12
12
  "cyan": "#7DE4FF",
13
13
  "violet": "#BCA7FF",
14
14
  "ice": "#D6F4FF",
15
- "mint": "#8CE6C2",
16
- "gold": "#F3CE83",
17
- "coral": "#FF93B1",
15
+ "rose": "#C75B7A",
16
+ "roseSoft": "#E8A7B8",
18
17
  "border": "#4C5B86",
19
18
  "borderMuted": "#303A5B"
20
19
  },
21
20
  "colors": {
22
- "accent": "rem", "border": "border", "borderAccent": "cyan", "borderMuted": "borderMuted",
23
- "success": "mint", "error": "coral", "warning": "gold", "muted": "muted", "dim": "dim", "text": "text", "thinkingText": "ice",
21
+ "accent": "rose", "border": "border", "borderAccent": "cyan", "borderMuted": "borderMuted",
22
+ "success": "cyan", "error": "rose", "warning": "violet", "muted": "muted", "dim": "dim", "text": "text", "thinkingText": "ice",
24
23
  "selectedBg": "raised", "userMessageBg": "", "userMessageText": "text", "customMessageBg": "", "customMessageText": "text", "customMessageLabel": "violet",
25
24
  "toolPendingBg": "", "toolSuccessBg": "", "toolErrorBg": "", "toolTitle": "cyan", "toolOutput": "ice",
26
- "mdHeading": "rem", "mdLink": "cyan", "mdLinkUrl": "muted", "mdCode": "gold", "mdCodeBlock": "text", "mdCodeBlockBorder": "borderMuted", "mdQuote": "ice", "mdQuoteBorder": "violet", "mdHr": "borderMuted", "mdListBullet": "rem",
27
- "toolDiffAdded": "mint", "toolDiffRemoved": "coral", "toolDiffContext": "muted",
28
- "syntaxComment": "muted", "syntaxKeyword": "violet", "syntaxFunction": "cyan", "syntaxVariable": "rem", "syntaxString": "mint", "syntaxNumber": "gold", "syntaxType": "ice", "syntaxOperator": "violet", "syntaxPunctuation": "text",
29
- "thinkingOff": "dim", "thinkingMinimal": "muted", "thinkingLow": "cyan", "thinkingMedium": "violet", "thinkingHigh": "rem", "thinkingXhigh": "coral", "thinkingMax": "coral", "bashMode": "mint"
25
+ "mdHeading": "rose", "mdLink": "cyan", "mdLinkUrl": "muted", "mdCode": "ice", "mdCodeBlock": "text", "mdCodeBlockBorder": "borderMuted", "mdQuote": "ice", "mdQuoteBorder": "violet", "mdHr": "borderMuted", "mdListBullet": "rose",
26
+ "toolDiffAdded": "cyan", "toolDiffRemoved": "rose", "toolDiffContext": "muted",
27
+ "syntaxComment": "muted", "syntaxKeyword": "violet", "syntaxFunction": "cyan", "syntaxVariable": "blue", "syntaxString": "roseSoft", "syntaxNumber": "violet", "syntaxType": "ice", "syntaxOperator": "violet", "syntaxPunctuation": "text",
28
+ "thinkingOff": "dim", "thinkingMinimal": "muted", "thinkingLow": "cyan", "thinkingMedium": "violet", "thinkingHigh": "blue", "thinkingXhigh": "rose", "thinkingMax": "rose", "bashMode": "violet"
30
29
  },
31
30
  "export": { "pageBg": "#10121D", "cardBg": "#191D2E", "infoBg": "#242A42" }
32
31
  }
File without changes