@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.
- package/README.md +7 -3
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/extensions/header/index.ts +26 -16
- package/extensions/matrix/index.ts +408 -195
- package/extensions/zentui/config.ts +21 -19
- package/extensions/zentui/format.ts +15 -1
- package/extensions/zentui/gradient.ts +48 -49
- package/extensions/zentui/thinking-message.ts +3 -3
- package/extensions/zentui/tool-execution.ts +9 -6
- package/extensions/zentui/ui.ts +3 -3
- package/manifests/provenance.json +1 -1
- package/manifests/sbom.json +2 -2
- package/notices/pi-sakura-cyberdeck-NOTICE.txt +3 -3
- package/package.json +2 -2
- package/src/runtime/rose-theme.ts +26 -0
- package/themes/{rem-cyberdeck.json → rose-cyberdeck.json} +10 -11
- /package/src/runtime/{rem-head.txt → rose-head.txt} +0 -0
|
@@ -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(), "
|
|
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: "#
|
|
238
|
-
contextWarning: "bold #
|
|
239
|
-
contextError: "bold #
|
|
238
|
+
contextNormal: "#7DE4FF",
|
|
239
|
+
contextWarning: "bold #BCA7FF",
|
|
240
|
+
contextError: "bold #C75B7A",
|
|
240
241
|
tokens: "#9DA9C8",
|
|
241
|
-
cost: "bold #
|
|
242
|
+
cost: "bold #7DE4FF",
|
|
242
243
|
separator: "#64708F",
|
|
243
244
|
runtimePrefix: "#7DE4FF",
|
|
244
245
|
extensionStatus: "#BCA7FF",
|
|
245
|
-
sessionDuration: "#
|
|
246
|
+
sessionDuration: "#BCA7FF",
|
|
246
247
|
packageVersion: "#D6F4FF",
|
|
247
|
-
gitCommit: "#
|
|
248
|
-
gitMetricsAdded: "#
|
|
249
|
-
gitMetricsDeleted: "#
|
|
250
|
-
username: "#
|
|
251
|
-
time: "#
|
|
252
|
-
os: "#
|
|
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: "
|
|
256
|
+
editorBorder: "rose-cyberdeck-gradient",
|
|
256
257
|
editorModel: "bold #88B8FF",
|
|
257
|
-
editorProvider: "#
|
|
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: "
|
|
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 === "
|
|
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
|
-
|
|
827
|
-
return mergeConfig(JSON.parse(readFileSync(
|
|
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
|
|
6
|
-
export const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
28
|
-
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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 {
|
|
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 = `${
|
|
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 ?
|
|
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,
|
|
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
|
|
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
|
-
//
|
|
147
|
-
//
|
|
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 =
|
|
154
|
-
const bottom =
|
|
156
|
+
const rightRail = completeGradient(" │");
|
|
157
|
+
const bottom = completeGradient(bottomBorder(width));
|
|
155
158
|
|
|
156
159
|
const boxed = [
|
|
157
160
|
...prefix,
|
package/extensions/zentui/ui.ts
CHANGED
|
@@ -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 {
|
|
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 ===
|
|
87
|
-
return
|
|
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
|
|
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
|
]
|
package/manifests/sbom.json
CHANGED
|
@@ -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/
|
|
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
|
|
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
|
|
6
|
-
|
|
7
|
-
and package-specific configuration
|
|
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.
|
|
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/
|
|
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": "
|
|
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
|
-
"
|
|
11
|
+
"blue": "#88B8FF",
|
|
12
12
|
"cyan": "#7DE4FF",
|
|
13
13
|
"violet": "#BCA7FF",
|
|
14
14
|
"ice": "#D6F4FF",
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"coral": "#FF93B1",
|
|
15
|
+
"rose": "#C75B7A",
|
|
16
|
+
"roseSoft": "#E8A7B8",
|
|
18
17
|
"border": "#4C5B86",
|
|
19
18
|
"borderMuted": "#303A5B"
|
|
20
19
|
},
|
|
21
20
|
"colors": {
|
|
22
|
-
"accent": "
|
|
23
|
-
"success": "
|
|
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": "
|
|
27
|
-
"toolDiffAdded": "
|
|
28
|
-
"syntaxComment": "muted", "syntaxKeyword": "violet", "syntaxFunction": "cyan", "syntaxVariable": "
|
|
29
|
-
"thinkingOff": "dim", "thinkingMinimal": "muted", "thinkingLow": "cyan", "thinkingMedium": "violet", "thinkingHigh": "
|
|
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
|