@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
package/README.md
CHANGED
|
@@ -49,11 +49,15 @@ The package does not write global AILI resources during extension load. After re
|
|
|
49
49
|
|
|
50
50
|
That command creates or updates only the AILI marker block in `~/.pi/agent/APPEND_SYSTEM.md` and installs the 19 packaged profiles at `~/.pi/agent/agents/aili/`. The marker block is a Pi-native governance derivation of the pinned `aili-workflows` global AGENTS template: it retains instruction precedence, untrusted-content handling, approval/evidence/verification discipline, bounded delegation, project-rule precedence, and user-language output, while excluding OpenCode-only control planes. It preserves unrelated prompt content, rejects malformed markers or an unowned profile collision, and reports stale profiles without pruning them.
|
|
51
51
|
|
|
52
|
-
##
|
|
52
|
+
## Rose Cyberdeck
|
|
53
53
|
|
|
54
|
-
The package supplies the dark `
|
|
54
|
+
The package supplies the dark `rose-cyberdeck` theme plus three additional Pi Extensions: a Rose header, Rose Shimmer + four-row Rose Code Rain working surface, and Zentui footer/editor surface. Select it through Pi's `/settings` theme selector or set `"theme": "rose-cyberdeck"` in `~/.pi/agent/settings.json`. The visual extensions are adapted from `pi-sakura-cyberdeck` at revision `165a1f8011a12a58a6409b56b8a6c0416cd9b589` under MIT; see `THIRD_PARTY_NOTICES.md` and `notices/pi-sakura-cyberdeck-NOTICE.txt`.
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
Rose Code Rain uses the original sparse, fixed-column waterfall geometry: `density` selects even-cell tracks, at most 96 tracks span ultra-wide terminals, and each track falls vertically with a randomized tail and gap. The default 12 FPS cadence and 8–16 rows/second fall speed sit between the released and dense-preview profiles. `/rose-matrix status`, `/rose-matrix fps <8-18>`, `/rose-matrix density <0.45-0.95>`, and `/rose-matrix appearance <auto|dark|light>` change active preferences. `/sakura-matrix` remains a deprecated compatibility alias. Header, rain, frames, footer, and editor use the Rose six-color system: Blue, Ice, Cyan, Violet, Rose, and Soft Rose.
|
|
57
|
+
|
|
58
|
+
### Migrating from Rem/Sakura names
|
|
59
|
+
|
|
60
|
+
Replace an exact legacy `rem-cyberdeck` theme token with `rose-cyberdeck` through `/settings` or `~/.pi/agent/settings.json`; when using a `light/dark` pair, replace only the legacy side. Existing `sakura-cyberdeck-matrix.json` and `rem-cyberdeck-zentui.json` configuration files are read compatibly and retained. Legacy product names below appear only for migration or upstream attribution.
|
|
57
61
|
|
|
58
62
|
Zentui enables its experimental fixed-bottom editor by default when the installed Pi TUI exposes the required private layout capabilities. If capability detection or installation fails, it keeps Pi's native editor and emits a warning. The feature uses the terminal alternate screen; its default mouse scrolling can interfere with terminal text selection and tmux scrollback. Use Zentui's `/zentui` settings to disable the fixed editor or mouse scrolling. Zentui hides `pi-cache-stats` by default so the one canonical Codex weekly quota remains visible; explicitly re-enabled cache stats follow quota in the bounded footer.
|
|
59
63
|
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -99,7 +99,7 @@ This distribution is MIT-licensed. The following adapted sources and locked deve
|
|
|
99
99
|
- License: MIT
|
|
100
100
|
- Source files: extensions/header/index.ts, extensions/matrix/index.ts, extensions/zentui/**
|
|
101
101
|
- Reused symbols/patterns: header, matrix animation, Zentui footer, fixed editor compositor
|
|
102
|
-
- Local changes: registered as three additional Pi Package Extensions; header
|
|
102
|
+
- 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
|
|
103
103
|
|
|
104
104
|
## npm dependency inventory
|
|
105
105
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
|
+
import { getAgentDir, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
3
|
import { fileURLToPath } from "node:url";
|
|
3
|
-
import
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { legacyRoseThemeGuidanceFromSettings } from "../../src/runtime/rose-theme.js";
|
|
4
6
|
|
|
5
7
|
const RESET = "\x1b[0m";
|
|
6
8
|
const BOLD = "\x1b[1m";
|
|
@@ -26,7 +28,7 @@ function gradient(text: string, from: RGB, to: RGB, bold = false): string {
|
|
|
26
28
|
}).join("");
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
const
|
|
31
|
+
const ROSE_ART = readFileSync(fileURLToPath(new URL("../../src/runtime/rose-head.txt", import.meta.url)), "utf8").trimEnd().split("\n") as readonly string[];
|
|
30
32
|
|
|
31
33
|
function getAvailableRows(tui: unknown): number {
|
|
32
34
|
try {
|
|
@@ -38,15 +40,15 @@ function getAvailableRows(tui: unknown): number {
|
|
|
38
40
|
}
|
|
39
41
|
}
|
|
40
42
|
|
|
41
|
-
function
|
|
43
|
+
export function renderRoseHeader(width: number, availableRows = 0): string[] {
|
|
42
44
|
if (width <= 0) return [];
|
|
43
45
|
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
const telemetry = "◈
|
|
49
|
-
const artWidth = Math.max(...
|
|
46
|
+
const blue: RGB = [136, 184, 255];
|
|
47
|
+
const cyan: RGB = [125, 228, 255];
|
|
48
|
+
const violet: RGB = [188, 167, 255];
|
|
49
|
+
const ice: RGB = [214, 244, 255];
|
|
50
|
+
const telemetry = "◈ ROSE CYBERDECK ◈";
|
|
51
|
+
const artWidth = Math.max(...ROSE_ART.map((line) => [...line].length));
|
|
50
52
|
const visibleArtWidth = Math.min(width, artWidth);
|
|
51
53
|
const artPad = " ".repeat(Math.max(0, Math.floor((width - visibleArtWidth) / 2) - 2));
|
|
52
54
|
// Keep the divider visually subordinate: inset it symmetrically from the artwork.
|
|
@@ -58,12 +60,12 @@ function renderHeader(width: number, availableRows = 0): string[] {
|
|
|
58
60
|
const telemetryWidth = [...visibleTelemetry].length;
|
|
59
61
|
const telemetryPad = " ".repeat(Math.max(0, Math.min(width - telemetryWidth, Math.floor((width - telemetryWidth) / 2) + 1)));
|
|
60
62
|
|
|
61
|
-
const art =
|
|
63
|
+
const art = ROSE_ART.map((line) => {
|
|
62
64
|
const clipped = [...line].slice(0, visibleArtWidth).join("");
|
|
63
|
-
return `${artPad}${gradient(clipped,
|
|
65
|
+
return `${artPad}${gradient(clipped, blue, ice)}`;
|
|
64
66
|
});
|
|
65
67
|
|
|
66
|
-
const visualHeight =
|
|
68
|
+
const visualHeight = ROSE_ART.length + 3; // artwork + gap + divider + label
|
|
67
69
|
const extraTopPadding = Math.max(0, Math.floor((availableRows - visualHeight) / 2) - 1);
|
|
68
70
|
|
|
69
71
|
return [
|
|
@@ -71,17 +73,25 @@ function renderHeader(width: number, availableRows = 0): string[] {
|
|
|
71
73
|
"",
|
|
72
74
|
...art,
|
|
73
75
|
"",
|
|
74
|
-
`${railPad}${gradient(rail,
|
|
75
|
-
`${telemetryPad}${gradient(visibleTelemetry,
|
|
76
|
+
`${railPad}${gradient(rail, blue, ice)}`,
|
|
77
|
+
`${telemetryPad}${gradient(visibleTelemetry, violet, cyan, true)}`,
|
|
76
78
|
"",
|
|
77
79
|
];
|
|
78
80
|
}
|
|
79
81
|
|
|
80
|
-
export default function
|
|
82
|
+
export default function roseCyberdeckHeader(pi: ExtensionAPI): void {
|
|
83
|
+
let legacyThemeNoticeSent = false;
|
|
81
84
|
pi.on("session_start", (_event, ctx) => {
|
|
82
85
|
if (!ctx.hasUI) return;
|
|
86
|
+
if (!legacyThemeNoticeSent) {
|
|
87
|
+
const guidance = legacyRoseThemeGuidanceFromSettings(join(getAgentDir(), "settings.json"));
|
|
88
|
+
if (guidance) {
|
|
89
|
+
legacyThemeNoticeSent = true;
|
|
90
|
+
ctx.ui.notify(guidance, "warning");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
83
93
|
ctx.ui.setHeader((tui) => ({
|
|
84
|
-
render: (width) =>
|
|
94
|
+
render: (width) => renderRoseHeader(width, getAvailableRows(tui)),
|
|
85
95
|
invalidate() {},
|
|
86
96
|
}));
|
|
87
97
|
});
|