@nghyane/arcane 0.1.10 → 0.1.12
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 +11 -0
- package/package.json +4 -4
- package/src/extensibility/plugins/installer.ts +6 -21
- package/src/extensibility/plugins/manager.ts +8 -29
- package/src/main.ts +3 -0
- package/src/modes/components/model-selector.ts +1 -1
- package/src/modes/components/status-line.ts +15 -40
- package/src/modes/components/user-message.ts +2 -0
- package/src/modes/components/welcome.ts +9 -10
- package/src/modes/controllers/event-controller.ts +51 -12
- package/src/modes/interactive-mode.ts +2 -0
- package/src/modes/theme/dark.json +56 -59
- package/src/modes/theme/defaults/dark-catppuccin.json +47 -56
- package/src/modes/theme/defaults/dark-dracula.json +24 -32
- package/src/modes/theme/defaults/dark-gruvbox.json +53 -74
- package/src/modes/theme/defaults/dark-solarized.json +33 -35
- package/src/modes/theme/defaults/dark-tokyo-night.json +57 -67
- package/src/modes/theme/defaults/index.ts +3 -179
- package/src/modes/theme/defaults/light-catppuccin.json +42 -50
- package/src/modes/theme/defaults/light-github.json +68 -94
- package/src/modes/theme/defaults/light-solarized.json +41 -49
- package/src/modes/theme/light.json +14 -12
- package/src/modes/theme/theme-schema.json +4 -0
- package/src/modes/theme/theme.ts +89 -6
- package/src/patch/index.ts +1 -1
- package/src/stt/downloader.ts +1 -4
- package/src/stt/setup.ts +2 -4
- package/src/tui/output-block.ts +2 -12
- package/src/utils/open.ts +2 -1
- package/src/modes/theme/defaults/alabaster.json +0 -93
- package/src/modes/theme/defaults/amethyst.json +0 -96
- package/src/modes/theme/defaults/anthracite.json +0 -93
- package/src/modes/theme/defaults/basalt.json +0 -91
- package/src/modes/theme/defaults/birch.json +0 -95
- package/src/modes/theme/defaults/dark-abyss.json +0 -91
- package/src/modes/theme/defaults/dark-arctic.json +0 -104
- package/src/modes/theme/defaults/dark-aurora.json +0 -95
- package/src/modes/theme/defaults/dark-cavern.json +0 -91
- package/src/modes/theme/defaults/dark-copper.json +0 -95
- package/src/modes/theme/defaults/dark-cosmos.json +0 -90
- package/src/modes/theme/defaults/dark-cyberpunk.json +0 -102
- package/src/modes/theme/defaults/dark-eclipse.json +0 -91
- package/src/modes/theme/defaults/dark-ember.json +0 -95
- package/src/modes/theme/defaults/dark-equinox.json +0 -90
- package/src/modes/theme/defaults/dark-forest.json +0 -96
- package/src/modes/theme/defaults/dark-github.json +0 -105
- package/src/modes/theme/defaults/dark-lavender.json +0 -95
- package/src/modes/theme/defaults/dark-lunar.json +0 -89
- package/src/modes/theme/defaults/dark-midnight.json +0 -95
- package/src/modes/theme/defaults/dark-monochrome.json +0 -94
- package/src/modes/theme/defaults/dark-monokai.json +0 -98
- package/src/modes/theme/defaults/dark-nebula.json +0 -90
- package/src/modes/theme/defaults/dark-nord.json +0 -97
- package/src/modes/theme/defaults/dark-ocean.json +0 -101
- package/src/modes/theme/defaults/dark-one.json +0 -100
- package/src/modes/theme/defaults/dark-rainforest.json +0 -91
- package/src/modes/theme/defaults/dark-reef.json +0 -91
- package/src/modes/theme/defaults/dark-retro.json +0 -92
- package/src/modes/theme/defaults/dark-rose-pine.json +0 -96
- package/src/modes/theme/defaults/dark-sakura.json +0 -95
- package/src/modes/theme/defaults/dark-slate.json +0 -95
- package/src/modes/theme/defaults/dark-solstice.json +0 -90
- package/src/modes/theme/defaults/dark-starfall.json +0 -91
- package/src/modes/theme/defaults/dark-sunset.json +0 -99
- package/src/modes/theme/defaults/dark-swamp.json +0 -90
- package/src/modes/theme/defaults/dark-synthwave.json +0 -103
- package/src/modes/theme/defaults/dark-taiga.json +0 -91
- package/src/modes/theme/defaults/dark-terminal.json +0 -95
- package/src/modes/theme/defaults/dark-tundra.json +0 -91
- package/src/modes/theme/defaults/dark-twilight.json +0 -91
- package/src/modes/theme/defaults/dark-volcanic.json +0 -91
- package/src/modes/theme/defaults/graphite.json +0 -92
- package/src/modes/theme/defaults/light-arctic.json +0 -107
- package/src/modes/theme/defaults/light-aurora-day.json +0 -91
- package/src/modes/theme/defaults/light-canyon.json +0 -91
- package/src/modes/theme/defaults/light-cirrus.json +0 -90
- package/src/modes/theme/defaults/light-coral.json +0 -95
- package/src/modes/theme/defaults/light-cyberpunk.json +0 -96
- package/src/modes/theme/defaults/light-dawn.json +0 -90
- package/src/modes/theme/defaults/light-dunes.json +0 -91
- package/src/modes/theme/defaults/light-eucalyptus.json +0 -95
- package/src/modes/theme/defaults/light-forest.json +0 -100
- package/src/modes/theme/defaults/light-frost.json +0 -95
- package/src/modes/theme/defaults/light-glacier.json +0 -91
- package/src/modes/theme/defaults/light-gruvbox.json +0 -108
- package/src/modes/theme/defaults/light-haze.json +0 -90
- package/src/modes/theme/defaults/light-honeycomb.json +0 -95
- package/src/modes/theme/defaults/light-lagoon.json +0 -91
- package/src/modes/theme/defaults/light-lavender.json +0 -95
- package/src/modes/theme/defaults/light-meadow.json +0 -91
- package/src/modes/theme/defaults/light-mint.json +0 -95
- package/src/modes/theme/defaults/light-monochrome.json +0 -101
- package/src/modes/theme/defaults/light-ocean.json +0 -99
- package/src/modes/theme/defaults/light-one.json +0 -99
- package/src/modes/theme/defaults/light-opal.json +0 -91
- package/src/modes/theme/defaults/light-orchard.json +0 -91
- package/src/modes/theme/defaults/light-paper.json +0 -95
- package/src/modes/theme/defaults/light-prism.json +0 -90
- package/src/modes/theme/defaults/light-retro.json +0 -98
- package/src/modes/theme/defaults/light-sand.json +0 -95
- package/src/modes/theme/defaults/light-savanna.json +0 -91
- package/src/modes/theme/defaults/light-soleil.json +0 -90
- package/src/modes/theme/defaults/light-sunset.json +0 -99
- package/src/modes/theme/defaults/light-synthwave.json +0 -98
- package/src/modes/theme/defaults/light-tokyo-night.json +0 -111
- package/src/modes/theme/defaults/light-wetland.json +0 -91
- package/src/modes/theme/defaults/light-zenith.json +0 -89
- package/src/modes/theme/defaults/limestone.json +0 -94
- package/src/modes/theme/defaults/mahogany.json +0 -97
- package/src/modes/theme/defaults/marble.json +0 -93
- package/src/modes/theme/defaults/obsidian.json +0 -91
- package/src/modes/theme/defaults/onyx.json +0 -91
- package/src/modes/theme/defaults/pearl.json +0 -93
- package/src/modes/theme/defaults/porcelain.json +0 -91
- package/src/modes/theme/defaults/quartz.json +0 -96
- package/src/modes/theme/defaults/sandstone.json +0 -95
- package/src/modes/theme/defaults/titanium.json +0 -90
|
@@ -2,114 +2,88 @@
|
|
|
2
2
|
"$schema": "https://raw.githubusercontent.com/nghyane/arcane/main/packages/coding-agent/theme-schema.json",
|
|
3
3
|
"name": "light-github",
|
|
4
4
|
"vars": {
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"accentBg": "#ddf4ff",
|
|
14
|
-
"success": "#1f883d",
|
|
15
|
-
"successBg": "#dafbe1",
|
|
16
|
-
"successBorder": "#4ac26b",
|
|
17
|
-
"danger": "#cf222e",
|
|
18
|
-
"dangerBg": "#ffebe9",
|
|
19
|
-
"dangerBorder": "#ff8182",
|
|
20
|
-
"attention": "#9a6700",
|
|
21
|
-
"attentionBg": "#fff8c5",
|
|
22
|
-
"done": "#8250df",
|
|
23
|
-
"lightGray": "#8c959f",
|
|
24
|
-
"mediumGray": "#656d76",
|
|
25
|
-
"selectedBg": "#e8eaed",
|
|
26
|
-
"statusBg": "#f6f8fa",
|
|
27
|
-
"gitInfo": "#0969da",
|
|
28
|
-
"gitWarning": "#bf8700",
|
|
29
|
-
"modelColor": "#8250df",
|
|
30
|
-
"pathColor": "#0969da",
|
|
31
|
-
"contextColor": "#8250df",
|
|
32
|
-
"spendColor": "#0969da",
|
|
33
|
-
"stagedColor": "#1f883d",
|
|
34
|
-
"dirtyColor": "#bf8700",
|
|
35
|
-
"untrackedColor": "#0969da",
|
|
36
|
-
"outputColor": "#cf222e",
|
|
37
|
-
"costColor": "#cf222e",
|
|
38
|
-
"subagentsColor": "#9a6700"
|
|
5
|
+
"blue": "#0969da",
|
|
6
|
+
"green": "#1a7f37",
|
|
7
|
+
"red": "#cf222e",
|
|
8
|
+
"orange": "#9a6700",
|
|
9
|
+
"purple": "#8250df",
|
|
10
|
+
"gray": "#656d76",
|
|
11
|
+
"lightGray": "#afb8c1",
|
|
12
|
+
"fgMuted": "#57606a"
|
|
39
13
|
},
|
|
40
14
|
"colors": {
|
|
41
|
-
"accent": "
|
|
42
|
-
"border": "
|
|
43
|
-
"borderAccent": "
|
|
44
|
-
"borderMuted": "
|
|
45
|
-
"success": "
|
|
46
|
-
"error": "
|
|
47
|
-
"warning": "
|
|
48
|
-
"muted": "
|
|
15
|
+
"accent": "blue",
|
|
16
|
+
"border": "blue",
|
|
17
|
+
"borderAccent": "blue",
|
|
18
|
+
"borderMuted": "lightGray",
|
|
19
|
+
"success": "green",
|
|
20
|
+
"error": "red",
|
|
21
|
+
"warning": "orange",
|
|
22
|
+
"muted": "gray",
|
|
49
23
|
"dim": "lightGray",
|
|
50
24
|
"text": "",
|
|
51
|
-
"thinkingText": "
|
|
52
|
-
"selectedBg": "
|
|
53
|
-
"userMessageBg": "
|
|
25
|
+
"thinkingText": "gray",
|
|
26
|
+
"selectedBg": "^-2",
|
|
27
|
+
"userMessageBg": "^-2",
|
|
54
28
|
"userMessageText": "",
|
|
55
|
-
"customMessageBg": "
|
|
29
|
+
"customMessageBg": "^-2",
|
|
56
30
|
"customMessageText": "",
|
|
57
|
-
"customMessageLabel": "
|
|
58
|
-
"toolPendingBg": "
|
|
59
|
-
"toolSuccessBg": "
|
|
60
|
-
"toolErrorBg": "
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"syntaxComment": "#59636e",
|
|
31
|
+
"customMessageLabel": "purple",
|
|
32
|
+
"toolPendingBg": "^-3",
|
|
33
|
+
"toolSuccessBg": "^-2",
|
|
34
|
+
"toolErrorBg": "^-3",
|
|
35
|
+
"toolTitle": "",
|
|
36
|
+
"toolOutput": "gray",
|
|
37
|
+
"mdHeading": "blue",
|
|
38
|
+
"mdLink": "blue",
|
|
39
|
+
"mdLinkUrl": "gray",
|
|
40
|
+
"mdCode": "purple",
|
|
41
|
+
"mdCodeBlock": "green",
|
|
42
|
+
"mdCodeBlockBorder": "lightGray",
|
|
43
|
+
"mdQuote": "gray",
|
|
44
|
+
"mdQuoteBorder": "lightGray",
|
|
45
|
+
"mdHr": "lightGray",
|
|
46
|
+
"mdListBullet": "blue",
|
|
47
|
+
"toolDiffAdded": "green",
|
|
48
|
+
"toolDiffRemoved": "red",
|
|
49
|
+
"toolDiffContext": "gray",
|
|
50
|
+
"link": "blue",
|
|
51
|
+
"syntaxComment": "#6e7781",
|
|
79
52
|
"syntaxKeyword": "#cf222e",
|
|
80
53
|
"syntaxFunction": "#8250df",
|
|
81
54
|
"syntaxVariable": "#0550ae",
|
|
82
55
|
"syntaxString": "#0a3069",
|
|
83
56
|
"syntaxNumber": "#0550ae",
|
|
84
57
|
"syntaxType": "#953800",
|
|
85
|
-
"syntaxOperator": "
|
|
86
|
-
"syntaxPunctuation": "
|
|
87
|
-
"thinkingOff": "
|
|
88
|
-
"thinkingMinimal": "
|
|
89
|
-
"thinkingLow": "
|
|
90
|
-
"thinkingMedium": "
|
|
91
|
-
"thinkingHigh": "
|
|
92
|
-
"thinkingXhigh": "
|
|
93
|
-
"bashMode": "
|
|
94
|
-
"statusLineBg": "
|
|
95
|
-
"statusLineSep": "
|
|
96
|
-
"statusLineModel": "
|
|
97
|
-
"statusLinePath": "
|
|
98
|
-
"statusLineGitClean": "
|
|
99
|
-
"statusLineGitDirty": "
|
|
100
|
-
"statusLineContext": "
|
|
101
|
-
"statusLineSpend": "
|
|
102
|
-
"statusLineStaged":
|
|
103
|
-
"statusLineDirty":
|
|
104
|
-
"statusLineUntracked":
|
|
105
|
-
"statusLineOutput":
|
|
106
|
-
"statusLineCost":
|
|
107
|
-
"statusLineSubagents": "
|
|
108
|
-
"pythonMode": "
|
|
58
|
+
"syntaxOperator": "fgMuted",
|
|
59
|
+
"syntaxPunctuation": "fgMuted",
|
|
60
|
+
"thinkingOff": "lightGray",
|
|
61
|
+
"thinkingMinimal": "gray",
|
|
62
|
+
"thinkingLow": "blue",
|
|
63
|
+
"thinkingMedium": "purple",
|
|
64
|
+
"thinkingHigh": "orange",
|
|
65
|
+
"thinkingXhigh": "red",
|
|
66
|
+
"bashMode": "green",
|
|
67
|
+
"statusLineBg": "^2",
|
|
68
|
+
"statusLineSep": "lightGray",
|
|
69
|
+
"statusLineModel": "purple",
|
|
70
|
+
"statusLinePath": "blue",
|
|
71
|
+
"statusLineGitClean": "green",
|
|
72
|
+
"statusLineGitDirty": "orange",
|
|
73
|
+
"statusLineContext": "gray",
|
|
74
|
+
"statusLineSpend": "blue",
|
|
75
|
+
"statusLineStaged": 28,
|
|
76
|
+
"statusLineDirty": 130,
|
|
77
|
+
"statusLineUntracked": 91,
|
|
78
|
+
"statusLineOutput": 91,
|
|
79
|
+
"statusLineCost": 28,
|
|
80
|
+
"statusLineSubagents": "blue",
|
|
81
|
+
"pythonMode": "orange",
|
|
82
|
+
"appBg": "^0"
|
|
109
83
|
},
|
|
110
84
|
"export": {
|
|
111
|
-
"pageBg": "#
|
|
85
|
+
"pageBg": "#ffffff",
|
|
112
86
|
"cardBg": "#ffffff",
|
|
113
|
-
"infoBg": "#
|
|
87
|
+
"infoBg": "#f6f8fa"
|
|
114
88
|
}
|
|
115
89
|
}
|
|
@@ -2,14 +2,11 @@
|
|
|
2
2
|
"$schema": "https://raw.githubusercontent.com/nghyane/arcane/main/packages/coding-agent/theme-schema.json",
|
|
3
3
|
"name": "light-solarized",
|
|
4
4
|
"vars": {
|
|
5
|
-
"base03": "#002b36",
|
|
6
|
-
"base02": "#073642",
|
|
7
|
-
"base01": "#586e75",
|
|
8
|
-
"base00": "#657b83",
|
|
9
|
-
"base0": "#839496",
|
|
10
|
-
"base1": "#93a1a1",
|
|
11
5
|
"base2": "#eee8d5",
|
|
12
6
|
"base3": "#fdf6e3",
|
|
7
|
+
"base00": "#657b83",
|
|
8
|
+
"base01": "#586e75",
|
|
9
|
+
"base1": "#93a1a1",
|
|
13
10
|
"yellow": "#b58900",
|
|
14
11
|
"orange": "#cb4b16",
|
|
15
12
|
"red": "#dc322f",
|
|
@@ -17,86 +14,81 @@
|
|
|
17
14
|
"violet": "#6c71c4",
|
|
18
15
|
"blue": "#268bd2",
|
|
19
16
|
"cyan": "#2aa198",
|
|
20
|
-
"green": "#859900"
|
|
21
|
-
"selectedBg": "#e3dcc8",
|
|
22
|
-
"userMsgBg": "#f5f0e6",
|
|
23
|
-
"toolPendingBg": "#eef4f9",
|
|
24
|
-
"toolSuccessBg": "#eff5ed",
|
|
25
|
-
"toolErrorBg": "#f9eeee",
|
|
26
|
-
"customMsgBg": "#f2eff7"
|
|
17
|
+
"green": "#859900"
|
|
27
18
|
},
|
|
28
19
|
"colors": {
|
|
29
|
-
"accent": "
|
|
30
|
-
"border": "
|
|
31
|
-
"borderAccent": "
|
|
20
|
+
"accent": "blue",
|
|
21
|
+
"border": "cyan",
|
|
22
|
+
"borderAccent": "blue",
|
|
32
23
|
"borderMuted": "base1",
|
|
33
24
|
"success": "green",
|
|
34
25
|
"error": "red",
|
|
35
26
|
"warning": "yellow",
|
|
36
|
-
"muted": "
|
|
27
|
+
"muted": "base00",
|
|
37
28
|
"dim": "base1",
|
|
38
29
|
"text": "",
|
|
39
|
-
"thinkingText": "
|
|
40
|
-
"selectedBg": "
|
|
41
|
-
"userMessageBg": "
|
|
30
|
+
"thinkingText": "base00",
|
|
31
|
+
"selectedBg": "^-2",
|
|
32
|
+
"userMessageBg": "^-2",
|
|
42
33
|
"userMessageText": "",
|
|
43
|
-
"customMessageBg": "
|
|
34
|
+
"customMessageBg": "^-2",
|
|
44
35
|
"customMessageText": "",
|
|
45
|
-
"customMessageLabel": "
|
|
46
|
-
"toolPendingBg": "
|
|
47
|
-
"toolSuccessBg": "
|
|
48
|
-
"toolErrorBg": "
|
|
36
|
+
"customMessageLabel": "blue",
|
|
37
|
+
"toolPendingBg": "^-3",
|
|
38
|
+
"toolSuccessBg": "^-2",
|
|
39
|
+
"toolErrorBg": "^-3",
|
|
49
40
|
"toolTitle": "",
|
|
50
|
-
"toolOutput": "
|
|
41
|
+
"toolOutput": "base00",
|
|
51
42
|
"mdHeading": "yellow",
|
|
52
43
|
"mdLink": "blue",
|
|
53
|
-
"mdLinkUrl": "
|
|
44
|
+
"mdLinkUrl": "base00",
|
|
54
45
|
"mdCode": "cyan",
|
|
55
46
|
"mdCodeBlock": "green",
|
|
56
47
|
"mdCodeBlockBorder": "base1",
|
|
57
|
-
"mdQuote": "
|
|
48
|
+
"mdQuote": "base00",
|
|
58
49
|
"mdQuoteBorder": "base1",
|
|
59
50
|
"mdHr": "base1",
|
|
60
|
-
"mdListBullet": "
|
|
51
|
+
"mdListBullet": "cyan",
|
|
61
52
|
"toolDiffAdded": "green",
|
|
62
53
|
"toolDiffRemoved": "red",
|
|
63
|
-
"toolDiffContext": "
|
|
54
|
+
"toolDiffContext": "base00",
|
|
64
55
|
"link": "blue",
|
|
65
56
|
"syntaxComment": "base1",
|
|
66
|
-
"syntaxKeyword": "
|
|
57
|
+
"syntaxKeyword": "orange",
|
|
67
58
|
"syntaxFunction": "blue",
|
|
68
59
|
"syntaxVariable": "cyan",
|
|
69
|
-
"syntaxString": "
|
|
60
|
+
"syntaxString": "green",
|
|
70
61
|
"syntaxNumber": "magenta",
|
|
71
62
|
"syntaxType": "yellow",
|
|
72
|
-
"syntaxOperator": "
|
|
73
|
-
"syntaxPunctuation": "
|
|
63
|
+
"syntaxOperator": "base01",
|
|
64
|
+
"syntaxPunctuation": "base01",
|
|
74
65
|
"thinkingOff": "base1",
|
|
75
|
-
"thinkingMinimal": "
|
|
76
|
-
"thinkingLow": "
|
|
77
|
-
"thinkingMedium": "
|
|
66
|
+
"thinkingMinimal": "base00",
|
|
67
|
+
"thinkingLow": "cyan",
|
|
68
|
+
"thinkingMedium": "blue",
|
|
78
69
|
"thinkingHigh": "violet",
|
|
79
70
|
"thinkingXhigh": "magenta",
|
|
80
71
|
"bashMode": "green",
|
|
81
|
-
"statusLineBg": "
|
|
72
|
+
"statusLineBg": "^2",
|
|
82
73
|
"statusLineSep": "base1",
|
|
83
|
-
"statusLineModel": "
|
|
74
|
+
"statusLineModel": "blue",
|
|
84
75
|
"statusLinePath": "cyan",
|
|
85
76
|
"statusLineGitClean": "green",
|
|
86
77
|
"statusLineGitDirty": "yellow",
|
|
87
|
-
"statusLineContext": "
|
|
78
|
+
"statusLineContext": "base00",
|
|
88
79
|
"statusLineSpend": "cyan",
|
|
89
|
-
"statusLineStaged":
|
|
90
|
-
"statusLineDirty":
|
|
91
|
-
"statusLineUntracked":
|
|
92
|
-
"statusLineOutput":
|
|
93
|
-
"statusLineCost":
|
|
94
|
-
"statusLineSubagents": "
|
|
95
|
-
"pythonMode": "yellow"
|
|
80
|
+
"statusLineStaged": 64,
|
|
81
|
+
"statusLineDirty": 136,
|
|
82
|
+
"statusLineUntracked": 37,
|
|
83
|
+
"statusLineOutput": 37,
|
|
84
|
+
"statusLineCost": 64,
|
|
85
|
+
"statusLineSubagents": "blue",
|
|
86
|
+
"pythonMode": "yellow",
|
|
87
|
+
"appBg": "^0"
|
|
96
88
|
},
|
|
97
89
|
"export": {
|
|
98
|
-
"pageBg": "
|
|
90
|
+
"pageBg": "#fdf6e3",
|
|
99
91
|
"cardBg": "#ffffff",
|
|
100
|
-
"infoBg": "
|
|
92
|
+
"infoBg": "#eee8d5"
|
|
101
93
|
}
|
|
102
94
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://raw.githubusercontent.com/nghyane/arcane/main/packages/coding-agent/theme-schema.json",
|
|
3
3
|
"name": "light",
|
|
4
4
|
"vars": {
|
|
5
|
-
"teal": "#
|
|
5
|
+
"teal": "#3e8a8a",
|
|
6
6
|
"blue": "#547da7",
|
|
7
7
|
"green": "#588458",
|
|
8
8
|
"red": "#aa5555",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"mdHeading": "yellow",
|
|
44
44
|
"mdLink": "blue",
|
|
45
45
|
"mdLinkUrl": "dimGray",
|
|
46
|
+
"link": "blue",
|
|
46
47
|
"mdCode": "teal",
|
|
47
48
|
"mdCodeBlock": "green",
|
|
48
49
|
"mdCodeBlockBorder": "mediumGray",
|
|
@@ -53,17 +54,17 @@
|
|
|
53
54
|
"toolDiffAdded": "green",
|
|
54
55
|
"toolDiffRemoved": "red",
|
|
55
56
|
"toolDiffContext": "mediumGray",
|
|
56
|
-
"syntaxComment": "#
|
|
57
|
-
"syntaxKeyword": "#
|
|
58
|
-
"syntaxFunction": "#
|
|
59
|
-
"syntaxVariable": "#
|
|
60
|
-
"syntaxString": "#
|
|
61
|
-
"syntaxNumber": "#
|
|
62
|
-
"syntaxType": "#
|
|
63
|
-
"syntaxOperator": "#
|
|
64
|
-
"syntaxPunctuation": "#
|
|
57
|
+
"syntaxComment": "#8a8a8a",
|
|
58
|
+
"syntaxKeyword": "#a626a4",
|
|
59
|
+
"syntaxFunction": "#4078f2",
|
|
60
|
+
"syntaxVariable": "#986801",
|
|
61
|
+
"syntaxString": "#50a14f",
|
|
62
|
+
"syntaxNumber": "#986801",
|
|
63
|
+
"syntaxType": "#c18401",
|
|
64
|
+
"syntaxOperator": "#4078f2",
|
|
65
|
+
"syntaxPunctuation": "#696c77",
|
|
65
66
|
"thinkingOff": "lightGray",
|
|
66
|
-
"thinkingMinimal": "
|
|
67
|
+
"thinkingMinimal": "dimGray",
|
|
67
68
|
"thinkingLow": "blue",
|
|
68
69
|
"thinkingMedium": "teal",
|
|
69
70
|
"thinkingHigh": "#875f87",
|
|
@@ -83,7 +84,8 @@
|
|
|
83
84
|
"statusLineOutput": 133,
|
|
84
85
|
"statusLineCost": 133,
|
|
85
86
|
"statusLineSubagents": "teal",
|
|
86
|
-
"pythonMode": "yellow"
|
|
87
|
+
"pythonMode": "yellow",
|
|
88
|
+
"appBg": "^0"
|
|
87
89
|
},
|
|
88
90
|
"export": {
|
|
89
91
|
"pageBg": "#f8f8f8",
|
|
@@ -315,6 +315,10 @@
|
|
|
315
315
|
"$ref": "#/$defs/colorValue",
|
|
316
316
|
"description": "Status line background"
|
|
317
317
|
},
|
|
318
|
+
"appBg": {
|
|
319
|
+
"$ref": "#/$defs/colorValue",
|
|
320
|
+
"description": "App-wide background color"
|
|
321
|
+
},
|
|
318
322
|
"statusLineSep": {
|
|
319
323
|
"$ref": "#/$defs/colorValue",
|
|
320
324
|
"description": "Status line separator color"
|
package/src/modes/theme/theme.ts
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
supportsLanguage as nativeSupportsLanguage,
|
|
7
7
|
} from "@nghyane/arcane-natives";
|
|
8
8
|
import type { EditorTheme, MarkdownTheme, SelectListTheme, SymbolTheme } from "@nghyane/arcane-tui";
|
|
9
|
-
import { adjustHsv, isEnoent, logger } from "@nghyane/arcane-utils";
|
|
9
|
+
import { adjustHsv, hexToHsv, hsvToHex, isEnoent, logger } from "@nghyane/arcane-utils";
|
|
10
10
|
import { getCustomThemesDir } from "@nghyane/arcane-utils/dirs";
|
|
11
11
|
import { type Static, Type } from "@sinclair/typebox";
|
|
12
12
|
import { TypeCompiler } from "@sinclair/typebox/compiler";
|
|
@@ -959,7 +959,8 @@ export type ThemeBg =
|
|
|
959
959
|
| "toolPendingBg"
|
|
960
960
|
| "toolSuccessBg"
|
|
961
961
|
| "toolErrorBg"
|
|
962
|
-
| "statusLineBg"
|
|
962
|
+
| "statusLineBg"
|
|
963
|
+
| "appBg";
|
|
963
964
|
|
|
964
965
|
type ColorMode = "truecolor" | "256color";
|
|
965
966
|
|
|
@@ -1015,7 +1016,7 @@ function resolveVarRefs(
|
|
|
1015
1016
|
vars: Record<string, ColorValue>,
|
|
1016
1017
|
visited = new Set<string>(),
|
|
1017
1018
|
): string | number {
|
|
1018
|
-
if (typeof value === "number" || value === "" || value.startsWith("#")) {
|
|
1019
|
+
if (typeof value === "number" || value === "" || value.startsWith("#") || value.startsWith("^")) {
|
|
1019
1020
|
return value;
|
|
1020
1021
|
}
|
|
1021
1022
|
if (visited.has(value)) {
|
|
@@ -1171,10 +1172,28 @@ export class Theme {
|
|
|
1171
1172
|
return `${ansi}${text}\x1b[39m`; // Reset only foreground color
|
|
1172
1173
|
}
|
|
1173
1174
|
|
|
1174
|
-
|
|
1175
|
+
/**
|
|
1176
|
+
* Wrap text with a background color, stabilizing inner SGR resets.
|
|
1177
|
+
* When terminal bg is not detected, uses reverse video as fallback.
|
|
1178
|
+
* This is the single source of truth for bg wrapping — all bg rendering goes through here.
|
|
1179
|
+
*/
|
|
1180
|
+
wrapBg(color: ThemeBg, text: string): string {
|
|
1175
1181
|
const ansi = this.#bgColors[color];
|
|
1176
1182
|
if (!ansi) throw new Error(`Unknown theme background color: ${color}`);
|
|
1177
|
-
|
|
1183
|
+
if (ansi === "\x1b[49m") {
|
|
1184
|
+
// Transparent fallback: reverse video with fg color preservation
|
|
1185
|
+
const stabilized = text
|
|
1186
|
+
.replace(/\x1b\[(?:0)?m/g, m => `${m}\x1b[7m`)
|
|
1187
|
+
.replace(/\x1b\[(?:3[0-9]m|38;)/g, m => `\x1b[27m${m}`);
|
|
1188
|
+
return `\x1b[7m${stabilized}\x1b[27m`;
|
|
1189
|
+
}
|
|
1190
|
+
// Real bg: stabilize inner resets by re-applying bg after them
|
|
1191
|
+
const stabilized = text.replace(/\x1b\[(?:0)?m/g, m => `${m}${ansi}`).replace(/\x1b\[49m/g, m => `${m}${ansi}`);
|
|
1192
|
+
return `${ansi}${stabilized}${this.#bgColors.appBg}`;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
bg(color: ThemeBg, text: string): string {
|
|
1196
|
+
return this.wrapBg(color, text);
|
|
1178
1197
|
}
|
|
1179
1198
|
|
|
1180
1199
|
bold(text: string): string {
|
|
@@ -1209,6 +1228,19 @@ export class Theme {
|
|
|
1209
1228
|
return ansi;
|
|
1210
1229
|
}
|
|
1211
1230
|
|
|
1231
|
+
getAppBgAnsi(): string {
|
|
1232
|
+
return this.#bgColors.appBg;
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
getAppBgPackedRgb(): number {
|
|
1236
|
+
const ansi = this.#bgColors.appBg;
|
|
1237
|
+
const match = ansi.match(/\x1b\[48;2;(\d+);(\d+);(\d+)m/);
|
|
1238
|
+
if (!match) return 0;
|
|
1239
|
+
return (
|
|
1240
|
+
((Number(match[1]) & 0xff) << 16) | ((Number(match[2]) & 0xff) << 8) | (Number(match[3]) & 0xff) | 0x01000000
|
|
1241
|
+
);
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1212
1244
|
getColorMode(): ColorMode {
|
|
1213
1245
|
return this.mode;
|
|
1214
1246
|
}
|
|
@@ -1563,11 +1595,48 @@ interface CreateThemeOptions {
|
|
|
1563
1595
|
mode?: ColorMode;
|
|
1564
1596
|
symbolPresetOverride?: SymbolPreset;
|
|
1565
1597
|
colorBlindMode?: boolean;
|
|
1598
|
+
terminalBg?: string;
|
|
1566
1599
|
}
|
|
1567
1600
|
|
|
1568
1601
|
/** HSV adjustment to shift green toward blue for colorblind mode (red-green colorblindness) */
|
|
1569
1602
|
const COLORBLIND_ADJUSTMENT = { h: 60, s: 0.71 };
|
|
1570
1603
|
|
|
1604
|
+
/**
|
|
1605
|
+
* Resolve a relative bg color value against the terminal background.
|
|
1606
|
+
* Format: "^N" where N is a brightness adjustment percentage.
|
|
1607
|
+
* Positive = lighter, negative = darker. E.g., "^5" or "^-3".
|
|
1608
|
+
* Returns the resolved hex color, or the original value if not relative.
|
|
1609
|
+
*/
|
|
1610
|
+
function resolveRelativeBg(value: string | number, terminalBg: string): string | number {
|
|
1611
|
+
if (typeof value !== "string" || !value.startsWith("^")) return value;
|
|
1612
|
+
const delta = parseFloat(value.slice(1));
|
|
1613
|
+
if (Number.isNaN(delta)) return value;
|
|
1614
|
+
const hsv = hexToHsv(terminalBg);
|
|
1615
|
+
hsv.v = Math.max(0, Math.min(1, hsv.v + delta / 100));
|
|
1616
|
+
return hsvToHex(hsv);
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
function detectDefaultSymbolPreset(): SymbolPreset {
|
|
1620
|
+
const termProgram = Bun.env.TERM_PROGRAM ?? "";
|
|
1621
|
+
const term = Bun.env.TERM ?? "";
|
|
1622
|
+
|
|
1623
|
+
// Terminals with known Nerd Font fallback support
|
|
1624
|
+
const nerdFontTerminals = new Set([
|
|
1625
|
+
"iTerm.app",
|
|
1626
|
+
"WezTerm",
|
|
1627
|
+
"Hyper",
|
|
1628
|
+
"vscode",
|
|
1629
|
+
"Termius",
|
|
1630
|
+
"WarpTerminal",
|
|
1631
|
+
"ghostty",
|
|
1632
|
+
"Tabby",
|
|
1633
|
+
]);
|
|
1634
|
+
if (nerdFontTerminals.has(termProgram)) return "nerd";
|
|
1635
|
+
if (term === "xterm-kitty") return "nerd";
|
|
1636
|
+
|
|
1637
|
+
return "unicode";
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1571
1640
|
function createTheme(themeJson: ThemeJson, options: CreateThemeOptions = {}): Theme {
|
|
1572
1641
|
const { mode, symbolPresetOverride, colorBlindMode } = options;
|
|
1573
1642
|
const colorMode = mode ?? detectColorMode();
|
|
@@ -1580,6 +1649,15 @@ function createTheme(themeJson: ThemeJson, options: CreateThemeOptions = {}): Th
|
|
|
1580
1649
|
}
|
|
1581
1650
|
}
|
|
1582
1651
|
|
|
1652
|
+
// Resolve relative bg colors (^N format) against terminal background
|
|
1653
|
+
const termBg = options.terminalBg;
|
|
1654
|
+
for (const key of Object.keys(resolvedColors) as Array<keyof typeof resolvedColors>) {
|
|
1655
|
+
const value = resolvedColors[key];
|
|
1656
|
+
if (typeof value === "string" && value.startsWith("^")) {
|
|
1657
|
+
resolvedColors[key] = termBg ? resolveRelativeBg(value, termBg) : "";
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1583
1661
|
const fgColors: Record<ThemeColor, string | number> = {} as Record<ThemeColor, string | number>;
|
|
1584
1662
|
const bgColors: Record<ThemeBg, string | number> = {} as Record<ThemeBg, string | number>;
|
|
1585
1663
|
const bgColorKeys: Set<string> = new Set([
|
|
@@ -1590,6 +1668,7 @@ function createTheme(themeJson: ThemeJson, options: CreateThemeOptions = {}): Th
|
|
|
1590
1668
|
"toolSuccessBg",
|
|
1591
1669
|
"toolErrorBg",
|
|
1592
1670
|
"statusLineBg",
|
|
1671
|
+
"appBg",
|
|
1593
1672
|
]);
|
|
1594
1673
|
for (const [key, value] of Object.entries(resolvedColors)) {
|
|
1595
1674
|
if (bgColorKeys.has(key)) {
|
|
@@ -1599,7 +1678,7 @@ function createTheme(themeJson: ThemeJson, options: CreateThemeOptions = {}): Th
|
|
|
1599
1678
|
}
|
|
1600
1679
|
}
|
|
1601
1680
|
// Extract symbol configuration - settings override takes precedence over theme
|
|
1602
|
-
const symbolPreset: SymbolPreset = symbolPresetOverride ?? themeJson.symbols?.preset ??
|
|
1681
|
+
const symbolPreset: SymbolPreset = symbolPresetOverride ?? themeJson.symbols?.preset ?? detectDefaultSymbolPreset();
|
|
1603
1682
|
const symbolOverrides = themeJson.symbols?.overrides ?? {};
|
|
1604
1683
|
return new Theme(fgColors, bgColors, colorMode, symbolPreset, symbolOverrides);
|
|
1605
1684
|
}
|
|
@@ -1650,6 +1729,7 @@ export function getCurrentThemeName(): string | undefined {
|
|
|
1650
1729
|
}
|
|
1651
1730
|
var currentSymbolPresetOverride: SymbolPreset | undefined;
|
|
1652
1731
|
var currentColorBlindMode: boolean = false;
|
|
1732
|
+
var currentTerminalBg: string | undefined;
|
|
1653
1733
|
var themeWatcher: fs.FSWatcher | undefined;
|
|
1654
1734
|
var sigwinchHandler: (() => void) | undefined;
|
|
1655
1735
|
var autoDetectedTheme: boolean = false;
|
|
@@ -1662,6 +1742,7 @@ function getCurrentThemeOptions(): CreateThemeOptions {
|
|
|
1662
1742
|
return {
|
|
1663
1743
|
symbolPresetOverride: currentSymbolPresetOverride,
|
|
1664
1744
|
colorBlindMode: currentColorBlindMode,
|
|
1745
|
+
terminalBg: currentTerminalBg,
|
|
1665
1746
|
};
|
|
1666
1747
|
}
|
|
1667
1748
|
|
|
@@ -1671,6 +1752,7 @@ export async function initTheme(
|
|
|
1671
1752
|
colorBlindMode?: boolean,
|
|
1672
1753
|
darkTheme?: string,
|
|
1673
1754
|
lightTheme?: string,
|
|
1755
|
+
terminalBg?: string,
|
|
1674
1756
|
): Promise<void> {
|
|
1675
1757
|
autoDetectedTheme = true;
|
|
1676
1758
|
autoDarkTheme = darkTheme ?? "dark";
|
|
@@ -1679,6 +1761,7 @@ export async function initTheme(
|
|
|
1679
1761
|
currentThemeName = name;
|
|
1680
1762
|
currentSymbolPresetOverride = symbolPreset;
|
|
1681
1763
|
currentColorBlindMode = colorBlindMode ?? false;
|
|
1764
|
+
currentTerminalBg = terminalBg;
|
|
1682
1765
|
try {
|
|
1683
1766
|
theme = await loadTheme(name, getCurrentThemeOptions());
|
|
1684
1767
|
if (enableWatcher) {
|
package/src/patch/index.ts
CHANGED
|
@@ -199,7 +199,7 @@ function hashlineParseContent(edit: string | string[] | null): string[] {
|
|
|
199
199
|
if (Array.isArray(edit)) return edit;
|
|
200
200
|
const lines = stripNewLinePrefixes(edit.split("\n"));
|
|
201
201
|
if (lines.length === 0) return [];
|
|
202
|
-
if (lines[lines.length - 1].trim() === "") return lines.slice(0, -1);
|
|
202
|
+
if (lines.length > 1 && lines[lines.length - 1].trim() === "") return lines.slice(0, -1);
|
|
203
203
|
return lines;
|
|
204
204
|
}
|
|
205
205
|
|
package/src/stt/downloader.ts
CHANGED
|
@@ -46,10 +46,7 @@ async function ensurePythonWhisper(options?: EnsureOptions): Promise<void> {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
// Check if whisper module is already importable
|
|
49
|
-
const check =
|
|
50
|
-
stdout: "pipe",
|
|
51
|
-
stderr: "pipe",
|
|
52
|
-
});
|
|
49
|
+
const check = await $`${pythonCmd} -c ${"import whisper"}`.quiet().nothrow();
|
|
53
50
|
if (check.exitCode === 0) return;
|
|
54
51
|
|
|
55
52
|
options?.onProgress?.({ stage: "Installing openai-whisper (this may take a few minutes)..." });
|
package/src/stt/setup.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { $ } from "bun";
|
|
1
2
|
import { detectRecordingTools } from "./recorder";
|
|
2
3
|
import { resolvePython } from "./transcriber";
|
|
3
4
|
|
|
@@ -20,10 +21,7 @@ export async function checkDependencies(): Promise<STTDependencyStatus> {
|
|
|
20
21
|
|
|
21
22
|
let whisperAvailable = false;
|
|
22
23
|
if (pythonCmd) {
|
|
23
|
-
const check =
|
|
24
|
-
stdout: "pipe",
|
|
25
|
-
stderr: "pipe",
|
|
26
|
-
});
|
|
24
|
+
const check = await $`${pythonCmd} -c ${"import whisper"}`.quiet().nothrow();
|
|
27
25
|
whisperAvailable = check.exitCode === 0;
|
|
28
26
|
}
|
|
29
27
|
const whisperHint = "Run 'arc setup stt' to auto-install, or: pip install openai-whisper";
|
package/src/tui/output-block.ts
CHANGED
|
@@ -32,18 +32,8 @@ export function renderOutputBlock(options: OutputBlockOptions, theme: Theme): st
|
|
|
32
32
|
? "accent"
|
|
33
33
|
: "dim";
|
|
34
34
|
const border = (text: string) => theme.fg(borderColor, text);
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
const bgAnsi = theme.getBgAnsi(getStateBgColor(state));
|
|
38
|
-
// Keep block background stable even if inner content contains SGR resets (e.g. "\x1b[0m"),
|
|
39
|
-
// which would otherwise clear the outer background mid-line.
|
|
40
|
-
return (text: string) => {
|
|
41
|
-
const stabilized = text
|
|
42
|
-
.replace(/\x1b\[(?:0)?m/g, m => `${m}${bgAnsi}`)
|
|
43
|
-
.replace(/\x1b\[49m/g, m => `${m}${bgAnsi}`);
|
|
44
|
-
return `${bgAnsi}${stabilized}\x1b[49m`;
|
|
45
|
-
};
|
|
46
|
-
})();
|
|
35
|
+
const bgColor = state && applyBg ? getStateBgColor(state) : undefined;
|
|
36
|
+
const bgFn = bgColor ? (text: string) => theme.wrapBg(bgColor, text) : undefined;
|
|
47
37
|
|
|
48
38
|
const buildBarLine = (leftChar: string, rightChar: string, label?: string, meta?: string): string => {
|
|
49
39
|
const left = border(`${leftChar}${cap}`);
|
package/src/utils/open.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { $ } from "bun";
|
|
1
2
|
/** Open a URL or file path in the default browser/application. Best-effort, never throws. */
|
|
2
3
|
export function openPath(urlOrPath: string): void {
|
|
3
4
|
let cmd: string[];
|
|
@@ -13,7 +14,7 @@ export function openPath(urlOrPath: string): void {
|
|
|
13
14
|
break;
|
|
14
15
|
}
|
|
15
16
|
try {
|
|
16
|
-
|
|
17
|
+
$`${cmd}`.quiet().nothrow();
|
|
17
18
|
} catch {
|
|
18
19
|
// Best-effort: browser opening is non-critical
|
|
19
20
|
}
|