pi-one-ui 0.1.1
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/LICENSE +21 -0
- package/README.md +106 -0
- package/extensions/app/config/renderer.ts +452 -0
- package/extensions/app/config/shell.ts +2484 -0
- package/extensions/app/ownership.ts +18 -0
- package/extensions/app/panel.ts +533 -0
- package/extensions/app/presets.ts +36 -0
- package/extensions/features/agent-summary/core.ts +194 -0
- package/extensions/features/agent-summary/index.ts +37 -0
- package/extensions/features/compact-thinking.ts +1262 -0
- package/extensions/features/context.ts +857 -0
- package/extensions/features/reference/index.ts +643 -0
- package/extensions/features/reference/session.ts +278 -0
- package/extensions/features/reference/subagent.ts +218 -0
- package/extensions/features/shell/aliases.ts +28 -0
- package/extensions/features/shell/flush-docked-bash.ts +39 -0
- package/extensions/features/shell/startup-header.ts +357 -0
- package/extensions/features/shell/working-message.ts +226 -0
- package/extensions/index.ts +52 -0
- package/extensions/shell/accent-rail-editor.ts +112 -0
- package/extensions/shell/accent-rail-layout-patch.ts +530 -0
- package/extensions/shell/completion-menu.ts +186 -0
- package/extensions/shell/editor-metadata-format.ts +287 -0
- package/extensions/shell/editor-transfer.ts +73 -0
- package/extensions/shell/extension-status.ts +102 -0
- package/extensions/shell/footer-format.ts +388 -0
- package/extensions/shell/footer-layout.ts +144 -0
- package/extensions/shell/footer.ts +1035 -0
- package/extensions/shell/format.ts +577 -0
- package/extensions/shell/git.ts +434 -0
- package/extensions/shell/icons.ts +261 -0
- package/extensions/shell/index.ts +1659 -0
- package/extensions/shell/interaction-summary.ts +1194 -0
- package/extensions/shell/live-context.ts +82 -0
- package/extensions/shell/minimalist-editor.ts +548 -0
- package/extensions/shell/package-version.ts +675 -0
- package/extensions/shell/project-refresh.ts +130 -0
- package/extensions/shell/project-state.ts +60 -0
- package/extensions/shell/prototype-patch-registry.ts +183 -0
- package/extensions/shell/runtime.ts +915 -0
- package/extensions/shell/selector-border.ts +109 -0
- package/extensions/shell/session-lifecycle.ts +60 -0
- package/extensions/shell/settings-command.ts +2144 -0
- package/extensions/shell/settings-previews.ts +137 -0
- package/extensions/shell/state.ts +83 -0
- package/extensions/shell/style.ts +480 -0
- package/extensions/shell/telemetry.ts +90 -0
- package/extensions/shell/ui.ts +1326 -0
- package/extensions/shell/user-message-osc.ts +279 -0
- package/extensions/shell/user-message-styles.ts +266 -0
- package/extensions/shell/user-message.ts +226 -0
- package/extensions/shell/working-line-messages.ts +24 -0
- package/extensions/shell/working-line-spinners.ts +54 -0
- package/extensions/shell/working-line.ts +1603 -0
- package/extensions/tools/ansi-color.ts +44 -0
- package/extensions/tools/ansi-text.ts +52 -0
- package/extensions/tools/component-tree.ts +37 -0
- package/extensions/tools/format.ts +28 -0
- package/extensions/tools/fullscreen-detect.ts +11 -0
- package/extensions/tools/patch-keys.ts +158 -0
- package/extensions/tools/sgr-mouse.ts +59 -0
- package/extensions/tools/tool-loading-icon.ts +20 -0
- package/extensions/tools/tool-result-sanitize.ts +27 -0
- package/extensions/transcript/index.ts +65 -0
- package/extensions/transcript/renderer/compact-mode.ts +1443 -0
- package/extensions/transcript/renderer/default-mode.ts +735 -0
- package/extensions/transcript/renderer/index.ts +286 -0
- package/extensions/transcript/renderer/markdown-enhance.ts +325 -0
- package/extensions/transcript/renderer/mouse/hover.ts +175 -0
- package/extensions/transcript/renderer/mouse/interaction.ts +1016 -0
- package/extensions/transcript/renderer/mouse/layout.ts +207 -0
- package/extensions/transcript/renderer/mouse/packets.ts +96 -0
- package/extensions/transcript/renderer/mouse/scroll.ts +211 -0
- package/extensions/transcript/renderer/tool/diff/ATTRIBUTION.md +28 -0
- package/extensions/transcript/renderer/tool/diff/ansi-utils.ts +128 -0
- package/extensions/transcript/renderer/tool/diff/diff-component.ts +112 -0
- package/extensions/transcript/renderer/tool/diff/diff-edit-render.ts +255 -0
- package/extensions/transcript/renderer/tool/diff/diff-header.ts +184 -0
- package/extensions/transcript/renderer/tool/diff/diff-highlight.ts +131 -0
- package/extensions/transcript/renderer/tool/diff/diff-inline.ts +350 -0
- package/extensions/transcript/renderer/tool/diff/diff-layout.ts +870 -0
- package/extensions/transcript/renderer/tool/diff/diff-limits.ts +189 -0
- package/extensions/transcript/renderer/tool/diff/diff-palette.ts +436 -0
- package/extensions/transcript/renderer/tool/diff/diff-parse.ts +536 -0
- package/extensions/transcript/renderer/tool/diff/diff-presentation.ts +79 -0
- package/extensions/transcript/renderer/tool/diff/diff-renderer.ts +29 -0
- package/extensions/transcript/renderer/tool/diff/diff-text.ts +57 -0
- package/extensions/transcript/renderer/tool/diff/diff-write-render.ts +629 -0
- package/extensions/transcript/renderer/tool/diff/index.ts +147 -0
- package/extensions/transcript/renderer/tool/diff/line-width-safety.ts +100 -0
- package/extensions/transcript/renderer/tool/diff/shiki-highlight.ts +104 -0
- package/extensions/transcript/renderer/tool/diff/write-execution.ts +124 -0
- package/extensions/transcript/renderer/tool/grouping.ts +619 -0
- package/extensions/transcript/renderer/tool/message-display.ts +183 -0
- package/extensions/transcript/renderer/tool/names.ts +195 -0
- package/extensions/transcript/renderer/tool/result.ts +842 -0
- package/extensions/transcript/renderer/tool/show-more-hint.ts +42 -0
- package/extensions/transcript/renderer/transcript-refresh.ts +79 -0
- package/package.json +58 -0
- package/themes/cc-dark.json +91 -0
- package/themes/cc-light.json +91 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { ThinkingPreviewBlock } from "../../../features/compact-thinking.ts";
|
|
2
|
+
import { setHoveredCompactAssistant } from "../compact-mode.ts";
|
|
3
|
+
import {
|
|
4
|
+
patchRegistry,
|
|
5
|
+
TOOL_HOVER_STATE_KEY,
|
|
6
|
+
} from "../../../tools/patch-keys.ts";
|
|
7
|
+
import {
|
|
8
|
+
isExpandedToolIoView,
|
|
9
|
+
invalidateIoView,
|
|
10
|
+
type ExpandedToolIoView,
|
|
11
|
+
type ToolIoSection,
|
|
12
|
+
} from "../tool/result.ts";
|
|
13
|
+
import type { ToolGroupComponent } from "../tool/grouping.ts";
|
|
14
|
+
import { componentAtLocalRow, type ComponentRowHit } from "./layout.ts";
|
|
15
|
+
import { setScrollButtonHovered } from "./scroll.ts";
|
|
16
|
+
|
|
17
|
+
type SharedToolHoverState = { toolCallId: string | null };
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* hover 状态宿主(Symbol.for + globalThis):模块 reload 后新旧实例共享,
|
|
21
|
+
* 测试依赖该跨实例语义。
|
|
22
|
+
*/
|
|
23
|
+
export function sharedToolHoverState(): SharedToolHoverState {
|
|
24
|
+
return patchRegistry.ensure(TOOL_HOVER_STATE_KEY, () => ({
|
|
25
|
+
toolCallId: null,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// 状态单源在 globalThis 槽;hoveredToolCallId 变量仅为兼容旧 deep import 保留
|
|
30
|
+
// (外部扩展可能直接从 interaction.ts re-export 读取),内部读取一律走槽。
|
|
31
|
+
export let hoveredToolCallId: string | null = sharedToolHoverState().toolCallId;
|
|
32
|
+
|
|
33
|
+
export function setHoveredToolCallId(toolCallId: string | null): void {
|
|
34
|
+
sharedToolHoverState().toolCallId = toolCallId;
|
|
35
|
+
hoveredToolCallId = toolCallId;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function isToolCallHovered(
|
|
39
|
+
toolCallId: string | null | undefined,
|
|
40
|
+
): boolean {
|
|
41
|
+
return Boolean(
|
|
42
|
+
toolCallId && sharedToolHoverState().toolCallId === toolCallId,
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let hoveredToolGroup: ToolGroupComponent | null = null;
|
|
47
|
+
|
|
48
|
+
export function setHoveredToolGroup(group: ToolGroupComponent | null): boolean {
|
|
49
|
+
if (group === hoveredToolGroup) return false;
|
|
50
|
+
hoveredToolGroup?.setHintHovered(false);
|
|
51
|
+
hoveredToolGroup = group;
|
|
52
|
+
group?.setHintHovered(true);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let hoveredThinking: ThinkingPreviewBlock | null = null;
|
|
57
|
+
|
|
58
|
+
export function setHoveredThinking(
|
|
59
|
+
block: ThinkingPreviewBlock | null,
|
|
60
|
+
): boolean {
|
|
61
|
+
if (block === hoveredThinking) return false;
|
|
62
|
+
hoveredThinking?.setHintHovered(false);
|
|
63
|
+
hoveredThinking = block;
|
|
64
|
+
block?.setHintHovered(true);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let hoveredMessageDisplay: any = null;
|
|
69
|
+
|
|
70
|
+
export function setHoveredMessageDisplay(component: any): boolean {
|
|
71
|
+
if (component === hoveredMessageDisplay) return false;
|
|
72
|
+
hoveredMessageDisplay?.setHintHovered?.(false);
|
|
73
|
+
hoveredMessageDisplay = component;
|
|
74
|
+
component?.setHintHovered?.(true);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
let hoveredToolIoView: ExpandedToolIoView | null = null;
|
|
79
|
+
let hoveredToolIoSection: ToolIoSection | null = null;
|
|
80
|
+
|
|
81
|
+
export function setHoveredToolIo(
|
|
82
|
+
view: ExpandedToolIoView | null,
|
|
83
|
+
section: ToolIoSection | null,
|
|
84
|
+
): boolean {
|
|
85
|
+
// resultRendererComponent 可能是 Text/第三方 renderer;reload 后也可能残留旧实例。
|
|
86
|
+
const nextView = isExpandedToolIoView(view) ? view : null;
|
|
87
|
+
const nextSection = nextView ? section : null;
|
|
88
|
+
if (nextView === hoveredToolIoView && nextSection === hoveredToolIoSection)
|
|
89
|
+
return false;
|
|
90
|
+
if (isExpandedToolIoView(hoveredToolIoView)) {
|
|
91
|
+
hoveredToolIoView.setHoveredSection(null);
|
|
92
|
+
invalidateIoView(hoveredToolIoView);
|
|
93
|
+
}
|
|
94
|
+
hoveredToolIoView = nextView;
|
|
95
|
+
hoveredToolIoSection = nextSection;
|
|
96
|
+
if (nextView) {
|
|
97
|
+
nextView.setHoveredSection(nextSection);
|
|
98
|
+
invalidateIoView(nextView);
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** hover 与点击共用组件定位;同一布局下按容器/宽度/行缓存,避免 motion 重复渲染。 */
|
|
104
|
+
let fullscreenHoverCacheLayout: unknown = null;
|
|
105
|
+
let fullscreenHoverComponentCache = new WeakMap<
|
|
106
|
+
object,
|
|
107
|
+
Map<string, ComponentRowHit | null>
|
|
108
|
+
>();
|
|
109
|
+
|
|
110
|
+
export function cachedFullscreenComponentAtRow(
|
|
111
|
+
layout: any,
|
|
112
|
+
container: any,
|
|
113
|
+
row: number,
|
|
114
|
+
width: number,
|
|
115
|
+
): ComponentRowHit | null {
|
|
116
|
+
if (!container || typeof container !== "object") return null;
|
|
117
|
+
if (fullscreenHoverCacheLayout !== layout) {
|
|
118
|
+
fullscreenHoverCacheLayout = layout;
|
|
119
|
+
fullscreenHoverComponentCache = new WeakMap();
|
|
120
|
+
}
|
|
121
|
+
let rows = fullscreenHoverComponentCache.get(container);
|
|
122
|
+
if (!rows) {
|
|
123
|
+
rows = new Map();
|
|
124
|
+
fullscreenHoverComponentCache.set(container, rows);
|
|
125
|
+
}
|
|
126
|
+
const key = `${width}:${row}`;
|
|
127
|
+
if (rows.has(key)) return rows.get(key) ?? null;
|
|
128
|
+
const hit = componentAtLocalRow(container, row, width);
|
|
129
|
+
rows.set(key, hit);
|
|
130
|
+
return hit;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** fullscreen 鼠标悬停目标。 */
|
|
134
|
+
export type FullscreenHoverTarget =
|
|
135
|
+
| { kind: "button" }
|
|
136
|
+
| { kind: "group"; component: ToolGroupComponent }
|
|
137
|
+
| { kind: "thinking"; component: ThinkingPreviewBlock }
|
|
138
|
+
| { kind: "message"; component: any }
|
|
139
|
+
| { kind: "assistant"; component: any }
|
|
140
|
+
| {
|
|
141
|
+
kind: "tool";
|
|
142
|
+
component: any;
|
|
143
|
+
view: ExpandedToolIoView | null;
|
|
144
|
+
section: ToolIoSection | null;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/** 悬停状态变化才触发渲染(motion 事件密集,状态不变跳过)。 */
|
|
148
|
+
export function applyFullscreenHover(
|
|
149
|
+
tui: any,
|
|
150
|
+
target: FullscreenHoverTarget | null,
|
|
151
|
+
): void {
|
|
152
|
+
let changed = false;
|
|
153
|
+
const nextCallId =
|
|
154
|
+
target?.kind === "tool" && !target.component.expanded
|
|
155
|
+
? (target.component.toolCallId ?? null)
|
|
156
|
+
: null;
|
|
157
|
+
if (nextCallId !== sharedToolHoverState().toolCallId) {
|
|
158
|
+
setHoveredToolCallId(nextCallId);
|
|
159
|
+
changed = true;
|
|
160
|
+
}
|
|
161
|
+
const nextGroup = target?.kind === "group" ? target.component : null;
|
|
162
|
+
if (setHoveredToolGroup(nextGroup)) changed = true;
|
|
163
|
+
const nextThinking = target?.kind === "thinking" ? target.component : null;
|
|
164
|
+
if (setHoveredThinking(nextThinking)) changed = true;
|
|
165
|
+
const nextMessage = target?.kind === "message" ? target.component : null;
|
|
166
|
+
if (setHoveredMessageDisplay(nextMessage)) changed = true;
|
|
167
|
+
const nextAssistant = target?.kind === "assistant" ? target.component : null;
|
|
168
|
+
if (setHoveredCompactAssistant(nextAssistant)) changed = true;
|
|
169
|
+
const nextView = target?.kind === "tool" ? target.view : null;
|
|
170
|
+
const nextSection = target?.kind === "tool" ? target.section : null;
|
|
171
|
+
if (setHoveredToolIo(nextView, nextSection)) changed = true;
|
|
172
|
+
const nextButton = target?.kind === "button";
|
|
173
|
+
if (setScrollButtonHovered(nextButton)) changed = true;
|
|
174
|
+
if (changed) tui.requestRender?.();
|
|
175
|
+
}
|