pi-cc-extensions 1.0.4 → 1.0.5
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/README.en.md +6 -6
- package/README.md +6 -6
- package/extensions/config/config.ts +16 -27
- package/extensions/config/panel.ts +49 -48
- package/extensions/feature/compact-thinking.ts +2 -3
- package/extensions/feature/context.ts +70 -2
- package/extensions/feature/shell/footer-layout.ts +108 -23
- package/extensions/feature/shell/footer.ts +59 -43
- package/extensions/feature/shell/prompt-editor.ts +77 -0
- package/extensions/index.ts +6 -0
- package/extensions/renderer/compact-mode.ts +47 -40
- package/extensions/renderer/default-mode.ts +7 -4
- package/extensions/renderer/mouse/interaction.ts +18 -4
- package/extensions/renderer/mouse/scroll.ts +23 -8
- package/extensions/renderer/mouse/sticky-prompt.ts +2 -2
- package/extensions/renderer/tool/ccstyle-tool.ts +24 -12
- package/extensions/renderer/tool/codemode.ts +121 -6
- package/extensions/renderer/tool/diff/diff-limits.ts +3 -2
- package/extensions/renderer/tool/diff/diff-palette.ts +39 -8
- package/extensions/renderer/tool/diff/diff-presentation.ts +2 -2
- package/extensions/renderer/tool/grouping.ts +13 -13
- package/extensions/renderer/tool/message-display.ts +3 -2
- package/extensions/renderer/tool/names.ts +49 -49
- package/extensions/renderer/tool/result.ts +24 -0
- package/extensions/renderer/tool/tool-state.ts +51 -2
- package/package.json +1 -1
- package/themes/cc-dark.json +72 -71
- package/themes/cc-light.json +72 -71
|
@@ -33,6 +33,30 @@ export function insetComponent(component: any): any {
|
|
|
33
33
|
return wrapped;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* 展开卡内嵌组件:`↳` 行右移 2 格(Box pad 1 + 2 = 标题文字列),其余行贴左。
|
|
38
|
+
* 与折叠态 insetComponent 的 ` ↳` 同一视觉列。
|
|
39
|
+
*/
|
|
40
|
+
export function expandedBodyComponent(component: any): any {
|
|
41
|
+
const wrapped: Record<string, unknown> = {
|
|
42
|
+
render: (width: number) =>
|
|
43
|
+
component
|
|
44
|
+
.render(width)
|
|
45
|
+
.map((line: string) =>
|
|
46
|
+
truncateToWidth(
|
|
47
|
+
line.replace(/^((?:\x1b\[[0-?]*[ -/]*[@-~])*)↳/, "$1 ↳"),
|
|
48
|
+
Math.max(0, width),
|
|
49
|
+
"",
|
|
50
|
+
),
|
|
51
|
+
),
|
|
52
|
+
invalidate: () => component.invalidate?.(),
|
|
53
|
+
};
|
|
54
|
+
if (typeof component.isCollapsedHintLine === "function") {
|
|
55
|
+
wrapped.isCollapsedHintLine = (line: string) => component.isCollapsedHintLine(line);
|
|
56
|
+
}
|
|
57
|
+
return wrapped;
|
|
58
|
+
}
|
|
59
|
+
|
|
36
60
|
function rawTextFromResult(result: any): string {
|
|
37
61
|
return Array.isArray(result?.content)
|
|
38
62
|
? result.content
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ThemeBg } from "@earendil-works/pi-coding-agent";
|
|
1
2
|
import { getToolMouseTui } from "../mouse/scroll.ts";
|
|
2
3
|
import { TOOL_LOADING_INTERVAL_MS, toolLoadingIcon } from "../../utils/tool-loading-icon.ts";
|
|
3
4
|
|
|
@@ -93,6 +94,54 @@ export function pendingIcon(_name: string): string {
|
|
|
93
94
|
|
|
94
95
|
type ToolVisualState = "pending" | "success" | "error";
|
|
95
96
|
|
|
97
|
+
/** 展开卡底色槽位:与工具状态一一对应,不再读配置。 */
|
|
98
|
+
export const TOOL_CARD_BG_SLOT: Record<ToolVisualState, ThemeBg> = {
|
|
99
|
+
pending: "toolPendingBg",
|
|
100
|
+
success: "toolSuccessBg",
|
|
101
|
+
error: "toolErrorBg",
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/** 单张工具卡的状态。有失败取失败,没有结果或仍在输出取进行中,其余取成功。 */
|
|
105
|
+
export function toolCardStatus(tool: any): ToolVisualState {
|
|
106
|
+
if (tool?.result?.isError === true || tool?.isError === true) return "error";
|
|
107
|
+
if (tool?.isPartial === true || (tool?.executionStarted && !tool?.result) || !tool?.result) {
|
|
108
|
+
return "pending";
|
|
109
|
+
}
|
|
110
|
+
return "success";
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 一张卡里多个工具的汇总状态。
|
|
115
|
+
* 有一个失败取失败;没有失败但还有进行中取进行中;全部成功取成功。
|
|
116
|
+
*/
|
|
117
|
+
export function aggregateToolCardStatus(tools: readonly any[]): ToolVisualState {
|
|
118
|
+
let pending = false;
|
|
119
|
+
for (const tool of tools) {
|
|
120
|
+
const value = toolCardStatus(tool);
|
|
121
|
+
if (value === "error") return "error";
|
|
122
|
+
if (value === "pending") pending = true;
|
|
123
|
+
}
|
|
124
|
+
return pending ? "pending" : "success";
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 单张工具卡的底色。
|
|
129
|
+
* edit/write 的新增行底色由 toolSuccessBg 混出,成功卡不能再用同一块绿,否则两层叠在一起。
|
|
130
|
+
* 成功的 edit/write 改用中性的 toolPendingBg;失败卡仍用 toolErrorBg。
|
|
131
|
+
*/
|
|
132
|
+
export function toolCardBgSlot(tool: any): ThemeBg {
|
|
133
|
+
const status = toolCardStatus(tool);
|
|
134
|
+
const name = String(tool?.toolName ?? "");
|
|
135
|
+
if ((name === "edit" || name === "write") && status !== "error") {
|
|
136
|
+
return TOOL_CARD_BG_SLOT.pending;
|
|
137
|
+
}
|
|
138
|
+
return TOOL_CARD_BG_SLOT[status];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function aggregateToolCardBgSlot(tools: readonly any[]): string {
|
|
142
|
+
return TOOL_CARD_BG_SLOT[aggregateToolCardStatus(tools)];
|
|
143
|
+
}
|
|
144
|
+
|
|
96
145
|
export function settledIcon(name: string, state: ToolVisualState | undefined): string {
|
|
97
146
|
if (state === "success") return "✓";
|
|
98
147
|
if (state === "error") return "✗";
|
|
@@ -124,11 +173,11 @@ export function resolveToolVisualState(context: any): ToolVisualState | undefine
|
|
|
124
173
|
return settledState;
|
|
125
174
|
}
|
|
126
175
|
|
|
127
|
-
export function toolIconColor(context: any): "
|
|
176
|
+
export function toolIconColor(context: any): "dim" | "error" | "success" | "muted" {
|
|
128
177
|
const visualState = getToolVisualState(context);
|
|
129
178
|
if (context?.isError || visualState === "error") return "error";
|
|
130
179
|
if (visualState === "success") return "success";
|
|
131
|
-
if (context?.isPartial || context?.executionStarted || visualState === "pending") return "
|
|
180
|
+
if (context?.isPartial || context?.executionStarted || visualState === "pending") return "dim";
|
|
132
181
|
return "muted";
|
|
133
182
|
}
|
|
134
183
|
|
package/package.json
CHANGED
package/themes/cc-dark.json
CHANGED
|
@@ -1,91 +1,92 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://
|
|
2
|
+
"$schema": "https://pi.dev/schemas/theme.schema.json",
|
|
3
3
|
"name": "cc-dark",
|
|
4
|
+
"appearance": "dark",
|
|
4
5
|
"vars": {
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"toolSuccessBg": "#1e1e2e",
|
|
28
|
-
"toolErrorBg": "#2a1b22",
|
|
29
|
-
"customMessageBg": "#211c30"
|
|
6
|
+
"fg": "#d6dde3",
|
|
7
|
+
"fgMuted": "#929eab",
|
|
8
|
+
"fgSubtle": "#768494",
|
|
9
|
+
"canvas": "#0d1117",
|
|
10
|
+
"canvasSubtle": "#1c2033",
|
|
11
|
+
"canvasInset": "#161a2b",
|
|
12
|
+
"border": "#1c2d44",
|
|
13
|
+
"borderMuted": "#16233a",
|
|
14
|
+
"blue": "#4f9eff",
|
|
15
|
+
"blueBright": "#79c0ff",
|
|
16
|
+
"green": "#37b34a",
|
|
17
|
+
"red": "#ff6e62",
|
|
18
|
+
"redSoft": "#ff7b72",
|
|
19
|
+
"yellow": "#cb9214",
|
|
20
|
+
"orange": "#f0883e",
|
|
21
|
+
"orangeSoft": "#ffa657",
|
|
22
|
+
"purple": "#be8fff",
|
|
23
|
+
"pink": "#f778ba",
|
|
24
|
+
"cyan": "#39c5cf",
|
|
25
|
+
"selection": "#1a4480",
|
|
26
|
+
"diffAddBg": "#0f2a24",
|
|
27
|
+
"diffDelBg": "#261418"
|
|
30
28
|
},
|
|
31
29
|
"colors": {
|
|
32
|
-
"accent": "
|
|
30
|
+
"accent": "blue",
|
|
33
31
|
"border": "border",
|
|
34
|
-
"borderAccent": "
|
|
32
|
+
"borderAccent": "blue",
|
|
35
33
|
"borderMuted": "borderMuted",
|
|
36
34
|
"success": "green",
|
|
37
35
|
"error": "red",
|
|
38
36
|
"warning": "yellow",
|
|
39
|
-
"muted": "
|
|
40
|
-
"dim": "
|
|
41
|
-
"text": "
|
|
42
|
-
"thinkingText": "
|
|
43
|
-
"selectedBg": "
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
37
|
+
"muted": "fgMuted",
|
|
38
|
+
"dim": "#71717a",
|
|
39
|
+
"text": "fg",
|
|
40
|
+
"thinkingText": "fgMuted",
|
|
41
|
+
"selectedBg": "selection",
|
|
42
|
+
"scrollbarTrack": "borderMuted",
|
|
43
|
+
"scrollbarThumb": "#3a5274",
|
|
44
|
+
"searchMatchBg": "#1e1800",
|
|
45
|
+
"searchMatchText": "fg",
|
|
46
|
+
"userMessageBg": "canvasSubtle",
|
|
47
|
+
"userMessageText": "fg",
|
|
48
|
+
"customMessageBg": "borderMuted",
|
|
49
|
+
"customMessageText": "fgMuted",
|
|
50
|
+
"customMessageLabel": "blue",
|
|
51
|
+
"toolPendingBg": "canvasSubtle",
|
|
52
|
+
"toolSuccessBg": "diffAddBg",
|
|
53
|
+
"toolErrorBg": "diffDelBg",
|
|
54
|
+
"toolTitle": "fg",
|
|
55
|
+
"toolOutput": "fgMuted",
|
|
56
|
+
"mdHeading": "blueBright",
|
|
57
|
+
"mdLink": "blue",
|
|
58
|
+
"mdLinkUrl": "fgMuted",
|
|
59
|
+
"mdCode": "#a5d6ff",
|
|
60
|
+
"mdCodeBlock": "fg",
|
|
60
61
|
"mdCodeBlockBorder": "border",
|
|
61
|
-
"mdQuote": "
|
|
62
|
-
"mdQuoteBorder": "
|
|
63
|
-
"mdHr": "
|
|
64
|
-
"mdListBullet": "
|
|
62
|
+
"mdQuote": "fgMuted",
|
|
63
|
+
"mdQuoteBorder": "#2a4060",
|
|
64
|
+
"mdHr": "border",
|
|
65
|
+
"mdListBullet": "blueBright",
|
|
65
66
|
"toolDiffAdded": "green",
|
|
66
67
|
"toolDiffRemoved": "red",
|
|
67
|
-
"toolDiffContext": "
|
|
68
|
-
"syntaxComment": "
|
|
69
|
-
"syntaxKeyword": "
|
|
70
|
-
"syntaxFunction": "
|
|
71
|
-
"syntaxVariable": "
|
|
72
|
-
"syntaxString": "
|
|
73
|
-
"syntaxNumber": "
|
|
74
|
-
"syntaxType": "
|
|
75
|
-
"syntaxOperator": "
|
|
76
|
-
"syntaxPunctuation": "
|
|
77
|
-
"thinkingOff": "
|
|
78
|
-
"thinkingMinimal": "
|
|
68
|
+
"toolDiffContext": "fgMuted",
|
|
69
|
+
"syntaxComment": "fgMuted",
|
|
70
|
+
"syntaxKeyword": "redSoft",
|
|
71
|
+
"syntaxFunction": "purple",
|
|
72
|
+
"syntaxVariable": "orangeSoft",
|
|
73
|
+
"syntaxString": "#a5d6ff",
|
|
74
|
+
"syntaxNumber": "blueBright",
|
|
75
|
+
"syntaxType": "orange",
|
|
76
|
+
"syntaxOperator": "redSoft",
|
|
77
|
+
"syntaxPunctuation": "fg",
|
|
78
|
+
"thinkingOff": "fgMuted",
|
|
79
|
+
"thinkingMinimal": "fgSubtle",
|
|
79
80
|
"thinkingLow": "blue",
|
|
80
|
-
"thinkingMedium": "
|
|
81
|
-
"thinkingHigh": "
|
|
82
|
-
"thinkingXhigh": "
|
|
81
|
+
"thinkingMedium": "blue",
|
|
82
|
+
"thinkingHigh": "blueBright",
|
|
83
|
+
"thinkingXhigh": "cyan",
|
|
83
84
|
"thinkingMax": "cyan",
|
|
84
85
|
"bashMode": "green"
|
|
85
86
|
},
|
|
86
87
|
"export": {
|
|
87
|
-
"pageBg": "
|
|
88
|
-
"cardBg": "
|
|
89
|
-
"infoBg": "
|
|
88
|
+
"pageBg": "#0a1424",
|
|
89
|
+
"cardBg": "canvasSubtle",
|
|
90
|
+
"infoBg": "#122544"
|
|
90
91
|
}
|
|
91
92
|
}
|
package/themes/cc-light.json
CHANGED
|
@@ -1,91 +1,92 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://
|
|
2
|
+
"$schema": "https://pi.dev/schemas/theme.schema.json",
|
|
3
3
|
"name": "cc-light",
|
|
4
|
+
"appearance": "light",
|
|
4
5
|
"vars": {
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"toolSuccessBg": "#edf7f0",
|
|
28
|
-
"toolErrorBg": "#fceff1",
|
|
29
|
-
"customMessageBg": "#f4effa"
|
|
6
|
+
"fg": "#1e252a",
|
|
7
|
+
"fgMuted": "#3e4a56",
|
|
8
|
+
"fgSubtle": "#46525e",
|
|
9
|
+
"canvas": "#ffffff",
|
|
10
|
+
"canvasSubtle": "#d6e1f1",
|
|
11
|
+
"canvasInset": "#e3ebf5",
|
|
12
|
+
"border": "#7391c2",
|
|
13
|
+
"borderMuted": "#a8bdd9",
|
|
14
|
+
"blue": "#0058ad",
|
|
15
|
+
"blueBright": "#004776",
|
|
16
|
+
"green": "#005a16",
|
|
17
|
+
"red": "#a81417",
|
|
18
|
+
"redSoft": "#9b1b1f",
|
|
19
|
+
"yellow": "#765300",
|
|
20
|
+
"orange": "#843f00",
|
|
21
|
+
"orangeSoft": "#663600",
|
|
22
|
+
"purple": "#65339c",
|
|
23
|
+
"pink": "#931662",
|
|
24
|
+
"cyan": "#005359",
|
|
25
|
+
"selection": "#c5d6ee",
|
|
26
|
+
"diffAddBg": "#c3dcd0",
|
|
27
|
+
"diffDelBg": "#f0d5d8"
|
|
30
28
|
},
|
|
31
29
|
"colors": {
|
|
32
|
-
"accent": "
|
|
30
|
+
"accent": "blue",
|
|
33
31
|
"border": "border",
|
|
34
|
-
"borderAccent": "
|
|
32
|
+
"borderAccent": "blue",
|
|
35
33
|
"borderMuted": "borderMuted",
|
|
36
34
|
"success": "green",
|
|
37
35
|
"error": "red",
|
|
38
36
|
"warning": "yellow",
|
|
39
|
-
"muted": "
|
|
40
|
-
"dim": "
|
|
41
|
-
"text": "
|
|
42
|
-
"thinkingText": "
|
|
43
|
-
"selectedBg": "
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
37
|
+
"muted": "fgMuted",
|
|
38
|
+
"dim": "#4e5966",
|
|
39
|
+
"text": "fg",
|
|
40
|
+
"thinkingText": "fgMuted",
|
|
41
|
+
"selectedBg": "selection",
|
|
42
|
+
"scrollbarTrack": "borderMuted",
|
|
43
|
+
"scrollbarThumb": "#5d84b8",
|
|
44
|
+
"searchMatchBg": "#f3e4b0",
|
|
45
|
+
"searchMatchText": "fg",
|
|
46
|
+
"userMessageBg": "canvasSubtle",
|
|
47
|
+
"userMessageText": "fg",
|
|
48
|
+
"customMessageBg": "#c5d3e6",
|
|
49
|
+
"customMessageText": "fgMuted",
|
|
50
|
+
"customMessageLabel": "blue",
|
|
51
|
+
"toolPendingBg": "canvasSubtle",
|
|
52
|
+
"toolSuccessBg": "diffAddBg",
|
|
53
|
+
"toolErrorBg": "diffDelBg",
|
|
54
|
+
"toolTitle": "fg",
|
|
55
|
+
"toolOutput": "fgMuted",
|
|
56
|
+
"mdHeading": "blueBright",
|
|
57
|
+
"mdLink": "blue",
|
|
58
|
+
"mdLinkUrl": "fgMuted",
|
|
59
|
+
"mdCode": "#053859",
|
|
60
|
+
"mdCodeBlock": "fg",
|
|
60
61
|
"mdCodeBlockBorder": "border",
|
|
61
|
-
"mdQuote": "
|
|
62
|
-
"mdQuoteBorder": "
|
|
63
|
-
"mdHr": "
|
|
64
|
-
"mdListBullet": "
|
|
62
|
+
"mdQuote": "fgMuted",
|
|
63
|
+
"mdQuoteBorder": "#6d8dbe",
|
|
64
|
+
"mdHr": "border",
|
|
65
|
+
"mdListBullet": "blueBright",
|
|
65
66
|
"toolDiffAdded": "green",
|
|
66
67
|
"toolDiffRemoved": "red",
|
|
67
|
-
"toolDiffContext": "
|
|
68
|
-
"syntaxComment": "
|
|
69
|
-
"syntaxKeyword": "
|
|
70
|
-
"syntaxFunction": "
|
|
71
|
-
"syntaxVariable": "
|
|
72
|
-
"syntaxString": "
|
|
73
|
-
"syntaxNumber": "
|
|
74
|
-
"syntaxType": "
|
|
75
|
-
"syntaxOperator": "
|
|
76
|
-
"syntaxPunctuation": "
|
|
77
|
-
"thinkingOff": "
|
|
78
|
-
"thinkingMinimal": "
|
|
68
|
+
"toolDiffContext": "fgMuted",
|
|
69
|
+
"syntaxComment": "fgMuted",
|
|
70
|
+
"syntaxKeyword": "redSoft",
|
|
71
|
+
"syntaxFunction": "purple",
|
|
72
|
+
"syntaxVariable": "orangeSoft",
|
|
73
|
+
"syntaxString": "#053859",
|
|
74
|
+
"syntaxNumber": "blueBright",
|
|
75
|
+
"syntaxType": "orange",
|
|
76
|
+
"syntaxOperator": "redSoft",
|
|
77
|
+
"syntaxPunctuation": "fg",
|
|
78
|
+
"thinkingOff": "fgMuted",
|
|
79
|
+
"thinkingMinimal": "fgSubtle",
|
|
79
80
|
"thinkingLow": "blue",
|
|
80
|
-
"thinkingMedium": "
|
|
81
|
-
"thinkingHigh": "
|
|
82
|
-
"thinkingXhigh": "
|
|
81
|
+
"thinkingMedium": "blue",
|
|
82
|
+
"thinkingHigh": "blueBright",
|
|
83
|
+
"thinkingXhigh": "cyan",
|
|
83
84
|
"thinkingMax": "cyan",
|
|
84
85
|
"bashMode": "green"
|
|
85
86
|
},
|
|
86
87
|
"export": {
|
|
87
|
-
"pageBg": "
|
|
88
|
-
"cardBg": "
|
|
89
|
-
"infoBg": "
|
|
88
|
+
"pageBg": "#f4f7fb",
|
|
89
|
+
"cardBg": "canvasSubtle",
|
|
90
|
+
"infoBg": "#d0dff2"
|
|
90
91
|
}
|
|
91
92
|
}
|