@esso0428/pi-subagents 0.15.5 → 0.15.7
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 +10 -19
- package/README.md +5 -5
- package/dist/agent-history-list.d.ts +19 -0
- package/dist/agent-history-list.d.ts.map +1 -0
- package/dist/agent-history-list.js +69 -0
- package/dist/agent-history-list.js.map +1 -0
- package/dist/agent-history.d.ts +2 -1
- package/dist/agent-history.d.ts.map +1 -0
- package/dist/agent-history.js +32 -34
- package/dist/agent-history.js.map +1 -0
- package/dist/agent-manager.d.ts +24 -8
- package/dist/agent-manager.d.ts.map +1 -0
- package/dist/agent-manager.js +171 -93
- package/dist/agent-manager.js.map +1 -0
- package/dist/agent-runner.d.ts +1 -0
- package/dist/agent-runner.d.ts.map +1 -0
- package/dist/agent-runner.js +75 -86
- package/dist/agent-runner.js.map +1 -0
- package/dist/agent-types.d.ts +1 -0
- package/dist/agent-types.d.ts.map +1 -0
- package/dist/agent-types.js +28 -45
- package/dist/agent-types.js.map +1 -0
- package/dist/context.d.ts +1 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +3 -6
- package/dist/context.js.map +1 -0
- package/dist/cross-extension-rpc.d.ts +1 -0
- package/dist/cross-extension-rpc.d.ts.map +1 -0
- package/dist/cross-extension-rpc.js +6 -9
- package/dist/cross-extension-rpc.js.map +1 -0
- package/dist/custom-agents.d.ts +1 -0
- package/dist/custom-agents.d.ts.map +1 -0
- package/dist/custom-agents.js +16 -18
- package/dist/custom-agents.js.map +1 -0
- package/dist/default-agents.d.ts +1 -0
- package/dist/default-agents.d.ts.map +1 -0
- package/dist/default-agents.js +2 -4
- package/dist/default-agents.js.map +1 -0
- package/dist/enabled-models.d.ts +1 -0
- package/dist/enabled-models.d.ts.map +1 -0
- package/dist/enabled-models.js +12 -16
- package/dist/enabled-models.js.map +1 -0
- package/dist/env.d.ts +1 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +2 -4
- package/dist/env.js.map +1 -0
- package/dist/group-join.d.ts +1 -0
- package/dist/group-join.d.ts.map +1 -0
- package/dist/group-join.js +2 -5
- package/dist/group-join.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +306 -292
- package/dist/index.js.map +1 -0
- package/dist/invocation-config.d.ts +1 -0
- package/dist/invocation-config.d.ts.map +1 -0
- package/dist/invocation-config.js +3 -6
- package/dist/invocation-config.js.map +1 -0
- package/dist/memory.d.ts +1 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +25 -34
- package/dist/memory.js.map +1 -0
- package/dist/model-resolver.d.ts +1 -0
- package/dist/model-resolver.d.ts.map +1 -0
- package/dist/model-resolver.js +2 -4
- package/dist/model-resolver.js.map +1 -0
- package/dist/nico-overrides.d.ts +1 -0
- package/dist/nico-overrides.d.ts.map +1 -0
- package/dist/nico-overrides.js +15 -20
- package/dist/nico-overrides.js.map +1 -0
- package/dist/output-file.d.ts +1 -0
- package/dist/output-file.d.ts.map +1 -0
- package/dist/output-file.js +17 -22
- package/dist/output-file.js.map +1 -0
- package/dist/prompts.d.ts +1 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +2 -4
- package/dist/prompts.js.map +1 -0
- package/dist/schedule-store.d.ts +1 -0
- package/dist/schedule-store.d.ts.map +1 -0
- package/dist/schedule-store.js +17 -21
- package/dist/schedule-store.js.map +1 -0
- package/dist/schedule.d.ts +1 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +9 -12
- package/dist/schedule.js.map +1 -0
- package/dist/settings.d.ts +1 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +16 -23
- package/dist/settings.js.map +1 -0
- package/dist/skill-loader.d.ts +1 -0
- package/dist/skill-loader.d.ts.map +1 -0
- package/dist/skill-loader.js +21 -23
- package/dist/skill-loader.js.map +1 -0
- package/dist/status-note.d.ts +1 -0
- package/dist/status-note.d.ts.map +1 -0
- package/dist/status-note.js +2 -4
- package/dist/status-note.js.map +1 -0
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -4
- package/dist/types.js.map +1 -0
- package/dist/ui/agent-widget.d.ts +2 -5
- package/dist/ui/agent-widget.d.ts.map +1 -0
- package/dist/ui/agent-widget.js +29 -51
- package/dist/ui/agent-widget.js.map +1 -0
- package/dist/ui/ccstyle/diff/ansi-utils.d.ts +11 -0
- package/dist/ui/ccstyle/diff/ansi-utils.d.ts.map +1 -0
- package/dist/ui/ccstyle/diff/ansi-utils.js +145 -0
- package/dist/ui/ccstyle/diff/ansi-utils.js.map +1 -0
- package/dist/ui/ccstyle/diff/diff-presentation.d.ts +12 -0
- package/dist/ui/ccstyle/diff/diff-presentation.d.ts.map +1 -0
- package/dist/ui/ccstyle/diff/diff-presentation.js +49 -0
- package/dist/ui/ccstyle/diff/diff-presentation.js.map +1 -0
- package/dist/ui/ccstyle/diff/diff-renderer.d.ts +46 -0
- package/dist/ui/ccstyle/diff/diff-renderer.d.ts.map +1 -0
- package/dist/ui/ccstyle/diff/diff-renderer.js +2044 -0
- package/dist/ui/ccstyle/diff/diff-renderer.js.map +1 -0
- package/dist/ui/ccstyle/diff/line-width-safety.d.ts +12 -0
- package/dist/ui/ccstyle/diff/line-width-safety.d.ts.map +1 -0
- package/dist/ui/ccstyle/diff/line-width-safety.js +59 -0
- package/dist/ui/ccstyle/diff/line-width-safety.js.map +1 -0
- package/dist/ui/ccstyle/diff/render-utils.d.ts +6 -0
- package/dist/ui/ccstyle/diff/render-utils.d.ts.map +1 -0
- package/dist/ui/ccstyle/diff/render-utils.js +25 -0
- package/dist/ui/ccstyle/diff/render-utils.js.map +1 -0
- package/dist/ui/ccstyle/diff/types.d.ts +22 -0
- package/dist/ui/ccstyle/diff/types.d.ts.map +1 -0
- package/dist/ui/ccstyle/diff/types.js +10 -0
- package/dist/ui/ccstyle/diff/types.js.map +1 -0
- package/dist/ui/ccstyle/diff/write-display-utils.d.ts +2 -0
- package/dist/ui/ccstyle/diff/write-display-utils.d.ts.map +1 -0
- package/dist/ui/ccstyle/diff/write-display-utils.js +12 -0
- package/dist/ui/ccstyle/diff/write-display-utils.js.map +1 -0
- package/dist/ui/ccstyle/tool-renderer.d.ts +17 -0
- package/dist/ui/ccstyle/tool-renderer.d.ts.map +1 -0
- package/dist/ui/ccstyle/tool-renderer.js +58 -0
- package/dist/ui/ccstyle/tool-renderer.js.map +1 -0
- package/dist/ui/ccstyle/tool-result.d.ts +24 -0
- package/dist/ui/ccstyle/tool-result.d.ts.map +1 -0
- package/dist/ui/ccstyle/tool-result.js +193 -0
- package/dist/ui/ccstyle/tool-result.js.map +1 -0
- package/dist/ui/conversation-blocks.d.ts +46 -0
- package/dist/ui/conversation-blocks.d.ts.map +1 -0
- package/dist/ui/conversation-blocks.js +306 -0
- package/dist/ui/conversation-blocks.js.map +1 -0
- package/dist/ui/conversation-nvim.d.ts +8 -0
- package/dist/ui/conversation-nvim.d.ts.map +1 -0
- package/dist/ui/conversation-nvim.js +117 -0
- package/dist/ui/conversation-nvim.js.map +1 -0
- package/dist/ui/conversation-role.d.ts +13 -0
- package/dist/ui/conversation-role.d.ts.map +1 -0
- package/dist/ui/conversation-role.js +39 -0
- package/dist/ui/conversation-role.js.map +1 -0
- package/dist/ui/conversation-search.d.ts +39 -0
- package/dist/ui/conversation-search.d.ts.map +1 -0
- package/dist/ui/conversation-search.js +124 -0
- package/dist/ui/conversation-search.js.map +1 -0
- package/dist/ui/conversation-timeline.d.ts +62 -0
- package/dist/ui/conversation-timeline.d.ts.map +1 -0
- package/dist/ui/conversation-timeline.js +263 -0
- package/dist/ui/conversation-timeline.js.map +1 -0
- package/dist/ui/conversation-viewer.d.ts +62 -20
- package/dist/ui/conversation-viewer.d.ts.map +1 -0
- package/dist/ui/conversation-viewer.js +449 -224
- package/dist/ui/conversation-viewer.js.map +1 -0
- package/dist/ui/fleet-list.d.ts +24 -11
- package/dist/ui/fleet-list.d.ts.map +1 -0
- package/dist/ui/fleet-list.js +86 -78
- package/dist/ui/fleet-list.js.map +1 -0
- package/dist/ui/schedule-menu.d.ts +1 -0
- package/dist/ui/schedule-menu.d.ts.map +1 -0
- package/dist/ui/schedule-menu.js +2 -4
- package/dist/ui/schedule-menu.js.map +1 -0
- package/dist/ui/viewer-keys.d.ts +1 -0
- package/dist/ui/viewer-keys.d.ts.map +1 -0
- package/dist/ui/viewer-keys.js +8 -10
- package/dist/ui/viewer-keys.js.map +1 -0
- package/dist/usage.d.ts +1 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +5 -10
- package/dist/usage.js.map +1 -0
- package/dist/worktree.d.ts +1 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +27 -31
- package/dist/worktree.js.map +1 -0
- package/dist/write-execution.d.ts +42 -0
- package/dist/write-execution.d.ts.map +1 -0
- package/dist/write-execution.js +138 -0
- package/dist/write-execution.js.map +1 -0
- package/package.json +1 -1
- package/src/agent-history-list.ts +91 -0
- package/src/agent-history.ts +12 -17
- package/src/agent-manager.ts +169 -81
- package/src/agent-runner.ts +12 -13
- package/src/index.ts +117 -98
- package/src/output-file.ts +1 -1
- package/src/types.ts +4 -1
- package/src/ui/agent-widget.ts +3 -9
- package/src/ui/ccstyle/ATTRIBUTION.md +37 -0
- package/src/ui/ccstyle/diff/ansi-utils.ts +168 -0
- package/src/ui/ccstyle/diff/diff-presentation.ts +70 -0
- package/src/ui/ccstyle/diff/diff-renderer.ts +3148 -0
- package/src/ui/ccstyle/diff/line-width-safety.ts +92 -0
- package/src/ui/ccstyle/diff/render-utils.ts +32 -0
- package/src/ui/ccstyle/diff/types.ts +33 -0
- package/src/ui/ccstyle/diff/write-display-utils.ts +12 -0
- package/src/ui/ccstyle/tool-renderer.ts +71 -0
- package/src/ui/ccstyle/tool-result.ts +238 -0
- package/src/ui/conversation-blocks.ts +404 -0
- package/src/ui/conversation-nvim.ts +127 -0
- package/src/ui/conversation-role.ts +45 -0
- package/src/ui/conversation-search.ts +161 -0
- package/src/ui/conversation-timeline.ts +315 -0
- package/src/ui/conversation-viewer.ts +418 -210
- package/src/ui/fleet-list.ts +73 -52
- package/src/write-execution.ts +180 -0
- package/test/agent-history-list.test.ts +121 -0
- package/test/agent-manager-history.test.ts +59 -58
- package/test/agent-menu-history-navigation.test.ts +86 -0
- package/test/output-file-history.test.ts +50 -0
- package/test/ui/conversation-blocks.test.ts +103 -0
- package/test/ui/conversation-diff.test.ts +91 -0
- package/test/ui/conversation-search.test.ts +55 -0
- package/test/ui/conversation-viewer.test.ts +182 -0
- package/test/ui/fleet-list.test.ts +131 -0
- package/test/write-execution.test.ts +83 -0
- package/tsconfig.json +16 -0
- package/vitest.temp.config.mts +6 -0
- package/dist/ui/markdown-result.d.ts +0 -3
- package/dist/ui/markdown-result.js +0 -53
- package/src/ui/markdown-result.ts +0 -56
- package/test/agent-history.test.ts +0 -63
- package/test/ui/markdown-result.test.ts +0 -45
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import * as CodingAgent from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { Markdown, Text, truncateToWidth, } from "@earendil-works/pi-tui";
|
|
3
|
+
import { getMarkdownTheme } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import { renderConversationRoleHeader } from "./conversation-role.js";
|
|
5
|
+
import { stripAnsi } from "./conversation-search.js";
|
|
6
|
+
import { createViewerCcstyleTool, } from "./ccstyle/tool-renderer.js";
|
|
7
|
+
function safeWidth(width) {
|
|
8
|
+
return Math.max(1, Math.floor(Number.isFinite(width) ? width : 1));
|
|
9
|
+
}
|
|
10
|
+
function resultContent(result) {
|
|
11
|
+
if (Array.isArray(result.content))
|
|
12
|
+
return result.content;
|
|
13
|
+
if (typeof result.content === "string")
|
|
14
|
+
return [{ type: "text", text: result.content }];
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
function fallbackToolLines(block, width, expanded = false) {
|
|
18
|
+
const summary = block.toolLine || block.fullText || block.toolName || "tool";
|
|
19
|
+
const output = block.toolResult
|
|
20
|
+
? block.toolResult.content
|
|
21
|
+
: undefined;
|
|
22
|
+
const outputText = typeof output === "string"
|
|
23
|
+
? output
|
|
24
|
+
: Array.isArray(output)
|
|
25
|
+
? output.filter((item) => item?.type === "text").map((item) => String(item.text ?? "")).join("\n")
|
|
26
|
+
: "";
|
|
27
|
+
const outputLines = outputText.split(/\r?\n/);
|
|
28
|
+
const displayOutput = expanded || outputLines.length <= 4
|
|
29
|
+
? outputLines
|
|
30
|
+
: [...outputLines.slice(0, 4), `… (${outputLines.length - 4} more lines · Enter to expand)`];
|
|
31
|
+
const body = outputText ? [summary, ...displayOutput].join("\n") : summary;
|
|
32
|
+
return body.split(/\r?\n/).map((line) => truncateToWidth(line, width, ""));
|
|
33
|
+
}
|
|
34
|
+
function applyToolComponentState(component, block, expanded) {
|
|
35
|
+
component.updateArgs?.(block.args ?? block.toolArguments ?? {});
|
|
36
|
+
component.setArgsComplete?.();
|
|
37
|
+
if (block.result ?? block.toolResult) {
|
|
38
|
+
const result = (block.result ?? block.toolResult);
|
|
39
|
+
component.updateResult?.({
|
|
40
|
+
content: resultContent(result),
|
|
41
|
+
details: result.details,
|
|
42
|
+
isError: result.isError === true,
|
|
43
|
+
}, false);
|
|
44
|
+
}
|
|
45
|
+
component.setExpanded?.(expanded);
|
|
46
|
+
}
|
|
47
|
+
function createToolComponent(block, tui, cwd, expanded) {
|
|
48
|
+
const Constructor = CodingAgent.ToolExecutionComponent;
|
|
49
|
+
if (typeof Constructor !== "function" || !block.toolName || !block.toolCallId)
|
|
50
|
+
return undefined;
|
|
51
|
+
try {
|
|
52
|
+
const renderer = createViewerCcstyleTool(block.toolName);
|
|
53
|
+
const component = new Constructor(block.toolName, block.toolCallId, block.args ?? block.toolArguments ?? {}, { showImages: false }, renderer, tui, cwd);
|
|
54
|
+
component.markExecutionStarted?.();
|
|
55
|
+
applyToolComponentState(component, block, expanded);
|
|
56
|
+
return component;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Component-aware, snapshot-driven conversation timeline.
|
|
64
|
+
* ToolExecutionComponent state is rebuilt from normalized blocks when a call id
|
|
65
|
+
* first appears and then reused; history never needs a live session, spinner,
|
|
66
|
+
* stream, or process handle.
|
|
67
|
+
*/
|
|
68
|
+
export class ConversationTimeline {
|
|
69
|
+
tui;
|
|
70
|
+
theme;
|
|
71
|
+
options;
|
|
72
|
+
blocks = [];
|
|
73
|
+
showTools = true;
|
|
74
|
+
focusedToolCallId;
|
|
75
|
+
expandedTools = new Set();
|
|
76
|
+
toolComponents = new Map();
|
|
77
|
+
snapshot = {
|
|
78
|
+
lines: [],
|
|
79
|
+
messageStarts: [],
|
|
80
|
+
messageBlocks: [],
|
|
81
|
+
interactiveToolIds: [],
|
|
82
|
+
toolSpans: [],
|
|
83
|
+
};
|
|
84
|
+
lastWidth = 0;
|
|
85
|
+
constructor(tui, theme, options = {}) {
|
|
86
|
+
this.tui = tui;
|
|
87
|
+
this.theme = theme;
|
|
88
|
+
this.options = options;
|
|
89
|
+
}
|
|
90
|
+
setBlocks(blocks) {
|
|
91
|
+
this.blocks = [...blocks];
|
|
92
|
+
const ids = new Set(this.blocks.filter((block) => block.kind === "tool" && block.toolCallId).map((block) => block.toolCallId));
|
|
93
|
+
if (this.focusedToolCallId && !ids.has(this.focusedToolCallId))
|
|
94
|
+
this.focusedToolCallId = undefined;
|
|
95
|
+
for (const id of this.expandedTools)
|
|
96
|
+
if (!ids.has(id))
|
|
97
|
+
this.expandedTools.delete(id);
|
|
98
|
+
for (const id of this.toolComponents.keys())
|
|
99
|
+
if (!ids.has(id))
|
|
100
|
+
this.toolComponents.delete(id);
|
|
101
|
+
this.invalidate();
|
|
102
|
+
}
|
|
103
|
+
setShowTools(show) {
|
|
104
|
+
if (this.showTools === show)
|
|
105
|
+
return;
|
|
106
|
+
this.showTools = show;
|
|
107
|
+
if (!show)
|
|
108
|
+
this.focusedToolCallId = undefined;
|
|
109
|
+
this.invalidate();
|
|
110
|
+
}
|
|
111
|
+
getShowTools() {
|
|
112
|
+
return this.showTools;
|
|
113
|
+
}
|
|
114
|
+
setFocusedToolCallId(id) {
|
|
115
|
+
this.focusedToolCallId = id;
|
|
116
|
+
this.invalidate();
|
|
117
|
+
}
|
|
118
|
+
getFocusedToolCallId() {
|
|
119
|
+
return this.focusedToolCallId;
|
|
120
|
+
}
|
|
121
|
+
getSnapshot() {
|
|
122
|
+
if (this.lastWidth <= 0)
|
|
123
|
+
this.render(80);
|
|
124
|
+
return this.snapshot;
|
|
125
|
+
}
|
|
126
|
+
moveFocus(direction) {
|
|
127
|
+
const ids = this.getSnapshot().interactiveToolIds;
|
|
128
|
+
if (ids.length === 0)
|
|
129
|
+
return false;
|
|
130
|
+
const current = this.focusedToolCallId ? ids.indexOf(this.focusedToolCallId) : -1;
|
|
131
|
+
const next = current < 0
|
|
132
|
+
? direction > 0 ? 0 : ids.length - 1
|
|
133
|
+
: (current + direction + ids.length) % ids.length;
|
|
134
|
+
this.focusedToolCallId = ids[next];
|
|
135
|
+
this.invalidate();
|
|
136
|
+
this.options.onChange?.();
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
toggleFocusedTool() {
|
|
140
|
+
const id = this.focusedToolCallId;
|
|
141
|
+
if (!id)
|
|
142
|
+
return false;
|
|
143
|
+
if (this.expandedTools.has(id))
|
|
144
|
+
this.expandedTools.delete(id);
|
|
145
|
+
else
|
|
146
|
+
this.expandedTools.add(id);
|
|
147
|
+
this.invalidate();
|
|
148
|
+
this.options.onChange?.();
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
isToolFocused() {
|
|
152
|
+
return this.focusedToolCallId !== undefined;
|
|
153
|
+
}
|
|
154
|
+
render(width) {
|
|
155
|
+
const requestedWidth = safeWidth(width);
|
|
156
|
+
const lines = [];
|
|
157
|
+
const messageStarts = [];
|
|
158
|
+
const messageBlocks = [];
|
|
159
|
+
const interactiveToolIds = [];
|
|
160
|
+
const toolSpans = [];
|
|
161
|
+
const visibleBlocks = this.blocks.filter((block) => this.showTools || block.kind !== "tool");
|
|
162
|
+
if (visibleBlocks.length === 0) {
|
|
163
|
+
const text = this.blocks.length === 0 ? "(waiting for first message...)" : "(tools hidden)";
|
|
164
|
+
lines.push({ text: this.theme.fg("dim", text), plain: text, blockIndex: -1 });
|
|
165
|
+
}
|
|
166
|
+
for (const block of visibleBlocks) {
|
|
167
|
+
const blockIndex = this.blocks.indexOf(block);
|
|
168
|
+
if (lines.length > 0) {
|
|
169
|
+
const separator = this.theme.fg("border", " " + "─ ".repeat(Math.max(1, Math.floor((requestedWidth - 6) / 2))).trimEnd());
|
|
170
|
+
lines.push({ text: truncateToWidth(separator, requestedWidth), plain: stripAnsi(separator), blockIndex });
|
|
171
|
+
}
|
|
172
|
+
const headerLine = ` ${renderConversationRoleHeader(block, this.theme)}`;
|
|
173
|
+
messageStarts.push(lines.length);
|
|
174
|
+
messageBlocks.push(block);
|
|
175
|
+
lines.push({ text: truncateToWidth(headerLine, requestedWidth), plain: stripAnsi(headerLine), blockIndex, railable: true });
|
|
176
|
+
if (block.kind === "tool") {
|
|
177
|
+
const id = block.toolCallId;
|
|
178
|
+
if (id)
|
|
179
|
+
interactiveToolIds.push(id);
|
|
180
|
+
let component;
|
|
181
|
+
if (id) {
|
|
182
|
+
const existing = this.toolComponents.get(id);
|
|
183
|
+
if (existing) {
|
|
184
|
+
applyToolComponentState(existing, block, this.expandedTools.has(id));
|
|
185
|
+
component = existing;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
component = createToolComponent(block, this.tui, this.options.cwd ?? process.cwd(), this.expandedTools.has(id));
|
|
189
|
+
if (component)
|
|
190
|
+
this.toolComponents.set(id, component);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
let rendered;
|
|
194
|
+
try {
|
|
195
|
+
rendered = component?.render(requestedWidth) ?? fallbackToolLines(block, requestedWidth, id ? this.expandedTools.has(id) : false);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Pi's interactive theme is a capability, not a viewer dependency;
|
|
199
|
+
// test hosts and older Pi versions can lack its initialized theme.
|
|
200
|
+
rendered = fallbackToolLines(block, requestedWidth, id ? this.expandedTools.has(id) : false);
|
|
201
|
+
}
|
|
202
|
+
for (const line of rendered) {
|
|
203
|
+
lines.push({ text: truncateToWidth(line, requestedWidth), plain: stripAnsi(line), blockIndex, railable: true });
|
|
204
|
+
}
|
|
205
|
+
if (id)
|
|
206
|
+
toolSpans.push({ toolCallId: id, startLine: messageStarts[messageStarts.length - 1], height: lines.length - messageStarts[messageStarts.length - 1] });
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const markdown = new Markdown(block.markdown || "∅", 2, 0, getMarkdownTheme(), {
|
|
211
|
+
color: (text) => this.theme.fg(block.role === "meta" ? "muted" : "text", text),
|
|
212
|
+
});
|
|
213
|
+
for (const line of markdown.render(requestedWidth)) {
|
|
214
|
+
lines.push({ text: truncateToWidth(line, requestedWidth), plain: stripAnsi(line), blockIndex, railable: true });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
try {
|
|
219
|
+
for (const line of new Text(block.markdown || "∅").render(requestedWidth)) {
|
|
220
|
+
lines.push({ text: truncateToWidth(line, requestedWidth), plain: stripAnsi(line), blockIndex, railable: true });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
for (const line of (block.markdown || "∅").split("\n")) {
|
|
225
|
+
lines.push({ text: truncateToWidth(line, requestedWidth), plain: line, blockIndex, railable: true });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
this.lastWidth = requestedWidth;
|
|
231
|
+
this.snapshot = { lines, messageStarts, messageBlocks, interactiveToolIds, toolSpans };
|
|
232
|
+
return lines.map((line) => line.text);
|
|
233
|
+
}
|
|
234
|
+
handleMouse(event) {
|
|
235
|
+
if (event.type !== "click" && event.type !== "press")
|
|
236
|
+
return undefined;
|
|
237
|
+
const span = this.snapshot.toolSpans.find((candidate) => event.y >= candidate.startLine && event.y < candidate.startLine + candidate.height);
|
|
238
|
+
if (!span)
|
|
239
|
+
return undefined;
|
|
240
|
+
this.focusedToolCallId = span.toolCallId;
|
|
241
|
+
const component = this.toolComponents.get(span.toolCallId);
|
|
242
|
+
try {
|
|
243
|
+
// Keep Pi's normalized mouse contract in the component tree. The local
|
|
244
|
+
// role header occupies the first row; ToolExecutionComponent receives
|
|
245
|
+
// the remaining card-relative coordinate.
|
|
246
|
+
component?.handleMouse?.({ ...event, y: event.y - span.startLine, height: span.height });
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// A missing/older Pi mouse implementation must not break the viewer.
|
|
250
|
+
}
|
|
251
|
+
this.expandedTools.has(span.toolCallId)
|
|
252
|
+
? this.expandedTools.delete(span.toolCallId)
|
|
253
|
+
: this.expandedTools.add(span.toolCallId);
|
|
254
|
+
this.invalidate();
|
|
255
|
+
this.options.onChange?.();
|
|
256
|
+
return { handled: true, render: true };
|
|
257
|
+
}
|
|
258
|
+
invalidate() {
|
|
259
|
+
this.lastWidth = 0;
|
|
260
|
+
this.snapshot = { lines: [], messageStarts: [], messageBlocks: [], interactiveToolIds: [], toolSpans: [] };
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=conversation-timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-timeline.js","sourceRoot":"","sources":["../../src/ui/conversation-timeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* conversation-viewer.ts — Live conversation overlay
|
|
2
|
+
* conversation-viewer.ts — Live and historical conversation overlay.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* The viewer deliberately keeps rendering state separate from the transcript:
|
|
5
|
+
* blocks are formatted data, while Markdown/ANSI lines are a bounded cache.
|
|
6
6
|
*/
|
|
7
|
-
import type { AgentSession } from "@earendil-works/pi-coding-agent";
|
|
8
|
-
import { type Component, type TUI } from "@earendil-works/pi-tui";
|
|
7
|
+
import type { ExtensionAPI, ExtensionContext, AgentSession } from "@earendil-works/pi-coding-agent";
|
|
8
|
+
import { type Component, type TUI, type TuiMouseEvent } from "@earendil-works/pi-tui";
|
|
9
9
|
import type { AgentRecord } from "../types.js";
|
|
10
10
|
import type { Theme } from "./agent-widget.js";
|
|
11
11
|
import { type AgentActivity } from "./agent-widget.js";
|
|
12
12
|
import { type ViewerKeybindings } from "./viewer-keys.js";
|
|
13
|
-
/** Height ceiling shared by the overlay's `maxHeight` and the viewer's internal viewport cap. */
|
|
14
13
|
export declare const VIEWPORT_HEIGHT_PCT = 70;
|
|
15
14
|
/** The live fields needed by the viewer; historical viewers use a static source. */
|
|
16
15
|
export type ConversationSource = Pick<AgentSession, "messages" | "subscribe">;
|
|
17
16
|
export declare function createStaticConversationSource(messages: AgentSession["messages"]): ConversationSource;
|
|
17
|
+
/** Optional operations are appended so all existing constructor call sites stay valid. */
|
|
18
|
+
export interface ConversationViewerOperations {
|
|
19
|
+
pi: ExtensionAPI;
|
|
20
|
+
ctx: ExtensionContext;
|
|
21
|
+
readOnly?: boolean;
|
|
22
|
+
}
|
|
18
23
|
export declare class ConversationViewer implements Component {
|
|
19
24
|
private tui;
|
|
20
25
|
private session;
|
|
@@ -22,39 +27,76 @@ export declare class ConversationViewer implements Component {
|
|
|
22
27
|
private activity;
|
|
23
28
|
private theme;
|
|
24
29
|
private done;
|
|
25
|
-
/** Abort the agent shown here. Omitted
|
|
30
|
+
/** Abort the agent shown here. Omitted means read-only history. */
|
|
26
31
|
private onStop?;
|
|
27
|
-
/** Send a steering message to the agent.
|
|
32
|
+
/** Send a steering message to the agent. */
|
|
28
33
|
private onSteer?;
|
|
34
|
+
/** Optional clipboard/nvim operation context, appended for compatibility. */
|
|
35
|
+
private operations?;
|
|
36
|
+
private blocks;
|
|
37
|
+
private showTools;
|
|
38
|
+
private selectedMessageIdx;
|
|
39
|
+
private cachedWidth;
|
|
40
|
+
private cachedLines;
|
|
41
|
+
private cachedMessageStarts;
|
|
42
|
+
private cachedMessageBlocks;
|
|
43
|
+
private cacheVersion;
|
|
44
|
+
private cachedVersion;
|
|
29
45
|
private scrollOffset;
|
|
30
46
|
private autoScroll;
|
|
31
47
|
private unsubscribe;
|
|
32
48
|
private lastInnerW;
|
|
33
49
|
private closed;
|
|
34
|
-
/** Two-press confirm guard for the stop key, so a stray key can't kill the agent. */
|
|
35
50
|
private stopArmed;
|
|
36
51
|
private keys;
|
|
37
|
-
/** Steering composer — present while the user is typing a message to the agent. */
|
|
38
52
|
private composer;
|
|
53
|
+
private searchMode;
|
|
54
|
+
private searchQuery;
|
|
55
|
+
private searchMatches;
|
|
56
|
+
private currentMatchIdx;
|
|
57
|
+
private timeline;
|
|
39
58
|
constructor(tui: TUI, session: ConversationSource, record: AgentRecord, activity: AgentActivity | undefined, theme: Theme, done: (result: undefined) => void,
|
|
40
|
-
/** Abort the agent shown here. Omitted
|
|
59
|
+
/** Abort the agent shown here. Omitted means read-only history. */
|
|
41
60
|
onStop?: (() => void) | undefined,
|
|
42
|
-
/** User keybindings from
|
|
61
|
+
/** User keybindings from ctx.ui.custom(). */
|
|
43
62
|
keybindings?: ViewerKeybindings,
|
|
44
|
-
/** Send a steering message to the agent.
|
|
45
|
-
onSteer?: ((message: string) => void) | undefined
|
|
63
|
+
/** Send a steering message to the agent. */
|
|
64
|
+
onSteer?: ((message: string) => void) | undefined,
|
|
65
|
+
/** Optional clipboard/nvim operation context, appended for compatibility. */
|
|
66
|
+
operations?: ConversationViewerOperations | undefined);
|
|
46
67
|
handleInput(data: string): void;
|
|
68
|
+
handleMouse(event: TuiMouseEvent): {
|
|
69
|
+
handled?: boolean;
|
|
70
|
+
render?: boolean;
|
|
71
|
+
} | undefined;
|
|
47
72
|
render(width: number): string[];
|
|
48
|
-
/** Stoppable only when a stop handler exists and the agent is still active. */
|
|
49
|
-
private isStoppable;
|
|
50
|
-
/** Steerable only when a steer handler exists and the agent is still active. */
|
|
51
|
-
private canSteer;
|
|
52
|
-
/** Open the inline steering composer and route subsequent input to it. */
|
|
53
|
-
private openComposer;
|
|
54
73
|
invalidate(): void;
|
|
55
74
|
dispose(): void;
|
|
56
75
|
private viewportHeight;
|
|
57
76
|
private chromeLines;
|
|
58
77
|
private invocationLine;
|
|
59
78
|
private buildContentLines;
|
|
79
|
+
private currentMessageIndex;
|
|
80
|
+
private currentBlockGlobalIndex;
|
|
81
|
+
private activeHeaderLine;
|
|
82
|
+
private currentBlock;
|
|
83
|
+
private messageIndexForOffset;
|
|
84
|
+
private jumpToMessage;
|
|
85
|
+
private scrollBy;
|
|
86
|
+
private scrollToTop;
|
|
87
|
+
private scrollToBottom;
|
|
88
|
+
private enterSearch;
|
|
89
|
+
private handleSearchInput;
|
|
90
|
+
private recomputeMatches;
|
|
91
|
+
private gotoMatch;
|
|
92
|
+
private scrollToMatch;
|
|
93
|
+
private copyCurrentMessage;
|
|
94
|
+
private viewCurrentInNvim;
|
|
95
|
+
private editCurrentInNvim;
|
|
96
|
+
private isReadOnly;
|
|
97
|
+
private isLive;
|
|
98
|
+
private isStoppable;
|
|
99
|
+
private canSteer;
|
|
100
|
+
private openComposer;
|
|
60
101
|
}
|
|
102
|
+
//# sourceMappingURL=conversation-viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-viewer.d.ts","sourceRoot":"","sources":["../../src/ui/conversation-viewer.ts"],"names":[],"mappings":"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"}
|