pi-cc-extensions 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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): "accent" | "error" | "success" | "muted" {
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 "accent";
180
+ if (context?.isPartial || context?.executionStarted || visualState === "pending") return "dim";
132
181
  return "muted";
133
182
  }
134
183
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-cc-extensions",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "license": "MIT",
5
5
  "description": "Claude Code-style TUI output with some personal touches and handy utilities.",
6
6
  "type": "module",
@@ -1,91 +1,92 @@
1
1
  {
2
- "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
2
+ "$schema": "https://pi.dev/schemas/theme.schema.json",
3
3
  "name": "cc-dark",
4
+ "appearance": "dark",
4
5
  "vars": {
5
- "bg": "#131217",
6
- "panel": "#1b1922",
7
- "surface": "#211e2b",
8
- "surfaceRaised": "#292533",
9
- "border": "#36313f",
10
- "borderMuted": "#292631",
11
- "accent": "#5e9cff",
12
- "accentBright": "#8ab4ff",
13
- "purple": "#c084fc",
14
- "pink": "#f472b6",
15
- "cyan": "#67e8f9",
16
- "blue": "#60a5fa",
17
- "green": "#4ade80",
18
- "red": "#fb7185",
19
- "yellow": "#facc15",
20
- "orange": "#fb923c",
21
- "text": "#e4e4e7",
22
- "muted": "#a1a1aa",
23
- "dim": "#71717a",
24
- "selectedBg": "#252035",
25
- "userMessageBg": "#1e1e2e",
26
- "toolPendingBg": "#1b1924",
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": "accent",
30
+ "accent": "blue",
33
31
  "border": "border",
34
- "borderAccent": "accent",
32
+ "borderAccent": "blue",
35
33
  "borderMuted": "borderMuted",
36
34
  "success": "green",
37
35
  "error": "red",
38
36
  "warning": "yellow",
39
- "muted": "muted",
40
- "dim": "dim",
41
- "text": "text",
42
- "thinkingText": "muted",
43
- "selectedBg": "selectedBg",
44
- "scrollbarThumb": "selectedBg",
45
- "userMessageBg": "userMessageBg",
46
- "userMessageText": "text",
47
- "customMessageBg": "customMessageBg",
48
- "customMessageText": "text",
49
- "customMessageLabel": "purple",
50
- "toolPendingBg": "toolPendingBg",
51
- "toolSuccessBg": "toolSuccessBg",
52
- "toolErrorBg": "toolErrorBg",
53
- "toolTitle": "accentBright",
54
- "toolOutput": "muted",
55
- "mdHeading": "accentBright",
56
- "mdLink": "cyan",
57
- "mdLinkUrl": "muted",
58
- "mdCode": "accentBright",
59
- "mdCodeBlock": "text",
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": "muted",
62
- "mdQuoteBorder": "accent",
63
- "mdHr": "borderMuted",
64
- "mdListBullet": "accent",
62
+ "mdQuote": "fgMuted",
63
+ "mdQuoteBorder": "#2a4060",
64
+ "mdHr": "border",
65
+ "mdListBullet": "blueBright",
65
66
  "toolDiffAdded": "green",
66
67
  "toolDiffRemoved": "red",
67
- "toolDiffContext": "muted",
68
- "syntaxComment": "#6b7280",
69
- "syntaxKeyword": "pink",
70
- "syntaxFunction": "accentBright",
71
- "syntaxVariable": "blue",
72
- "syntaxString": "green",
73
- "syntaxNumber": "orange",
74
- "syntaxType": "cyan",
75
- "syntaxOperator": "text",
76
- "syntaxPunctuation": "muted",
77
- "thinkingOff": "muted",
78
- "thinkingMinimal": "dim",
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": "accent",
81
- "thinkingHigh": "accentBright",
82
- "thinkingXhigh": "#4db9cd",
81
+ "thinkingMedium": "blue",
82
+ "thinkingHigh": "blueBright",
83
+ "thinkingXhigh": "cyan",
83
84
  "thinkingMax": "cyan",
84
85
  "bashMode": "green"
85
86
  },
86
87
  "export": {
87
- "pageBg": "bg",
88
- "cardBg": "panel",
89
- "infoBg": "surface"
88
+ "pageBg": "#0a1424",
89
+ "cardBg": "canvasSubtle",
90
+ "infoBg": "#122544"
90
91
  }
91
92
  }
@@ -1,91 +1,92 @@
1
1
  {
2
- "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
2
+ "$schema": "https://pi.dev/schemas/theme.schema.json",
3
3
  "name": "cc-light",
4
+ "appearance": "light",
4
5
  "vars": {
5
- "bg": "#f7f7f8",
6
- "panel": "#ffffff",
7
- "surface": "#f3f1f7",
8
- "surfaceRaised": "#ebe8f0",
9
- "border": "#d4d0db",
10
- "borderMuted": "#e5e2e9",
11
- "accent": "#2563eb",
12
- "accentBright": "#1d4ed8",
13
- "purple": "#7e22ce",
14
- "pink": "#be185d",
15
- "cyan": "#0e7490",
16
- "blue": "#2563eb",
17
- "green": "#15803d",
18
- "red": "#dc2626",
19
- "yellow": "#a16207",
20
- "orange": "#c2410c",
21
- "text": "#282530",
22
- "muted": "#625f68",
23
- "dim": "#76717d",
24
- "selectedBg": "#e3e8f5",
25
- "userMessageBg": "#f0eef4",
26
- "toolPendingBg": "#f1f3f9",
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": "accent",
30
+ "accent": "blue",
33
31
  "border": "border",
34
- "borderAccent": "accent",
32
+ "borderAccent": "blue",
35
33
  "borderMuted": "borderMuted",
36
34
  "success": "green",
37
35
  "error": "red",
38
36
  "warning": "yellow",
39
- "muted": "muted",
40
- "dim": "dim",
41
- "text": "text",
42
- "thinkingText": "muted",
43
- "selectedBg": "selectedBg",
44
- "scrollbarThumb": "selectedBg",
45
- "userMessageBg": "userMessageBg",
46
- "userMessageText": "text",
47
- "customMessageBg": "customMessageBg",
48
- "customMessageText": "text",
49
- "customMessageLabel": "purple",
50
- "toolPendingBg": "toolPendingBg",
51
- "toolSuccessBg": "toolSuccessBg",
52
- "toolErrorBg": "toolErrorBg",
53
- "toolTitle": "accentBright",
54
- "toolOutput": "muted",
55
- "mdHeading": "accentBright",
56
- "mdLink": "cyan",
57
- "mdLinkUrl": "muted",
58
- "mdCode": "accentBright",
59
- "mdCodeBlock": "text",
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": "muted",
62
- "mdQuoteBorder": "accent",
63
- "mdHr": "borderMuted",
64
- "mdListBullet": "accent",
62
+ "mdQuote": "fgMuted",
63
+ "mdQuoteBorder": "#6d8dbe",
64
+ "mdHr": "border",
65
+ "mdListBullet": "blueBright",
65
66
  "toolDiffAdded": "green",
66
67
  "toolDiffRemoved": "red",
67
- "toolDiffContext": "muted",
68
- "syntaxComment": "#6b7280",
69
- "syntaxKeyword": "pink",
70
- "syntaxFunction": "accentBright",
71
- "syntaxVariable": "blue",
72
- "syntaxString": "green",
73
- "syntaxNumber": "orange",
74
- "syntaxType": "cyan",
75
- "syntaxOperator": "text",
76
- "syntaxPunctuation": "muted",
77
- "thinkingOff": "muted",
78
- "thinkingMinimal": "dim",
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": "accent",
81
- "thinkingHigh": "accentBright",
82
- "thinkingXhigh": "#0e7490",
81
+ "thinkingMedium": "blue",
82
+ "thinkingHigh": "blueBright",
83
+ "thinkingXhigh": "cyan",
83
84
  "thinkingMax": "cyan",
84
85
  "bashMode": "green"
85
86
  },
86
87
  "export": {
87
- "pageBg": "bg",
88
- "cardBg": "panel",
89
- "infoBg": "surface"
88
+ "pageBg": "#f4f7fb",
89
+ "cardBg": "canvasSubtle",
90
+ "infoBg": "#d0dff2"
90
91
  }
91
92
  }