@rosetears/aili-pi 0.1.6 → 0.1.8
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 +16 -8
- package/THIRD_PARTY_NOTICES.md +7 -7
- package/extensions/header/index.ts +26 -16
- package/extensions/matrix/index.ts +390 -193
- package/extensions/zentui/config.ts +8 -6
- package/extensions/zentui/gradient.ts +37 -47
- package/extensions/zentui/thinking-message.ts +3 -3
- package/extensions/zentui/tool-execution.ts +6 -6
- package/extensions/zentui/ui.ts +3 -3
- package/licenses/pi-permission-modes-MIT.txt +21 -0
- package/manifests/adapter-evidence.json +10 -9
- package/manifests/live-verification.json +19 -11
- package/manifests/provenance.json +8 -8
- package/manifests/sbom.json +4 -4
- package/manifests/skill-compatibility.json +12 -12
- package/manifests/subagent-provenance.json +13 -3
- package/notices/pi-sakura-cyberdeck-NOTICE.txt +3 -3
- package/package.json +6 -4
- package/scripts/generate-provenance.ts +1 -1
- package/scripts/sync-permission-modes.ts +135 -0
- package/src/runtime/native-integrations.ts +5 -5
- package/src/runtime/package-resolution.ts +8 -0
- package/src/runtime/registry.ts +138 -9
- package/src/runtime/rose-theme.ts +26 -0
- package/src/runtime/subagents.ts +85 -10
- package/src/vendor/pi-permission-modes/index.ts +692 -0
- package/src/vendor/pi-permission-modes/resolve.ts +142 -0
- package/themes/rose-cyberdeck.json +35 -0
- package/upstream/pi-permission-modes.lock.json +47 -0
- package/themes/rem-cyberdeck.json +0 -32
- /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,
|
|
@@ -252,7 +253,7 @@ export const defaultConfig: PolishedTuiConfig = {
|
|
|
252
253
|
os: "#F7EEF8",
|
|
253
254
|
editorAccent: "bold #88B8FF",
|
|
254
255
|
editorPrompt: "bold #88B8FF",
|
|
255
|
-
editorBorder: "
|
|
256
|
+
editorBorder: "rose-cyberdeck-gradient",
|
|
256
257
|
editorModel: "bold #88B8FF",
|
|
257
258
|
editorProvider: "#B8BEDD",
|
|
258
259
|
editorThinking: "#BCA7FF",
|
|
@@ -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
|
}
|
|
@@ -2,13 +2,14 @@ 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
|
|
12
13
|
];
|
|
13
14
|
|
|
14
15
|
const RESET = "\x1b[0m";
|
|
@@ -16,55 +17,44 @@ const GRADIENT_CACHE_LIMIT = 128;
|
|
|
16
17
|
const gradientCache = new Map<string, string>();
|
|
17
18
|
|
|
18
19
|
function mix(from: RGB, to: RGB, amount: number): RGB {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
const t = Math.max(0, Math.min(1, amount));
|
|
21
|
+
return [
|
|
22
|
+
Math.round(from[0] + (to[0] - from[0]) * t),
|
|
23
|
+
Math.round(from[1] + (to[1] - from[1]) * t),
|
|
24
|
+
Math.round(from[2] + (to[2] - from[2]) * t),
|
|
25
|
+
];
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
function sampleGradient(position: number): RGB {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return mix(from, to, scaled - index);
|
|
29
|
+
const normalized = Math.max(0, Math.min(1, position));
|
|
30
|
+
const scaled = normalized * (ROSE_GRADIENT_STOPS.length - 1);
|
|
31
|
+
const index = Math.min(ROSE_GRADIENT_STOPS.length - 2, Math.floor(scaled));
|
|
32
|
+
const from = ROSE_GRADIENT_STOPS[index] ?? ROSE_GRADIENT_STOPS[0]!;
|
|
33
|
+
const to = ROSE_GRADIENT_STOPS[index + 1] ?? from;
|
|
34
|
+
return mix(from, to, scaled - index);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
function foreground(color: RGB, text: string): string {
|
|
38
|
-
|
|
38
|
+
return `\x1b[38;2;${color[0]};${color[1]};${color[2]}m${text}`;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
/** Render the stable
|
|
42
|
-
export function
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
gradientCache.set(text, rendered);
|
|
53
|
-
return rendered;
|
|
41
|
+
/** Render the stable Rose-to-ice gradient for Zentui chrome and markers. */
|
|
42
|
+
export function renderRoseGradient(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) gradientCache.delete(gradientCache.keys().next().value ?? "");
|
|
50
|
+
gradientCache.set(text, rendered);
|
|
51
|
+
return rendered;
|
|
54
52
|
}
|
|
55
53
|
|
|
56
54
|
/** 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, "");
|
|
55
|
+
export function renderBoxedLine(line: string, width: number, leftRail: string, rightRail: string): string {
|
|
56
|
+
if (width <= 0) return "";
|
|
57
|
+
const innerWidth = Math.max(0, width - visibleWidth(leftRail) - visibleWidth(rightRail));
|
|
58
|
+
const content = truncateToWidth(line, innerWidth, "");
|
|
59
|
+
return truncateToWidth(`${leftRail}${content}${" ".repeat(Math.max(0, innerWidth - visibleWidth(content)))}${rightRail}`, width, "");
|
|
70
60
|
}
|
|
@@ -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 } 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,17 @@ 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 =
|
|
144
|
+
const top = renderRoseGradient(label);
|
|
145
145
|
// Keep only the status rail slightly heavier. State is expressed in the
|
|
146
|
-
//
|
|
147
|
-
//
|
|
146
|
+
// Rose palette rather than traffic-light red/green: violet while running,
|
|
147
|
+
// ice blue when complete, and Rose when failed.
|
|
148
148
|
const leftRail = pending
|
|
149
149
|
? theme.fg("thinkingXhigh", "┃ ")
|
|
150
150
|
: runtime.result?.isError
|
|
151
151
|
? theme.fg("accent", "┃ ")
|
|
152
152
|
: theme.fg("syntaxFunction", "┃ ");
|
|
153
|
-
const rightRail =
|
|
154
|
-
const bottom =
|
|
153
|
+
const rightRail = renderRoseGradient(" │");
|
|
154
|
+
const bottom = renderRoseGradient(bottomBorder(width));
|
|
155
155
|
|
|
156
156
|
const boxed = [
|
|
157
157
|
...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,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Nico Merz
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"vitest run tests/unit/runtime.test.ts"
|
|
12
12
|
],
|
|
13
13
|
"artifacts": [
|
|
14
|
-
{ "path": "package-lock.json", "sha256": "
|
|
14
|
+
{ "path": "package-lock.json", "sha256": "a9e5a3e4d1076b3179dd8cca5ef89f9fddc838e0acf9abcc1f42daf2a90ddafb" },
|
|
15
15
|
{ "path": "tests/integration/extension-load.test.ts", "sha256": "f2fdceb965f55bc481acc6457eee5cac9499dac08e8c3d17ca60efd07f13e96c" },
|
|
16
16
|
{ "path": "tests/unit/runtime.test.ts", "sha256": "9e99920e7e16529f109771d659f611c9fa580941a5dbf924b2d9d117dd3adeee" }
|
|
17
17
|
]
|
|
@@ -24,21 +24,22 @@
|
|
|
24
24
|
"verification": [
|
|
25
25
|
"npm run verify:roles",
|
|
26
26
|
"vitest run tests/unit/roles.test.ts tests/unit/subagents.test.ts",
|
|
27
|
-
"vitest run tests/integration/generic-permission.test.ts",
|
|
28
|
-
"
|
|
29
|
-
"
|
|
27
|
+
"vitest run tests/integration/generic-subagent.test.ts tests/integration/generic-permission.test.ts",
|
|
28
|
+
"AILI_LIVE_GENERIC_SUBAGENT_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts",
|
|
29
|
+
"AILI_LIVE_CREDENTIAL_GUARD_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts"
|
|
30
30
|
],
|
|
31
31
|
"artifacts": [
|
|
32
|
-
{ "path": "src/runtime/subagents.ts", "sha256": "
|
|
32
|
+
{ "path": "src/runtime/subagents.ts", "sha256": "9f09e0e8a380d026d82b0842f2c687da2f3529b43a7ef6d1a6aad47d71190d48" },
|
|
33
33
|
{ "path": "src/runtime/child-guard.ts", "sha256": "9da3c1d80805fd76bbf7a7fd253dff44f0756439fdee039bd7d7fd30766329e1" },
|
|
34
34
|
{ "path": "src/runtime/credential-guard.ts", "sha256": "01d76ff0a9a2a0a08a2d2e52b6ed050d925df5e5bea1e6194130e00bfe22cde3" },
|
|
35
|
-
{ "path": "tests/unit/subagents.test.ts", "sha256": "
|
|
35
|
+
{ "path": "tests/unit/subagents.test.ts", "sha256": "16fc1fbd1759befeed03a2428294c28d662022622c61a6444e23b365dc7447aa" },
|
|
36
36
|
{ "path": "tests/unit/child-guard.test.ts", "sha256": "b187d6d84cd0829ae5474e133b4df911a80b75b9e89622b8543a1c5894be4974" },
|
|
37
|
-
{ "path": "tests/integration/generic-permission.test.ts", "sha256": "
|
|
37
|
+
{ "path": "tests/integration/generic-permission.test.ts", "sha256": "90cc4ee67098f671dddac495d5e2cd5dc2c50131297fd04f0d72a1ca44217f24" },
|
|
38
|
+
{ "path": "tests/integration/generic-subagent.test.ts", "sha256": "a13f8564bdd1bd735f9313d2ad71511a47c939dd6351f2f460771cb48a7fc80b" },
|
|
38
39
|
{ "path": "tests/unit/roles.test.ts", "sha256": "72b61af16ff66506aaaceac28c92d8b3756741e3c4df0544686b3d4940215b57" },
|
|
39
40
|
{ "path": "scripts/sync-roles.ts", "sha256": "a4fd66c95d91ebd92f0b1c6164a84809c4b5a1bf1e185dbdd61af23688dd2d9c" },
|
|
40
|
-
{ "path": "tests/integration/live-subagent.test.ts", "sha256": "
|
|
41
|
-
{ "path": "manifests/live-verification.json", "sha256": "
|
|
41
|
+
{ "path": "tests/integration/live-subagent.test.ts", "sha256": "b88750f74b203cdbdb9d0e453e16f720ff4d8e4591ca140e0a3c7e1d8428868c" },
|
|
42
|
+
{ "path": "manifests/live-verification.json", "sha256": "f5c80dfb2fb989b43af3b7460510b0a546cc05f8ff9e671c3e9284384c33d95b" }
|
|
42
43
|
]
|
|
43
44
|
}
|
|
44
45
|
]
|
|
@@ -1,32 +1,40 @@
|
|
|
1
1
|
{
|
|
2
|
-
"schemaVersion":
|
|
2
|
+
"schemaVersion": 2,
|
|
3
3
|
"platform": "linux",
|
|
4
4
|
"piVersion": "0.81.1",
|
|
5
|
+
"subagentVersion": "0.4.8",
|
|
5
6
|
"status": "passed",
|
|
6
|
-
"approvedScope": "
|
|
7
|
+
"approvedScope": "On 2026-07-24, the user authorized two bounded live probes after repository-local compatibility verification: an omitted-backend, agentless child restricted to reading package.json, and an explicit-headless credential guard child restricted to a disposable .env sentinel. Both probes used only their declared temporary artifact roots and completed without business-file changes.",
|
|
7
8
|
"probes": [
|
|
8
9
|
{
|
|
9
10
|
"id": "generic-subagent-fixtures",
|
|
10
11
|
"command": "npx vitest run tests/unit/subagents.test.ts tests/integration/generic-subagent.test.ts",
|
|
11
|
-
"status": "passed"
|
|
12
|
+
"status": "passed",
|
|
13
|
+
"changedFiles": 0,
|
|
14
|
+
"backendRequest": "matrix",
|
|
15
|
+
"resolvedBackend": "headless"
|
|
12
16
|
},
|
|
13
17
|
{
|
|
14
|
-
"id": "generic-agentless-
|
|
18
|
+
"id": "generic-agentless-default-path",
|
|
15
19
|
"command": "AILI_LIVE_GENERIC_SUBAGENT_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts",
|
|
16
20
|
"status": "passed",
|
|
17
|
-
"changedFiles": 0
|
|
21
|
+
"changedFiles": 0,
|
|
22
|
+
"backendRequest": "omitted",
|
|
23
|
+
"resolvedBackend": "headless"
|
|
18
24
|
},
|
|
19
25
|
{
|
|
20
|
-
"id": "generic-credential-guard",
|
|
26
|
+
"id": "generic-credential-guard-explicit-headless",
|
|
21
27
|
"command": "AILI_LIVE_CREDENTIAL_GUARD_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts",
|
|
22
28
|
"status": "passed",
|
|
23
|
-
"changedFiles": 0
|
|
29
|
+
"changedFiles": 0,
|
|
30
|
+
"backendRequest": "explicit-headless",
|
|
31
|
+
"resolvedBackend": "headless"
|
|
24
32
|
}
|
|
25
33
|
],
|
|
26
34
|
"implementation": {
|
|
27
|
-
"src/runtime/subagents.ts": "
|
|
28
|
-
"tests/unit/subagents.test.ts": "
|
|
29
|
-
"tests/integration/live-subagent.test.ts": "
|
|
35
|
+
"src/runtime/subagents.ts": "9f09e0e8a380d026d82b0842f2c687da2f3529b43a7ef6d1a6aad47d71190d48",
|
|
36
|
+
"tests/unit/subagents.test.ts": "16fc1fbd1759befeed03a2428294c28d662022622c61a6444e23b365dc7447aa",
|
|
37
|
+
"tests/integration/live-subagent.test.ts": "b88750f74b203cdbdb9d0e453e16f720ff4d8e4591ca140e0a3c7e1d8428868c"
|
|
30
38
|
},
|
|
31
|
-
"credentialHandling": "
|
|
39
|
+
"credentialHandling": "The explicit-headless credential guard probe used only a disposable .env sentinel. It completed with changedFiles=0; the sentinel was absent from the model-visible result and every temporary artifact before cleanup."
|
|
32
40
|
}
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"status": "dependency",
|
|
31
31
|
"sourceFiles": ["src/index.ts", "src/api.ts", "src/runners/headless-model.ts", "src/artifacts/result.ts"],
|
|
32
32
|
"symbols": ["subagent tool renderCall", "runSubagent API", "headless lifecycle", "artifact envelope"],
|
|
33
|
-
"localChanges": ["AILI registers the full pinned upstream subagent tool schema, prepends a sanitized bounded requested-Agent heading
|
|
34
|
-
"verification": ["tests/unit/subagents.test.ts", "tests/integration/package-runtime.test.ts"]
|
|
33
|
+
"localChanges": ["AILI registers the full pinned upstream subagent tool schema, prepends a sanitized bounded requested-Agent heading, injects a non-removable credential guard, normalizes ordinary omitted/auto runs to headless for the Pi 0.81.1 compatibility window, and rejects explicit inline before model startup; no upstream source is copied"],
|
|
34
|
+
"verification": ["tests/unit/subagents.test.ts", "tests/integration/generic-subagent.test.ts", "tests/integration/live-subagent.test.ts", "tests/integration/package-runtime.test.ts"]
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"name": "pi-permission-modes",
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
"revision": "23d65d10a53b67043cae42322acf9044d6edb196",
|
|
40
40
|
"version": "2.2.0",
|
|
41
41
|
"license": "MIT",
|
|
42
|
-
"status": "
|
|
43
|
-
"sourceFiles": ["src/index.ts", "permission-
|
|
44
|
-
"symbols": ["Default/Plan/Build/YOLO", "/perm", "Alt+M", "sandbox degradation"],
|
|
45
|
-
"localChanges": ["AILI
|
|
46
|
-
"verification": ["tests/unit/
|
|
42
|
+
"status": "adapted",
|
|
43
|
+
"sourceFiles": ["src/vendor/pi-permission-modes/index.ts", "src/vendor/pi-permission-modes/resolve.ts", "upstream/pi-permission-modes.lock.json", "licenses/pi-permission-modes-MIT.txt"],
|
|
44
|
+
"symbols": ["Default/Plan/Build/YOLO", "/perm", "Alt+M", "shared permission pattern matcher", "sandbox degradation"],
|
|
45
|
+
"localChanges": ["AILI's generated adapted entry redirects unchanged sibling modules to the exact 2.2.0 dependency", "the owned resolve.ts compiles permission globs with RegExp dotAll so * and ? include ECMAScript line terminators", "the exact upstream and adapted files are hash-locked and drift-checked"],
|
|
46
|
+
"verification": ["npm run verify:permission-modes", "tests/unit/permission-patterns.test.ts", "tests/integration/permission-modes.test.ts", "tests/integration/extension-load.test.ts"]
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
"name": "pi-quota-status",
|
|
@@ -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/4a5b950286a6867acf10e709f49f1448",
|
|
7
7
|
"creationInfo": {
|
|
8
8
|
"creators": [
|
|
9
9
|
"Tool: @rosetears/aili-pi scripts/generate-provenance.ts"
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"licenseDeclared": "MIT",
|
|
44
44
|
"checksums": [],
|
|
45
45
|
"primaryPackagePurpose": "SOURCE",
|
|
46
|
-
"comment": "revision=daa7b83819116a62008ad17aa65fcd50fefbafd0; files=src/index.ts, src/api.ts, src/runners/headless-model.ts, src/artifacts/result.ts; symbols=subagent tool renderCall, runSubagent API, headless lifecycle, artifact envelope; local changes=AILI registers the full pinned upstream subagent tool schema, prepends a sanitized bounded requested-Agent heading
|
|
46
|
+
"comment": "revision=daa7b83819116a62008ad17aa65fcd50fefbafd0; files=src/index.ts, src/api.ts, src/runners/headless-model.ts, src/artifacts/result.ts; symbols=subagent tool renderCall, runSubagent API, headless lifecycle, artifact envelope; local changes=AILI registers the full pinned upstream subagent tool schema, prepends a sanitized bounded requested-Agent heading, injects a non-removable credential guard, normalizes ordinary omitted/auto runs to headless for the Pi 0.81.1 compatibility window, and rejects explicit inline before model startup; no upstream source is copied"
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
"SPDXID": "SPDXRef-source-pi-permission-modes-9b38b384cd",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"licenseDeclared": "MIT",
|
|
56
56
|
"checksums": [],
|
|
57
57
|
"primaryPackagePurpose": "SOURCE",
|
|
58
|
-
"comment": "revision=23d65d10a53b67043cae42322acf9044d6edb196; files=src/index.ts, permission-
|
|
58
|
+
"comment": "revision=23d65d10a53b67043cae42322acf9044d6edb196; files=src/vendor/pi-permission-modes/index.ts, src/vendor/pi-permission-modes/resolve.ts, upstream/pi-permission-modes.lock.json, licenses/pi-permission-modes-MIT.txt; symbols=Default/Plan/Build/YOLO, /perm, Alt+M, shared permission pattern matcher, sandbox degradation; local changes=AILI's generated adapted entry redirects unchanged sibling modules to the exact 2.2.0 dependency | the owned resolve.ts compiles permission globs with RegExp dotAll so * and ? include ECMAScript line terminators | the exact upstream and adapted files are hash-locked and drift-checked"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"SPDXID": "SPDXRef-source-pi-quota-status-63ccce8956",
|
|
@@ -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",
|
|
@@ -801,9 +801,9 @@
|
|
|
801
801
|
"snapshot-hash:verified",
|
|
802
802
|
"npm run verify:roles",
|
|
803
803
|
"vitest run tests/unit/roles.test.ts tests/unit/subagents.test.ts",
|
|
804
|
-
"vitest run tests/integration/generic-permission.test.ts",
|
|
805
|
-
"
|
|
806
|
-
"
|
|
804
|
+
"vitest run tests/integration/generic-subagent.test.ts tests/integration/generic-permission.test.ts",
|
|
805
|
+
"AILI_LIVE_GENERIC_SUBAGENT_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts",
|
|
806
|
+
"AILI_LIVE_CREDENTIAL_GUARD_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts"
|
|
807
807
|
],
|
|
808
808
|
"status": "adapted",
|
|
809
809
|
"reason": "Required capabilities are covered by verified Pi adapter evidence: subagent.dispatch.",
|
|
@@ -4311,9 +4311,9 @@
|
|
|
4311
4311
|
"snapshot-hash:verified",
|
|
4312
4312
|
"npm run verify:roles",
|
|
4313
4313
|
"vitest run tests/unit/roles.test.ts tests/unit/subagents.test.ts",
|
|
4314
|
-
"vitest run tests/integration/generic-permission.test.ts",
|
|
4315
|
-
"
|
|
4316
|
-
"
|
|
4314
|
+
"vitest run tests/integration/generic-subagent.test.ts tests/integration/generic-permission.test.ts",
|
|
4315
|
+
"AILI_LIVE_GENERIC_SUBAGENT_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts",
|
|
4316
|
+
"AILI_LIVE_CREDENTIAL_GUARD_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts"
|
|
4317
4317
|
],
|
|
4318
4318
|
"status": "adapted",
|
|
4319
4319
|
"reason": "Required capabilities are covered by verified Pi adapter evidence: subagent.dispatch.",
|
|
@@ -5596,9 +5596,9 @@
|
|
|
5596
5596
|
"snapshot-hash:verified",
|
|
5597
5597
|
"npm run verify:roles",
|
|
5598
5598
|
"vitest run tests/unit/roles.test.ts tests/unit/subagents.test.ts",
|
|
5599
|
-
"vitest run tests/integration/generic-permission.test.ts",
|
|
5600
|
-
"
|
|
5601
|
-
"
|
|
5599
|
+
"vitest run tests/integration/generic-subagent.test.ts tests/integration/generic-permission.test.ts",
|
|
5600
|
+
"AILI_LIVE_GENERIC_SUBAGENT_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts",
|
|
5601
|
+
"AILI_LIVE_CREDENTIAL_GUARD_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts"
|
|
5602
5602
|
],
|
|
5603
5603
|
"status": "adapted",
|
|
5604
5604
|
"reason": "Required capabilities are covered by verified Pi adapter evidence: subagent.dispatch.",
|
|
@@ -6416,9 +6416,9 @@
|
|
|
6416
6416
|
"snapshot-hash:verified",
|
|
6417
6417
|
"npm run verify:roles",
|
|
6418
6418
|
"vitest run tests/unit/roles.test.ts tests/unit/subagents.test.ts",
|
|
6419
|
-
"vitest run tests/integration/generic-permission.test.ts",
|
|
6420
|
-
"
|
|
6421
|
-
"
|
|
6419
|
+
"vitest run tests/integration/generic-subagent.test.ts tests/integration/generic-permission.test.ts",
|
|
6420
|
+
"AILI_LIVE_GENERIC_SUBAGENT_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts",
|
|
6421
|
+
"AILI_LIVE_CREDENTIAL_GUARD_PROBE=1 npx vitest run tests/integration/live-subagent.test.ts"
|
|
6422
6422
|
],
|
|
6423
6423
|
"status": "adapted",
|
|
6424
6424
|
"reason": "Required capabilities are covered by verified Pi adapter evidence: subagent.dispatch.",
|
|
@@ -27,11 +27,21 @@
|
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"name": "@agwab/pi-subagent",
|
|
30
|
+
"version": "0.4.8",
|
|
30
31
|
"revision": "daa7b83819116a62008ad17aa65fcd50fefbafd0",
|
|
31
32
|
"license": "MIT",
|
|
32
|
-
"status": "
|
|
33
|
-
"reusedPatterns": [
|
|
34
|
-
|
|
33
|
+
"status": "dependency",
|
|
34
|
+
"reusedPatterns": [
|
|
35
|
+
"generic subagent tool schema and rendering",
|
|
36
|
+
"headless/tmux/inline backend and lifecycle envelopes",
|
|
37
|
+
"bounded parallel fan-out, worktree, sandbox, async, interrupt, and reconcile behavior"
|
|
38
|
+
],
|
|
39
|
+
"localAdaptation": [
|
|
40
|
+
"ordinary omitted/auto runs use headless for the Pi 0.81.1 compatibility window",
|
|
41
|
+
"explicit incompatible inline requests fail before model startup",
|
|
42
|
+
"AILI injects the immutable credential guard and a bounded requested-Agent heading"
|
|
43
|
+
],
|
|
44
|
+
"reason": "AILI depends on the exact package and applies a wrapper-only compatibility adaptation; no upstream source is copied."
|
|
35
45
|
}
|
|
36
46
|
]
|
|
37
47
|
}
|
|
@@ -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.8",
|
|
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": {
|
|
@@ -68,8 +68,10 @@
|
|
|
68
68
|
"validate:roles": "npm run verify:roles",
|
|
69
69
|
"sync:adapters": "node --experimental-strip-types scripts/apply-adapter-evidence.ts",
|
|
70
70
|
"validate:compatibility": "node --experimental-strip-types scripts/apply-adapter-evidence.ts --verify",
|
|
71
|
-
"
|
|
72
|
-
"
|
|
71
|
+
"sync:permission-modes": "node --experimental-strip-types scripts/sync-permission-modes.ts",
|
|
72
|
+
"verify:permission-modes": "node --experimental-strip-types scripts/sync-permission-modes.ts --verify",
|
|
73
|
+
"generate:provenance": "node --experimental-strip-types scripts/sync-permission-modes.ts --verify && node --experimental-strip-types scripts/generate-provenance.ts",
|
|
74
|
+
"validate:provenance": "node --experimental-strip-types scripts/sync-permission-modes.ts --verify && node --experimental-strip-types scripts/generate-provenance.ts --verify",
|
|
73
75
|
"validate:capabilities": "node --experimental-strip-types scripts/validate-runtime.ts",
|
|
74
76
|
"validate:release": "node --experimental-strip-types scripts/validate-runtime.ts --release",
|
|
75
77
|
"test:doctor": "vitest run tests/unit/doctor.test.ts",
|
|
@@ -115,7 +115,7 @@ async function generate(): Promise<{ notices: string; sbom: object }> {
|
|
|
115
115
|
"",
|
|
116
116
|
`The exact ${packages.length}-entry package-lock inventory, versions, integrity values, dependency scope, and declared licenses is recorded in \`manifests/sbom.json\`.`,
|
|
117
117
|
"",
|
|
118
|
-
"Runtime dependencies are initialized through the single AILI Extension entry
|
|
118
|
+
"Runtime dependencies are initialized through the single AILI Extension entry. Package-owned third-party adaptations are copied only where their provenance sourceFiles explicitly name repository paths.",
|
|
119
119
|
"",
|
|
120
120
|
].join("\n");
|
|
121
121
|
return { notices, sbom };
|