@quandev104/pi-style 0.1.4 → 0.1.6
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/CHANGELOG.md +30 -0
- package/README.md +10 -6
- package/dist/extensions/pi-style.js +3939 -1431
- package/dist/extensions/pi-style.js.map +1 -1
- package/extension-src/pi-style/app/command-service.ts +2 -0
- package/extension-src/pi-style/domain/config-authorization.ts +6 -3
- package/extension-src/pi-style/domain/config-normalization.ts +21 -5
- package/extension-src/pi-style/domain/config-presets.ts +1 -1
- package/extension-src/pi-style/domain/config-types.ts +7 -3
- package/extension-src/pi-style/domain/theme.ts +6 -1
- package/extension-src/pi-style/features/editor/index.ts +169 -27
- package/extension-src/pi-style/features/messages/index.ts +66 -0
- package/extension-src/pi-style/features/tools/bash-execution.ts +112 -0
- package/extension-src/pi-style/features/tools/boxed/bash.ts +154 -130
- package/extension-src/pi-style/features/tools/boxed/batch.ts +50 -27
- package/extension-src/pi-style/features/tools/boxed/command-shape.ts +136 -0
- package/extension-src/pi-style/features/tools/boxed/find.ts +2 -2
- package/extension-src/pi-style/features/tools/boxed/gh.ts +1012 -0
- package/extension-src/pi-style/features/tools/boxed/git.ts +1960 -0
- package/extension-src/pi-style/features/tools/boxed/grep.ts +2 -2
- package/extension-src/pi-style/features/tools/boxed/output-tree.ts +9 -10
- package/extension-src/pi-style/features/tools/boxed/read.ts +3 -3
- package/extension-src/pi-style/features/tools/boxed/write.ts +2 -1
- package/extension-src/pi-style/pi/compatibility-coordinator.ts +32 -11
- package/extension-src/pi-style/pi/compatibility-probe.ts +341 -205
- package/extension-src/pi-style/pi/compatibility-registry.ts +19 -3
- package/extension-src/pi-style/pi/index.ts +21 -3
- package/extension-src/pi-style/pi/session-coordinator.ts +24 -0
- package/extension-src/pi-style/shared/box.ts +8 -4
- package/extension-src/pi-style/shared/split-diff.ts +9 -9
- package/package.json +9 -9
- package/themes/titanium-light.json +82 -0
- package/themes/titanium.json +79 -0
- package/themes/.gitkeep +0 -0
|
@@ -5,7 +5,8 @@ export type CompatibilitySubtype =
|
|
|
5
5
|
| "native-skill-message"
|
|
6
6
|
| "native-custom-message"
|
|
7
7
|
| "tool-call-renderer"
|
|
8
|
-
| "tool-result-renderer"
|
|
8
|
+
| "tool-result-renderer"
|
|
9
|
+
| "native-bash-execution";
|
|
9
10
|
|
|
10
11
|
type CompatibilityShape = "supported" | "unsupported" | "conflict" | "installed" | "skipped";
|
|
11
12
|
|
|
@@ -171,6 +172,13 @@ function validateInstall(
|
|
|
171
172
|
if (!options.shape) return skippedResult(options, "unsupported", options.diagnostic ?? "unsupported shape", current);
|
|
172
173
|
const conflict = existing && activeConflict(existing, current, options.generation);
|
|
173
174
|
if (conflict) return conflict;
|
|
175
|
+
if (options.kind === "add-method") {
|
|
176
|
+
// Additive install: the slot must be unowned (the method is inherited); the
|
|
177
|
+
// delegate receives the inherited native function as its fallback identity.
|
|
178
|
+
if (current !== undefined || ownDescriptor !== undefined)
|
|
179
|
+
return skippedResult(options, "conflict", "target already owns the additive method", current);
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
174
182
|
if (typeof current !== "function")
|
|
175
183
|
return skippedResult(
|
|
176
184
|
options,
|
|
@@ -225,6 +233,8 @@ export function installDelegatingPatch(options: {
|
|
|
225
233
|
expectedIdentity?: unknown;
|
|
226
234
|
hasExpectedIdentity?: boolean;
|
|
227
235
|
diagnostic?: string | undefined;
|
|
236
|
+
/** "add-method" installs a new own method on the prototype (nothing may already own the slot); the delegate receives the inherited native function as the fallback. */
|
|
237
|
+
kind?: "method" | "add-method";
|
|
228
238
|
delegate: (original: unknown, thisArg: object, args: unknown[]) => unknown;
|
|
229
239
|
}): InstallResult {
|
|
230
240
|
const { target, method } = options;
|
|
@@ -235,7 +245,9 @@ export function installDelegatingPatch(options: {
|
|
|
235
245
|
const validation = validateInstall(options, current, records.get(method), inspection.descriptor);
|
|
236
246
|
if (validation) return validation;
|
|
237
247
|
const originalDescriptor = Object.getOwnPropertyDescriptor(target, method);
|
|
238
|
-
|
|
248
|
+
// Additive installs have no current owner; the captured inherited native
|
|
249
|
+
// function (expectedIdentity) is both the fallback and the delegate's original.
|
|
250
|
+
const originalIdentity = options.kind === "add-method" ? options.expectedIdentity : current;
|
|
239
251
|
let active = true;
|
|
240
252
|
const installed = function (this: object, ...args: unknown[]): unknown {
|
|
241
253
|
if (!active) return Reflect.apply(originalIdentity as (...values: unknown[]) => unknown, this, args);
|
|
@@ -260,7 +272,11 @@ export function installDelegatingPatch(options: {
|
|
|
260
272
|
};
|
|
261
273
|
try {
|
|
262
274
|
Object.defineProperty(installed, "__piStyleCompatibilityRecord", { value: record, configurable: false });
|
|
263
|
-
|
|
275
|
+
// Additive installs have no original descriptor; write a fresh writable,
|
|
276
|
+
// configurable, non-enumerable own method so the slot stays reversible.
|
|
277
|
+
const descriptor = originalDescriptor
|
|
278
|
+
? { ...originalDescriptor, value: installed }
|
|
279
|
+
: { value: installed, writable: true, enumerable: false, configurable: true };
|
|
264
280
|
const wrote = Reflect.defineProperty(target, method, descriptor);
|
|
265
281
|
registryTestHooks.afterWrite?.();
|
|
266
282
|
const currentDescriptor = Object.getOwnPropertyDescriptor(target, method);
|
|
@@ -40,8 +40,9 @@ export function __setCompatibilityTestHooks(hooks: CompatibilityTestHooks): () =
|
|
|
40
40
|
|
|
41
41
|
/** Thin Pi adapter: register flags, commands, and forward lifecycle events. */
|
|
42
42
|
export default function piStyleExtension(pi: ExtensionAPI): void {
|
|
43
|
-
// The core/message/tool surfaces are default-on (
|
|
44
|
-
//
|
|
43
|
+
// The core/message/tool surfaces are default-on (identity-certified per surface by
|
|
44
|
+
// name/arity/source fingerprint, graceful native fallback for any surface whose
|
|
45
|
+
// runtime identity is not recorded, conflict-preserving). The OFF switch is the
|
|
45
46
|
// product gate `compatibility.allowCorePatches: false` (or `enabled: false`) in config.
|
|
46
47
|
for (const [name, description] of [
|
|
47
48
|
["pi-style-core-patches", "Enable pi-style message/tool core patches"],
|
|
@@ -66,7 +67,24 @@ export default function piStyleExtension(pi: ExtensionAPI): void {
|
|
|
66
67
|
await coordinator.start(event, ctx);
|
|
67
68
|
});
|
|
68
69
|
pi.on("agent_start", () => coordinator.app.runtime.current?.dismissStartup());
|
|
69
|
-
pi.on("input", () =>
|
|
70
|
+
pi.on("input", (event, _ctx) => {
|
|
71
|
+
coordinator.app.runtime.current?.dismissStartup();
|
|
72
|
+
// Bare `!`/`!!` submit guard: Pi treats `!`-prefixed input as a direct bash
|
|
73
|
+
// command but falls through to normal message submission when the bang has
|
|
74
|
+
// no command after it — sending a literal `!` to the agent. Drop those
|
|
75
|
+
// accidental submits instead; Pi's submit path already cleared the editor
|
|
76
|
+
// (onChange("") resets isBashMode), so the input returns to the normal
|
|
77
|
+
// prompt without sending anything. Only the interactive input box is
|
|
78
|
+
// guarded; rpc/extension sources keep sending text verbatim.
|
|
79
|
+
if (event.source === "interactive") {
|
|
80
|
+
const trimmed = event.text.trimStart();
|
|
81
|
+
if (trimmed.startsWith("!")) {
|
|
82
|
+
const bangLength = trimmed.startsWith("!!") ? 2 : 1;
|
|
83
|
+
if (trimmed.slice(bangLength).trim() === "") return { action: "handled" };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return undefined;
|
|
87
|
+
});
|
|
70
88
|
pi.on("tool_execution_start", () => coordinator.app.runtime.current?.dismissStartup());
|
|
71
89
|
pi.on("model_select", (event) =>
|
|
72
90
|
coordinator.app.update(
|
|
@@ -4,6 +4,7 @@ import type { ConfigFilePort } from "../app/config-storage.js";
|
|
|
4
4
|
import { createPiStyleApp, type PiStyleApp } from "../app/index.js";
|
|
5
5
|
import { resolveTheme } from "../domain/theme.js";
|
|
6
6
|
import { setSpecialBlockTheme } from "../features/messages/special-blocks.js";
|
|
7
|
+
import { setBashExecutionTheme } from "../features/tools/bash-execution.js";
|
|
7
8
|
import { resetBashTreeRegistry } from "../features/tools/boxed/bash.js";
|
|
8
9
|
import { resetBatchRegistry } from "../features/tools/boxed/batch.js";
|
|
9
10
|
import { resetGrepRegistry } from "../features/tools/boxed/grep.js";
|
|
@@ -94,6 +95,26 @@ export function createPiStyleSessionCoordinator(pi: ExtensionAPI, hooks: Compati
|
|
|
94
95
|
const applyMessagesConfig = (config: import("../domain/config-types.js").NormalizedPiStyleConfig) => {
|
|
95
96
|
sessionUi?.setHiddenThinkingLabel?.(config.messages.hideThinkingLabel ? "" : undefined);
|
|
96
97
|
};
|
|
98
|
+
/**
|
|
99
|
+
* Auto-apply the configured pi-style theme (default "titanium") once per TUI
|
|
100
|
+
* session before any surface captures the active theme, so a fresh install
|
|
101
|
+
* renders with the intended palette. Failure-safe: an unresolvable target is
|
|
102
|
+
* never passed to Pi (its setTheme falls back to the dark theme on load
|
|
103
|
+
* error, which would clobber the user's theme), and "off" disables the
|
|
104
|
+
* surface for users who keep their own theme.
|
|
105
|
+
*/
|
|
106
|
+
const applyAutoTheme = (
|
|
107
|
+
config: import("../domain/config-types.js").NormalizedPiStyleConfig,
|
|
108
|
+
ctx: ExtensionContext,
|
|
109
|
+
) => {
|
|
110
|
+
const target = config.theme.autoApply;
|
|
111
|
+
if (ctx.mode !== "tui" || !target || target === "off") return;
|
|
112
|
+
const ui = ctx.ui;
|
|
113
|
+
if (ui?.theme?.name === target) return;
|
|
114
|
+
// Resolve before switching (see failure-safe note above).
|
|
115
|
+
if (!ui?.getTheme?.(target)) return;
|
|
116
|
+
ui.setTheme?.(target);
|
|
117
|
+
};
|
|
97
118
|
const app: PiStyleApp = createPiStyleApp(
|
|
98
119
|
undefined,
|
|
99
120
|
{
|
|
@@ -162,6 +183,8 @@ export function createPiStyleSessionCoordinator(pi: ExtensionAPI, hooks: Compati
|
|
|
162
183
|
productGate = app.productPolicy.corePatchGate;
|
|
163
184
|
active = true;
|
|
164
185
|
compatibility.install(app.config, ctx.mode === "tui", productGate);
|
|
186
|
+
// Auto-apply the configured theme before surfaces capture the active one.
|
|
187
|
+
applyAutoTheme(app.config, ctx);
|
|
165
188
|
// Session-scoped render configuration for the boxed tool/message surfaces.
|
|
166
189
|
// Populated once per session (never inside render).
|
|
167
190
|
sessionTheme = ctx.ui?.theme as never;
|
|
@@ -169,6 +192,7 @@ export function createPiStyleSessionCoordinator(pi: ExtensionAPI, hooks: Compati
|
|
|
169
192
|
applyToolsRenderConfig(app.config);
|
|
170
193
|
applyMessagesConfig(app.config);
|
|
171
194
|
if (ctx.ui?.theme) setSpecialBlockTheme(ctx.ui.theme as never);
|
|
195
|
+
if (ctx.ui?.theme) setBashExecutionTheme(ctx.ui.theme as never);
|
|
172
196
|
const toolDetails = collectToolDetails(pi.getActiveTools?.(), pi.getAllTools?.());
|
|
173
197
|
app.sessionStart(
|
|
174
198
|
{
|
|
@@ -319,8 +319,6 @@ export function formatToolParamLines(args: unknown, theme?: BoxTheme): string[]
|
|
|
319
319
|
return lines;
|
|
320
320
|
}
|
|
321
321
|
|
|
322
|
-
const RESET_INTENSITY = "\x1b[22m";
|
|
323
|
-
|
|
324
322
|
function colorFromExtra(theme: BoxTheme, extraKey: string, fallbackColor: string, text: string): string {
|
|
325
323
|
const color = getThemeExtra(theme, extraKey);
|
|
326
324
|
if (color) {
|
|
@@ -380,11 +378,17 @@ export function formatBoxedRunningStatus(theme: BoxTheme, elapsedMs: number | un
|
|
|
380
378
|
return `${theme.fg("dim", "◌ Running")}${elapsed}`;
|
|
381
379
|
}
|
|
382
380
|
|
|
381
|
+
/** Structural line — box frame, tree branch, divider, gutter — wrapped in
|
|
382
|
+
* dim terminal-default intensity. Visible in every theme; matches omp. */
|
|
383
|
+
export function dimLine(text: string): string {
|
|
384
|
+
return `\x1b[2m${text}\x1b[22m`;
|
|
385
|
+
}
|
|
386
|
+
|
|
383
387
|
function boxText(theme: BoxTheme, text: string): string {
|
|
384
|
-
return
|
|
388
|
+
return dimLine(text);
|
|
385
389
|
}
|
|
386
390
|
function boxFrameText(theme: BoxTheme, text: string): string {
|
|
387
|
-
return
|
|
391
|
+
return dimLine(text);
|
|
388
392
|
}
|
|
389
393
|
|
|
390
394
|
export function boxedToolBgName(isError?: boolean, isPartial?: boolean): string {
|
|
@@ -7,6 +7,7 @@ import { highlightCode } from "@earendil-works/pi-coding-agent";
|
|
|
7
7
|
import type { Component } from "@earendil-works/pi-tui";
|
|
8
8
|
|
|
9
9
|
import { stripAnsi } from "./ansi.js";
|
|
10
|
+
import { dimLine } from "./box.js";
|
|
10
11
|
import { safeTruncateToWidth, safeVisibleWidth } from "./render-budget.js";
|
|
11
12
|
|
|
12
13
|
// ── Types ──────────────────────────────────────────────────────────
|
|
@@ -761,7 +762,7 @@ class SplitDiffRenderer {
|
|
|
761
762
|
lineKind === "add" ? "toolDiffAdded" : lineKind === "remove" ? "toolDiffRemoved" : "borderMuted";
|
|
762
763
|
const marker = this.ctx.fg(markerColor, markerChar);
|
|
763
764
|
const lineNumber = this.ctx.fg("dim", " ".repeat(this.ctx.lineNumberWidth));
|
|
764
|
-
const divider =
|
|
765
|
+
const divider = dimLine(" │ ");
|
|
765
766
|
const prefix = `${marker} ${lineNumber}${divider}`;
|
|
766
767
|
const prefixPlain = `${markerChar} ${" ".repeat(this.ctx.lineNumberWidth)} │ `;
|
|
767
768
|
const tailWidth = Math.max(0, columnWidth - safeVisibleWidth(prefixPlain));
|
|
@@ -791,14 +792,14 @@ class SplitDiffRenderer {
|
|
|
791
792
|
this.ctx.fg(markerColor, markerChar) +
|
|
792
793
|
" " +
|
|
793
794
|
this.ctx.fg(this.getNumberColor(lineKind), lineNumber) +
|
|
794
|
-
|
|
795
|
+
dimLine(" │ ");
|
|
795
796
|
const firstPrefixPlain = `${markerChar} ${lineNumber} │ `;
|
|
796
797
|
|
|
797
798
|
const contPrefixAnsi =
|
|
798
799
|
this.ctx.fg(markerColor, markerChar) +
|
|
799
800
|
" " +
|
|
800
801
|
this.ctx.fg("dim", " ".repeat(this.ctx.lineNumberWidth)) +
|
|
801
|
-
|
|
802
|
+
dimLine(" │ ");
|
|
802
803
|
const contPrefixPlain = `${markerChar} ${" ".repeat(this.ctx.lineNumberWidth)} │ `;
|
|
803
804
|
|
|
804
805
|
const codeWidth = Math.max(1, columnWidth - safeVisibleWidth(firstPrefixPlain));
|
|
@@ -865,7 +866,7 @@ class SplitDiffRenderer {
|
|
|
865
866
|
|
|
866
867
|
render(width: number): string[] {
|
|
867
868
|
const safeWidth = Math.max(20, width);
|
|
868
|
-
const columnSeparator =
|
|
869
|
+
const columnSeparator = dimLine(" │ ");
|
|
869
870
|
const separatorWidth = safeVisibleWidth(stripAnsi(columnSeparator));
|
|
870
871
|
const leftWidth = Math.max(20, Math.floor((safeWidth - separatorWidth) / 2));
|
|
871
872
|
const rightWidth = Math.max(20, safeWidth - separatorWidth - leftWidth);
|
|
@@ -877,15 +878,14 @@ class SplitDiffRenderer {
|
|
|
877
878
|
if (dividerIndex >= 0 && dividerIndex < chars.length) {
|
|
878
879
|
chars[dividerIndex] = junction;
|
|
879
880
|
}
|
|
880
|
-
return
|
|
881
|
+
return dimLine(chars.join(""));
|
|
881
882
|
};
|
|
882
883
|
|
|
883
884
|
const formatHeaderCell = (label: string, columnWidth: number): string => {
|
|
884
885
|
// Keep marker+space columns, then place label inside the line-number column.
|
|
885
886
|
const markerPad = " ";
|
|
886
887
|
const lineNumberLabel = fitToWidth(label, this.ctx.lineNumberWidth);
|
|
887
|
-
const prefixAnsi =
|
|
888
|
-
this.ctx.fg("borderMuted", markerPad) + this.ctx.fg("dim", lineNumberLabel) + this.ctx.fg("borderMuted", " │ ");
|
|
888
|
+
const prefixAnsi = dimLine(markerPad) + this.ctx.fg("dim", lineNumberLabel) + dimLine(" │ ");
|
|
889
889
|
const prefixPlain = `${markerPad}${stripAnsi(lineNumberLabel)} │ `;
|
|
890
890
|
const codeWidth = Math.max(0, columnWidth - safeVisibleWidth(prefixPlain));
|
|
891
891
|
return padRenderedLineWidth(prefixAnsi + " ".repeat(codeWidth), columnWidth);
|
|
@@ -894,7 +894,7 @@ class SplitDiffRenderer {
|
|
|
894
894
|
const lines: string[] = [];
|
|
895
895
|
lines.push(
|
|
896
896
|
padRenderedLineWidth(
|
|
897
|
-
formatBorderCell(leftWidth, "┬") +
|
|
897
|
+
formatBorderCell(leftWidth, "┬") + dimLine("─┬─") + formatBorderCell(rightWidth, "┬"),
|
|
898
898
|
safeWidth,
|
|
899
899
|
),
|
|
900
900
|
);
|
|
@@ -931,7 +931,7 @@ class SplitDiffRenderer {
|
|
|
931
931
|
|
|
932
932
|
lines.push(
|
|
933
933
|
padRenderedLineWidth(
|
|
934
|
-
formatBorderCell(leftWidth, "┴") +
|
|
934
|
+
formatBorderCell(leftWidth, "┴") + dimLine("─┴─") + formatBorderCell(rightWidth, "┴"),
|
|
935
935
|
safeWidth,
|
|
936
936
|
),
|
|
937
937
|
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quandev104/pi-style",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "A native-layout, cohesive visual style package for Pi.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -42,18 +42,18 @@
|
|
|
42
42
|
"check": "npm run typecheck && npm run lint && npm run depcruise && npm run test && npm run build && npm run package:smoke"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
|
-
"@earendil-works/pi-agent-core": ">=0.83.0 <0.
|
|
46
|
-
"@earendil-works/pi-ai": ">=0.83.0 <0.
|
|
47
|
-
"@earendil-works/pi-coding-agent": ">=0.83.0 <0.
|
|
48
|
-
"@earendil-works/pi-tui": ">=0.83.0 <0.
|
|
45
|
+
"@earendil-works/pi-agent-core": ">=0.83.0 <0.85.0",
|
|
46
|
+
"@earendil-works/pi-ai": ">=0.83.0 <0.85.0",
|
|
47
|
+
"@earendil-works/pi-coding-agent": ">=0.83.0 <0.85.0",
|
|
48
|
+
"@earendil-works/pi-tui": ">=0.83.0 <0.85.0",
|
|
49
49
|
"typebox": ">=1.3.9 <2.0.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@biomejs/biome": "^2.5.0",
|
|
53
|
-
"@earendil-works/pi-agent-core": "^0.
|
|
54
|
-
"@earendil-works/pi-ai": "^0.
|
|
55
|
-
"@earendil-works/pi-coding-agent": "^0.
|
|
56
|
-
"@earendil-works/pi-tui": "^0.
|
|
53
|
+
"@earendil-works/pi-agent-core": "^0.84.0",
|
|
54
|
+
"@earendil-works/pi-ai": "^0.84.0",
|
|
55
|
+
"@earendil-works/pi-coding-agent": "^0.84.0",
|
|
56
|
+
"@earendil-works/pi-tui": "^0.84.0",
|
|
57
57
|
"@types/node": "^24.0.0",
|
|
58
58
|
"dependency-cruiser": "^17.4.3",
|
|
59
59
|
"git-cliff": "^2.13.1",
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
3
|
+
"name": "titanium-light",
|
|
4
|
+
"vars": {
|
|
5
|
+
"teal": "#5a8080",
|
|
6
|
+
"blue": "#547da7",
|
|
7
|
+
"green": "#588458",
|
|
8
|
+
"red": "#aa5555",
|
|
9
|
+
"yellow": "#9a7326",
|
|
10
|
+
"mediumGray": "#6c6c6c",
|
|
11
|
+
"dimGray": "#767676",
|
|
12
|
+
"lightGray": "#b0b0b0",
|
|
13
|
+
"selectedBg": "#d0d0e0",
|
|
14
|
+
"userMsgBg": "#e8e8e8",
|
|
15
|
+
"toolPendingBg": "#e8e8f0",
|
|
16
|
+
"toolSuccessBg": "#e8f0e8",
|
|
17
|
+
"toolErrorBg": "#f0e8e8",
|
|
18
|
+
"customMsgBg": "#ede7f6"
|
|
19
|
+
},
|
|
20
|
+
"colors": {
|
|
21
|
+
"accent": "teal",
|
|
22
|
+
"border": "blue",
|
|
23
|
+
"borderAccent": "teal",
|
|
24
|
+
"borderMuted": "lightGray",
|
|
25
|
+
"success": "green",
|
|
26
|
+
"error": "red",
|
|
27
|
+
"warning": "yellow",
|
|
28
|
+
"muted": "mediumGray",
|
|
29
|
+
"dim": "dimGray",
|
|
30
|
+
"text": "",
|
|
31
|
+
"thinkingText": "mediumGray",
|
|
32
|
+
|
|
33
|
+
"selectedBg": "selectedBg",
|
|
34
|
+
"userMessageBg": "userMsgBg",
|
|
35
|
+
"userMessageText": "",
|
|
36
|
+
"customMessageBg": "customMsgBg",
|
|
37
|
+
"customMessageText": "",
|
|
38
|
+
"customMessageLabel": "#7e57c2",
|
|
39
|
+
"toolPendingBg": "toolPendingBg",
|
|
40
|
+
"toolSuccessBg": "toolSuccessBg",
|
|
41
|
+
"toolErrorBg": "toolErrorBg",
|
|
42
|
+
"toolTitle": "",
|
|
43
|
+
"toolOutput": "mediumGray",
|
|
44
|
+
|
|
45
|
+
"mdHeading": "yellow",
|
|
46
|
+
"mdLink": "blue",
|
|
47
|
+
"mdLinkUrl": "dimGray",
|
|
48
|
+
"mdCode": "teal",
|
|
49
|
+
"mdCodeBlock": "green",
|
|
50
|
+
"mdCodeBlockBorder": "mediumGray",
|
|
51
|
+
"mdQuote": "mediumGray",
|
|
52
|
+
"mdQuoteBorder": "mediumGray",
|
|
53
|
+
"mdHr": "mediumGray",
|
|
54
|
+
"mdListBullet": "green",
|
|
55
|
+
|
|
56
|
+
"toolDiffAdded": "green",
|
|
57
|
+
"toolDiffRemoved": "red",
|
|
58
|
+
"toolDiffContext": "mediumGray",
|
|
59
|
+
"syntaxComment": "#008000",
|
|
60
|
+
"syntaxKeyword": "#0000FF",
|
|
61
|
+
"syntaxFunction": "#795E26",
|
|
62
|
+
"syntaxVariable": "#001080",
|
|
63
|
+
"syntaxString": "#A31515",
|
|
64
|
+
"syntaxNumber": "#098658",
|
|
65
|
+
"syntaxType": "#267F99",
|
|
66
|
+
"syntaxOperator": "#000000",
|
|
67
|
+
"syntaxPunctuation": "#000000",
|
|
68
|
+
|
|
69
|
+
"thinkingOff": "lightGray",
|
|
70
|
+
"thinkingMinimal": "#767676",
|
|
71
|
+
"thinkingLow": "blue",
|
|
72
|
+
"thinkingMedium": "teal",
|
|
73
|
+
"thinkingHigh": "#875f87",
|
|
74
|
+
"thinkingXhigh": "#8b008b",
|
|
75
|
+
"bashMode": "green"
|
|
76
|
+
},
|
|
77
|
+
"export": {
|
|
78
|
+
"pageBg": "#f8f8f8",
|
|
79
|
+
"cardBg": "#ffffff",
|
|
80
|
+
"infoBg": "#fffae6"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
3
|
+
"name": "titanium",
|
|
4
|
+
"vars": {
|
|
5
|
+
"brushedTitanium": "#151820",
|
|
6
|
+
"darkTitanium": "#0f1216",
|
|
7
|
+
"electricBlue": "#00b4ff",
|
|
8
|
+
"deepBlue": "#0082b3",
|
|
9
|
+
"titaniumGold": "#d4c090",
|
|
10
|
+
"brightAluminum": "#e8ecf4",
|
|
11
|
+
"dimAluminum": "#9ca3b0",
|
|
12
|
+
"warningAmber": "#ffb347",
|
|
13
|
+
"readoutGreen": "#00ff88",
|
|
14
|
+
"alertRed": "#ff4757",
|
|
15
|
+
"subtleGray": "#2a3038"
|
|
16
|
+
},
|
|
17
|
+
"colors": {
|
|
18
|
+
"accent": "electricBlue",
|
|
19
|
+
"border": "subtleGray",
|
|
20
|
+
"borderAccent": "electricBlue",
|
|
21
|
+
"borderMuted": "#1f252d",
|
|
22
|
+
"success": "readoutGreen",
|
|
23
|
+
"error": "alertRed",
|
|
24
|
+
"warning": "warningAmber",
|
|
25
|
+
"muted": "dimAluminum",
|
|
26
|
+
"dim": "#6b7280",
|
|
27
|
+
"text": "",
|
|
28
|
+
"thinkingText": "dimAluminum",
|
|
29
|
+
|
|
30
|
+
"selectedBg": "deepBlue",
|
|
31
|
+
"userMessageBg": "darkTitanium",
|
|
32
|
+
"userMessageText": "",
|
|
33
|
+
"customMessageBg": "subtleGray",
|
|
34
|
+
"customMessageText": "",
|
|
35
|
+
"customMessageLabel": "titaniumGold",
|
|
36
|
+
"toolPendingBg": "darkTitanium",
|
|
37
|
+
"toolSuccessBg": "darkTitanium",
|
|
38
|
+
"toolErrorBg": "#1a0f10",
|
|
39
|
+
"toolTitle": "",
|
|
40
|
+
"toolOutput": "dimAluminum",
|
|
41
|
+
|
|
42
|
+
"mdHeading": "electricBlue",
|
|
43
|
+
"mdLink": "electricBlue",
|
|
44
|
+
"mdLinkUrl": "deepBlue",
|
|
45
|
+
"mdCode": "readoutGreen",
|
|
46
|
+
"mdCodeBlock": "dimAluminum",
|
|
47
|
+
"mdCodeBlockBorder": "subtleGray",
|
|
48
|
+
"mdQuote": "dimAluminum",
|
|
49
|
+
"mdQuoteBorder": "subtleGray",
|
|
50
|
+
"mdHr": "subtleGray",
|
|
51
|
+
"mdListBullet": "electricBlue",
|
|
52
|
+
|
|
53
|
+
"toolDiffAdded": "readoutGreen",
|
|
54
|
+
"toolDiffRemoved": "alertRed",
|
|
55
|
+
"toolDiffContext": "dimAluminum",
|
|
56
|
+
"syntaxComment": "#6b7280",
|
|
57
|
+
"syntaxKeyword": "electricBlue",
|
|
58
|
+
"syntaxFunction": "readoutGreen",
|
|
59
|
+
"syntaxVariable": "brightAluminum",
|
|
60
|
+
"syntaxString": "titaniumGold",
|
|
61
|
+
"syntaxNumber": "warningAmber",
|
|
62
|
+
"syntaxType": "electricBlue",
|
|
63
|
+
"syntaxOperator": "electricBlue",
|
|
64
|
+
"syntaxPunctuation": "dimAluminum",
|
|
65
|
+
|
|
66
|
+
"thinkingOff": "#4a5058",
|
|
67
|
+
"thinkingMinimal": "#5a6068",
|
|
68
|
+
"thinkingLow": "#6a7078",
|
|
69
|
+
"thinkingMedium": "dimAluminum",
|
|
70
|
+
"thinkingHigh": "electricBlue",
|
|
71
|
+
"thinkingXhigh": "titaniumGold",
|
|
72
|
+
"bashMode": "readoutGreen"
|
|
73
|
+
},
|
|
74
|
+
"export": {
|
|
75
|
+
"pageBg": "brushedTitanium",
|
|
76
|
+
"cardBg": "darkTitanium",
|
|
77
|
+
"infoBg": "subtleGray"
|
|
78
|
+
}
|
|
79
|
+
}
|
package/themes/.gitkeep
DELETED
|
File without changes
|