@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.
- package/CHANGELOG.md +173 -51
- package/examples/sdk/04-skills.ts +1 -1
- package/package.json +6 -5
- package/src/cli/stats-cli.ts +191 -0
- package/src/core/agent-session.ts +214 -4
- package/src/core/auth-storage.ts +524 -202
- package/src/core/bash-executor.ts +1 -1
- package/src/core/extensions/index.ts +2 -0
- package/src/core/extensions/runner.ts +31 -0
- package/src/core/extensions/types.ts +24 -0
- package/src/core/messages.ts +48 -0
- package/src/core/model-registry.ts +7 -0
- package/src/core/python-executor.ts +29 -8
- package/src/core/python-gateway-coordinator.ts +55 -1
- package/src/core/python-prelude.py +201 -8
- package/src/core/session-manager.ts +10 -1
- package/src/core/tools/bash.ts +5 -7
- package/src/core/tools/find.ts +18 -5
- package/src/core/tools/index.ts +1 -1
- package/src/core/tools/lsp/index.ts +13 -2
- package/src/core/tools/patch/applicator.ts +115 -17
- package/src/core/tools/patch/index.ts +1 -1
- package/src/core/tools/patch/normalize.ts +185 -10
- package/src/core/tools/python.ts +445 -86
- package/src/core/tools/read.ts +4 -4
- package/src/core/tools/task/executor.ts +2 -6
- package/src/core/tools/task/index.ts +30 -12
- package/src/core/tools/task/render.ts +163 -30
- package/src/core/tools/task/template.ts +37 -0
- package/src/core/tools/task/types.ts +6 -2
- package/src/core/tools/task/worker.ts +1 -1
- package/src/index.ts +2 -0
- package/src/main.ts +12 -0
- package/src/modes/interactive/components/python-execution.ts +180 -0
- package/src/modes/interactive/components/welcome.ts +1 -0
- package/src/modes/interactive/controllers/command-controller.ts +395 -0
- package/src/modes/interactive/controllers/input-controller.ts +83 -8
- package/src/modes/interactive/interactive-mode.ts +16 -1
- package/src/modes/interactive/theme/dark.json +2 -9
- package/src/modes/interactive/theme/defaults/alabaster.json +2 -8
- package/src/modes/interactive/theme/defaults/amethyst.json +2 -9
- package/src/modes/interactive/theme/defaults/anthracite.json +2 -9
- package/src/modes/interactive/theme/defaults/basalt.json +89 -88
- package/src/modes/interactive/theme/defaults/birch.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-abyss.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-arctic.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-aurora.json +3 -2
- package/src/modes/interactive/theme/defaults/dark-catppuccin.json +2 -1
- package/src/modes/interactive/theme/defaults/dark-cavern.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-copper.json +3 -2
- package/src/modes/interactive/theme/defaults/dark-cosmos.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-cyberpunk.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-dracula.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-eclipse.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-ember.json +3 -2
- package/src/modes/interactive/theme/defaults/dark-equinox.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-forest.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-github.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-gruvbox.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-lavender.json +3 -2
- package/src/modes/interactive/theme/defaults/dark-lunar.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-midnight.json +3 -2
- package/src/modes/interactive/theme/defaults/dark-monochrome.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-monokai.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-nebula.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-nord.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-ocean.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-one.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-rainforest.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-reef.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-retro.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-rose-pine.json +2 -1
- package/src/modes/interactive/theme/defaults/dark-sakura.json +3 -2
- package/src/modes/interactive/theme/defaults/dark-slate.json +3 -2
- package/src/modes/interactive/theme/defaults/dark-solarized.json +2 -1
- package/src/modes/interactive/theme/defaults/dark-solstice.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-starfall.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-sunset.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-swamp.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-synthwave.json +2 -1
- package/src/modes/interactive/theme/defaults/dark-taiga.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-terminal.json +3 -2
- package/src/modes/interactive/theme/defaults/dark-tokyo-night.json +2 -9
- package/src/modes/interactive/theme/defaults/dark-tundra.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-twilight.json +2 -8
- package/src/modes/interactive/theme/defaults/dark-volcanic.json +2 -8
- package/src/modes/interactive/theme/defaults/graphite.json +2 -9
- package/src/modes/interactive/theme/defaults/light-arctic.json +2 -1
- package/src/modes/interactive/theme/defaults/light-aurora-day.json +2 -8
- package/src/modes/interactive/theme/defaults/light-canyon.json +2 -8
- package/src/modes/interactive/theme/defaults/light-catppuccin.json +2 -1
- package/src/modes/interactive/theme/defaults/light-cirrus.json +2 -8
- package/src/modes/interactive/theme/defaults/light-coral.json +3 -2
- package/src/modes/interactive/theme/defaults/light-cyberpunk.json +2 -9
- package/src/modes/interactive/theme/defaults/light-dawn.json +2 -8
- package/src/modes/interactive/theme/defaults/light-dunes.json +2 -8
- package/src/modes/interactive/theme/defaults/light-eucalyptus.json +3 -2
- package/src/modes/interactive/theme/defaults/light-forest.json +2 -9
- package/src/modes/interactive/theme/defaults/light-frost.json +3 -2
- package/src/modes/interactive/theme/defaults/light-github.json +2 -1
- package/src/modes/interactive/theme/defaults/light-glacier.json +2 -8
- package/src/modes/interactive/theme/defaults/light-gruvbox.json +2 -9
- package/src/modes/interactive/theme/defaults/light-haze.json +2 -8
- package/src/modes/interactive/theme/defaults/light-honeycomb.json +3 -2
- package/src/modes/interactive/theme/defaults/light-lagoon.json +2 -8
- package/src/modes/interactive/theme/defaults/light-lavender.json +3 -2
- package/src/modes/interactive/theme/defaults/light-meadow.json +2 -8
- package/src/modes/interactive/theme/defaults/light-mint.json +3 -2
- package/src/modes/interactive/theme/defaults/light-monochrome.json +2 -1
- package/src/modes/interactive/theme/defaults/light-ocean.json +2 -9
- package/src/modes/interactive/theme/defaults/light-one.json +2 -8
- package/src/modes/interactive/theme/defaults/light-opal.json +2 -8
- package/src/modes/interactive/theme/defaults/light-orchard.json +2 -8
- package/src/modes/interactive/theme/defaults/light-paper.json +3 -2
- package/src/modes/interactive/theme/defaults/light-prism.json +2 -8
- package/src/modes/interactive/theme/defaults/light-retro.json +2 -9
- package/src/modes/interactive/theme/defaults/light-sand.json +3 -2
- package/src/modes/interactive/theme/defaults/light-savanna.json +2 -8
- package/src/modes/interactive/theme/defaults/light-solarized.json +2 -1
- package/src/modes/interactive/theme/defaults/light-soleil.json +2 -8
- package/src/modes/interactive/theme/defaults/light-sunset.json +2 -9
- package/src/modes/interactive/theme/defaults/light-synthwave.json +2 -9
- package/src/modes/interactive/theme/defaults/light-tokyo-night.json +2 -9
- package/src/modes/interactive/theme/defaults/light-wetland.json +2 -8
- package/src/modes/interactive/theme/defaults/light-zenith.json +2 -8
- package/src/modes/interactive/theme/defaults/limestone.json +2 -8
- package/src/modes/interactive/theme/defaults/mahogany.json +2 -9
- package/src/modes/interactive/theme/defaults/marble.json +2 -8
- package/src/modes/interactive/theme/defaults/obsidian.json +89 -88
- package/src/modes/interactive/theme/defaults/onyx.json +89 -88
- package/src/modes/interactive/theme/defaults/pearl.json +2 -8
- package/src/modes/interactive/theme/defaults/porcelain.json +89 -88
- package/src/modes/interactive/theme/defaults/quartz.json +2 -8
- package/src/modes/interactive/theme/defaults/sandstone.json +2 -8
- package/src/modes/interactive/theme/defaults/titanium.json +88 -87
- package/src/modes/interactive/theme/light.json +2 -8
- package/src/modes/interactive/theme/theme-schema.json +5 -0
- package/src/modes/interactive/theme/theme.ts +7 -0
- package/src/modes/interactive/types.ts +7 -1
- package/src/modes/interactive/utils/ui-helpers.ts +20 -0
- package/src/prompts/system/system-prompt.md +88 -78
- package/src/prompts/tools/python.md +39 -2
- package/src/prompts/tools/task.md +8 -13
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
}
|