@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.
Files changed (34) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +10 -6
  3. package/dist/extensions/pi-style.js +3939 -1431
  4. package/dist/extensions/pi-style.js.map +1 -1
  5. package/extension-src/pi-style/app/command-service.ts +2 -0
  6. package/extension-src/pi-style/domain/config-authorization.ts +6 -3
  7. package/extension-src/pi-style/domain/config-normalization.ts +21 -5
  8. package/extension-src/pi-style/domain/config-presets.ts +1 -1
  9. package/extension-src/pi-style/domain/config-types.ts +7 -3
  10. package/extension-src/pi-style/domain/theme.ts +6 -1
  11. package/extension-src/pi-style/features/editor/index.ts +169 -27
  12. package/extension-src/pi-style/features/messages/index.ts +66 -0
  13. package/extension-src/pi-style/features/tools/bash-execution.ts +112 -0
  14. package/extension-src/pi-style/features/tools/boxed/bash.ts +154 -130
  15. package/extension-src/pi-style/features/tools/boxed/batch.ts +50 -27
  16. package/extension-src/pi-style/features/tools/boxed/command-shape.ts +136 -0
  17. package/extension-src/pi-style/features/tools/boxed/find.ts +2 -2
  18. package/extension-src/pi-style/features/tools/boxed/gh.ts +1012 -0
  19. package/extension-src/pi-style/features/tools/boxed/git.ts +1960 -0
  20. package/extension-src/pi-style/features/tools/boxed/grep.ts +2 -2
  21. package/extension-src/pi-style/features/tools/boxed/output-tree.ts +9 -10
  22. package/extension-src/pi-style/features/tools/boxed/read.ts +3 -3
  23. package/extension-src/pi-style/features/tools/boxed/write.ts +2 -1
  24. package/extension-src/pi-style/pi/compatibility-coordinator.ts +32 -11
  25. package/extension-src/pi-style/pi/compatibility-probe.ts +341 -205
  26. package/extension-src/pi-style/pi/compatibility-registry.ts +19 -3
  27. package/extension-src/pi-style/pi/index.ts +21 -3
  28. package/extension-src/pi-style/pi/session-coordinator.ts +24 -0
  29. package/extension-src/pi-style/shared/box.ts +8 -4
  30. package/extension-src/pi-style/shared/split-diff.ts +9 -9
  31. package/package.json +9 -9
  32. package/themes/titanium-light.json +82 -0
  33. package/themes/titanium.json +79 -0
  34. 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
- const originalIdentity = current;
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
- const descriptor = { ...originalDescriptor, value: installed };
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 (safe: fingerprint-certified against
44
- // exact Pi 0.83.0, fail-closed elsewhere, conflict-preserving). The OFF switch is the
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", () => coordinator.app.runtime.current?.dismissStartup());
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 `${RESET_INTENSITY}${theme.fg("borderMuted", text)}`;
388
+ return dimLine(text);
385
389
  }
386
390
  function boxFrameText(theme: BoxTheme, text: string): string {
387
- return `${RESET_INTENSITY}${theme.fg("border", text)}`;
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 = this.ctx.fg("borderMuted", " │ ");
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
- this.ctx.fg("borderMuted", " │ ");
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
- this.ctx.fg("borderMuted", " │ ");
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 = this.ctx.fg("borderMuted", " │ ");
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 this.ctx.fg("borderMuted", chars.join(""));
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, "┬") + this.ctx.fg("borderMuted", "─┬─") + formatBorderCell(rightWidth, "┬"),
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, "┴") + this.ctx.fg("borderMuted", "─┴─") + formatBorderCell(rightWidth, "┴"),
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.4",
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.84.0",
46
- "@earendil-works/pi-ai": ">=0.83.0 <0.84.0",
47
- "@earendil-works/pi-coding-agent": ">=0.83.0 <0.84.0",
48
- "@earendil-works/pi-tui": ">=0.83.0 <0.84.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.83.0",
54
- "@earendil-works/pi-ai": "^0.83.0",
55
- "@earendil-works/pi-coding-agent": "^0.83.0",
56
- "@earendil-works/pi-tui": "^0.83.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