@mono-agent/tui 0.4.0 → 0.5.0
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.md +60 -10
- package/dist/bin/cli.d.ts +4 -1
- package/dist/bin/cli.d.ts.map +1 -1
- package/dist/bin/cli.js +36 -53
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/mono-agent-tui.js +21 -10
- package/dist/bin/mono-agent-tui.js.map +1 -1
- package/dist/config/pane.d.ts +9 -9
- package/dist/config/pane.d.ts.map +1 -1
- package/dist/config/pane.js +15 -196
- package/dist/config/pane.js.map +1 -1
- package/dist/data/instances.d.ts +48 -0
- package/dist/data/instances.d.ts.map +1 -0
- package/dist/data/instances.js +101 -0
- package/dist/data/instances.js.map +1 -0
- package/dist/data/replay.d.ts +68 -0
- package/dist/data/replay.d.ts.map +1 -0
- package/dist/data/replay.js +149 -0
- package/dist/data/replay.js.map +1 -0
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/remote/client.d.ts +44 -0
- package/dist/remote/client.d.ts.map +1 -0
- package/dist/remote/client.js +173 -0
- package/dist/remote/client.js.map +1 -0
- package/dist/runtime/start.d.ts +11 -18
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +19 -33
- package/dist/runtime/start.js.map +1 -1
- package/dist/ui/app.d.ts +142 -0
- package/dist/ui/app.d.ts.map +1 -0
- package/dist/ui/app.js +586 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/components/event-list.d.ts +60 -0
- package/dist/ui/components/event-list.d.ts.map +1 -0
- package/dist/ui/components/event-list.js +369 -0
- package/dist/ui/components/event-list.js.map +1 -0
- package/dist/ui/components/status-bar.d.ts +65 -0
- package/dist/ui/components/status-bar.d.ts.map +1 -0
- package/dist/ui/components/status-bar.js +126 -0
- package/dist/ui/components/status-bar.js.map +1 -0
- package/dist/ui/components/tool-panel.d.ts +30 -0
- package/dist/ui/components/tool-panel.d.ts.map +1 -0
- package/dist/ui/components/tool-panel.js +59 -0
- package/dist/ui/components/tool-panel.js.map +1 -0
- package/dist/ui/components/transcript-cells.d.ts +49 -0
- package/dist/ui/components/transcript-cells.d.ts.map +1 -0
- package/dist/ui/components/transcript-cells.js +110 -0
- package/dist/ui/components/transcript-cells.js.map +1 -0
- package/dist/ui/format.d.ts +29 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +105 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/theme.d.ts +25 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +62 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/turn-presenter.d.ts +72 -0
- package/dist/ui/turn-presenter.d.ts.map +1 -0
- package/dist/ui/turn-presenter.js +334 -0
- package/dist/ui/turn-presenter.js.map +1 -0
- package/dist/ui/views/chat.d.ts +128 -0
- package/dist/ui/views/chat.d.ts.map +1 -0
- package/dist/ui/views/chat.js +313 -0
- package/dist/ui/views/chat.js.map +1 -0
- package/dist/ui/views/config.d.ts +23 -0
- package/dist/ui/views/config.d.ts.map +1 -0
- package/dist/ui/views/config.js +87 -0
- package/dist/ui/views/config.js.map +1 -0
- package/dist/ui/views/picker.d.ts +17 -0
- package/dist/ui/views/picker.d.ts.map +1 -0
- package/dist/ui/views/picker.js +57 -0
- package/dist/ui/views/picker.js.map +1 -0
- package/dist/ui/views/replay-detail.d.ts +60 -0
- package/dist/ui/views/replay-detail.d.ts.map +1 -0
- package/dist/ui/views/replay-detail.js +328 -0
- package/dist/ui/views/replay-detail.js.map +1 -0
- package/dist/ui/views/replay.d.ts +74 -0
- package/dist/ui/views/replay.d.ts.map +1 -0
- package/dist/ui/views/replay.js +460 -0
- package/dist/ui/views/replay.js.map +1 -0
- package/package.json +9 -12
- package/dist/agent/message-stream.d.ts +0 -52
- package/dist/agent/message-stream.d.ts.map +0 -1
- package/dist/agent/message-stream.js +0 -110
- package/dist/agent/message-stream.js.map +0 -1
- package/dist/components/ChatPane.d.ts +0 -20
- package/dist/components/ChatPane.d.ts.map +0 -1
- package/dist/components/ChatPane.js +0 -142
- package/dist/components/ChatPane.js.map +0 -1
- package/dist/components/ConfigPane.d.ts +0 -12
- package/dist/components/ConfigPane.d.ts.map +0 -1
- package/dist/components/ConfigPane.js +0 -70
- package/dist/components/ConfigPane.js.map +0 -1
- package/dist/components/HelpOverlay.d.ts +0 -6
- package/dist/components/HelpOverlay.d.ts.map +0 -1
- package/dist/components/HelpOverlay.js +0 -18
- package/dist/components/HelpOverlay.js.map +0 -1
- package/dist/components/HistoryPane.d.ts +0 -9
- package/dist/components/HistoryPane.d.ts.map +0 -1
- package/dist/components/HistoryPane.js +0 -125
- package/dist/components/HistoryPane.js.map +0 -1
- package/dist/components/StatusBar.d.ts +0 -10
- package/dist/components/StatusBar.d.ts.map +0 -1
- package/dist/components/StatusBar.js +0 -15
- package/dist/components/StatusBar.js.map +0 -1
- package/dist/components/TuiApp.d.ts +0 -29
- package/dist/components/TuiApp.d.ts.map +0 -1
- package/dist/components/TuiApp.js +0 -81
- package/dist/components/TuiApp.js.map +0 -1
- package/dist/components/primitives/Badge.d.ts +0 -8
- package/dist/components/primitives/Badge.d.ts.map +0 -1
- package/dist/components/primitives/Badge.js +0 -14
- package/dist/components/primitives/Badge.js.map +0 -1
- package/dist/components/primitives/Spinner.d.ts +0 -6
- package/dist/components/primitives/Spinner.d.ts.map +0 -1
- package/dist/components/primitives/Spinner.js +0 -8
- package/dist/components/primitives/Spinner.js.map +0 -1
- package/dist/components/primitives/TranscriptLine.d.ts +0 -10
- package/dist/components/primitives/TranscriptLine.d.ts.map +0 -1
- package/dist/components/primitives/TranscriptLine.js +0 -15
- package/dist/components/primitives/TranscriptLine.js.map +0 -1
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Component } from "@earendil-works/pi-tui";
|
|
2
|
+
export type ToolPanelState = "pending" | "success" | "error";
|
|
3
|
+
/**
|
|
4
|
+
* One tool call's lifecycle: pending (with live progress tail) → success/error
|
|
5
|
+
* (with result preview + execution time). Border color tracks state.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ToolPanel implements Component {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
private readonly name;
|
|
10
|
+
private readonly argsPreview;
|
|
11
|
+
private state;
|
|
12
|
+
private progressTail;
|
|
13
|
+
private resultPreview;
|
|
14
|
+
private executionMs;
|
|
15
|
+
private truncated;
|
|
16
|
+
private expandedValue;
|
|
17
|
+
constructor(id: string, name: string, args?: unknown);
|
|
18
|
+
setProgress(partialResult: unknown): void;
|
|
19
|
+
complete(input: {
|
|
20
|
+
isError?: boolean;
|
|
21
|
+
content?: unknown;
|
|
22
|
+
executionMs?: number;
|
|
23
|
+
truncated?: boolean;
|
|
24
|
+
}): void;
|
|
25
|
+
getState(): ToolPanelState;
|
|
26
|
+
setExpanded(expanded: boolean): void;
|
|
27
|
+
render(width: number): string[];
|
|
28
|
+
invalidate(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=tool-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-panel.d.ts","sourceRoot":"","sources":["../../../src/ui/components/tool-panel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKxD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D;;;GAGG;AACH,qBAAa,SAAU,YAAW,SAAS;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;gBAElB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAMpD,WAAW,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI;IAIzC,QAAQ,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAQ1G,QAAQ,IAAI,cAAc;IAI1B,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAIpC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAwB/B,UAAU,IAAI,IAAI;CAGnB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Text } from "@earendil-works/pi-tui";
|
|
2
|
+
import { formatDurationMs, lastLines, previewValue } from "../format.js";
|
|
3
|
+
import { styles } from "../theme.js";
|
|
4
|
+
/**
|
|
5
|
+
* One tool call's lifecycle: pending (with live progress tail) → success/error
|
|
6
|
+
* (with result preview + execution time). Border color tracks state.
|
|
7
|
+
*/
|
|
8
|
+
export class ToolPanel {
|
|
9
|
+
id;
|
|
10
|
+
name;
|
|
11
|
+
argsPreview;
|
|
12
|
+
state = "pending";
|
|
13
|
+
progressTail = "";
|
|
14
|
+
resultPreview = "";
|
|
15
|
+
executionMs;
|
|
16
|
+
truncated = false;
|
|
17
|
+
expandedValue = false;
|
|
18
|
+
constructor(id, name, args) {
|
|
19
|
+
this.id = id;
|
|
20
|
+
this.name = name;
|
|
21
|
+
this.argsPreview = previewValue(args, 240).replace(/\s+/gu, " ").trim();
|
|
22
|
+
}
|
|
23
|
+
setProgress(partialResult) {
|
|
24
|
+
this.progressTail = lastLines(previewValue(partialResult, 4_000), 10);
|
|
25
|
+
}
|
|
26
|
+
complete(input) {
|
|
27
|
+
this.state = input.isError === true ? "error" : "success";
|
|
28
|
+
this.progressTail = "";
|
|
29
|
+
this.resultPreview = previewValue(input.content, this.expandedValue ? 20_000 : 600);
|
|
30
|
+
this.executionMs = input.executionMs;
|
|
31
|
+
this.truncated = input.truncated === true;
|
|
32
|
+
}
|
|
33
|
+
getState() {
|
|
34
|
+
return this.state;
|
|
35
|
+
}
|
|
36
|
+
setExpanded(expanded) {
|
|
37
|
+
this.expandedValue = expanded;
|
|
38
|
+
}
|
|
39
|
+
render(width) {
|
|
40
|
+
const stateStyle = this.state === "pending" ? styles.warning : this.state === "error" ? styles.error : styles.success;
|
|
41
|
+
const bullet = this.state === "pending" ? "◐" : this.state === "error" ? "✗" : "✓";
|
|
42
|
+
const timing = this.executionMs === undefined ? "" : styles.dim(` ${formatDurationMs(this.executionMs)}`);
|
|
43
|
+
const header = new Text(`${stateStyle(`${bullet} ${styles.bold(this.name)}`)}${timing}${this.argsPreview.length > 0 ? ` ${styles.dim(this.argsPreview)}` : ""}`, 1, 0);
|
|
44
|
+
const lines = ["", ...header.render(width)];
|
|
45
|
+
const body = this.state === "pending" ? this.progressTail : this.resultPreview;
|
|
46
|
+
if (body.length > 0) {
|
|
47
|
+
const bodyText = new Text(styles.muted(body), 3, 0);
|
|
48
|
+
lines.push(...bodyText.render(width));
|
|
49
|
+
}
|
|
50
|
+
if (this.truncated) {
|
|
51
|
+
lines.push(...new Text(styles.dim("(payload truncated for streaming — full data in run artifacts)"), 3, 0).render(width));
|
|
52
|
+
}
|
|
53
|
+
return lines;
|
|
54
|
+
}
|
|
55
|
+
invalidate() {
|
|
56
|
+
// Renders from plain state each frame; nothing cached.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=tool-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-panel.js","sourceRoot":"","sources":["../../../src/ui/components/tool-panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Component } from "@earendil-works/pi-tui";
|
|
2
|
+
/** A user-authored message. */
|
|
3
|
+
export declare class UserCell implements Component {
|
|
4
|
+
private readonly text;
|
|
5
|
+
constructor(text: string);
|
|
6
|
+
render(width: number): string[];
|
|
7
|
+
invalidate(): void;
|
|
8
|
+
}
|
|
9
|
+
/** Streaming assistant markdown. */
|
|
10
|
+
export declare class AssistantCell implements Component {
|
|
11
|
+
private readonly markdown;
|
|
12
|
+
private textValue;
|
|
13
|
+
setText(text: string): void;
|
|
14
|
+
getText(): string;
|
|
15
|
+
isEmpty(): boolean;
|
|
16
|
+
render(width: number): string[];
|
|
17
|
+
invalidate(): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Reasoning block. Collapsed by default to a one-line summary; Ctrl+T (or
|
|
21
|
+
* replay's expand) shows the full text, dim-italic so it never reads as the
|
|
22
|
+
* answer.
|
|
23
|
+
*/
|
|
24
|
+
export declare class ThinkingCell implements Component {
|
|
25
|
+
private textValue;
|
|
26
|
+
private expandedValue;
|
|
27
|
+
private durationMsValue;
|
|
28
|
+
private readonly body;
|
|
29
|
+
/** Set while the turn is still streaming into this cell. */
|
|
30
|
+
active: boolean;
|
|
31
|
+
constructor(expanded?: boolean);
|
|
32
|
+
append(delta: string): void;
|
|
33
|
+
getText(): string;
|
|
34
|
+
isEmpty(): boolean;
|
|
35
|
+
setExpanded(expanded: boolean): void;
|
|
36
|
+
isExpanded(): boolean;
|
|
37
|
+
/** Stamped once this cell is sealed (turn's first thought → this seal). */
|
|
38
|
+
setDurationMs(ms: number): void;
|
|
39
|
+
render(width: number): string[];
|
|
40
|
+
invalidate(): void;
|
|
41
|
+
}
|
|
42
|
+
/** Runtime warning / failover / neutral notice. */
|
|
43
|
+
export declare class NoticeCell implements Component {
|
|
44
|
+
private readonly text;
|
|
45
|
+
constructor(message: string, kind?: "info" | "warning" | "error");
|
|
46
|
+
render(width: number): string[];
|
|
47
|
+
invalidate(): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=transcript-cells.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-cells.d.ts","sourceRoot":"","sources":["../../../src/ui/components/transcript-cells.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKxD,+BAA+B;AAC/B,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,IAAI,EAAE,MAAM;IAIxB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAI/B,UAAU,IAAI,IAAI;CAGnB;AAED,oCAAoC;AACpC,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAClE,OAAO,CAAC,SAAS,CAAM;IAEvB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,OAAO;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAO/B,UAAU,IAAI,IAAI;CAGnB;AAED;;;;GAIG;AACH,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmF;IACxG,4DAA4D;IAC5D,MAAM,UAAQ;gBAEF,QAAQ,UAAQ;IAI5B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3B,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,OAAO;IAIlB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAIpC,UAAU,IAAI,OAAO;IAIrB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI/B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAuB/B,UAAU,IAAI,IAAI;CAGnB;AAED,mDAAmD;AACnD,qBAAa,UAAW,YAAW,SAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,SAAS,GAAG,OAAmB;IAM3E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAI/B,UAAU,IAAI,IAAI;CAGnB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Markdown, Text } from "@earendil-works/pi-tui";
|
|
2
|
+
import { formatDurationMs, formatTokens } from "../format.js";
|
|
3
|
+
import { dimMarkdownTheme, markdownTheme, styles } from "../theme.js";
|
|
4
|
+
/** A user-authored message. */
|
|
5
|
+
export class UserCell {
|
|
6
|
+
text;
|
|
7
|
+
constructor(text) {
|
|
8
|
+
this.text = new Text(`${styles.bold(styles.user("you"))} ${text}`, 1, 0);
|
|
9
|
+
}
|
|
10
|
+
render(width) {
|
|
11
|
+
return ["", ...this.text.render(width)];
|
|
12
|
+
}
|
|
13
|
+
invalidate() {
|
|
14
|
+
this.text.invalidate();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Streaming assistant markdown. */
|
|
18
|
+
export class AssistantCell {
|
|
19
|
+
markdown = new Markdown("", 1, 0, markdownTheme);
|
|
20
|
+
textValue = "";
|
|
21
|
+
setText(text) {
|
|
22
|
+
this.textValue = text;
|
|
23
|
+
this.markdown.setText(text);
|
|
24
|
+
}
|
|
25
|
+
getText() {
|
|
26
|
+
return this.textValue;
|
|
27
|
+
}
|
|
28
|
+
isEmpty() {
|
|
29
|
+
return this.textValue.length === 0;
|
|
30
|
+
}
|
|
31
|
+
render(width) {
|
|
32
|
+
if (this.isEmpty()) {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
return ["", ...this.markdown.render(width)];
|
|
36
|
+
}
|
|
37
|
+
invalidate() {
|
|
38
|
+
this.markdown.invalidate();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reasoning block. Collapsed by default to a one-line summary; Ctrl+T (or
|
|
43
|
+
* replay's expand) shows the full text, dim-italic so it never reads as the
|
|
44
|
+
* answer.
|
|
45
|
+
*/
|
|
46
|
+
export class ThinkingCell {
|
|
47
|
+
textValue = "";
|
|
48
|
+
expandedValue;
|
|
49
|
+
durationMsValue;
|
|
50
|
+
body = new Markdown("", 3, 0, dimMarkdownTheme, { color: styles.muted, italic: true });
|
|
51
|
+
/** Set while the turn is still streaming into this cell. */
|
|
52
|
+
active = true;
|
|
53
|
+
constructor(expanded = false) {
|
|
54
|
+
this.expandedValue = expanded;
|
|
55
|
+
}
|
|
56
|
+
append(delta) {
|
|
57
|
+
this.textValue += delta;
|
|
58
|
+
this.body.setText(this.textValue);
|
|
59
|
+
}
|
|
60
|
+
getText() {
|
|
61
|
+
return this.textValue;
|
|
62
|
+
}
|
|
63
|
+
isEmpty() {
|
|
64
|
+
return this.textValue.trim().length === 0;
|
|
65
|
+
}
|
|
66
|
+
setExpanded(expanded) {
|
|
67
|
+
this.expandedValue = expanded;
|
|
68
|
+
}
|
|
69
|
+
isExpanded() {
|
|
70
|
+
return this.expandedValue;
|
|
71
|
+
}
|
|
72
|
+
/** Stamped once this cell is sealed (turn's first thought → this seal). */
|
|
73
|
+
setDurationMs(ms) {
|
|
74
|
+
this.durationMsValue = ms;
|
|
75
|
+
}
|
|
76
|
+
render(width) {
|
|
77
|
+
if (this.isEmpty()) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
const chars = this.textValue.length;
|
|
81
|
+
const marker = this.active ? "∴ thinking…" : "∴ thought";
|
|
82
|
+
const durationPart = this.durationMsValue !== undefined && this.durationMsValue >= 0
|
|
83
|
+
? ` · ${formatDurationMs(this.durationMsValue)}`
|
|
84
|
+
: "";
|
|
85
|
+
const header = new Text(styles.thinking(`${marker} (${formatTokens(chars)} chars${durationPart}${this.expandedValue ? "" : " — ctrl+t expands"})`), 1, 0);
|
|
86
|
+
if (!this.expandedValue) {
|
|
87
|
+
return ["", ...header.render(width)];
|
|
88
|
+
}
|
|
89
|
+
return ["", ...header.render(width), ...this.body.render(width)];
|
|
90
|
+
}
|
|
91
|
+
invalidate() {
|
|
92
|
+
this.body.invalidate();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Runtime warning / failover / neutral notice. */
|
|
96
|
+
export class NoticeCell {
|
|
97
|
+
text;
|
|
98
|
+
constructor(message, kind = "warning") {
|
|
99
|
+
const style = kind === "error" ? styles.error : kind === "warning" ? styles.warning : styles.info;
|
|
100
|
+
const prefix = kind === "info" ? "i" : "⚠";
|
|
101
|
+
this.text = new Text(style(`${prefix} ${message}`), 1, 0);
|
|
102
|
+
}
|
|
103
|
+
render(width) {
|
|
104
|
+
return this.text.render(width);
|
|
105
|
+
}
|
|
106
|
+
invalidate() {
|
|
107
|
+
this.text.invalidate();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=transcript-cells.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-cells.js","sourceRoot":"","sources":["../../../src/ui/components/transcript-cells.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Small pure formatters shared by the chat, replay, and status-bar surfaces. */
|
|
2
|
+
export declare function formatTokens(count: number): string;
|
|
3
|
+
export declare function formatUsd(usd: number): string;
|
|
4
|
+
export declare function formatDurationMs(ms: number): string;
|
|
5
|
+
/** Render an unknown payload (tool args/results) as compact single-or-multi-line text. */
|
|
6
|
+
export declare function previewValue(value: unknown, maxChars?: number): string;
|
|
7
|
+
export declare function lastLines(text: string, maxLines: number): string;
|
|
8
|
+
export declare function formatClock(iso: string | undefined): string;
|
|
9
|
+
/**
|
|
10
|
+
* `MM-DD HH:MM` in local time -- unlike {@link formatClock} (time only), this
|
|
11
|
+
* carries the date too: a run list spans days, and a bare clock reading is
|
|
12
|
+
* ambiguous once results run past midnight.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatDateClock(iso: string | undefined): string;
|
|
15
|
+
/** Token/cost numbers pulled out of a run summary's opaque `usage`/`cost` fields. */
|
|
16
|
+
export interface ExtractedUsage {
|
|
17
|
+
readonly input?: number;
|
|
18
|
+
readonly output?: number;
|
|
19
|
+
readonly usd?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Provider-shape-agnostic extraction shared by the replay detail headline
|
|
23
|
+
* (`usageLine`) and the run list description: `usage`/`cost` are recorded
|
|
24
|
+
* verbatim from whatever the runtime/provider handed back, so field names
|
|
25
|
+
* vary (`input` vs `inputTokens` vs `input_tokens`, `totalUsd` vs `usd`).
|
|
26
|
+
* Returns undefined when no token counts are present at all.
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractUsage(usage: unknown, cost: unknown): ExtractedUsage | undefined;
|
|
29
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQlD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAWnD;AAED,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAM,GAAG,MAAM,CAmBnE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAM3D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAU/D;AAED,qFAAqF;AACrF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAoBtF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/** Small pure formatters shared by the chat, replay, and status-bar surfaces. */
|
|
2
|
+
export function formatTokens(count) {
|
|
3
|
+
if (count >= 1_000_000) {
|
|
4
|
+
return `${(count / 1_000_000).toFixed(1)}M`;
|
|
5
|
+
}
|
|
6
|
+
if (count >= 1_000) {
|
|
7
|
+
return `${(count / 1_000).toFixed(1)}k`;
|
|
8
|
+
}
|
|
9
|
+
return String(count);
|
|
10
|
+
}
|
|
11
|
+
export function formatUsd(usd) {
|
|
12
|
+
return usd >= 0.995 ? `$${usd.toFixed(2)}` : `$${usd.toFixed(3)}`;
|
|
13
|
+
}
|
|
14
|
+
export function formatDurationMs(ms) {
|
|
15
|
+
if (ms >= 60_000) {
|
|
16
|
+
const minutes = Math.floor(ms / 60_000);
|
|
17
|
+
// Floor, not round: rounding 59.8s would render an impossible "1m 60s".
|
|
18
|
+
const seconds = Math.floor((ms % 60_000) / 1000);
|
|
19
|
+
return `${minutes}m${seconds > 0 ? ` ${seconds}s` : ""}`;
|
|
20
|
+
}
|
|
21
|
+
if (ms >= 1_000) {
|
|
22
|
+
return `${(ms / 1_000).toFixed(1)}s`;
|
|
23
|
+
}
|
|
24
|
+
return `${Math.round(ms)}ms`;
|
|
25
|
+
}
|
|
26
|
+
/** Render an unknown payload (tool args/results) as compact single-or-multi-line text. */
|
|
27
|
+
export function previewValue(value, maxChars = 600) {
|
|
28
|
+
if (value === undefined) {
|
|
29
|
+
return "";
|
|
30
|
+
}
|
|
31
|
+
let text;
|
|
32
|
+
if (typeof value === "string") {
|
|
33
|
+
text = value;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
try {
|
|
37
|
+
text = JSON.stringify(value, null, value !== null && typeof value === "object" ? 1 : undefined) ?? String(value);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
text = String(value);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
text = text.trimEnd();
|
|
44
|
+
if (text.length > maxChars) {
|
|
45
|
+
return `${text.slice(0, maxChars)}…`;
|
|
46
|
+
}
|
|
47
|
+
return text;
|
|
48
|
+
}
|
|
49
|
+
export function lastLines(text, maxLines) {
|
|
50
|
+
const lines = text.split("\n");
|
|
51
|
+
return lines.length <= maxLines ? text : lines.slice(lines.length - maxLines).join("\n");
|
|
52
|
+
}
|
|
53
|
+
export function formatClock(iso) {
|
|
54
|
+
if (iso === undefined) {
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
const date = new Date(iso);
|
|
58
|
+
return Number.isNaN(date.getTime()) ? "" : date.toLocaleTimeString();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* `MM-DD HH:MM` in local time -- unlike {@link formatClock} (time only), this
|
|
62
|
+
* carries the date too: a run list spans days, and a bare clock reading is
|
|
63
|
+
* ambiguous once results run past midnight.
|
|
64
|
+
*/
|
|
65
|
+
export function formatDateClock(iso) {
|
|
66
|
+
if (iso === undefined) {
|
|
67
|
+
return "";
|
|
68
|
+
}
|
|
69
|
+
const date = new Date(iso);
|
|
70
|
+
if (Number.isNaN(date.getTime())) {
|
|
71
|
+
return "";
|
|
72
|
+
}
|
|
73
|
+
const pad = (value) => String(value).padStart(2, "0");
|
|
74
|
+
return `${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Provider-shape-agnostic extraction shared by the replay detail headline
|
|
78
|
+
* (`usageLine`) and the run list description: `usage`/`cost` are recorded
|
|
79
|
+
* verbatim from whatever the runtime/provider handed back, so field names
|
|
80
|
+
* vary (`input` vs `inputTokens` vs `input_tokens`, `totalUsd` vs `usd`).
|
|
81
|
+
* Returns undefined when no token counts are present at all.
|
|
82
|
+
*/
|
|
83
|
+
export function extractUsage(usage, cost) {
|
|
84
|
+
if (typeof usage !== "object" || usage === null) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
const record = usage;
|
|
88
|
+
const input = numberOrUndefined(record.input ?? record.inputTokens ?? record.input_tokens);
|
|
89
|
+
const output = numberOrUndefined(record.output ?? record.outputTokens ?? record.output_tokens);
|
|
90
|
+
if (input === undefined && output === undefined) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const usd = numberOrUndefined(typeof cost === "object" && cost !== null
|
|
94
|
+
? (cost.totalUsd ?? cost.usd)
|
|
95
|
+
: cost);
|
|
96
|
+
return {
|
|
97
|
+
...(input === undefined ? {} : { input }),
|
|
98
|
+
...(output === undefined ? {} : { output }),
|
|
99
|
+
...(usd === undefined ? {} : { usd }),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function numberOrUndefined(value) {
|
|
103
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EditorTheme, MarkdownTheme, SelectListTheme } from "@earendil-works/pi-tui";
|
|
2
|
+
export declare const styles: {
|
|
3
|
+
readonly bold: (text: string) => string;
|
|
4
|
+
readonly dim: (text: string) => string;
|
|
5
|
+
readonly italic: (text: string) => string;
|
|
6
|
+
readonly underline: (text: string) => string;
|
|
7
|
+
readonly strikethrough: (text: string) => string;
|
|
8
|
+
readonly inverse: (text: string) => string;
|
|
9
|
+
readonly accent: (text: string) => string;
|
|
10
|
+
readonly info: (text: string) => string;
|
|
11
|
+
readonly user: (text: string) => string;
|
|
12
|
+
readonly muted: (text: string) => string;
|
|
13
|
+
readonly warning: (text: string) => string;
|
|
14
|
+
readonly error: (text: string) => string;
|
|
15
|
+
readonly success: (text: string) => string;
|
|
16
|
+
readonly thinking: (text: string) => string;
|
|
17
|
+
readonly code: (text: string) => string;
|
|
18
|
+
readonly link: (text: string) => string;
|
|
19
|
+
};
|
|
20
|
+
export declare const markdownTheme: MarkdownTheme;
|
|
21
|
+
/** Markdown theme for collapsed/secondary content (thinking, previews). */
|
|
22
|
+
export declare const dimMarkdownTheme: MarkdownTheme;
|
|
23
|
+
export declare const selectListTheme: SelectListTheme;
|
|
24
|
+
export declare const editorTheme: EditorTheme;
|
|
25
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAc1F,eAAO,MAAM,MAAM;0BALkC,MAAM,KAAG,MAAM;yBAAf,MAAM,KAAG,MAAM;4BAAf,MAAM,KAAG,MAAM;+BAAf,MAAM,KAAG,MAAM;mCAAf,MAAM,KAAG,MAAM;6BAAf,MAAM,KAAG,MAAM;4BAAf,MAAM,KAAG,MAAM;0BAAf,MAAM,KAAG,MAAM;0BAAf,MAAM,KAAG,MAAM;2BAAf,MAAM,KAAG,MAAM;6BAAf,MAAM,KAAG,MAAM;2BAAf,MAAM,KAAG,MAAM;6BAAf,MAAM,KAAG,MAAM;8BAoBjD,MAAM,KAAG,MAAM;0BApBmB,MAAM,KAAG,MAAM;0BAAf,MAAM,KAAG,MAAM;CAuB1D,CAAC;AAEX,eAAO,MAAM,aAAa,EAAE,aAe3B,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,EAAE,aAM9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAM7B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,WAGzB,CAAC"}
|
package/dist/ui/theme.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ANSI styling for the whole TUI. pi-tui has no named-role theme registry —
|
|
3
|
+
* components take per-component theme objects of styling functions — so this
|
|
4
|
+
* module is the single place colors live. 4-bit/8-bit SGR only (no truecolor)
|
|
5
|
+
* so both dark and light terminals stay legible.
|
|
6
|
+
*/
|
|
7
|
+
const wrap = (open, close) => (text) => text.length === 0 ? text : `\u001b[${open}m${text}\u001b[${close}m`;
|
|
8
|
+
const fg = (color) => wrap(`38;5;${color}`, "39");
|
|
9
|
+
export const styles = {
|
|
10
|
+
bold: wrap("1", "22"),
|
|
11
|
+
dim: wrap("2", "22"),
|
|
12
|
+
italic: wrap("3", "23"),
|
|
13
|
+
underline: wrap("4", "24"),
|
|
14
|
+
strikethrough: wrap("9", "29"),
|
|
15
|
+
inverse: wrap("7", "27"),
|
|
16
|
+
accent: fg(45), // cyan — interactive highlights, headers
|
|
17
|
+
info: fg(75), // blue — neutral notices
|
|
18
|
+
user: fg(114), // green — user-authored text
|
|
19
|
+
muted: fg(245), // gray — chrome, secondary text
|
|
20
|
+
warning: fg(214), // orange — warnings, failover
|
|
21
|
+
error: fg(203), // red — errors
|
|
22
|
+
success: fg(114), // green — completed tools
|
|
23
|
+
thinking: (text) => styles.dim(styles.italic(text)),
|
|
24
|
+
code: fg(180),
|
|
25
|
+
link: fg(75),
|
|
26
|
+
};
|
|
27
|
+
export const markdownTheme = {
|
|
28
|
+
heading: (text) => styles.bold(styles.accent(text)),
|
|
29
|
+
link: styles.link,
|
|
30
|
+
linkUrl: (text) => styles.dim(styles.link(text)),
|
|
31
|
+
code: styles.code,
|
|
32
|
+
codeBlock: styles.code,
|
|
33
|
+
codeBlockBorder: styles.muted,
|
|
34
|
+
quote: styles.muted,
|
|
35
|
+
quoteBorder: styles.muted,
|
|
36
|
+
hr: styles.muted,
|
|
37
|
+
listBullet: styles.accent,
|
|
38
|
+
bold: styles.bold,
|
|
39
|
+
italic: styles.italic,
|
|
40
|
+
strikethrough: styles.strikethrough,
|
|
41
|
+
underline: styles.underline,
|
|
42
|
+
};
|
|
43
|
+
/** Markdown theme for collapsed/secondary content (thinking, previews). */
|
|
44
|
+
export const dimMarkdownTheme = {
|
|
45
|
+
...markdownTheme,
|
|
46
|
+
heading: (text) => styles.dim(styles.bold(text)),
|
|
47
|
+
listBullet: styles.dim,
|
|
48
|
+
code: styles.dim,
|
|
49
|
+
codeBlock: styles.dim,
|
|
50
|
+
};
|
|
51
|
+
export const selectListTheme = {
|
|
52
|
+
selectedPrefix: styles.accent,
|
|
53
|
+
selectedText: (text) => styles.bold(styles.accent(text)),
|
|
54
|
+
description: styles.muted,
|
|
55
|
+
scrollInfo: styles.dim,
|
|
56
|
+
noMatch: styles.dim,
|
|
57
|
+
};
|
|
58
|
+
export const editorTheme = {
|
|
59
|
+
borderColor: styles.muted,
|
|
60
|
+
selectList: selectListTheme,
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Container } from "@earendil-works/pi-tui";
|
|
2
|
+
import type { AgentMessageStream, AgentStreamEvent } from "@mono-agent/agent-contracts";
|
|
3
|
+
import type { StatusBar } from "./components/status-bar.js";
|
|
4
|
+
export interface TurnPresenterOptions {
|
|
5
|
+
/** The transcript container this turn appends its cells into. */
|
|
6
|
+
readonly transcript: Container;
|
|
7
|
+
readonly statusBar: StatusBar;
|
|
8
|
+
readonly requestRender: () => void;
|
|
9
|
+
/** Coalescing window for streamed markdown re-parses; 0 disables (tests). */
|
|
10
|
+
readonly flushIntervalMs?: number;
|
|
11
|
+
/** New thinking cells start expanded when the app-level toggle is on. */
|
|
12
|
+
readonly thinkingExpanded?: () => boolean;
|
|
13
|
+
/** Injectable clock for thinking-duration assertions; defaults to Date.now. */
|
|
14
|
+
readonly now?: () => number;
|
|
15
|
+
/**
|
|
16
|
+
* The model override the operator requested for this turn (via `/model`), if
|
|
17
|
+
* any. Used only to notice when a run reports `overridden: false` despite a
|
|
18
|
+
* requested override — i.e. the override was ignored (old agent) or invalid.
|
|
19
|
+
*/
|
|
20
|
+
readonly requestedModelOverride?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Implements AgentMessageStream against pi-tui components: every stream
|
|
24
|
+
* callback mutates transcript cells and requests a coalesced redraw. Identical
|
|
25
|
+
* for in-process and remote responders — the wire protocol replays the same
|
|
26
|
+
* callbacks.
|
|
27
|
+
*
|
|
28
|
+
* Cell ordering mirrors the model's own block order: thinking and tool cells
|
|
29
|
+
* are appended as they arrive; the assistant text cell is (re)opened after
|
|
30
|
+
* each tool call so interleaved text→tool→text turns read chronologically.
|
|
31
|
+
*/
|
|
32
|
+
export declare class TurnPresenter implements AgentMessageStream {
|
|
33
|
+
private readonly options;
|
|
34
|
+
private assistantCell;
|
|
35
|
+
/** Every assistant cell this turn opened, oldest first (segments split at tool calls). */
|
|
36
|
+
private readonly assistantCells;
|
|
37
|
+
/** Concatenated text of sealed segments (everything before the live buffer). */
|
|
38
|
+
private sealedText;
|
|
39
|
+
private thinkingCell;
|
|
40
|
+
/** Running total across the whole turn, even across multiple thinking cells. */
|
|
41
|
+
private thinkingChars;
|
|
42
|
+
/** Wall-clock time of this turn's first thought; undefined until then. */
|
|
43
|
+
private firstThoughtTime;
|
|
44
|
+
private readonly toolPanels;
|
|
45
|
+
private buffer;
|
|
46
|
+
private flushTimer;
|
|
47
|
+
private finished;
|
|
48
|
+
constructor(options: TurnPresenterOptions);
|
|
49
|
+
append(delta: string): Promise<void>;
|
|
50
|
+
replace(text: string): Promise<void>;
|
|
51
|
+
status(text: string): Promise<void>;
|
|
52
|
+
event(event: AgentStreamEvent): Promise<void>;
|
|
53
|
+
finish(finalText?: string): Promise<void>;
|
|
54
|
+
/** The turn is over (success, error, or cancel): stop timers, seal cells. */
|
|
55
|
+
settle(): void;
|
|
56
|
+
assistantText(): string;
|
|
57
|
+
/** Collapse all assistant segments into the last cell holding exactly `text`. */
|
|
58
|
+
private reconcileTo;
|
|
59
|
+
private scheduleFlush;
|
|
60
|
+
private flushText;
|
|
61
|
+
private assistantCellFor;
|
|
62
|
+
private thinkingCellFor;
|
|
63
|
+
/**
|
|
64
|
+
* A tool call interrupts the streaming text/thinking cells: whatever comes
|
|
65
|
+
* next starts fresh cells so the transcript stays chronological.
|
|
66
|
+
*/
|
|
67
|
+
private sealStreamingCells;
|
|
68
|
+
private flushTextImmediate;
|
|
69
|
+
private sealThinking;
|
|
70
|
+
private nowMs;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=turn-presenter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-presenter.d.ts","sourceRoot":"","sources":["../../src/ui/turn-presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAIxF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAI5D,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,yEAAyE;IACzE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1C,+EAA+E;IAC/E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAC1C;AAID;;;;;;;;;GASG;AACH,qBAAa,aAAc,YAAW,kBAAkB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,aAAa,CAA4B;IACjD,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,gFAAgF;IAChF,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,YAAY,CAA2B;IAC/C,gFAAgF;IAChF,OAAO,CAAC,aAAa,CAAK;IAC1B,0EAA0E;IAC1E,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,oBAAoB;IAInC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnC,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwG7C,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B/C,6EAA6E;IAC7E,MAAM,IAAI,IAAI;IAUd,aAAa,IAAI,MAAM;IAIvB,iFAAiF;IACjF,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,eAAe;IAQvB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,KAAK;CAGd"}
|