@operator-labs/darwin 0.1.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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/app.d.ts +5 -0
  4. package/dist/app.js +469 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/cli.d.ts +1 -0
  7. package/dist/cli.js +134 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.js +8 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/lib/auth.d.ts +15 -0
  13. package/dist/lib/auth.js +71 -0
  14. package/dist/lib/auth.js.map +1 -0
  15. package/dist/lib/autocomplete.d.ts +18 -0
  16. package/dist/lib/autocomplete.js +124 -0
  17. package/dist/lib/autocomplete.js.map +1 -0
  18. package/dist/lib/command-surface.d.ts +52 -0
  19. package/dist/lib/command-surface.js +198 -0
  20. package/dist/lib/command-surface.js.map +1 -0
  21. package/dist/lib/config.d.ts +25 -0
  22. package/dist/lib/config.js +99 -0
  23. package/dist/lib/config.js.map +1 -0
  24. package/dist/lib/darwin-local.d.ts +31 -0
  25. package/dist/lib/darwin-local.js +195 -0
  26. package/dist/lib/darwin-local.js.map +1 -0
  27. package/dist/lib/local-sessions.d.ts +66 -0
  28. package/dist/lib/local-sessions.js +357 -0
  29. package/dist/lib/local-sessions.js.map +1 -0
  30. package/dist/lib/operator-harness.d.ts +13 -0
  31. package/dist/lib/operator-harness.js +185 -0
  32. package/dist/lib/operator-harness.js.map +1 -0
  33. package/dist/lib/operator.d.ts +2 -0
  34. package/dist/lib/operator.js +13 -0
  35. package/dist/lib/operator.js.map +1 -0
  36. package/dist/lib/pi-tools.d.ts +19 -0
  37. package/dist/lib/pi-tools.js +73 -0
  38. package/dist/lib/pi-tools.js.map +1 -0
  39. package/dist/theme.d.ts +21 -0
  40. package/dist/theme.js +64 -0
  41. package/dist/theme.js.map +1 -0
  42. package/dist/ui/components/answer-box.d.ts +6 -0
  43. package/dist/ui/components/answer-box.js +17 -0
  44. package/dist/ui/components/answer-box.js.map +1 -0
  45. package/dist/ui/components/chat-log.d.ts +18 -0
  46. package/dist/ui/components/chat-log.js +72 -0
  47. package/dist/ui/components/chat-log.js.map +1 -0
  48. package/dist/ui/components/custom-editor.d.ts +6 -0
  49. package/dist/ui/components/custom-editor.js +17 -0
  50. package/dist/ui/components/custom-editor.js.map +1 -0
  51. package/dist/ui/components/footer.d.ts +6 -0
  52. package/dist/ui/components/footer.js +15 -0
  53. package/dist/ui/components/footer.js.map +1 -0
  54. package/dist/ui/components/intro.d.ts +11 -0
  55. package/dist/ui/components/intro.js +62 -0
  56. package/dist/ui/components/intro.js.map +1 -0
  57. package/dist/ui/components/note-box.d.ts +6 -0
  58. package/dist/ui/components/note-box.js +17 -0
  59. package/dist/ui/components/note-box.js.map +1 -0
  60. package/dist/ui/components/tool-event.d.ts +9 -0
  61. package/dist/ui/components/tool-event.js +58 -0
  62. package/dist/ui/components/tool-event.js.map +1 -0
  63. package/dist/ui/components/user-query.d.ts +6 -0
  64. package/dist/ui/components/user-query.js +16 -0
  65. package/dist/ui/components/user-query.js.map +1 -0
  66. package/dist/ui/components/working-indicator.d.ts +12 -0
  67. package/dist/ui/components/working-indicator.js +30 -0
  68. package/dist/ui/components/working-indicator.js.map +1 -0
  69. package/dist/utils/markdown-table.d.ts +8 -0
  70. package/dist/utils/markdown-table.js +123 -0
  71. package/dist/utils/markdown-table.js.map +1 -0
  72. package/package.json +41 -0
@@ -0,0 +1,73 @@
1
+ import { createBashTool, createEditTool, createFindTool, createGrepTool, createLsTool, createReadTool, createWriteTool, } from "@mariozechner/pi-coding-agent";
2
+ export const darwinLocalToolNames = ["read", "bash", "edit", "write", "grep", "find", "ls"];
3
+ function truncate(text, max = 12_000) {
4
+ if (text.length <= max) {
5
+ return text;
6
+ }
7
+ return `${text.slice(0, max)}\n\n[truncated]`;
8
+ }
9
+ function flattenOutput(content) {
10
+ return content
11
+ .map((item) => {
12
+ if (item.type === "text") {
13
+ return item.text ?? "";
14
+ }
15
+ return `[${item.type}]`;
16
+ })
17
+ .join("\n")
18
+ .trim();
19
+ }
20
+ function summarizeResult(tool, output, isError) {
21
+ if (isError) {
22
+ return output.split("\n")[0]?.trim() || `${tool} failed`;
23
+ }
24
+ const firstLine = output.split("\n")[0]?.trim();
25
+ if (firstLine) {
26
+ return firstLine.slice(0, 120);
27
+ }
28
+ return `${tool} completed`;
29
+ }
30
+ export class PiToolHarness {
31
+ tools;
32
+ constructor(cwd) {
33
+ this.tools = {
34
+ read: createReadTool(cwd),
35
+ bash: createBashTool(cwd),
36
+ edit: createEditTool(cwd),
37
+ write: createWriteTool(cwd),
38
+ grep: createGrepTool(cwd),
39
+ find: createFindTool(cwd),
40
+ ls: createLsTool(cwd),
41
+ };
42
+ }
43
+ async execute(call) {
44
+ const tool = this.tools[call.tool];
45
+ if (!tool) {
46
+ throw new Error(`Unknown Pi tool: ${call.tool}`);
47
+ }
48
+ try {
49
+ const result = await tool.execute(crypto.randomUUID(), call.args);
50
+ const output = truncate(flattenOutput(result.content));
51
+ return {
52
+ tool: call.tool,
53
+ args: call.args,
54
+ summary: summarizeResult(call.tool, output, false),
55
+ output,
56
+ details: result.details,
57
+ isError: false,
58
+ };
59
+ }
60
+ catch (error) {
61
+ const output = error instanceof Error ? error.message : String(error);
62
+ return {
63
+ tool: call.tool,
64
+ args: call.args,
65
+ summary: summarizeResult(call.tool, output, true),
66
+ output: truncate(output),
67
+ details: undefined,
68
+ isError: true,
69
+ };
70
+ }
71
+ }
72
+ }
73
+ //# sourceMappingURL=pi-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-tools.js","sourceRoot":"","sources":["../../src/lib/pi-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { EditorTheme, MarkdownTheme, SelectListTheme } from "@mariozechner/pi-tui";
2
+ export declare const theme: {
3
+ primary: (text: string) => string;
4
+ primarySoft: (text: string) => string;
5
+ accent: (text: string) => string;
6
+ info: (text: string) => string;
7
+ warning: (text: string) => string;
8
+ error: (text: string) => string;
9
+ muted: (text: string) => string;
10
+ mutedDark: (text: string) => string;
11
+ border: (text: string) => string;
12
+ white: (text: string) => string;
13
+ surface: (text: string) => string;
14
+ surfaceAlt: (text: string) => string;
15
+ queryBg: (text: string) => string;
16
+ dim: (text: string) => string;
17
+ bold: (text: string) => string;
18
+ };
19
+ export declare const markdownTheme: MarkdownTheme;
20
+ export declare const selectListTheme: SelectListTheme;
21
+ export declare const editorTheme: EditorTheme;
package/dist/theme.js ADDED
@@ -0,0 +1,64 @@
1
+ import chalk from "chalk";
2
+ const palette = {
3
+ primary: "#47d16c",
4
+ primarySoft: "#baf5c9",
5
+ accent: "#7ee787",
6
+ info: "#9be9a8",
7
+ warning: "#f6c177",
8
+ error: "#eb6f92",
9
+ muted: "#a6a6a6",
10
+ mutedDark: "#2c3a2f",
11
+ border: "#28412f",
12
+ surface: "#121914",
13
+ surfaceAlt: "#18211b",
14
+ queryBg: "#243228",
15
+ white: "#f8fafc",
16
+ };
17
+ const fg = (color) => (text) => chalk.hex(color)(text);
18
+ const bg = (color) => (text) => chalk.bgHex(color)(text);
19
+ export const theme = {
20
+ primary: fg(palette.primary),
21
+ primarySoft: fg(palette.primarySoft),
22
+ accent: fg(palette.accent),
23
+ info: fg(palette.info),
24
+ warning: fg(palette.warning),
25
+ error: fg(palette.error),
26
+ muted: fg(palette.muted),
27
+ mutedDark: fg(palette.mutedDark),
28
+ border: fg(palette.border),
29
+ white: fg(palette.white),
30
+ surface: bg(palette.surface),
31
+ surfaceAlt: bg(palette.surfaceAlt),
32
+ queryBg: bg(palette.queryBg),
33
+ dim: (text) => chalk.dim(text),
34
+ bold: (text) => chalk.bold(text),
35
+ };
36
+ export const markdownTheme = {
37
+ heading: (text) => theme.bold(theme.primary(text)),
38
+ link: (text) => theme.primarySoft(text),
39
+ linkUrl: (text) => theme.muted(text),
40
+ code: (text) => theme.primarySoft(text),
41
+ codeBlock: (text) => theme.white(text),
42
+ codeBlockBorder: (text) => theme.border(text),
43
+ quote: (text) => theme.info(text),
44
+ quoteBorder: (text) => theme.border(text),
45
+ hr: (text) => theme.border(text),
46
+ listBullet: (text) => theme.primary(text),
47
+ bold: (text) => theme.bold(text),
48
+ italic: (text) => chalk.italic(text),
49
+ strikethrough: (text) => chalk.strikethrough(text),
50
+ underline: (text) => chalk.underline(text),
51
+ codeBlockIndent: " ",
52
+ };
53
+ export const selectListTheme = {
54
+ selectedPrefix: (text) => theme.primarySoft(text),
55
+ selectedText: (text) => theme.bold(theme.primarySoft(text)),
56
+ description: (text) => theme.muted(text),
57
+ scrollInfo: (text) => theme.muted(text),
58
+ noMatch: (text) => theme.warning(text),
59
+ };
60
+ export const editorTheme = {
61
+ borderColor: (text) => theme.border(text),
62
+ selectList: selectListTheme,
63
+ };
64
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Container } from "@mariozechner/pi-tui";
2
+ export declare class AnswerBoxComponent extends Container {
3
+ private readonly body;
4
+ constructor(initialText?: string);
5
+ setText(text: string): void;
6
+ }
@@ -0,0 +1,17 @@
1
+ import { Container, Markdown, Spacer } from "@mariozechner/pi-tui";
2
+ import { markdownTheme, theme } from "../../theme.js";
3
+ import { formatResponse } from "../../utils/markdown-table.js";
4
+ export class AnswerBoxComponent extends Container {
5
+ body;
6
+ constructor(initialText = "") {
7
+ super();
8
+ this.addChild(new Spacer(1));
9
+ this.body = new Markdown("", 0, 0, markdownTheme, { color: (line) => line });
10
+ this.addChild(this.body);
11
+ this.setText(initialText);
12
+ }
13
+ setText(text) {
14
+ this.body.setText(`${theme.primary("⏺ ")}${formatResponse(text).replace(/^\n+/, "")}`);
15
+ }
16
+ }
17
+ //# sourceMappingURL=answer-box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-box.js","sourceRoot":"","sources":["../../../src/ui/components/answer-box.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC9B,IAAI,CAAW;IAEhC,YAAY,WAAW,GAAG,EAAE;QAC1B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import { Container, type TUI } from "@mariozechner/pi-tui";
2
+ export declare class ChatLogComponent extends Container {
3
+ private readonly tui;
4
+ private activeAnswer;
5
+ private activeTool;
6
+ constructor(tui: TUI);
7
+ clearAll(): void;
8
+ addQuery(query: string): void;
9
+ addAssistant(text: string): void;
10
+ addNote(text: string): void;
11
+ addError(text: string): void;
12
+ beginAnswer(): void;
13
+ updateAnswer(text: string): void;
14
+ finalizeAnswer(): void;
15
+ startTool(tool: string, args: Record<string, unknown>): void;
16
+ completeTool(summary: string): void;
17
+ failTool(message: string): void;
18
+ }
@@ -0,0 +1,72 @@
1
+ import { Container, Text } from "@mariozechner/pi-tui";
2
+ import { theme } from "../../theme.js";
3
+ import { AnswerBoxComponent } from "./answer-box.js";
4
+ import { NoteBoxComponent } from "./note-box.js";
5
+ import { ToolEventComponent } from "./tool-event.js";
6
+ import { UserQueryComponent } from "./user-query.js";
7
+ export class ChatLogComponent extends Container {
8
+ tui;
9
+ activeAnswer = null;
10
+ activeTool = null;
11
+ constructor(tui) {
12
+ super();
13
+ this.tui = tui;
14
+ }
15
+ clearAll() {
16
+ this.clear();
17
+ this.activeAnswer = null;
18
+ this.activeTool = null;
19
+ }
20
+ addQuery(query) {
21
+ this.activeAnswer = null;
22
+ this.activeTool = null;
23
+ this.addChild(new UserQueryComponent(query));
24
+ }
25
+ addAssistant(text) {
26
+ this.addChild(new AnswerBoxComponent(text));
27
+ this.activeAnswer = null;
28
+ this.activeTool = null;
29
+ }
30
+ addNote(text) {
31
+ this.activeAnswer = null;
32
+ this.activeTool = null;
33
+ this.addChild(new NoteBoxComponent(text));
34
+ }
35
+ addError(text) {
36
+ this.activeAnswer = null;
37
+ this.activeTool = null;
38
+ this.addChild(new Text(theme.error(text), 0, 0));
39
+ }
40
+ beginAnswer() {
41
+ this.activeAnswer = new AnswerBoxComponent("");
42
+ this.addChild(this.activeAnswer);
43
+ this.tui.requestRender();
44
+ }
45
+ updateAnswer(text) {
46
+ if (!this.activeAnswer) {
47
+ this.beginAnswer();
48
+ }
49
+ this.activeAnswer?.setText(text);
50
+ this.tui.requestRender();
51
+ }
52
+ finalizeAnswer() {
53
+ this.activeAnswer = null;
54
+ }
55
+ startTool(tool, args) {
56
+ this.activeTool = new ToolEventComponent(tool, args);
57
+ this.activeTool.setActive();
58
+ this.addChild(this.activeTool);
59
+ this.tui.requestRender();
60
+ }
61
+ completeTool(summary) {
62
+ this.activeTool?.setComplete(summary);
63
+ this.activeTool = null;
64
+ this.tui.requestRender();
65
+ }
66
+ failTool(message) {
67
+ this.activeTool?.setError(message);
68
+ this.activeTool = null;
69
+ this.tui.requestRender();
70
+ }
71
+ }
72
+ //# sourceMappingURL=chat-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-log.js","sourceRoot":"","sources":["../../../src/ui/components/chat-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Editor } from "@mariozechner/pi-tui";
2
+ export declare class CustomEditor extends Editor {
3
+ onEscape?: () => void;
4
+ onCtrlC?: () => void;
5
+ handleInput(data: string): void;
6
+ }
@@ -0,0 +1,17 @@
1
+ import { Editor, Key, matchesKey } from "@mariozechner/pi-tui";
2
+ export class CustomEditor extends Editor {
3
+ onEscape;
4
+ onCtrlC;
5
+ handleInput(data) {
6
+ if (matchesKey(data, Key.escape) && this.onEscape) {
7
+ this.onEscape();
8
+ return;
9
+ }
10
+ if (matchesKey(data, Key.ctrl("c")) && this.onCtrlC) {
11
+ this.onCtrlC();
12
+ return;
13
+ }
14
+ super.handleInput(data);
15
+ }
16
+ }
17
+ //# sourceMappingURL=custom-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-editor.js","sourceRoot":"","sources":["../../../src/ui/components/custom-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,OAAO,YAAa,SAAQ,MAAM;IACtC,QAAQ,CAAc;IACtB,OAAO,CAAc;IAErB,WAAW,CAAC,IAAY;QACtB,IAAI,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { Container } from "@mariozechner/pi-tui";
2
+ export declare class FooterComponent extends Container {
3
+ private readonly statusText;
4
+ constructor();
5
+ setStatus(text: string): void;
6
+ }
@@ -0,0 +1,15 @@
1
+ import { Container, Text } from "@mariozechner/pi-tui";
2
+ import { theme } from "../../theme.js";
3
+ export class FooterComponent extends Container {
4
+ statusText;
5
+ constructor() {
6
+ super();
7
+ this.addChild(new Text(`${theme.primary("?")} ${theme.muted("for help")} ${theme.border("·")} ${theme.primary("/login")} ${theme.muted("to login")}`, 0, 0));
8
+ this.statusText = new Text("", 0, 0);
9
+ this.addChild(this.statusText);
10
+ }
11
+ setStatus(text) {
12
+ this.statusText.setText(text);
13
+ }
14
+ }
15
+ //# sourceMappingURL=footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../src/ui/components/footer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,OAAO,eAAgB,SAAQ,SAAS;IAC3B,UAAU,CAAO;IAElC;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,CACX,IAAI,IAAI,CACN,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,CAC7G,UAAU,CACX,EAAE,EACH,CAAC,EACD,CAAC,CACF,CACF,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { Container, type TUI } from "@mariozechner/pi-tui";
2
+ export declare class IntroComponent extends Container {
3
+ private readonly helperText;
4
+ private readonly tui;
5
+ private exampleIndex;
6
+ private timer;
7
+ constructor(tui: TUI);
8
+ dispose(): void;
9
+ private setExample;
10
+ private ensureTimer;
11
+ }
@@ -0,0 +1,62 @@
1
+ import { Container, Spacer, Text } from "@mariozechner/pi-tui";
2
+ import { theme } from "../../theme.js";
3
+ const EXAMPLE_PROMPTS = [
4
+ "Evolve agents that get better at predicting whether Bitcoin will go down in the next 5 minutes.",
5
+ "Evolve agents that improve on the ARC-AGI-2 benchmark.",
6
+ "Evolve agents that outperform Karpathy's autoresearch baseline on a fixed 5-minute run.",
7
+ "Evolve agents that get better at one-shot prediction of the next 1-minute BTC candle.",
8
+ "Evolve agents that improve pass@1 on a fixed set of 25 real bugfix tasks.",
9
+ "Evolve agents that get better at finding the single best patch under a 10-minute budget.",
10
+ "Evolve agents that improve tool-use accuracy on a fixed terminal benchmark.",
11
+ "Evolve agents that get better at recovering broken CI runs in one attempt.",
12
+ "Evolve agents that improve win rate in a fixed market-making simulator.",
13
+ "Evolve agents that get better at solving a held-out suite of GitHub issue repros.",
14
+ ];
15
+ const ROTATION_INTERVAL_MS = 18000;
16
+ export class IntroComponent extends Container {
17
+ helperText;
18
+ tui;
19
+ exampleIndex;
20
+ timer = null;
21
+ constructor(tui) {
22
+ super();
23
+ this.tui = tui;
24
+ this.exampleIndex = Math.floor(Date.now() / ROTATION_INTERVAL_MS) % EXAMPLE_PROMPTS.length;
25
+ this.addChild(new Spacer(1));
26
+ this.addChild(new Text(theme.bold(theme.primary([
27
+ "██████╗ █████╗ ██████╗ ██╗ ██╗██╗███╗ ██╗",
28
+ "██╔══██╗██╔══██╗██╔══██╗██║ ██║██║████╗ ██║",
29
+ "██║ ██║███████║██████╔╝██║ █╗ ██║██║██╔██╗ ██║",
30
+ "██║ ██║██╔══██║██╔══██╗██║███╗██║██║██║╚██╗██║",
31
+ "██████╔╝██║ ██║██║ ██║╚███╔███╔╝██║██║ ╚████║",
32
+ "╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚══╝╚══╝ ╚═╝╚═╝ ╚═══╝",
33
+ ].join("\n"))), 0, 0));
34
+ this.addChild(new Spacer(1));
35
+ this.helperText = new Text("", 0, 0);
36
+ this.addChild(this.helperText);
37
+ this.setExample(this.exampleIndex);
38
+ this.ensureTimer();
39
+ this.addChild(new Spacer(1));
40
+ }
41
+ dispose() {
42
+ if (!this.timer) {
43
+ return;
44
+ }
45
+ clearInterval(this.timer);
46
+ this.timer = null;
47
+ }
48
+ setExample(index) {
49
+ this.helperText.setText(`${theme.white("Directed evolution for OpenClaw agents.")} ${theme.muted(`Try: "${EXAMPLE_PROMPTS[index]}"`)}`);
50
+ }
51
+ ensureTimer() {
52
+ if (this.timer) {
53
+ return;
54
+ }
55
+ this.timer = setInterval(() => {
56
+ this.exampleIndex = (this.exampleIndex + 1) % EXAMPLE_PROMPTS.length;
57
+ this.setExample(this.exampleIndex);
58
+ this.tui.requestRender();
59
+ }, ROTATION_INTERVAL_MS);
60
+ }
61
+ }
62
+ //# sourceMappingURL=intro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intro.js","sourceRoot":"","sources":["../../../src/ui/components/intro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAY,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,eAAe,GAAG;IACtB,iGAAiG;IACjG,wDAAwD;IACxD,yFAAyF;IACzF,uFAAuF;IACvF,2EAA2E;IAC3E,0FAA0F;IAC1F,6EAA6E;IAC7E,4EAA4E;IAC5E,yEAAyE;IACzE,mFAAmF;CACpF,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAEnC,MAAM,OAAO,cAAe,SAAQ,SAAS;IAC1B,UAAU,CAAO;IACjB,GAAG,CAAM;IAClB,YAAY,CAAS;IACrB,KAAK,GAA0B,IAAI,CAAC;IAE5C,YAAY,GAAQ;QAClB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,oBAAoB,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;QAC3F,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CACX,IAAI,IAAI,CACN,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,OAAO,CACX;YACE,iDAAiD;YACjD,iDAAiD;YACjD,iDAAiD;YACjD,iDAAiD;YACjD,iDAAiD;YACjD,iDAAiD;SAClD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CACF,EACD,CAAC,EACD,CAAC,CACF,CACF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,IAAI,CAAC,UAAU,CAAC,OAAO,CACrB,GAAG,KAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAC/G,CAAC;IACJ,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;YACrE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { Container } from "@mariozechner/pi-tui";
2
+ export declare class NoteBoxComponent extends Container {
3
+ private readonly body;
4
+ constructor(initialText?: string);
5
+ setText(text: string): void;
6
+ }
@@ -0,0 +1,17 @@
1
+ import { Container, Markdown, Spacer } from "@mariozechner/pi-tui";
2
+ import { markdownTheme, theme } from "../../theme.js";
3
+ import { formatResponse } from "../../utils/markdown-table.js";
4
+ export class NoteBoxComponent extends Container {
5
+ body;
6
+ constructor(initialText = "") {
7
+ super();
8
+ this.addChild(new Spacer(1));
9
+ this.body = new Markdown("", 0, 0, markdownTheme, { color: (line) => line });
10
+ this.addChild(this.body);
11
+ this.setText(initialText);
12
+ }
13
+ setText(text) {
14
+ this.body.setText(`${theme.info("▣ ")}${formatResponse(text).replace(/^\n+/, "")}`);
15
+ }
16
+ }
17
+ //# sourceMappingURL=note-box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note-box.js","sourceRoot":"","sources":["../../../src/ui/components/note-box.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAC5B,IAAI,CAAW;IAEhC,YAAY,WAAW,GAAG,EAAE;QAC1B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { Container } from "@mariozechner/pi-tui";
2
+ export declare class ToolEventComponent extends Container {
3
+ private detail;
4
+ constructor(tool: string, args: Record<string, unknown>);
5
+ setActive(message?: string): void;
6
+ setComplete(summary: string): void;
7
+ setError(message: string): void;
8
+ private clearDetail;
9
+ }
@@ -0,0 +1,58 @@
1
+ import { Container, Spacer, Text } from "@mariozechner/pi-tui";
2
+ import { theme } from "../../theme.js";
3
+ function formatToolName(name) {
4
+ return name
5
+ .split(/[_-]/)
6
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
7
+ .join(" ");
8
+ }
9
+ function truncate(text, max = 80) {
10
+ if (text.length <= max) {
11
+ return text;
12
+ }
13
+ const lastSpace = text.lastIndexOf(" ", max);
14
+ if (lastSpace > max * 0.5) {
15
+ return `${text.slice(0, lastSpace)}...`;
16
+ }
17
+ return `${text.slice(0, max)}...`;
18
+ }
19
+ function formatArgs(args) {
20
+ if ("query" in args) {
21
+ return theme.muted(`"${truncate(String(args.query), 60)}"`);
22
+ }
23
+ return theme.muted(Object.entries(args)
24
+ .slice(0, 4)
25
+ .map(([key, value]) => `${key}=${truncate(String(value).replace(/\n/g, "\\n"), 32)}`)
26
+ .join(", "));
27
+ }
28
+ export class ToolEventComponent extends Container {
29
+ detail = null;
30
+ constructor(tool, args) {
31
+ super();
32
+ this.addChild(new Spacer(1));
33
+ const suffix = Object.keys(args).length > 0 ? `${theme.muted(" (")}${formatArgs(args)}${theme.muted(")")}` : "";
34
+ this.addChild(new Text(`${theme.primary("⏺")} ${formatToolName(tool)}${suffix}`, 0, 0));
35
+ }
36
+ setActive(message = "Working...") {
37
+ this.clearDetail();
38
+ this.detail = new Text(`${theme.muted("⎿ ")}${theme.muted(message)}`, 0, 0);
39
+ this.addChild(this.detail);
40
+ }
41
+ setComplete(summary) {
42
+ this.clearDetail();
43
+ this.detail = new Text(`${theme.muted("⎿ ")}${summary}`, 0, 0);
44
+ this.addChild(this.detail);
45
+ }
46
+ setError(message) {
47
+ this.clearDetail();
48
+ this.detail = new Text(`${theme.muted("⎿ ")}${theme.error(truncate(message))}`, 0, 0);
49
+ this.addChild(this.detail);
50
+ }
51
+ clearDetail() {
52
+ if (this.detail) {
53
+ this.removeChild(this.detail);
54
+ this.detail = null;
55
+ }
56
+ }
57
+ }
58
+ //# sourceMappingURL=tool-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-event.js","sourceRoot":"","sources":["../../../src/ui/components/tool-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,KAAK,CAAC,MAAM,CAAC;SACb,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAG,GAAG,EAAE;IACtC,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,SAAS,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,IAA6B;IAC/C,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAChB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACjB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;SACpF,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IACvC,MAAM,GAAgB,IAAI,CAAC;IAEnC,YAAY,IAAY,EAAE,IAA6B;QACrD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChH,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,SAAS,CAAC,OAAO,GAAG,YAAY;QAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { Container } from "@mariozechner/pi-tui";
2
+ export declare class UserQueryComponent extends Container {
3
+ private readonly body;
4
+ constructor(query: string);
5
+ setQuery(query: string): void;
6
+ }
@@ -0,0 +1,16 @@
1
+ import { Container, Spacer, Text } from "@mariozechner/pi-tui";
2
+ import { theme } from "../../theme.js";
3
+ export class UserQueryComponent extends Container {
4
+ body;
5
+ constructor(query) {
6
+ super();
7
+ this.addChild(new Spacer(1));
8
+ this.body = new Text("", 0, 0);
9
+ this.addChild(this.body);
10
+ this.setQuery(query);
11
+ }
12
+ setQuery(query) {
13
+ this.body.setText(`${theme.queryBg(theme.white(`❯ ${query} `))}`);
14
+ }
15
+ }
16
+ //# sourceMappingURL=user-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-query.js","sourceRoot":"","sources":["../../../src/ui/components/user-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC9B,IAAI,CAAO;IAE5B,YAAY,KAAa;QACvB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import { Container, type TUI } from "@mariozechner/pi-tui";
2
+ export interface WorkingState {
3
+ status: "idle" | "thinking" | "auth";
4
+ message?: string;
5
+ }
6
+ export declare class WorkingIndicatorComponent extends Container {
7
+ private readonly tui;
8
+ private loader;
9
+ constructor(tui: TUI);
10
+ setState(state: WorkingState): void;
11
+ dispose(): void;
12
+ }
@@ -0,0 +1,30 @@
1
+ import { Container, Loader } from "@mariozechner/pi-tui";
2
+ import { theme } from "../../theme.js";
3
+ export class WorkingIndicatorComponent extends Container {
4
+ tui;
5
+ loader = null;
6
+ constructor(tui) {
7
+ super();
8
+ this.tui = tui;
9
+ }
10
+ setState(state) {
11
+ if (state.status === "idle") {
12
+ this.dispose();
13
+ this.clear();
14
+ return;
15
+ }
16
+ this.clear();
17
+ if (!this.loader) {
18
+ this.loader = new Loader(this.tui, (text) => theme.primary(text), (text) => theme.primarySoft(text), "");
19
+ }
20
+ this.loader.setMessage(state.message || (state.status === "auth" ? "Waiting for browser login..." : "Operator is thinking..."));
21
+ this.addChild(this.loader);
22
+ }
23
+ dispose() {
24
+ if (this.loader) {
25
+ this.loader.stop();
26
+ this.loader = null;
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=working-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-indicator.js","sourceRoot":"","sources":["../../../src/ui/components/working-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAY,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAOvC,MAAM,OAAO,yBAA0B,SAAQ,SAAS;IACrC,GAAG,CAAM;IAClB,MAAM,GAAkB,IAAI,CAAC;IAErC,YAAY,GAAQ;QAClB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,QAAQ,CAAC,KAAmB;QAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CACtB,IAAI,CAAC,GAAG,EACR,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAC7B,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EACjC,EAAE,CACH,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,UAAU,CACpB,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,yBAAyB,CAAC,CACxG,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ export declare function parseMarkdownTable(tableText: string): {
2
+ headers: string[];
3
+ rows: string[][];
4
+ } | null;
5
+ export declare function renderBoxTable(headers: string[], rows: string[][]): string;
6
+ export declare function transformMarkdownTables(content: string): string;
7
+ export declare function transformBold(content: string): string;
8
+ export declare function formatResponse(content: string): string;