@oh-my-pi/pi-coding-agent 6.9.0 → 7.0.0

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 (143) hide show
  1. package/CHANGELOG.md +173 -51
  2. package/examples/sdk/04-skills.ts +1 -1
  3. package/package.json +6 -5
  4. package/src/cli/stats-cli.ts +191 -0
  5. package/src/core/agent-session.ts +214 -4
  6. package/src/core/auth-storage.ts +524 -202
  7. package/src/core/bash-executor.ts +1 -1
  8. package/src/core/extensions/index.ts +2 -0
  9. package/src/core/extensions/runner.ts +31 -0
  10. package/src/core/extensions/types.ts +24 -0
  11. package/src/core/messages.ts +48 -0
  12. package/src/core/model-registry.ts +7 -0
  13. package/src/core/python-executor.ts +29 -8
  14. package/src/core/python-gateway-coordinator.ts +55 -1
  15. package/src/core/python-prelude.py +201 -8
  16. package/src/core/session-manager.ts +10 -1
  17. package/src/core/tools/bash.ts +5 -7
  18. package/src/core/tools/find.ts +18 -5
  19. package/src/core/tools/index.ts +1 -1
  20. package/src/core/tools/lsp/index.ts +13 -2
  21. package/src/core/tools/patch/applicator.ts +115 -17
  22. package/src/core/tools/patch/index.ts +1 -1
  23. package/src/core/tools/patch/normalize.ts +185 -10
  24. package/src/core/tools/python.ts +445 -86
  25. package/src/core/tools/read.ts +4 -4
  26. package/src/core/tools/task/executor.ts +2 -6
  27. package/src/core/tools/task/index.ts +30 -12
  28. package/src/core/tools/task/render.ts +163 -30
  29. package/src/core/tools/task/template.ts +37 -0
  30. package/src/core/tools/task/types.ts +6 -2
  31. package/src/core/tools/task/worker.ts +1 -1
  32. package/src/index.ts +2 -0
  33. package/src/main.ts +12 -0
  34. package/src/modes/interactive/components/python-execution.ts +180 -0
  35. package/src/modes/interactive/components/welcome.ts +1 -0
  36. package/src/modes/interactive/controllers/command-controller.ts +395 -0
  37. package/src/modes/interactive/controllers/input-controller.ts +83 -8
  38. package/src/modes/interactive/interactive-mode.ts +16 -1
  39. package/src/modes/interactive/theme/dark.json +2 -9
  40. package/src/modes/interactive/theme/defaults/alabaster.json +2 -8
  41. package/src/modes/interactive/theme/defaults/amethyst.json +2 -9
  42. package/src/modes/interactive/theme/defaults/anthracite.json +2 -9
  43. package/src/modes/interactive/theme/defaults/basalt.json +89 -88
  44. package/src/modes/interactive/theme/defaults/birch.json +2 -8
  45. package/src/modes/interactive/theme/defaults/dark-abyss.json +2 -8
  46. package/src/modes/interactive/theme/defaults/dark-arctic.json +2 -9
  47. package/src/modes/interactive/theme/defaults/dark-aurora.json +3 -2
  48. package/src/modes/interactive/theme/defaults/dark-catppuccin.json +2 -1
  49. package/src/modes/interactive/theme/defaults/dark-cavern.json +2 -8
  50. package/src/modes/interactive/theme/defaults/dark-copper.json +3 -2
  51. package/src/modes/interactive/theme/defaults/dark-cosmos.json +2 -8
  52. package/src/modes/interactive/theme/defaults/dark-cyberpunk.json +2 -9
  53. package/src/modes/interactive/theme/defaults/dark-dracula.json +2 -9
  54. package/src/modes/interactive/theme/defaults/dark-eclipse.json +2 -8
  55. package/src/modes/interactive/theme/defaults/dark-ember.json +3 -2
  56. package/src/modes/interactive/theme/defaults/dark-equinox.json +2 -8
  57. package/src/modes/interactive/theme/defaults/dark-forest.json +2 -9
  58. package/src/modes/interactive/theme/defaults/dark-github.json +2 -9
  59. package/src/modes/interactive/theme/defaults/dark-gruvbox.json +2 -9
  60. package/src/modes/interactive/theme/defaults/dark-lavender.json +3 -2
  61. package/src/modes/interactive/theme/defaults/dark-lunar.json +2 -8
  62. package/src/modes/interactive/theme/defaults/dark-midnight.json +3 -2
  63. package/src/modes/interactive/theme/defaults/dark-monochrome.json +2 -9
  64. package/src/modes/interactive/theme/defaults/dark-monokai.json +2 -9
  65. package/src/modes/interactive/theme/defaults/dark-nebula.json +2 -8
  66. package/src/modes/interactive/theme/defaults/dark-nord.json +2 -9
  67. package/src/modes/interactive/theme/defaults/dark-ocean.json +2 -9
  68. package/src/modes/interactive/theme/defaults/dark-one.json +2 -9
  69. package/src/modes/interactive/theme/defaults/dark-rainforest.json +2 -8
  70. package/src/modes/interactive/theme/defaults/dark-reef.json +2 -8
  71. package/src/modes/interactive/theme/defaults/dark-retro.json +2 -9
  72. package/src/modes/interactive/theme/defaults/dark-rose-pine.json +2 -1
  73. package/src/modes/interactive/theme/defaults/dark-sakura.json +3 -2
  74. package/src/modes/interactive/theme/defaults/dark-slate.json +3 -2
  75. package/src/modes/interactive/theme/defaults/dark-solarized.json +2 -1
  76. package/src/modes/interactive/theme/defaults/dark-solstice.json +2 -8
  77. package/src/modes/interactive/theme/defaults/dark-starfall.json +2 -8
  78. package/src/modes/interactive/theme/defaults/dark-sunset.json +2 -9
  79. package/src/modes/interactive/theme/defaults/dark-swamp.json +2 -8
  80. package/src/modes/interactive/theme/defaults/dark-synthwave.json +2 -1
  81. package/src/modes/interactive/theme/defaults/dark-taiga.json +2 -8
  82. package/src/modes/interactive/theme/defaults/dark-terminal.json +3 -2
  83. package/src/modes/interactive/theme/defaults/dark-tokyo-night.json +2 -9
  84. package/src/modes/interactive/theme/defaults/dark-tundra.json +2 -8
  85. package/src/modes/interactive/theme/defaults/dark-twilight.json +2 -8
  86. package/src/modes/interactive/theme/defaults/dark-volcanic.json +2 -8
  87. package/src/modes/interactive/theme/defaults/graphite.json +2 -9
  88. package/src/modes/interactive/theme/defaults/light-arctic.json +2 -1
  89. package/src/modes/interactive/theme/defaults/light-aurora-day.json +2 -8
  90. package/src/modes/interactive/theme/defaults/light-canyon.json +2 -8
  91. package/src/modes/interactive/theme/defaults/light-catppuccin.json +2 -1
  92. package/src/modes/interactive/theme/defaults/light-cirrus.json +2 -8
  93. package/src/modes/interactive/theme/defaults/light-coral.json +3 -2
  94. package/src/modes/interactive/theme/defaults/light-cyberpunk.json +2 -9
  95. package/src/modes/interactive/theme/defaults/light-dawn.json +2 -8
  96. package/src/modes/interactive/theme/defaults/light-dunes.json +2 -8
  97. package/src/modes/interactive/theme/defaults/light-eucalyptus.json +3 -2
  98. package/src/modes/interactive/theme/defaults/light-forest.json +2 -9
  99. package/src/modes/interactive/theme/defaults/light-frost.json +3 -2
  100. package/src/modes/interactive/theme/defaults/light-github.json +2 -1
  101. package/src/modes/interactive/theme/defaults/light-glacier.json +2 -8
  102. package/src/modes/interactive/theme/defaults/light-gruvbox.json +2 -9
  103. package/src/modes/interactive/theme/defaults/light-haze.json +2 -8
  104. package/src/modes/interactive/theme/defaults/light-honeycomb.json +3 -2
  105. package/src/modes/interactive/theme/defaults/light-lagoon.json +2 -8
  106. package/src/modes/interactive/theme/defaults/light-lavender.json +3 -2
  107. package/src/modes/interactive/theme/defaults/light-meadow.json +2 -8
  108. package/src/modes/interactive/theme/defaults/light-mint.json +3 -2
  109. package/src/modes/interactive/theme/defaults/light-monochrome.json +2 -1
  110. package/src/modes/interactive/theme/defaults/light-ocean.json +2 -9
  111. package/src/modes/interactive/theme/defaults/light-one.json +2 -8
  112. package/src/modes/interactive/theme/defaults/light-opal.json +2 -8
  113. package/src/modes/interactive/theme/defaults/light-orchard.json +2 -8
  114. package/src/modes/interactive/theme/defaults/light-paper.json +3 -2
  115. package/src/modes/interactive/theme/defaults/light-prism.json +2 -8
  116. package/src/modes/interactive/theme/defaults/light-retro.json +2 -9
  117. package/src/modes/interactive/theme/defaults/light-sand.json +3 -2
  118. package/src/modes/interactive/theme/defaults/light-savanna.json +2 -8
  119. package/src/modes/interactive/theme/defaults/light-solarized.json +2 -1
  120. package/src/modes/interactive/theme/defaults/light-soleil.json +2 -8
  121. package/src/modes/interactive/theme/defaults/light-sunset.json +2 -9
  122. package/src/modes/interactive/theme/defaults/light-synthwave.json +2 -9
  123. package/src/modes/interactive/theme/defaults/light-tokyo-night.json +2 -9
  124. package/src/modes/interactive/theme/defaults/light-wetland.json +2 -8
  125. package/src/modes/interactive/theme/defaults/light-zenith.json +2 -8
  126. package/src/modes/interactive/theme/defaults/limestone.json +2 -8
  127. package/src/modes/interactive/theme/defaults/mahogany.json +2 -9
  128. package/src/modes/interactive/theme/defaults/marble.json +2 -8
  129. package/src/modes/interactive/theme/defaults/obsidian.json +89 -88
  130. package/src/modes/interactive/theme/defaults/onyx.json +89 -88
  131. package/src/modes/interactive/theme/defaults/pearl.json +2 -8
  132. package/src/modes/interactive/theme/defaults/porcelain.json +89 -88
  133. package/src/modes/interactive/theme/defaults/quartz.json +2 -8
  134. package/src/modes/interactive/theme/defaults/sandstone.json +2 -8
  135. package/src/modes/interactive/theme/defaults/titanium.json +88 -87
  136. package/src/modes/interactive/theme/light.json +2 -8
  137. package/src/modes/interactive/theme/theme-schema.json +5 -0
  138. package/src/modes/interactive/theme/theme.ts +7 -0
  139. package/src/modes/interactive/types.ts +7 -1
  140. package/src/modes/interactive/utils/ui-helpers.ts +20 -0
  141. package/src/prompts/system/system-prompt.md +88 -78
  142. package/src/prompts/tools/python.md +39 -2
  143. package/src/prompts/tools/task.md +8 -13
@@ -1,4 +1,6 @@
1
- import { rm } from "node:fs/promises";
1
+ import { spawn } from "node:child_process";
2
+ import type { FileHandle } from "node:fs/promises";
3
+ import { open, rm } from "node:fs/promises";
2
4
  import * as os from "node:os";
3
5
  import * as path from "node:path";
4
6
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
@@ -31,6 +33,12 @@ export class InputController {
31
33
  this.ctx.editor.setText("");
32
34
  this.ctx.isBashMode = false;
33
35
  this.ctx.updateEditorBorderColor();
36
+ } else if (this.ctx.isPythonMode) {
37
+ this.ctx.editor.setText("");
38
+ this.ctx.isPythonMode = false;
39
+ this.ctx.updateEditorBorderColor();
40
+ } else if (this.ctx.session.isPythonRunning) {
41
+ this.ctx.session.abortPython();
34
42
  } else if (!this.ctx.editor.getText().trim()) {
35
43
  // Double-escape with empty editor triggers /tree or /branch based on setting
36
44
  const now = Date.now();
@@ -83,8 +91,11 @@ export class InputController {
83
91
 
84
92
  this.ctx.editor.onChange = (text: string) => {
85
93
  const wasBashMode = this.ctx.isBashMode;
94
+ const wasPythonMode = this.ctx.isPythonMode;
95
+ const trimmed = text.trimStart();
86
96
  this.ctx.isBashMode = text.trimStart().startsWith("!");
87
- if (wasBashMode !== this.ctx.isBashMode) {
97
+ this.ctx.isPythonMode = trimmed.startsWith("$") && !trimmed.startsWith("${");
98
+ if (wasBashMode !== this.ctx.isBashMode || wasPythonMode !== this.ctx.isPythonMode) {
88
99
  this.ctx.updateEditorBorderColor();
89
100
  }
90
101
  };
@@ -134,6 +145,16 @@ export class InputController {
134
145
 
135
146
  if (!text) return;
136
147
 
148
+ // Continue shortcuts: "." or "c" sends empty message (agent continues, no visible message)
149
+ if (text === "." || text === "c") {
150
+ if (this.ctx.onInputCallback) {
151
+ this.ctx.editor.setText("");
152
+ this.ctx.pendingImages = [];
153
+ this.ctx.onInputCallback({ text: "" });
154
+ }
155
+ return;
156
+ }
157
+
137
158
  const runner = this.ctx.session.extensionRunner;
138
159
  let inputImages = this.ctx.pendingImages.length > 0 ? [...this.ctx.pendingImages] : undefined;
139
160
 
@@ -190,6 +211,11 @@ export class InputController {
190
211
  this.ctx.editor.setText("");
191
212
  return;
192
213
  }
214
+ if (text === "/usage") {
215
+ await this.ctx.handleUsageCommand();
216
+ this.ctx.editor.setText("");
217
+ return;
218
+ }
193
219
  if (text === "/changelog") {
194
220
  this.ctx.handleChangelogCommand();
195
221
  this.ctx.editor.setText("");
@@ -309,6 +335,24 @@ export class InputController {
309
335
  }
310
336
  }
311
337
 
338
+ // Handle python command ($ for normal, $$ for excluded from context)
339
+ if (text.startsWith("$")) {
340
+ const isExcluded = text.startsWith("$$");
341
+ const code = isExcluded ? text.slice(2).trim() : text.slice(1).trim();
342
+ if (code) {
343
+ if (this.ctx.session.isPythonRunning) {
344
+ this.ctx.showWarning("A Python execution is already running. Press Esc to cancel it first.");
345
+ this.ctx.editor.setText(text);
346
+ return;
347
+ }
348
+ this.ctx.editor.addToHistory(text);
349
+ await this.ctx.handlePythonCommand(code, isExcluded);
350
+ this.ctx.isPythonMode = false;
351
+ this.ctx.updateEditorBorderColor();
352
+ return;
353
+ }
354
+ }
355
+
312
356
  // Queue input during compaction
313
357
  if (this.ctx.session.isCompacting) {
314
358
  if (this.ctx.pendingImages.length > 0) {
@@ -587,6 +631,25 @@ export class InputController {
587
631
  this.ctx.showStatus(`Thinking blocks: ${this.ctx.hideThinkingBlock ? "hidden" : "visible"}`);
588
632
  }
589
633
 
634
+ private getEditorTerminalPath(): string | null {
635
+ if (process.platform === "win32") {
636
+ return null;
637
+ }
638
+ return "/dev/tty";
639
+ }
640
+
641
+ private async openEditorTerminalHandle(): Promise<FileHandle | null> {
642
+ const terminalPath = this.getEditorTerminalPath();
643
+ if (!terminalPath) {
644
+ return null;
645
+ }
646
+ try {
647
+ return await open(terminalPath, "r+");
648
+ } catch {
649
+ return null;
650
+ }
651
+ }
652
+
590
653
  async openExternalEditor(): Promise<void> {
591
654
  // Determine editor (respect $VISUAL, then $EDITOR)
592
655
  const editorCmd = process.env.VISUAL || process.env.EDITOR;
@@ -598,23 +661,27 @@ export class InputController {
598
661
  const currentText = this.ctx.editor.getText();
599
662
  const tmpFile = path.join(os.tmpdir(), `omp-editor-${nanoid()}.omp.md`);
600
663
 
664
+ let ttyHandle: FileHandle | null = null;
601
665
  try {
602
666
  // Write current content to temp file
603
667
  await Bun.write(tmpFile, currentText);
604
668
 
605
669
  // Stop TUI to release terminal
670
+ ttyHandle = await this.openEditorTerminalHandle();
606
671
  this.ctx.ui.stop();
607
672
 
608
673
  // Split by space to support editor arguments (e.g., "code --wait")
609
674
  const [editor, ...editorArgs] = editorCmd.split(" ");
610
675
 
611
- // Spawn editor synchronously with inherited stdio for interactive editing
612
- const child = Bun.spawn([editor, ...editorArgs, tmpFile], {
613
- stdin: "inherit",
614
- stdout: "inherit",
615
- stderr: "inherit",
676
+ const stdio: [number | "inherit", number | "inherit", number | "inherit"] = ttyHandle
677
+ ? [ttyHandle.fd, ttyHandle.fd, ttyHandle.fd]
678
+ : ["inherit", "inherit", "inherit"];
679
+
680
+ const child = spawn(editor, [...editorArgs, tmpFile], { stdio });
681
+ const exitCode = await new Promise<number>((resolve, reject) => {
682
+ child.once("exit", (code, signal) => resolve(code ?? (signal ? -1 : 0)));
683
+ child.once("error", (error) => reject(error));
616
684
  });
617
- const exitCode = await child.exited;
618
685
 
619
686
  // On successful exit (exitCode 0), replace editor content
620
687
  if (exitCode === 0) {
@@ -622,6 +689,10 @@ export class InputController {
622
689
  this.ctx.editor.setText(newContent);
623
690
  }
624
691
  // On non-zero exit, keep original text (no action needed)
692
+ } catch (error) {
693
+ this.ctx.showWarning(
694
+ `Failed to open external editor: ${error instanceof Error ? error.message : String(error)}`,
695
+ );
625
696
  } finally {
626
697
  // Clean up temp file
627
698
  try {
@@ -630,6 +701,10 @@ export class InputController {
630
701
  // Ignore cleanup errors
631
702
  }
632
703
 
704
+ if (ttyHandle) {
705
+ await ttyHandle.close();
706
+ }
707
+
633
708
  // Restart TUI
634
709
  this.ctx.ui.start();
635
710
  this.ctx.ui.requestRender();
@@ -5,7 +5,7 @@
5
5
 
6
6
  import * as path from "node:path";
7
7
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
8
- import type { AssistantMessage, ImageContent, Message } from "@oh-my-pi/pi-ai";
8
+ import type { AssistantMessage, ImageContent, Message, UsageReport } from "@oh-my-pi/pi-ai";
9
9
  import type { Component, Loader, SlashCommand } from "@oh-my-pi/pi-tui";
10
10
  import {
11
11
  CombinedAutocompleteProvider,
@@ -35,6 +35,7 @@ import { DynamicBorder } from "./components/dynamic-border";
35
35
  import type { HookEditorComponent } from "./components/hook-editor";
36
36
  import type { HookInputComponent } from "./components/hook-input";
37
37
  import type { HookSelectorComponent } from "./components/hook-selector";
38
+ import type { PythonExecutionComponent } from "./components/python-execution";
38
39
  import { StatusLineComponent } from "./components/status-line";
39
40
  import type { ToolExecutionHandle } from "./components/tool-execution";
40
41
  import { WelcomeComponent } from "./components/welcome";
@@ -93,6 +94,9 @@ export class InteractiveMode implements InteractiveModeContext {
93
94
  public pendingTools = new Map<string, ToolExecutionHandle>();
94
95
  public pendingBashComponents: BashExecutionComponent[] = [];
95
96
  public bashComponent: BashExecutionComponent | undefined = undefined;
97
+ public pendingPythonComponents: PythonExecutionComponent[] = [];
98
+ public pythonComponent: PythonExecutionComponent | undefined = undefined;
99
+ public isPythonMode = false;
96
100
  public streamingComponent: AssistantMessageComponent | undefined = undefined;
97
101
  public streamingMessage: AssistantMessage | undefined = undefined;
98
102
  public loadingAnimation: Loader | undefined = undefined;
@@ -183,6 +187,7 @@ export class InteractiveMode implements InteractiveModeContext {
183
187
  { name: "share", description: "Share session as a secret GitHub gist" },
184
188
  { name: "copy", description: "Copy last agent message to clipboard" },
185
189
  { name: "session", description: "Show session info and stats" },
190
+ { name: "usage", description: "Show provider usage and limits" },
186
191
  { name: "extensions", description: "Open Extension Control Center dashboard" },
187
192
  { name: "status", description: "Alias for /extensions" },
188
193
  { name: "changelog", description: "Show changelog entries" },
@@ -367,6 +372,8 @@ export class InteractiveMode implements InteractiveModeContext {
367
372
  updateEditorBorderColor(): void {
368
373
  if (this.isBashMode) {
369
374
  this.editor.borderColor = theme.getBashModeBorderColor();
375
+ } else if (this.isPythonMode) {
376
+ this.editor.borderColor = theme.getPythonModeBorderColor();
370
377
  } else {
371
378
  const level = this.session.thinkingLevel || "off";
372
379
  this.editor.borderColor = theme.getThinkingBorderColor(level);
@@ -607,6 +614,10 @@ export class InteractiveMode implements InteractiveModeContext {
607
614
  this.commandController.handleSessionCommand();
608
615
  }
609
616
 
617
+ handleUsageCommand(reports?: UsageReport[] | null): Promise<void> {
618
+ return this.commandController.handleUsageCommand(reports);
619
+ }
620
+
610
621
  handleChangelogCommand(): void {
611
622
  this.commandController.handleChangelogCommand();
612
623
  }
@@ -631,6 +642,10 @@ export class InteractiveMode implements InteractiveModeContext {
631
642
  return this.commandController.handleBashCommand(command, excludeFromContext);
632
643
  }
633
644
 
645
+ handlePythonCommand(code: string, excludeFromContext?: boolean): Promise<void> {
646
+ return this.commandController.handlePythonCommand(code, excludeFromContext);
647
+ }
648
+
634
649
  handleCompactCommand(customInstructions?: string): Promise<void> {
635
650
  return this.commandController.handleCompactCommand(customInstructions);
636
651
  }
@@ -30,7 +30,6 @@
30
30
  "dim": "dimGray",
31
31
  "text": "",
32
32
  "thinkingText": "gray",
33
-
34
33
  "selectedBg": "selectedBg",
35
34
  "userMessageBg": "userMsgBg",
36
35
  "userMessageText": "",
@@ -42,7 +41,6 @@
42
41
  "toolErrorBg": "toolErrorBg",
43
42
  "toolTitle": "",
44
43
  "toolOutput": "gray",
45
-
46
44
  "mdHeading": "#febc38",
47
45
  "mdLink": "#0088fa",
48
46
  "mdLinkUrl": "dimGray",
@@ -53,13 +51,10 @@
53
51
  "mdQuoteBorder": "darkGray",
54
52
  "mdHr": "darkGray",
55
53
  "mdListBullet": "accent",
56
-
57
54
  "toolDiffAdded": "green",
58
55
  "toolDiffRemoved": "red",
59
56
  "toolDiffContext": "gray",
60
-
61
57
  "link": "#0088fa",
62
-
63
58
  "syntaxComment": "#6A9955",
64
59
  "syntaxKeyword": "#569CD6",
65
60
  "syntaxFunction": "#DCDCAA",
@@ -69,16 +64,13 @@
69
64
  "syntaxType": "#4EC9B0",
70
65
  "syntaxOperator": "#D4D4D4",
71
66
  "syntaxPunctuation": "#D4D4D4",
72
-
73
67
  "thinkingOff": "darkGray",
74
68
  "thinkingMinimal": "dimGray",
75
69
  "thinkingLow": "#178fb9",
76
70
  "thinkingMedium": "#0088fa",
77
71
  "thinkingHigh": "#b281d6",
78
72
  "thinkingXhigh": "#e5c1ff",
79
-
80
73
  "bashMode": "cyan",
81
-
82
74
  "statusLineBg": "#121212",
83
75
  "statusLineSep": 244,
84
76
  "statusLineModel": "#d787af",
@@ -92,7 +84,8 @@
92
84
  "statusLineUntracked": 39,
93
85
  "statusLineOutput": 205,
94
86
  "statusLineCost": 205,
95
- "statusLineSubagents": "accent"
87
+ "statusLineSubagents": "accent",
88
+ "pythonMode": "yellow"
96
89
  },
97
90
  "export": {
98
91
  "pageBg": "#18181e",
@@ -29,7 +29,6 @@
29
29
  "dim": "#909098",
30
30
  "text": "",
31
31
  "thinkingText": "carvedDepth",
32
-
33
32
  "selectedBg": "selectedBg",
34
33
  "userMessageBg": "userMsgBg",
35
34
  "userMessageText": "",
@@ -41,7 +40,6 @@
41
40
  "toolErrorBg": "toolErrorBg",
42
41
  "toolTitle": "",
43
42
  "toolOutput": "carvedDepth",
44
-
45
43
  "mdHeading": "chiseledBlack",
46
44
  "mdLink": "shadowGray",
47
45
  "mdLinkUrl": "carvedDepth",
@@ -52,11 +50,9 @@
52
50
  "mdQuoteBorder": "subtleShadow",
53
51
  "mdHr": "subtleShadow",
54
52
  "mdListBullet": "shadowGray",
55
-
56
53
  "toolDiffAdded": "#405840",
57
54
  "toolDiffRemoved": "#704040",
58
55
  "toolDiffContext": "carvedDepth",
59
-
60
56
  "syntaxComment": "#707880",
61
57
  "syntaxKeyword": "#303840",
62
58
  "syntaxFunction": "chiseledBlack",
@@ -66,16 +62,13 @@
66
62
  "syntaxType": "#303840",
67
63
  "syntaxOperator": "#404850",
68
64
  "syntaxPunctuation": "#505860",
69
-
70
65
  "thinkingOff": "#c0c0c8",
71
66
  "thinkingMinimal": "#a0a0a8",
72
67
  "thinkingLow": "#808090",
73
68
  "thinkingMedium": "#606870",
74
69
  "thinkingHigh": "#505860",
75
70
  "thinkingXhigh": "#303840",
76
-
77
71
  "bashMode": "#405840",
78
-
79
72
  "statusLineBg": "#ececf0",
80
73
  "statusLineSep": "#a0a0a8",
81
74
  "statusLineModel": "#505860",
@@ -89,7 +82,8 @@
89
82
  "statusLineUntracked": 31,
90
83
  "statusLineOutput": 133,
91
84
  "statusLineCost": 133,
92
- "statusLineSubagents": "shadowGray"
85
+ "statusLineSubagents": "shadowGray",
86
+ "pythonMode": "#f0c040"
93
87
  },
94
88
  "export": {
95
89
  "pageBg": "#fdfcfb",
@@ -31,7 +31,6 @@
31
31
  "dim": "#6a5a78",
32
32
  "text": "",
33
33
  "thinkingText": "#8b7a99",
34
-
35
34
  "selectedBg": "selectedBg",
36
35
  "userMessageBg": "userMsgBg",
37
36
  "userMessageText": "",
@@ -43,7 +42,6 @@
43
42
  "toolErrorBg": "toolErrorBg",
44
43
  "toolTitle": "",
45
44
  "toolOutput": "#8b7a99",
46
-
47
45
  "mdHeading": "amethyst",
48
46
  "mdLink": "violet",
49
47
  "mdLinkUrl": "#6a5a78",
@@ -54,13 +52,10 @@
54
52
  "mdQuoteBorder": "crystalFacet",
55
53
  "mdHr": "crystalFacet",
56
54
  "mdListBullet": "amethyst",
57
-
58
55
  "toolDiffAdded": "#8eb897",
59
56
  "toolDiffRemoved": "#d96c75",
60
57
  "toolDiffContext": "#8b7a99",
61
-
62
58
  "link": "violet",
63
-
64
59
  "syntaxComment": "#7a6b88",
65
60
  "syntaxKeyword": "amethyst",
66
61
  "syntaxFunction": "gold",
@@ -70,16 +65,13 @@
70
65
  "syntaxType": "violet",
71
66
  "syntaxOperator": "quartz",
72
67
  "syntaxPunctuation": "#c0b0cf",
73
-
74
68
  "thinkingOff": "crystalFacet",
75
69
  "thinkingMinimal": "#6a5a78",
76
70
  "thinkingLow": "deepPurple",
77
71
  "thinkingMedium": "violet",
78
72
  "thinkingHigh": "amethyst",
79
73
  "thinkingXhigh": "lavender",
80
-
81
74
  "bashMode": "amethyst",
82
-
83
75
  "statusLineBg": "caveDeep",
84
76
  "statusLineSep": 240,
85
77
  "statusLineModel": "roseQuartz",
@@ -93,7 +85,8 @@
93
85
  "statusLineUntracked": 183,
94
86
  "statusLineOutput": 213,
95
87
  "statusLineCost": 213,
96
- "statusLineSubagents": "amethyst"
88
+ "statusLineSubagents": "amethyst",
89
+ "pythonMode": "gold"
97
90
  },
98
91
  "export": {
99
92
  "pageBg": "caveDark",
@@ -28,7 +28,6 @@
28
28
  "dim": "soot",
29
29
  "text": "",
30
30
  "thinkingText": "soot",
31
-
32
31
  "selectedBg": "#252932",
33
32
  "userMessageBg": "#1a1511",
34
33
  "userMessageText": "",
@@ -40,7 +39,6 @@
40
39
  "toolErrorBg": "#221617",
41
40
  "toolTitle": "",
42
41
  "toolOutput": "ashGray",
43
-
44
42
  "mdHeading": "ember",
45
43
  "mdLink": "#6ba3d4",
46
44
  "mdLinkUrl": "soot",
@@ -51,13 +49,10 @@
51
49
  "mdQuoteBorder": "sootDark",
52
50
  "mdHr": "steel",
53
51
  "mdListBullet": "ember",
54
-
55
52
  "toolDiffAdded": "success",
56
53
  "toolDiffRemoved": "error",
57
54
  "toolDiffContext": "soot",
58
-
59
55
  "link": "#6ba3d4",
60
-
61
56
  "syntaxComment": "#6b8099",
62
57
  "syntaxKeyword": "#7ba8d4",
63
58
  "syntaxFunction": "#e8a069",
@@ -67,16 +62,13 @@
67
62
  "syntaxType": "#67b8a8",
68
63
  "syntaxOperator": "#b8bfcc",
69
64
  "syntaxPunctuation": "#9ca3b5",
70
-
71
65
  "thinkingOff": "sootDark",
72
66
  "thinkingMinimal": "soot",
73
67
  "thinkingLow": "#5f7fa3",
74
68
  "thinkingMedium": "#6ba3d4",
75
69
  "thinkingHigh": "#c99a6e",
76
70
  "thinkingXhigh": "#e8b089",
77
-
78
71
  "bashMode": "#6ba3d4",
79
-
80
72
  "statusLineBg": "#0f1114",
81
73
  "statusLineSep": 240,
82
74
  "statusLineModel": "#c99a6e",
@@ -90,7 +82,8 @@
90
82
  "statusLineUntracked": 74,
91
83
  "statusLineOutput": 173,
92
84
  "statusLineCost": 173,
93
- "statusLineSubagents": "ember"
85
+ "statusLineSubagents": "ember",
86
+ "pythonMode": "#f0c040"
94
87
  },
95
88
  "export": {
96
89
  "pageBg": "#121419",
@@ -1,90 +1,91 @@
1
1
  {
2
- "$schema": "https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/theme-schema.json",
3
- "name": "basalt",
4
- "vars": {
5
- "charcoal": "#171613",
6
- "coolingLava": "#3a3530",
7
- "warmGray": "#4a433d",
8
- "pumice": "#e4e0d8",
9
- "dustyWhite": "#cac5bd",
10
- "ironOxide": "#c45a3a",
11
- "rustOrange": "#d97651",
12
- "mineralGreen": "#6a9a6a",
13
- "lichtenGreen": "#8bb88b",
14
- "obsidian": "#0f0d0b",
15
- "emberRed": "#b84a2c",
16
- "ashGray": "#5a524b"
17
- },
18
- "colors": {
19
- "accent": "#c45a3a",
20
- "border": "#3a3530",
21
- "borderAccent": "#4a433d",
22
- "borderMuted": "#2a2520",
23
- "success": "#6a9a6a",
24
- "error": "#b84a2c",
25
- "warning": "#d97651",
26
- "muted": "#5a524b",
27
- "dim": "#4a433d",
28
- "text": "",
29
- "thinkingText": "#cac5bd",
30
- "selectedBg": "#2a2520",
31
- "userMessageBg": "#3a3530",
32
- "userMessageText": "",
33
- "customMessageBg": "#4a433d",
34
- "customMessageText": "",
35
- "customMessageLabel": "#c45a3a",
36
- "toolPendingBg": "#2a2520",
37
- "toolSuccessBg": "#1f2520",
38
- "toolErrorBg": "#2a1f1d",
39
- "toolTitle": "",
40
- "toolOutput": "#cac5bd",
41
- "mdHeading": "#c45a3a",
42
- "mdLink": "#8bb88b",
43
- "mdLinkUrl": "#6a9a6a",
44
- "mdCode": "#d97651",
45
- "mdCodeBlock": "#cac5bd",
46
- "mdCodeBlockBorder": "#3a3530",
47
- "mdQuote": "#cac5bd",
48
- "mdQuoteBorder": "#4a433d",
49
- "mdHr": "#3a3530",
50
- "mdListBullet": "#c45a3a",
51
- "toolDiffAdded": "#6a9a6a",
52
- "toolDiffRemoved": "#b84a2c",
53
- "toolDiffContext": "#5a524b",
54
- "syntaxComment": "#5a524b",
55
- "syntaxKeyword": "#c45a3a",
56
- "syntaxFunction": "#8bb88b",
57
- "syntaxVariable": "#e4e0d8",
58
- "syntaxString": "#6a9a6a",
59
- "syntaxNumber": "#d97651",
60
- "syntaxType": "#c45a3a",
61
- "syntaxOperator": "#cac5bd",
62
- "syntaxPunctuation": "#cac5bd",
63
- "thinkingOff": "#3a3530",
64
- "thinkingMinimal": "#4a433d",
65
- "thinkingLow": "#5a524b",
66
- "thinkingMedium": "#6a605a",
67
- "thinkingHigh": "#7a706a",
68
- "thinkingXhigh": "#8a807a",
69
- "bashMode": "#c45a3a",
70
- "statusLineBg": "#0f0d0b",
71
- "statusLineSep": "#3a3530",
72
- "statusLineModel": "#c45a3a",
73
- "statusLinePath": "#cac5bd",
74
- "statusLineGitClean": "#6a9a6a",
75
- "statusLineGitDirty": "#d97651",
76
- "statusLineContext": "#8bb88b",
77
- "statusLineSpend": "#d97651",
78
- "statusLineStaged": "#6a9a6a",
79
- "statusLineDirty": "#d97651",
80
- "statusLineUntracked": "#5a524b",
81
- "statusLineOutput": "#cac5bd",
82
- "statusLineCost": "#d97651",
83
- "statusLineSubagents": "#c45a3a"
84
- },
85
- "export": {
86
- "pageBg": "#171613",
87
- "cardBg": "#1f1c19",
88
- "infoBg": "#2a2520"
89
- }
2
+ "$schema": "https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/theme-schema.json",
3
+ "name": "basalt",
4
+ "vars": {
5
+ "charcoal": "#171613",
6
+ "coolingLava": "#3a3530",
7
+ "warmGray": "#4a433d",
8
+ "pumice": "#e4e0d8",
9
+ "dustyWhite": "#cac5bd",
10
+ "ironOxide": "#c45a3a",
11
+ "rustOrange": "#d97651",
12
+ "mineralGreen": "#6a9a6a",
13
+ "lichtenGreen": "#8bb88b",
14
+ "obsidian": "#0f0d0b",
15
+ "emberRed": "#b84a2c",
16
+ "ashGray": "#5a524b"
17
+ },
18
+ "colors": {
19
+ "accent": "#c45a3a",
20
+ "border": "#3a3530",
21
+ "borderAccent": "#4a433d",
22
+ "borderMuted": "#2a2520",
23
+ "success": "#6a9a6a",
24
+ "error": "#b84a2c",
25
+ "warning": "#d97651",
26
+ "muted": "#5a524b",
27
+ "dim": "#4a433d",
28
+ "text": "",
29
+ "thinkingText": "#cac5bd",
30
+ "selectedBg": "#2a2520",
31
+ "userMessageBg": "#3a3530",
32
+ "userMessageText": "",
33
+ "customMessageBg": "#4a433d",
34
+ "customMessageText": "",
35
+ "customMessageLabel": "#c45a3a",
36
+ "toolPendingBg": "#2a2520",
37
+ "toolSuccessBg": "#1f2520",
38
+ "toolErrorBg": "#2a1f1d",
39
+ "toolTitle": "",
40
+ "toolOutput": "#cac5bd",
41
+ "mdHeading": "#c45a3a",
42
+ "mdLink": "#8bb88b",
43
+ "mdLinkUrl": "#6a9a6a",
44
+ "mdCode": "#d97651",
45
+ "mdCodeBlock": "#cac5bd",
46
+ "mdCodeBlockBorder": "#3a3530",
47
+ "mdQuote": "#cac5bd",
48
+ "mdQuoteBorder": "#4a433d",
49
+ "mdHr": "#3a3530",
50
+ "mdListBullet": "#c45a3a",
51
+ "toolDiffAdded": "#6a9a6a",
52
+ "toolDiffRemoved": "#b84a2c",
53
+ "toolDiffContext": "#5a524b",
54
+ "syntaxComment": "#5a524b",
55
+ "syntaxKeyword": "#c45a3a",
56
+ "syntaxFunction": "#8bb88b",
57
+ "syntaxVariable": "#e4e0d8",
58
+ "syntaxString": "#6a9a6a",
59
+ "syntaxNumber": "#d97651",
60
+ "syntaxType": "#c45a3a",
61
+ "syntaxOperator": "#cac5bd",
62
+ "syntaxPunctuation": "#cac5bd",
63
+ "thinkingOff": "#3a3530",
64
+ "thinkingMinimal": "#4a433d",
65
+ "thinkingLow": "#5a524b",
66
+ "thinkingMedium": "#6a605a",
67
+ "thinkingHigh": "#7a706a",
68
+ "thinkingXhigh": "#8a807a",
69
+ "bashMode": "#c45a3a",
70
+ "statusLineBg": "#0f0d0b",
71
+ "statusLineSep": "#3a3530",
72
+ "statusLineModel": "#c45a3a",
73
+ "statusLinePath": "#cac5bd",
74
+ "statusLineGitClean": "#6a9a6a",
75
+ "statusLineGitDirty": "#d97651",
76
+ "statusLineContext": "#8bb88b",
77
+ "statusLineSpend": "#d97651",
78
+ "statusLineStaged": "#6a9a6a",
79
+ "statusLineDirty": "#d97651",
80
+ "statusLineUntracked": "#5a524b",
81
+ "statusLineOutput": "#cac5bd",
82
+ "statusLineCost": "#d97651",
83
+ "statusLineSubagents": "#c45a3a",
84
+ "pythonMode": "#f0c040"
85
+ },
86
+ "export": {
87
+ "pageBg": "#171613",
88
+ "cardBg": "#1f1c19",
89
+ "infoBg": "#2a2520"
90
+ }
90
91
  }