pi-one-ui 0.2.2 → 0.3.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/CHANGELOG.md +51 -0
- package/README.en.md +256 -0
- package/README.md +26 -25
- package/extensions/app/commands/settings-previews.ts +3 -3
- package/extensions/app/config/renderer.ts +12 -23
- package/extensions/app/config/shell.ts +122 -426
- package/extensions/app/config/store.ts +23 -92
- package/extensions/app/overlay/selector-border.ts +5 -5
- package/extensions/app/ownership.ts +1 -1
- package/extensions/app/panel.ts +18 -19
- package/extensions/app/presets.ts +1 -2
- package/extensions/app/runtime/tui-runtime.ts +31 -31
- package/extensions/features/context-inspector/index.ts +3 -3
- package/extensions/features/session-reference/index.ts +5 -5
- package/extensions/features/subagent-autocomplete.ts +1 -1
- package/extensions/layouts/context/index.ts +9 -12
- package/extensions/layouts/context/renderer/compact-mode.ts +24 -24
- package/extensions/layouts/context/renderer/default-mode.ts +21 -16
- package/extensions/layouts/context/renderer/index.ts +24 -24
- package/extensions/layouts/context/renderer/mouse/hover.ts +6 -6
- package/extensions/layouts/context/renderer/mouse/interaction.ts +35 -35
- package/extensions/layouts/context/renderer/mouse/packets.ts +3 -2
- package/extensions/layouts/context/renderer/mouse/scroll.ts +2 -2
- package/extensions/layouts/context/renderer/tool/diff/diff-component.ts +2 -1
- package/extensions/layouts/context/renderer/tool/diff/diff-edit-render.ts +21 -21
- package/extensions/layouts/context/renderer/tool/diff/diff-header.ts +4 -4
- package/extensions/layouts/context/renderer/tool/diff/diff-highlight.ts +6 -6
- package/extensions/layouts/context/renderer/tool/diff/diff-inline.ts +1 -1
- package/extensions/layouts/context/renderer/tool/diff/diff-layout.ts +18 -18
- package/extensions/layouts/context/renderer/tool/diff/diff-limits.ts +5 -5
- package/extensions/layouts/context/renderer/tool/diff/diff-palette.ts +3 -3
- package/extensions/layouts/context/renderer/tool/diff/diff-presentation.ts +1 -1
- package/extensions/layouts/context/renderer/tool/diff/diff-renderer.ts +2 -1
- package/extensions/layouts/context/renderer/tool/diff/diff-write-render.ts +31 -31
- package/extensions/layouts/context/renderer/tool/diff/index.ts +4 -4
- package/extensions/layouts/context/renderer/tool/diff/line-width-safety.ts +1 -1
- package/extensions/layouts/context/renderer/tool/diff/write-execution.ts +1 -1
- package/extensions/layouts/context/renderer/tool/grouping.ts +12 -12
- package/extensions/layouts/context/renderer/tool/message-display.ts +2 -2
- package/extensions/layouts/context/renderer/tool/result.ts +199 -19
- package/extensions/layouts/context/summary/core.ts +1 -0
- package/extensions/layouts/context/summary/index.ts +3 -3
- package/extensions/layouts/context/thinking/compact-thinking.ts +12 -13
- package/extensions/layouts/editor/accent-rail-editor.ts +5 -5
- package/extensions/layouts/editor/controller.ts +4 -4
- package/extensions/layouts/editor/editor-metadata-format.ts +4 -4
- package/extensions/layouts/editor/factory.ts +3 -3
- package/extensions/layouts/editor/index.ts +7 -7
- package/extensions/layouts/editor/minimalist-editor.ts +1 -1
- package/extensions/layouts/editor/ui.ts +7 -7
- package/extensions/layouts/footer/controller.ts +3 -3
- package/extensions/layouts/footer/footer.ts +21 -21
- package/extensions/layouts/footer/index.ts +8 -8
- package/extensions/layouts/header/index.ts +1 -1
- package/extensions/layouts/header/startup-header.ts +3 -2
- package/extensions/layouts/working-line/controller.ts +6 -6
- package/extensions/services/project-refresh.ts +2 -2
- package/extensions/services/session-state.ts +1 -1
- package/extensions/shared/format.ts +2 -2
- package/package.json +17 -10
- package/extensions/features/legacy/working-message.ts +0 -226
|
@@ -1,14 +1,20 @@
|
|
|
1
|
+
export type { FooterState } from "../../services/session-state.ts";
|
|
2
|
+
export {
|
|
3
|
+
createInitialState,
|
|
4
|
+
modelLabelFor,
|
|
5
|
+
syncState,
|
|
6
|
+
} from "../../services/session-state.ts";
|
|
1
7
|
export {
|
|
2
|
-
FooterLayoutController,
|
|
3
8
|
type FooterControllerContext,
|
|
9
|
+
FooterLayoutController,
|
|
4
10
|
} from "./controller.ts";
|
|
5
11
|
export { activeFooterReferences } from "./data.ts";
|
|
6
|
-
export { installFooter, installHiddenFooter } from "./footer.ts";
|
|
7
12
|
export {
|
|
8
13
|
collectExtensionStatusSegments,
|
|
9
14
|
sanitizeExtensionStatusOriginalText,
|
|
10
15
|
sanitizeExtensionStatusText,
|
|
11
16
|
} from "./extension-status.ts";
|
|
17
|
+
export { installFooter, installHiddenFooter } from "./footer.ts";
|
|
12
18
|
export {
|
|
13
19
|
collectFooterFormatReferences,
|
|
14
20
|
compileCompactFormat,
|
|
@@ -16,9 +22,3 @@ export {
|
|
|
16
22
|
renderFormatSplit,
|
|
17
23
|
renderFormatTokens,
|
|
18
24
|
} from "./footer-format.ts";
|
|
19
|
-
export {
|
|
20
|
-
createInitialState,
|
|
21
|
-
modelLabelFor,
|
|
22
|
-
syncState,
|
|
23
|
-
} from "../../services/session-state.ts";
|
|
24
|
-
export type { FooterState } from "../../services/session-state.ts";
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { VERSION, type AppKeybinding } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { getKeybindings } from "@earendil-works/pi-tui";
|
|
3
1
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type AppKeybinding, VERSION } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { getKeybindings } from "@earendil-works/pi-tui";
|
|
4
4
|
import { config } from "../../app/config/renderer.ts";
|
|
5
5
|
import { ansi16ToRgb, ansi256ToRgb } from "../../tools/ansi-color.ts";
|
|
6
|
+
|
|
6
7
|
type Rgb = [number, number, number];
|
|
7
8
|
type StyledPart = {
|
|
8
9
|
raw: string;
|
|
@@ -3,21 +3,21 @@ import type {
|
|
|
3
3
|
ExtensionContext,
|
|
4
4
|
Theme,
|
|
5
5
|
} from "@earendil-works/pi-coding-agent";
|
|
6
|
+
import type {
|
|
7
|
+
PolishedTuiConfig,
|
|
8
|
+
WorkingLineComponentPatch,
|
|
9
|
+
} from "../../app/config/shell.ts";
|
|
10
|
+
import type { SessionLifecycle } from "../../app/runtime/session-lifecycle.ts";
|
|
6
11
|
import {
|
|
7
12
|
InteractionMetricsTracker,
|
|
8
|
-
TURN_SUMMARY_ENTRY_TYPE,
|
|
9
13
|
type MetricsUpdateResult,
|
|
14
|
+
TURN_SUMMARY_ENTRY_TYPE,
|
|
10
15
|
} from "./interaction-summary.ts";
|
|
11
16
|
import {
|
|
12
17
|
AgentDurationClock,
|
|
13
18
|
snapshotWorkingLineHighStyle,
|
|
14
19
|
WorkingLineController,
|
|
15
20
|
} from "./working-line.ts";
|
|
16
|
-
import {
|
|
17
|
-
type PolishedTuiConfig,
|
|
18
|
-
type WorkingLineComponentPatch,
|
|
19
|
-
} from "../../app/config/shell.ts";
|
|
20
|
-
import type { SessionLifecycle } from "../../app/runtime/session-lifecycle.ts";
|
|
21
21
|
|
|
22
22
|
export type WorkingLineMessage = Parameters<
|
|
23
23
|
InteractionMetricsTracker["messageUpdate"]
|
|
@@ -3,10 +3,10 @@ import { dirname, join, resolve } from "node:path";
|
|
|
3
3
|
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
4
4
|
import type { SessionLifecycle } from "../app/runtime/session-lifecycle.ts";
|
|
5
5
|
import { readGitStatus } from "./git-data.ts";
|
|
6
|
-
import type { FooterState } from "./session-state.ts";
|
|
7
|
-
import { applyProjectRefreshToState } from "./project-state.ts";
|
|
8
6
|
import { readPackageVersionResult } from "./package-data.ts";
|
|
7
|
+
import { applyProjectRefreshToState } from "./project-state.ts";
|
|
9
8
|
import { readRuntimeInfo } from "./runtime-data.ts";
|
|
9
|
+
import type { FooterState } from "./session-state.ts";
|
|
10
10
|
|
|
11
11
|
export type StopProjectRefreshInterval = () => void;
|
|
12
12
|
|
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
getUsageTotals,
|
|
11
11
|
invalidateUsageTotalsCache,
|
|
12
12
|
} from "../shared/format.ts";
|
|
13
|
-
import { emptyGitStatus } from "./git-data.ts";
|
|
14
13
|
import type { GitStatusSummary } from "./git-data.ts";
|
|
14
|
+
import { emptyGitStatus } from "./git-data.ts";
|
|
15
15
|
import type { PackageVersionResult } from "./package-data.ts";
|
|
16
16
|
import type { RuntimeInfo } from "./runtime-data.ts";
|
|
17
17
|
import type { FooterTelemetry } from "./telemetry.ts";
|
|
@@ -10,14 +10,14 @@ import type {
|
|
|
10
10
|
PathDisplayMode,
|
|
11
11
|
} from "../app/config/shell.ts";
|
|
12
12
|
import type { GitCommitInfo, GitMetricsInfo } from "../services/git-data.ts";
|
|
13
|
+
import type { PackageVersionResult } from "../services/package-data.ts";
|
|
14
|
+
import type { RuntimeInfo } from "../services/runtime-data.ts";
|
|
13
15
|
import type { IconMode } from "./icons.ts";
|
|
14
16
|
import {
|
|
15
17
|
resolveOsIcon,
|
|
16
18
|
resolvePackageIcon,
|
|
17
19
|
resolveRuntimeSymbol,
|
|
18
20
|
} from "./icons.ts";
|
|
19
|
-
import type { PackageVersionResult } from "../services/package-data.ts";
|
|
20
|
-
import type { RuntimeInfo } from "../services/runtime-data.ts";
|
|
21
21
|
import { renderStyleForSource } from "./style.ts";
|
|
22
22
|
|
|
23
23
|
/**
|
package/package.json
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-one-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "A single, customizable Pi UI package with layout-oriented Context and Shell rendering for Pi.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"pi-package",
|
|
9
|
+
"pi-extension",
|
|
10
|
+
"pi",
|
|
11
|
+
"pi-coding-agent",
|
|
12
|
+
"tui"
|
|
13
|
+
],
|
|
7
14
|
"repository": {
|
|
8
15
|
"type": "git",
|
|
9
16
|
"url": "https://github.com/kerolt/pi-one-ui"
|
|
@@ -16,20 +23,20 @@
|
|
|
16
23
|
"extensions",
|
|
17
24
|
"themes",
|
|
18
25
|
"README.md",
|
|
26
|
+
"README.en.md",
|
|
27
|
+
"CHANGELOG.md",
|
|
19
28
|
"LICENSE"
|
|
20
29
|
],
|
|
21
30
|
"scripts": {
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"format": "biome format --write extensions tests package.json tsconfig.json biome.json",
|
|
26
|
-
"format:check": "biome format extensions tests package.json tsconfig.json biome.json",
|
|
27
|
-
"lint": "biome check extensions/index.ts extensions/app/panel.ts extensions/app/presets.ts package.json tsconfig.json biome.json",
|
|
28
|
-
"test:vitest": "vitest run tests/shell-*.test.ts tests/working-line-*.test.ts tests/editor-*.test.ts tests/footer-*.test.ts tests/services-*.test.ts",
|
|
29
|
-
"verify": "npm run format:check && npm run lint && npm run typecheck && npm test",
|
|
31
|
+
"format": "biome format --write extensions tests package.json tsconfig.json vitest.config.ts biome.json",
|
|
32
|
+
"check": "biome check extensions tests package.json tsconfig.json vitest.config.ts biome.json",
|
|
33
|
+
"fix": "biome check --write extensions tests package.json tsconfig.json vitest.config.ts biome.json",
|
|
30
34
|
"pack:check": "npm pack --dry-run",
|
|
31
35
|
"pi:dev": "${PI_BIN:-pi} --no-extensions -e ./extensions/index.ts",
|
|
32
|
-
"pi:install-local": "${PI_BIN:-pi} install ./ -l"
|
|
36
|
+
"pi:install-local": "${PI_BIN:-pi} install ./ -l",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"verify": "npm run check && npm run typecheck && npm test"
|
|
33
40
|
},
|
|
34
41
|
"dependencies": {
|
|
35
42
|
"@shikijs/cli": "^4.0.2",
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { formatDuration } from "../../tools/format.ts";
|
|
3
|
-
|
|
4
|
-
const REFRESH_INTERVAL_MS = 1_000;
|
|
5
|
-
/** Elapsed time is only shown once the turn has run this long. */
|
|
6
|
-
const SHOW_TIMER_AFTER_MS = 3_000;
|
|
7
|
-
|
|
8
|
-
function formatCount(value: number): string {
|
|
9
|
-
return new Intl.NumberFormat("en-US").format(value);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
type ContentBlock = {
|
|
13
|
-
type?: unknown;
|
|
14
|
-
text?: unknown;
|
|
15
|
-
thinkingSignature?: { body?: unknown };
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
type StreamMessage = {
|
|
19
|
-
content?: unknown;
|
|
20
|
-
usage?: { output?: unknown };
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/** 每个 content index 的可见文本/思考长度;无对应块的 index 保持稀疏洞。 */
|
|
24
|
-
function textBlockLengths(message: StreamMessage): number[] {
|
|
25
|
-
const content = message.content;
|
|
26
|
-
if (!Array.isArray(content)) return [];
|
|
27
|
-
const lengths: number[] = [];
|
|
28
|
-
for (let index = 0; index < content.length; index++) {
|
|
29
|
-
const block = content[index] as ContentBlock;
|
|
30
|
-
if (block?.type === "text" && typeof block.text === "string") {
|
|
31
|
-
lengths[index] = block.text.length;
|
|
32
|
-
} else if (block?.type === "thinking" && block.thinkingSignature?.body) {
|
|
33
|
-
lengths[index] = (block.thinkingSignature.body as string).length;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return lengths;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function outputUsage(message: StreamMessage): number {
|
|
40
|
-
const value = Number(message?.usage?.output);
|
|
41
|
-
return Number.isFinite(value) && value > 0 ? Math.round(value) : 0;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
type WorkingUi = {
|
|
45
|
-
setWorkingMessage(message?: string): void;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Extend Pi's footer working row while preserving its spinner and "Working...":
|
|
50
|
-
* `⠋ Working... (↓ 1,234 tokens · 12s)`
|
|
51
|
-
*
|
|
52
|
-
* Live tokens use the same chars/4 estimate as pi-claude-code-ui, then switch to
|
|
53
|
-
* provider `usage.output` whenever the stream exposes an actual count.
|
|
54
|
-
*/
|
|
55
|
-
export default function (pi: ExtensionAPI): void {
|
|
56
|
-
let turnActive = false;
|
|
57
|
-
let agentStartTime = 0;
|
|
58
|
-
let turnStartTime = 0;
|
|
59
|
-
let responseLength = 0;
|
|
60
|
-
let responseTextBlockLengths: number[] = [];
|
|
61
|
-
let providerOutputTokens = 0;
|
|
62
|
-
let refreshTimer: ReturnType<typeof setTimeout> | null = null;
|
|
63
|
-
let lastMessage: string | null = null;
|
|
64
|
-
let activeCtx: { ui: WorkingUi | undefined; hasUI: boolean } | null = null;
|
|
65
|
-
|
|
66
|
-
function tokenCount(): number {
|
|
67
|
-
return providerOutputTokens || Math.max(0, Math.round(responseLength / 4));
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function setTextBlockLength(index: number, length: number): void {
|
|
71
|
-
const previous = responseTextBlockLengths[index] ?? 0;
|
|
72
|
-
responseTextBlockLengths[index] = Math.max(0, length);
|
|
73
|
-
responseLength = Math.max(
|
|
74
|
-
0,
|
|
75
|
-
responseLength + responseTextBlockLengths[index] - previous,
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function resetResponseTracking(message?: StreamMessage): void {
|
|
80
|
-
responseTextBlockLengths = message ? textBlockLengths(message) : [];
|
|
81
|
-
responseLength = responseTextBlockLengths.reduce(
|
|
82
|
-
(sum, length) => sum + length,
|
|
83
|
-
0,
|
|
84
|
-
);
|
|
85
|
-
providerOutputTokens = message ? outputUsage(message) : 0;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function updateProviderUsage(message: StreamMessage): void {
|
|
89
|
-
const output = outputUsage(message);
|
|
90
|
-
if (output > 0) providerOutputTokens = output;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function buildWorkingMessage(): string {
|
|
94
|
-
const elapsed = Date.now() - (agentStartTime || turnStartTime);
|
|
95
|
-
const tokens = tokenCount();
|
|
96
|
-
const parts: string[] = [];
|
|
97
|
-
if (tokens > 0) parts.push(`↓ ${formatCount(tokens)} tokens`);
|
|
98
|
-
if (elapsed >= SHOW_TIMER_AFTER_MS || tokens > 0) {
|
|
99
|
-
// formatDuration 低于 1 秒返回 "",此处回退 "0s" 保持计时器连续跳动。
|
|
100
|
-
parts.push(formatDuration(elapsed) || "0s");
|
|
101
|
-
}
|
|
102
|
-
return parts.length ? `Working... (${parts.join(" · ")})` : "";
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function restoreDefaultWorkingMessage(): void {
|
|
106
|
-
lastMessage = null;
|
|
107
|
-
if (!activeCtx?.hasUI) return;
|
|
108
|
-
try {
|
|
109
|
-
activeCtx.ui?.setWorkingMessage();
|
|
110
|
-
} catch {
|
|
111
|
-
// Noop when the TUI is unavailable.
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function syncWorkingMessage(force = false): void {
|
|
116
|
-
if (!activeCtx?.hasUI) return;
|
|
117
|
-
const next = buildWorkingMessage();
|
|
118
|
-
if (!next) {
|
|
119
|
-
if (force) restoreDefaultWorkingMessage();
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
if (!force && next === lastMessage) return;
|
|
123
|
-
lastMessage = next;
|
|
124
|
-
try {
|
|
125
|
-
activeCtx.ui?.setWorkingMessage(next);
|
|
126
|
-
} catch {
|
|
127
|
-
// Noop when the TUI is unavailable.
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function scheduleRefreshTick(): void {
|
|
132
|
-
if (!turnActive || refreshTimer) return;
|
|
133
|
-
refreshTimer = setTimeout(() => {
|
|
134
|
-
refreshTimer = null;
|
|
135
|
-
try {
|
|
136
|
-
syncWorkingMessage();
|
|
137
|
-
} finally {
|
|
138
|
-
scheduleRefreshTick();
|
|
139
|
-
}
|
|
140
|
-
}, REFRESH_INTERVAL_MS);
|
|
141
|
-
refreshTimer.unref?.();
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function stopRefreshLoop(): void {
|
|
145
|
-
if (!refreshTimer) return;
|
|
146
|
-
clearTimeout(refreshTimer);
|
|
147
|
-
refreshTimer = null;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
function clearDisplay(): void {
|
|
151
|
-
stopRefreshLoop();
|
|
152
|
-
agentStartTime = 0;
|
|
153
|
-
turnStartTime = 0;
|
|
154
|
-
resetResponseTracking();
|
|
155
|
-
restoreDefaultWorkingMessage();
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
pi.on("before_agent_start", async () => {
|
|
159
|
-
if (!agentStartTime) agentStartTime = Date.now();
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
pi.on("turn_start", async (_event, ctx) => {
|
|
163
|
-
turnActive = true;
|
|
164
|
-
activeCtx = ctx;
|
|
165
|
-
turnStartTime = Date.now();
|
|
166
|
-
if (!agentStartTime) agentStartTime = turnStartTime;
|
|
167
|
-
resetResponseTracking();
|
|
168
|
-
syncWorkingMessage(true);
|
|
169
|
-
scheduleRefreshTick();
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
pi.on("message_update", async (event, ctx) => {
|
|
173
|
-
activeCtx = ctx;
|
|
174
|
-
const evt = event?.assistantMessageEvent;
|
|
175
|
-
if (!evt) return;
|
|
176
|
-
|
|
177
|
-
if (evt.type === "start") {
|
|
178
|
-
resetResponseTracking(evt.partial);
|
|
179
|
-
} else if (evt.type === "thinking_start" || evt.type === "text_start") {
|
|
180
|
-
setTextBlockLength(evt.contentIndex, 0);
|
|
181
|
-
updateProviderUsage(evt.partial);
|
|
182
|
-
} else if (evt.type === "thinking_delta" || evt.type === "text_delta") {
|
|
183
|
-
const add = typeof evt.delta === "string" ? evt.delta.length : 0;
|
|
184
|
-
setTextBlockLength(
|
|
185
|
-
evt.contentIndex,
|
|
186
|
-
(responseTextBlockLengths[evt.contentIndex] ?? 0) + add,
|
|
187
|
-
);
|
|
188
|
-
updateProviderUsage(evt.partial);
|
|
189
|
-
} else if (evt.type === "text_end") {
|
|
190
|
-
setTextBlockLength(
|
|
191
|
-
evt.contentIndex,
|
|
192
|
-
typeof evt.content === "string" ? evt.content.length : 0,
|
|
193
|
-
);
|
|
194
|
-
updateProviderUsage(evt.partial);
|
|
195
|
-
} else if (evt.type === "done") {
|
|
196
|
-
resetResponseTracking(evt.message);
|
|
197
|
-
} else if (evt.type === "error") {
|
|
198
|
-
resetResponseTracking(evt.error);
|
|
199
|
-
} else {
|
|
200
|
-
updateProviderUsage(evt.partial);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
syncWorkingMessage();
|
|
204
|
-
scheduleRefreshTick();
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
pi.on("turn_end", async (_event, ctx) => {
|
|
208
|
-
turnActive = false;
|
|
209
|
-
activeCtx = ctx;
|
|
210
|
-
stopRefreshLoop();
|
|
211
|
-
resetResponseTracking();
|
|
212
|
-
// No completion message: return immediately to Pi's default idle state.
|
|
213
|
-
restoreDefaultWorkingMessage();
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
pi.on("agent_end", async () => {
|
|
217
|
-
turnActive = false;
|
|
218
|
-
clearDisplay();
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
pi.on("session_shutdown", async () => {
|
|
222
|
-
turnActive = false;
|
|
223
|
-
clearDisplay();
|
|
224
|
-
activeCtx = null;
|
|
225
|
-
});
|
|
226
|
-
}
|