From 7c94e9e1907fb6206bf3a8f694d6a5eeff3a8b00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 5 Oct 2026 14:29:40 -0400 Subject: [PATCH] Agent: components 261-280 --- agent_diff.go | 127 ++++++++ agent_parts.go | 293 ++++++++++++++++++ agent_plan.go | 146 +++++++++ agent_plan_test.go | 94 ++++++ agent_progress.go | 36 +++ agent_progress_test.go | 54 ++++ agent_status.go | 34 ++ agent_status_test.go | 69 +++++ agent_step_list.go | 140 +++++++++ agent_step_list_test.go | 87 ++++++ artifact_panel.go | 148 +++++++++ artifact_panel_test.go | 79 +++++ artifact_version_switcher.go | 89 ++++++ artifact_version_switcher_test.go | 77 +++++ checkpoint_list.go | 119 +++++++ checkpoint_list_test.go | 77 +++++ command_execution_card.go | 128 ++++++++ command_execution_card_test.go | 98 ++++++ docs/components/261-tool-call-card.md | 47 +++ docs/components/262-tool-call-group.md | 47 +++ docs/components/263-tool-approval-dialog.md | 51 +++ docs/components/264-permission-prompt.md | 48 +++ docs/components/265-agent-step-list.md | 51 +++ docs/components/266-agent-plan.md | 49 +++ docs/components/267-agent-status.md | 41 +++ docs/components/268-agent-progress.md | 42 +++ docs/components/269-sub-agent-tree.md | 45 +++ docs/components/270-file-change-card.md | 48 +++ docs/components/271-multi-file-diff-review.md | 48 +++ docs/components/272-command-execution-card.md | 48 +++ docs/components/273-screenshot-stream.md | 45 +++ docs/components/274-artifact-panel.md | 47 +++ .../275-artifact-version-switcher.md | 45 +++ docs/components/276-sandbox-status.md | 43 +++ docs/components/277-mcp-server-list.md | 46 +++ docs/components/278-memory-panel.md | 47 +++ docs/components/279-checkpoint-list.md | 46 +++ docs/components/280-human-input-request.md | 52 ++++ example_agent_test.go | 243 +++++++++++++++ examples/gallery/pages_agent.go | 281 ++++++++++++++++- examples/gallery/pages_agent_code.go | 196 ++++++++++++ examples/gallery/pages_agent_more.go | 285 +++++++++++++++++ file_change_card.go | 85 +++++ file_change_card_test.go | 84 +++++ human_input_request.go | 126 ++++++++ human_input_request_test.go | 94 ++++++ internal/diff.go | 12 +- mcp_server_list.go | 144 +++++++++ mcp_server_list_test.go | 91 ++++++ memory_panel.go | 159 ++++++++++ memory_panel_test.go | 96 ++++++ messages_agent.go | 127 ++++++++ multi_file_diff_review.go | 158 ++++++++++ multi_file_diff_review_test.go | 118 +++++++ permission_prompt.go | 76 +++++ permission_prompt_test.go | 78 +++++ sandbox_status.go | 107 +++++++ sandbox_status_test.go | 68 ++++ screenshot_stream.go | 125 ++++++++ screenshot_stream_test.go | 110 +++++++ sub_agent_tree.go | 104 +++++++ sub_agent_tree_test.go | 81 +++++ testdata/snapshots/darwin/agent_plan-dark.png | Bin 0 -> 22491 bytes .../snapshots/darwin/agent_plan-light.png | Bin 0 -> 21845 bytes .../snapshots/darwin/agent_progress-dark.png | Bin 0 -> 6914 bytes .../snapshots/darwin/agent_progress-light.png | Bin 0 -> 6660 bytes .../snapshots/darwin/agent_status-dark.png | Bin 0 -> 8602 bytes .../snapshots/darwin/agent_status-light.png | Bin 0 -> 8321 bytes .../snapshots/darwin/agent_step_list-dark.png | Bin 0 -> 21118 bytes .../darwin/agent_step_list-light.png | Bin 0 -> 20677 bytes .../snapshots/darwin/artifact_panel-dark.png | Bin 0 -> 23276 bytes .../snapshots/darwin/artifact_panel-light.png | Bin 0 -> 22104 bytes .../darwin/artifact_version_switcher-dark.png | Bin 0 -> 6383 bytes .../artifact_version_switcher-light.png | Bin 0 -> 6098 bytes .../snapshots/darwin/checkpoint_list-dark.png | Bin 0 -> 15247 bytes .../darwin/checkpoint_list-light.png | Bin 0 -> 14910 bytes .../darwin/command_execution_card-dark.png | Bin 0 -> 22439 bytes .../darwin/command_execution_card-light.png | Bin 0 -> 21339 bytes .../darwin/file_change_card-dark.png | Bin 0 -> 24065 bytes .../darwin/file_change_card-light.png | Bin 0 -> 23061 bytes .../darwin/human_input_request-dark.png | Bin 0 -> 16550 bytes .../darwin/human_input_request-light.png | Bin 0 -> 16059 bytes .../snapshots/darwin/mcp_server_list-dark.png | Bin 0 -> 26561 bytes .../darwin/mcp_server_list-light.png | Bin 0 -> 26213 bytes .../snapshots/darwin/memory_panel-dark.png | Bin 0 -> 28687 bytes .../snapshots/darwin/memory_panel-light.png | Bin 0 -> 27454 bytes .../darwin/multi_file_diff_review-dark.png | Bin 0 -> 40763 bytes .../darwin/multi_file_diff_review-light.png | Bin 0 -> 39456 bytes .../darwin/permission_prompt-dark.png | Bin 0 -> 24519 bytes .../darwin/permission_prompt-light.png | Bin 0 -> 25303 bytes .../snapshots/darwin/sandbox_status-dark.png | Bin 0 -> 12023 bytes .../snapshots/darwin/sandbox_status-light.png | Bin 0 -> 11551 bytes .../darwin/screenshot_stream-dark.png | Bin 0 -> 7842 bytes .../darwin/screenshot_stream-light.png | Bin 0 -> 7643 bytes .../snapshots/darwin/sub_agent_tree-dark.png | Bin 0 -> 20444 bytes .../snapshots/darwin/sub_agent_tree-light.png | Bin 0 -> 19589 bytes .../darwin/tool_approval_dialog-dark.png | Bin 0 -> 23291 bytes .../darwin/tool_approval_dialog-light.png | Bin 0 -> 24229 bytes .../snapshots/darwin/tool_call_card-dark.png | Bin 0 -> 13969 bytes .../snapshots/darwin/tool_call_card-light.png | Bin 0 -> 13488 bytes .../snapshots/darwin/tool_call_group-dark.png | Bin 0 -> 17357 bytes .../darwin/tool_call_group-light.png | Bin 0 -> 16891 bytes tool_approval_dialog.go | 65 ++++ tool_approval_dialog_test.go | 97 ++++++ tool_call_card.go | 79 +++++ tool_call_card_test.go | 103 ++++++ tool_call_group.go | 75 +++++ tool_call_group_test.go | 72 +++++ 108 files changed, 6363 insertions(+), 7 deletions(-) create mode 100644 agent_diff.go create mode 100644 agent_parts.go create mode 100644 agent_plan.go create mode 100644 agent_plan_test.go create mode 100644 agent_progress.go create mode 100644 agent_progress_test.go create mode 100644 agent_status.go create mode 100644 agent_status_test.go create mode 100644 agent_step_list.go create mode 100644 agent_step_list_test.go create mode 100644 artifact_panel.go create mode 100644 artifact_panel_test.go create mode 100644 artifact_version_switcher.go create mode 100644 artifact_version_switcher_test.go create mode 100644 checkpoint_list.go create mode 100644 checkpoint_list_test.go create mode 100644 command_execution_card.go create mode 100644 command_execution_card_test.go create mode 100644 docs/components/261-tool-call-card.md create mode 100644 docs/components/262-tool-call-group.md create mode 100644 docs/components/263-tool-approval-dialog.md create mode 100644 docs/components/264-permission-prompt.md create mode 100644 docs/components/265-agent-step-list.md create mode 100644 docs/components/266-agent-plan.md create mode 100644 docs/components/267-agent-status.md create mode 100644 docs/components/268-agent-progress.md create mode 100644 docs/components/269-sub-agent-tree.md create mode 100644 docs/components/270-file-change-card.md create mode 100644 docs/components/271-multi-file-diff-review.md create mode 100644 docs/components/272-command-execution-card.md create mode 100644 docs/components/273-screenshot-stream.md create mode 100644 docs/components/274-artifact-panel.md create mode 100644 docs/components/275-artifact-version-switcher.md create mode 100644 docs/components/276-sandbox-status.md create mode 100644 docs/components/277-mcp-server-list.md create mode 100644 docs/components/278-memory-panel.md create mode 100644 docs/components/279-checkpoint-list.md create mode 100644 docs/components/280-human-input-request.md create mode 100644 example_agent_test.go create mode 100644 examples/gallery/pages_agent_code.go create mode 100644 examples/gallery/pages_agent_more.go create mode 100644 file_change_card.go create mode 100644 file_change_card_test.go create mode 100644 human_input_request.go create mode 100644 human_input_request_test.go create mode 100644 mcp_server_list.go create mode 100644 mcp_server_list_test.go create mode 100644 memory_panel.go create mode 100644 memory_panel_test.go create mode 100644 messages_agent.go create mode 100644 multi_file_diff_review.go create mode 100644 multi_file_diff_review_test.go create mode 100644 permission_prompt.go create mode 100644 permission_prompt_test.go create mode 100644 sandbox_status.go create mode 100644 sandbox_status_test.go create mode 100644 screenshot_stream.go create mode 100644 screenshot_stream_test.go create mode 100644 sub_agent_tree.go create mode 100644 sub_agent_tree_test.go create mode 100644 testdata/snapshots/darwin/agent_plan-dark.png create mode 100644 testdata/snapshots/darwin/agent_plan-light.png create mode 100644 testdata/snapshots/darwin/agent_progress-dark.png create mode 100644 testdata/snapshots/darwin/agent_progress-light.png create mode 100644 testdata/snapshots/darwin/agent_status-dark.png create mode 100644 testdata/snapshots/darwin/agent_status-light.png create mode 100644 testdata/snapshots/darwin/agent_step_list-dark.png create mode 100644 testdata/snapshots/darwin/agent_step_list-light.png create mode 100644 testdata/snapshots/darwin/artifact_panel-dark.png create mode 100644 testdata/snapshots/darwin/artifact_panel-light.png create mode 100644 testdata/snapshots/darwin/artifact_version_switcher-dark.png create mode 100644 testdata/snapshots/darwin/artifact_version_switcher-light.png create mode 100644 testdata/snapshots/darwin/checkpoint_list-dark.png create mode 100644 testdata/snapshots/darwin/checkpoint_list-light.png create mode 100644 testdata/snapshots/darwin/command_execution_card-dark.png create mode 100644 testdata/snapshots/darwin/command_execution_card-light.png create mode 100644 testdata/snapshots/darwin/file_change_card-dark.png create mode 100644 testdata/snapshots/darwin/file_change_card-light.png create mode 100644 testdata/snapshots/darwin/human_input_request-dark.png create mode 100644 testdata/snapshots/darwin/human_input_request-light.png create mode 100644 testdata/snapshots/darwin/mcp_server_list-dark.png create mode 100644 testdata/snapshots/darwin/mcp_server_list-light.png create mode 100644 testdata/snapshots/darwin/memory_panel-dark.png create mode 100644 testdata/snapshots/darwin/memory_panel-light.png create mode 100644 testdata/snapshots/darwin/multi_file_diff_review-dark.png create mode 100644 testdata/snapshots/darwin/multi_file_diff_review-light.png create mode 100644 testdata/snapshots/darwin/permission_prompt-dark.png create mode 100644 testdata/snapshots/darwin/permission_prompt-light.png create mode 100644 testdata/snapshots/darwin/sandbox_status-dark.png create mode 100644 testdata/snapshots/darwin/sandbox_status-light.png create mode 100644 testdata/snapshots/darwin/screenshot_stream-dark.png create mode 100644 testdata/snapshots/darwin/screenshot_stream-light.png create mode 100644 testdata/snapshots/darwin/sub_agent_tree-dark.png create mode 100644 testdata/snapshots/darwin/sub_agent_tree-light.png create mode 100644 testdata/snapshots/darwin/tool_approval_dialog-dark.png create mode 100644 testdata/snapshots/darwin/tool_approval_dialog-light.png create mode 100644 testdata/snapshots/darwin/tool_call_card-dark.png create mode 100644 testdata/snapshots/darwin/tool_call_card-light.png create mode 100644 testdata/snapshots/darwin/tool_call_group-dark.png create mode 100644 testdata/snapshots/darwin/tool_call_group-light.png create mode 100644 tool_approval_dialog.go create mode 100644 tool_approval_dialog_test.go create mode 100644 tool_call_card.go create mode 100644 tool_call_card_test.go create mode 100644 tool_call_group.go create mode 100644 tool_call_group_test.go diff --git a/agent_diff.go b/agent_diff.go new file mode 100644 index 0000000..c686101 --- /dev/null +++ b/agent_diff.go @@ -0,0 +1,127 @@ +package mujica + +import ( + "fmt" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// FileChange is a proposed edit; empty Old adds a file. +type FileChange struct { + Path string + Old, New string +} + +// FileDecision is a review state; zero is FilePending. +type FileDecision int + +const ( + FilePending FileDecision = iota + FileAccepted + FileRejected +) + +// agentDiffCache holds a change's line diff until its text changes. +type agentDiffCache struct { + old, new string + lines []internal.DiffLine + add, del int + firstEdit int + done bool +} + +func (dc *agentDiffCache) update(ch FileChange) { + if dc.done && dc.old == ch.Old && dc.new == ch.New { + return + } + dc.old, dc.new, dc.done = ch.Old, ch.New, true + dc.lines = internal.LineDiff(internal.SplitLines(ch.Old), internal.SplitLines(ch.New)) + dc.add, dc.del = internal.DiffStats(dc.lines) + dc.firstEdit = 0 + for i, l := range dc.lines { + if l.Op != internal.DiffEqual { + dc.firstEdit = i + break + } + } +} + +// agentDiffOf returns the cached diff of ch kept on holder. +func agentDiffOf(holder *ui.Element, ch FileChange) *agentDiffCache { + dc := ui.Local(holder, "mujica.agent.diff", func() *agentDiffCache { return &agentDiffCache{} }) + (*dc).update(ch) + return *dc +} + +// agentDiffStats shows signed added and removed counts. +func agentDiffStats(c *ui.Context, add, del int) { + k := Tokens(c) + size := FontSize(c, theme.CaptionSize+1) + ui.Row(c).Gap(Density(c).Unit() * 1.5).Shrink(0).Label(fmt.Sprintf(msg(c, "file_change_card.stats"), add, del)).Children(func() { + ui.Text(c, fmt.Sprintf("+%d", add)).TextColor(k.Success).FontSize(size).Font(theme.MonoFont) + ui.Text(c, fmt.Sprintf("−%d", del)).TextColor(k.Danger).FontSize(size).Font(theme.MonoFont) + }) +} + +// agentDiffRow draws one numbered, signed, tinted diff line. +func agentDiffRow(c *ui.Context, l internal.DiffLine) { + k := Tokens(c) + u := Density(c).Unit() + sign, bg, fg := " ", ui.Transparent, k.TextMuted + switch l.Op { + case internal.DiffInsert: + sign, bg, fg = "+", k.Success.Alpha(0.14), k.Success + case internal.DiffDelete: + sign, bg, fg = "−", k.Danger.Alpha(0.14), k.Danger + } + num := func(n int) string { + if n == 0 { + return "" + } + return fmt.Sprint(n) + } + ui.Row(c).Gap(u*2).Background(bg).Padding(0, u).Children(func() { + ui.Text(c, num(l.Old)).Width(36).TextAlign(ui.End).TextColor(k.TextMuted).Shrink(0) + ui.Text(c, num(l.New)).Width(36).TextAlign(ui.End).TextColor(k.TextMuted).Shrink(0) + ui.Text(c, sign).TextColor(fg).Width(10).Shrink(0) + text := l.Text + if text == "" { + text = " " + } + ui.Text(c, text).Grow(1).Shrink(1) + }) +} + +// agentDiffView shows lines[from:to] in a capped well, virtualized when long. +func agentDiffView(c *ui.Context, lines []internal.DiffLine, maxHeight float32) *ui.Element { + w := agentWellRows(c, len(lines), func(i int) { agentDiffRow(c, lines[i]) }, maxHeight) + return w.Padding(Density(c).Unit(), 0) +} + +// agentDecisionMark shows a decision by icon and word. +func agentDecisionMark(c *ui.Context, d FileDecision) { + ui.Row(c).Gap(Density(c).Unit()).AlignItems(ui.Center).Shrink(0).Children(func() { + agentCaption(c, agentDecisionIcon(c, d)) + }) +} + +// agentDecisionIcon draws a named decision icon, returning its word. +func agentDecisionIcon(c *ui.Context, d FileDecision) string { + k := Tokens(c) + tone, icon, word := k.TextMuted, "circle", msg(c, "file_change_card.pending") + switch d { + case FileAccepted: + tone, icon, word = k.Success, "circle-check", msg(c, "file_change_card.accepted") + case FileRejected: + tone, icon, word = k.Danger, "circle-x", msg(c, "file_change_card.rejected") + case FilePending: + default: + panic(fmt.Sprintf("mujica: unknown FileDecision %d", int(d))) + } + ui.Icon(c, icons.Must(icon)).Size(14, 14).TextColor(tone).Shrink(0).Label(word) + return word +} diff --git a/agent_parts.go b/agent_parts.go new file mode 100644 index 0000000..d2758a0 --- /dev/null +++ b/agent_parts.go @@ -0,0 +1,293 @@ +package mujica + +import ( + "bytes" + "encoding/json" + "fmt" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// AgentState is an agent or step state; zero is pending. +type AgentState int + +const ( + AgentPending AgentState = iota + AgentPlanning + AgentRunning + AgentWaiting + AgentDone + AgentFailed + AgentSkipped +) + +func (s AgentState) String() string { + switch s { + case AgentPending: + return "pending" + case AgentPlanning: + return "planning" + case AgentRunning: + return "running" + case AgentWaiting: + return "waiting" + case AgentDone: + return "done" + case AgentFailed: + return "failed" + case AgentSkipped: + return "skipped" + } + panic(fmt.Sprintf("mujica: unknown AgentState %d", int(s))) +} + +// agentTone returns the color and icon marking s. +func agentTone(k theme.Tokens, s AgentState) (ui.Color, *ui.SVG) { + switch s { + case AgentPlanning: + return k.Info, icons.Must("list") + case AgentRunning: + return k.AccentText, icons.Must("loader-circle") + case AgentWaiting: + return k.Warning, icons.Must("clock") + case AgentDone: + return k.Success, icons.Must("circle-check") + case AgentFailed: + return k.Danger, icons.Must("circle-x") + case AgentSkipped: + return k.TextMuted, icons.Must("ban") + } + return k.TextMuted, icons.Must("circle") +} + +// agentMark draws s; running spins unless still. +func agentMark(c *ui.Context, s AgentState, size float32, still bool) *ui.Element { + tone, icon := agentTone(Tokens(c), s) + if s == AgentRunning && !still { + return Spinner(c, SpinnerOptions{Size: size, Color: tone, Label: msg(c, "agent_status.running")}) + } + return ui.Icon(c, icon).Size(size, size).TextColor(tone).Shrink(0) +} + +// agentWord is the built-in word for s. +func agentWord(c *ui.Context, s AgentState) string { return msg(c, "agent_status."+s.String()) } + +// agentDuration formats d like "320 ms" or "4.2 s". +func agentDuration(d time.Duration) string { + if d < 0 { + panic(fmt.Sprintf("mujica: negative duration %v", d)) + } + switch { + case d < time.Second: + return fmt.Sprintf("%d ms", d.Milliseconds()) + case d < time.Minute: + return fmt.Sprintf("%.1f s", d.Seconds()) + case d < time.Hour: + return fmt.Sprintf("%d m %02d s", int(d.Minutes()), int(d.Seconds())%60) + } + return fmt.Sprintf("%d h %02d m", int(d.Hours()), int(d.Minutes())%60) +} + +// agentCard is the bordered surface every agent card sits on. +func agentCard(c *ui.Context) *ui.Element { + k := Tokens(c) + u := Density(c).Unit() + return ui.Column(c).Shrink(0).Padding(u*3).Gap(u*2).Radius(theme.CardRadius). + Background(k.Surface).Border(theme.BorderWidth, k.Border) +} + +// agentCaption is small muted text. +func agentCaption(c *ui.Context, s string) *ui.Element { + return ui.Text(c, s).FontSize(FontSize(c, theme.CaptionSize)).TextColor(Tokens(c).TextMuted) +} + +// agentWell styles a sunken monospace well. +func agentWell(c *ui.Context, l *ui.Element, maxHeight float32) *ui.Element { + k := Tokens(c) + u := Density(c).Unit() + return l.Shrink(1).MaxHeight(maxHeight).Padding(u*2, u*3).Radius(theme.ControlRadius). + Background(k.Background).Border(theme.BorderWidth, k.Border).Font(theme.MonoFont). + FontSize(FontSize(c, theme.CaptionSize+1)) +} + +// agentWellRows builds n rows in a well. +func agentWellRows(c *ui.Context, n int, row func(i int), maxHeight float32) *ui.Element { + return agentWell(c, agentRows(c, n, row), maxHeight) +} + +// agentRows builds n scrolling rows, virtualized when many. +func agentRows(c *ui.Context, n int, row func(i int)) *ui.Element { + if n > agentVirtualRows { + return ui.List(c, nil, n, row) + } + return ui.Scroll(c).Children(func() { + for i := range n { + row(i) + } + }) +} + +// agentVirtualRows is the row count above which wells virtualize. +const agentVirtualRows = 200 + +// agentCodeCache keeps lines and comment states per text. +type agentCodeCache struct { + language, text string + lines []string + open []bool +} + +func (cc *agentCodeCache) update(language, text string) { + if cc.lines != nil && cc.language == language && cc.text == text { + return + } + cc.language, cc.text = language, text + cc.lines = internal.SplitLines(text) + cc.open = make([]bool, len(cc.lines)) + block := false + for i, line := range cc.lines { + cc.open[i] = block + _, block = internal.Highlight(language, line, block) + } +} + +// agentPrettyJSON indents valid JSON; anything else comes back unchanged. +func agentPrettyJSON(s string) string { + var b bytes.Buffer + if json.Indent(&b, []byte(s), "", " ") != nil { + return s + } + return b.String() +} + +// agentTokenColor colors a highlight token from the theme. +func agentTokenColor(k theme.Tokens, kind internal.TokenKind) ui.Color { + switch kind { + case internal.TokKeyword: + return k.AccentText + case internal.TokString: + return k.Success + case internal.TokNumber, internal.TokType: + return k.Info + case internal.TokComment, internal.TokPunct: + return k.TextMuted + } + return k.Text +} + +// agentCodeLine builds one highlighted line of language. +func agentCodeLine(c *ui.Context, language, line string, inBlock bool) { + k := Tokens(c) + toks, _ := internal.Highlight(language, line, inBlock) + spans := make([]ui.Span, 0, len(toks)) + for _, t := range toks { + spans = append(spans, ui.Span{Text: t.Text, Color: agentTokenColor(k, t.Kind)}) + } + if len(spans) == 0 { + spans = append(spans, ui.Span{Text: " "}) + } + ui.RichText(c, spans...) +} + +// agentCode shows highlighted text in a capped well. +func agentCode(c *ui.Context, language, text string, maxHeight float32) *ui.Element { + holder := ui.Column(c).Shrink(1) + cc := ui.Local(holder, "mujica.agent.code", func() *agentCodeCache { return &agentCodeCache{} }) + (*cc).update(language, text) + lines, open := (*cc).lines, (*cc).open + row := func(i int) { agentCodeLine(c, language, lines[i], open[i]) } + holder.Children(func() { + agentWellRows(c, len(lines), row, maxHeight) + }) + return holder +} + +// agentAnsiColor maps a terminal color onto the theme. +func agentAnsiColor(k theme.Tokens, a internal.AnsiColor, fallback ui.Color) ui.Color { + switch a.Kind { + case internal.AnsiRGB: + return ui.RGB(a.R, a.G, a.B) + case internal.AnsiIndexed: + switch a.Index % 8 { + case 0: + return k.TextMuted + case 1: + return k.Danger + case 2: + return k.Success + case 3: + return k.Warning + case 4, 6: + return k.Info + case 5: + return k.AccentText + case 7: + return k.Text + } + } + return fallback +} + +// agentAnsiSpans turns parsed terminal spans into rich text spans. +func agentAnsiSpans(k theme.Tokens, in []internal.AnsiSpan) []ui.Span { + out := make([]ui.Span, 0, len(in)+1) + for _, s := range in { + fg := agentAnsiColor(k, s.Style.FG, k.Text) + bg := agentAnsiColor(k, s.Style.BG, ui.Transparent) + if s.Style.Inverse { + fg, bg = agentAnsiColor(k, s.Style.BG, k.Background), fg + } + if s.Style.Dim { + fg = fg.Alpha(0.7) + } + sp := ui.Span{Text: s.Text, Color: fg, Background: bg, Italic: s.Style.Italic, + Underline: s.Style.Underline, Strikethrough: s.Style.Strike} + if s.Style.Bold { + sp.Weight = 700 + } + out = append(out, sp) + } + if len(out) == 0 { + out = append(out, ui.Span{Text: " "}) + } + return out +} + +// agentBar is a thin progress bar named label. +func agentBar(c *ui.Context, frac float64, label string) *ui.Element { + if frac < 0 || frac > 1 || frac != frac { + panic(fmt.Sprintf("mujica: progress %v outside 0..1", frac)) + } + k := Tokens(c) + return ui.Box(c).FillWidth().Height(4).Shrink(0).Role(ui.RoleProgress).Label(label). + Draw(func(p *ui.Painter, r ui.Rect) { + p.Fill(r, k.Border, 2) + if frac > 0 { + p.Fill(ui.Rect{X: r.X, Y: r.Y, W: r.W * float32(frac), H: r.H}, k.AccentText, 2) + } + }) +} + +// agentToggle is a small text button reporting a click. +func agentToggle(c *ui.Context, label string, icon string, disabled bool) bool { + k := Tokens(c) + u := Density(c).Unit() + b := ui.ButtonBase(c).MinHeight(theme.MinHitSize).MinWidth(theme.MinHitSize).Padding(0, u*2).Gap(u). + Radius(theme.ControlRadius).Disabled(disabled).TextColor(k.AccentText) + internal.Ring(b, k.Focus, theme.ControlRadius) + if !disabled && b.Hovered() { + b.Background(k.SurfaceHover) + } + b.Children(func() { + if icon != "" { + ui.Icon(c, icons.Must(icon)).Size(14, 14) + } + ui.Text(c, label).FontSize(FontSize(c, theme.CaptionSize+1)).SingleLine() + }) + return !b.IsDisabled() && b.Clicked() +} diff --git a/agent_plan.go b/agent_plan.go new file mode 100644 index 0000000..2be4683 --- /dev/null +++ b/agent_plan.go @@ -0,0 +1,146 @@ +package mujica + +import ( + "fmt" + "log/slog" + "strings" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// PlanItem is a plan task: pending, running, done or skipped. +type PlanItem struct { + ID string + Text string + State AgentState +} + +// AgentPlanOptions configure an AgentPlan. +type AgentPlanOptions struct { + // Title heads the checklist; empty uses "Plan". + Title string + Disabled bool + Still bool +} + +type agentPlanState struct{ draft string } + +// AgentPlan is a live checklist with skip, restore and add. +func AgentPlan(c *ui.Context, items *[]PlanItem, opts AgentPlanOptions) ChoiceResult { + if items == nil { + panic("mujica: AgentPlan needs items") + } + seen := map[string]bool{} + done, counted := 0, 0 + for i, it := range *items { + if it.ID == "" || seen[it.ID] { + panic(fmt.Sprintf("mujica: AgentPlan item %d needs a unique ID", i)) + } + switch it.State { + case AgentPending, AgentRunning, AgentDone, AgentSkipped: + default: + panic(fmt.Sprintf("mujica: AgentPlan item %q has state %v", it.ID, it.State)) + } + seen[it.ID] = true + if it.State != AgentSkipped { + counted++ + } + done += agentB2I(it.State == AgentDone) + } + u := Density(c).Unit() + title := opts.Title + if title == "" { + title = msg(c, "agent_plan.title") + } + var r ChoiceResult + r.Element = agentCard(c).Disabled(opts.Disabled).Label(title) + st := ui.Local(r.Element, "mujica.plan", func() agentPlanState { return agentPlanState{} }) + locked := r.Element.IsDisabled() + r.Element.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + ui.Text(c, title).Font(theme.SerifFont).FontSize(FontSize(c, theme.H3Size)).FontWeight(600).Grow(1) + agentCaption(c, fmt.Sprintf(msg(c, "agent_plan.progress"), done, counted)) + }) + frac := 0.0 + if counted > 0 { + frac = float64(done) / float64(counted) + } + agentBar(c, frac, fmt.Sprintf(msg(c, "agent_plan.progress"), done, counted)) + list := *items + for i := range list { + ui.Row(c).Key(list[i].ID).Gap(u * 2).AlignItems(ui.Center).MinHeight(Density(c).ControlHeight()).Children(func() { + if agentPlanRow(c, &list[i], locked, opts.Still) { + r.changed = true + } + }) + } + if !locked && agentPlanAdd(c, &st.draft) { + *items = append(*items, PlanItem{ID: agentPlanID(seen), Text: strings.TrimSpace(st.draft)}) + st.draft = "" + r.changed = true + } + }) + if r.changed { + slog.Debug("mujica: agent_plan change", "items", len(*items)) + } + return r +} + +// agentPlanRow builds one item, reporting a user change. +func agentPlanRow(c *ui.Context, it *PlanItem, locked, still bool) bool { + k := Tokens(c) + checked := it.State == AgentDone + box := Checkbox(c, &checked, "", CheckboxOptions{Disabled: locked || it.State == AgentSkipped}).Label(it.Text) + changed := !locked && box.Changed() + if changed { + it.State = AgentPending + if checked { + it.State = AgentDone + } + } + t := ui.Text(c, it.Text).Grow(1).Shrink(1) + switch it.State { + case AgentSkipped: + t.Strikethrough().TextColor(k.TextMuted) + case AgentRunning: + agentMark(c, AgentRunning, 14, still) + agentCaption(c, msg(c, "agent_plan.doing")) + } + if it.State == AgentDone || locked { + return changed + } + label, icon, next := msg(c, "agent_plan.skip"), "ban", AgentSkipped + if it.State == AgentSkipped { + label, icon, next = msg(c, "agent_plan.restore"), "refresh-cw", AgentPending + } + if agentToggle(c, label, icon, false) { + it.State = next + changed = true + } + return changed +} + +// agentPlanAdd builds the new-item field and reports a non-empty submit. +func agentPlanAdd(c *ui.Context, draft *string) bool { + u := Density(c).Unit() + add := false + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + in := TextInput(c, draft, TextInputOptions{Placeholder: msg(c, "agent_plan.placeholder"), Label: msg(c, "agent_plan.placeholder")}) + in.Element.Grow(1) + blank := strings.TrimSpace(*draft) == "" + add = Button(c, msg(c, "agent_plan.add"), ButtonOptions{Variant: Secondary, Disabled: blank}).Clicked() + add = (add || in.Submitted()) && !blank + }) + return add +} + +// agentPlanID returns an ID no item uses yet. +func agentPlanID(seen map[string]bool) string { + for n := len(seen) + 1; ; n++ { + if id := fmt.Sprintf("item-%d", n); !seen[id] { + return id + } + } +} diff --git a/agent_plan_test.go b/agent_plan_test.go new file mode 100644 index 0000000..1353cc3 --- /dev/null +++ b/agent_plan_test.go @@ -0,0 +1,94 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func agentPlanSample() []PlanItem { + return []PlanItem{ + {ID: "a", Text: "Read the guest list", State: AgentDone}, + {ID: "b", Text: "Assign the seats", State: AgentRunning}, + {ID: "c", Text: "Order the flowers"}, + } +} + +func planTester(items *[]PlanItem, opts AgentPlanOptions, changes *int) *ui.Tester { + opts.Still = true + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if AgentPlan(c, items, opts).Changed() { + *changes++ + } + }, 560, 500) +} + +func TestAgentPlanProgressCheckSkipAdd(t *testing.T) { + items := agentPlanSample() + changes := 0 + tt := planTester(&items, AgentPlanOptions{}, &changes) + if !tt.HasText("1 / 3 done") || !tt.HasText("In progress") { + t.Fatalf("texts %q", tt.Texts()) + } + _ = tt.Click("Order the flowers") // the box is named by the item + if items[2].State != AgentDone || changes != 1 || !tt.HasText("2 / 3 done") { + t.Fatalf("check: %+v changes %d", items[2], changes) + } + skips, _ := tt.Find("Skip") + tt.ClickAt(skips.X+4, skips.Y+4) // the running item's Skip + if items[1].State != AgentSkipped || !tt.HasText("2 / 2 done") { + t.Fatalf("skip: %+v texts %q", items[1], tt.Texts()) + } + _ = tt.Click("Restore") + if items[1].State != AgentPending { + t.Fatalf("restore: %+v", items[1]) + } + _ = tt.Click("Add a step") + tt.Type(" ") + tt.Key(0, ui.KeyEnter) + if len(items) != 3 { + t.Fatal("blank item added") + } + tt.Type("Light the candles") + tt.Key(0, ui.KeyEnter) + if len(items) != 4 || items[3].Text != "Light the candles" || items[3].ID == "" || !tt.HasText("Light the candles") { + t.Fatalf("add: %+v", items) + } +} + +func TestAgentPlanLiveUpdateAndDisabled(t *testing.T) { + items := agentPlanSample() + changes := 0 + tt := planTester(&items, AgentPlanOptions{Disabled: true, Title: "Ball"}, &changes) + _ = tt.Click("Order the flowers") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeySpace) + if changes != 0 || items[2].State != AgentPending || tt.HasText("Add a step") || tt.HasText("Skip") { + t.Fatalf("disabled plan changed: %+v", items) + } + items[2].State = AgentDone // the agent checks it off + tt.Frame() + if !tt.HasText("2 / 3 done") || !tt.HasText("Ball") { + t.Fatalf("live update: %q", tt.Texts()) + } +} + +func TestAgentPlanRejectsBadState(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + items := []PlanItem{{ID: "a", Text: "x", State: AgentFailed}} + n := 0 + planTester(&items, AgentPlanOptions{}, &n) +} + +func TestAgentPlanSnapshot(t *testing.T) { + snapshot(t, "agent_plan", 520, 330, func(c *ui.Context) { + items := agentPlanSample() + items = append(items, PlanItem{ID: "d", Text: "Hire the quartet", State: AgentSkipped}) + ui.Column(c).Padding(16).Children(func() { AgentPlan(c, &items, AgentPlanOptions{Still: true}) }) + }) +} diff --git a/agent_progress.go b/agent_progress.go new file mode 100644 index 0000000..3fb6459 --- /dev/null +++ b/agent_progress.go @@ -0,0 +1,36 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" +) + +// AgentProgressOptions configure an AgentProgress. +type AgentProgressOptions struct { + // Label names the work; empty uses "Progress". + Label string + // Action is what the agent does now. + Action string + // Indeterminate shows work of unknown length; the value is ignored. + Indeterminate bool + Still bool +} + +// AgentProgress shows progress 0 to 1 and the current action. +func AgentProgress(c *ui.Context, value float64, opts AgentProgressOptions) *ui.Element { + label := opts.Label + if label == "" { + label = msg(c, "agent_progress.label") + } + u := Density(c).Unit() + col := ui.Column(c).FillWidth().Shrink(0).Gap(u * 1.5) + col.Children(func() { + Progress(c, value, ProgressOptions{Label: label, ShowValue: !opts.Indeterminate, Indeterminate: opts.Indeterminate}) + if opts.Action != "" { + ui.Row(c).Gap(u * 1.5).AlignItems(ui.Center).Role(ui.RoleStatus).Label(opts.Action).Children(func() { + agentMark(c, AgentRunning, 14, opts.Still) + agentCaption(c, opts.Action) + }) + } + }) + return col +} diff --git a/agent_progress_test.go b/agent_progress_test.go new file mode 100644 index 0000000..5103ede --- /dev/null +++ b/agent_progress_test.go @@ -0,0 +1,54 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestAgentProgressValueAndAction(t *testing.T) { + value, action := 0.25, "Reading ledger.md" + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + AgentProgress(c, value, AgentProgressOptions{Action: action, Still: true}) + }, 400, 200) + if !tt.HasText("25%") || !tt.HasText("Reading ledger.md") || !tt.HasText("Progress") { + t.Fatalf("texts %q", tt.Texts()) + } + value, action = 0.8, "Writing summary.md" + tt.Frame() + if !tt.HasText("80%") || !tt.HasText("Writing summary.md") || tt.HasText("Reading ledger.md") { + t.Fatalf("update: %q", tt.Texts()) + } +} + +func TestAgentProgressIndeterminate(t *testing.T) { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + AgentProgress(c, 0, AgentProgressOptions{Label: "Research", Indeterminate: true, Still: true}) + }, 400, 200) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + if tt.HasText("0%") || !tt.HasText("Research") { + t.Fatalf("texts %q", tt.Texts()) + } +} + +func TestAgentProgressRejectsOutOfRange(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + AgentProgress(c, 1.5, AgentProgressOptions{}) + }, 200, 100) +} + +func TestAgentProgressSnapshot(t *testing.T) { + snapshot(t, "agent_progress", 420, 110, func(c *ui.Context) { + ui.Column(c).Padding(16).Children(func() { + AgentProgress(c, 0.62, AgentProgressOptions{Label: "Preparing the ball", Action: "Writing the seating chart"}) + }) + }) +} diff --git a/agent_status.go b/agent_status.go new file mode 100644 index 0000000..4384112 --- /dev/null +++ b/agent_status.go @@ -0,0 +1,34 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// AgentStatusOptions configure an AgentStatus. +type AgentStatusOptions struct { + // Label replaces the built-in word, as "Writing the report". + Label string + // Still stops the running animation. + Still bool +} + +// AgentStatus shows a state by icon shape and word. +func AgentStatus(c *ui.Context, state AgentState, opts AgentStatusOptions) *ui.Element { + label := opts.Label + if label == "" { + label = agentWord(c, state) // panics on an unknown state + } + k := Tokens(c) + u := Density(c).Unit() + tone, _ := agentTone(k, state) + pill := ui.Row(c).Shrink(0).AlignSelf(ui.Start).AlignItems(ui.Center).Gap(u*1.5).Padding(u, u*2.5). + Radius(theme.CardRadius).Border(theme.BorderWidth, tone).Background(k.Surface). + Role(ui.RoleStatus).Label(label) + pill.Children(func() { + agentMark(c, state, 14, opts.Still) + ui.Text(c, label).FontSize(FontSize(c, theme.CaptionSize+1)).TextColor(k.Text).SingleLine() + }) + return pill +} diff --git a/agent_status_test.go b/agent_status_test.go new file mode 100644 index 0000000..a642c4c --- /dev/null +++ b/agent_status_test.go @@ -0,0 +1,69 @@ +package mujica + +import ( + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func TestAgentStatusWords(t *testing.T) { + states := []AgentState{AgentPlanning, AgentRunning, AgentWaiting, AgentDone, AgentFailed} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + for _, s := range states { + AgentStatus(c, s, AgentStatusOptions{Still: true}) + } + AgentStatus(c, AgentRunning, AgentStatusOptions{Label: "Writing the report", Still: true}) + }, 400, 400) + for _, w := range []string{"Planning", "Running", "Waiting", "Done", "Failed", "Writing the report"} { + if !tt.HasText(w) { + t.Fatalf("missing %q in %q", w, tt.Texts()) + } + } +} + +func TestAgentStatusAnimationStopsWhenStill(t *testing.T) { + still := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + AgentStatus(c, AgentRunning, AgentStatusOptions{Still: still}) + }, 300, 100) + tt.Frame() + moving := string(tt.Image().Pix) + time.Sleep(80 * time.Millisecond) + tt.Frame() + if moving == string(tt.Image().Pix) { + t.Fatal("running status did not animate") + } + still = true + tt.Frame() + a := string(tt.Image().Pix) + time.Sleep(80 * time.Millisecond) + tt.Frame() + if a != string(tt.Image().Pix) { + t.Fatal("still status kept moving") + } +} + +func TestAgentStatusRejectsUnknownState(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + AgentStatus(c, AgentState(42), AgentStatusOptions{}) + }, 200, 100) +} + +func TestAgentStatusSnapshot(t *testing.T) { + snapshot(t, "agent_status", 480, 120, func(c *ui.Context) { + ui.Row(c).Padding(16).Gap(8).Wrap().Children(func() { + for _, s := range []AgentState{AgentPlanning, AgentRunning, AgentWaiting, AgentDone, AgentFailed} { + AgentStatus(c, s, AgentStatusOptions{}) + } + }) + }) +} diff --git a/agent_step_list.go b/agent_step_list.go new file mode 100644 index 0000000..710dc56 --- /dev/null +++ b/agent_step_list.go @@ -0,0 +1,140 @@ +package mujica + +import ( + "fmt" + "log/slog" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// AgentStep is one step of an agent run. +type AgentStep struct { + ID string + Title string + Detail string + State AgentState + Duration time.Duration +} + +// AgentStepListOptions configure an AgentStepList. +type AgentStepListOptions struct { + Disabled bool + Still bool +} + +// AgentStepListResult reports this frame's events. +type AgentStepListResult struct { + Element *ui.Element + // Retry is the failed step to retry, else "". + Retry string + // Toggled is the step whose detail toggled, else "". + Toggled string +} + +// AgentStepList is a step timeline with details and retries. +func AgentStepList(c *ui.Context, steps []AgentStep, opts AgentStepListOptions) AgentStepListResult { + current := -1 + seen := make(map[string]bool, len(steps)) + for i, s := range steps { + if s.ID == "" || s.Title == "" || seen[s.ID] { + panic(fmt.Sprintf("mujica: AgentStepList step %d needs a unique ID and a Title", i)) + } + seen[s.ID] = true + if current < 0 && (s.State == AgentRunning || s.State == AgentWaiting || s.State == AgentPlanning) { + current = i + } + } + var r AgentStepListResult + r.Element = ui.Column(c).Shrink(0).FocusGroup(ui.Vertical).Disabled(opts.Disabled) + open := ui.Local(r.Element, "mujica.steps.open", func() map[string]bool { return map[string]bool{} }) + r.Element.Children(func() { + for i, s := range steps { + ui.Column(c).Key(s.ID).Children(func() { + if agentStepRow(c, s, i, len(steps), i == current, (*open)[s.ID], opts.Still, &r) { + (*open)[s.ID] = !(*open)[s.ID] + r.Toggled = s.ID + } + }) + } + }) + if r.Element.IsDisabled() { + r.Retry, r.Toggled = "", "" + } + for id := range *open { + if !seen[id] { + delete(*open, id) + } + } + if r.Retry != "" || r.Toggled != "" { + slog.Debug("mujica: agent_step_list event", "retry", r.Retry, "toggled", r.Toggled) + } + return r +} + +// agentStepRow builds one step, reporting a header click. +func agentStepRow(c *ui.Context, s AgentStep, i, n int, current, open, still bool, r *AgentStepListResult) bool { + k := Tokens(c) + d := Density(c) + u := d.Unit() + clicked := false + top := (d.ControlHeight() - 18) / 2 // centers the mark on the step header + ui.Row(c).Gap(u * 3).AlignItems(ui.Stretch).Children(func() { + // The rail joins the marks; it is drawn, not focusable. + ui.Column(c).Width(20).Shrink(0).AlignItems(ui.Center).Draw(func(p *ui.Painter, rc ui.Rect) { + x := internal.Snap(p, rc.X+rc.W/2) + if i > 0 { + p.Line(x, rc.Y, x, rc.Y+top-3, 1, k.ControlBorder) + } + if i < n-1 { + p.Line(x, rc.Y+top+21, x, rc.Y+rc.H, 1, k.ControlBorder) + } + }).Children(func() { + ui.Box(c).Height(top) + agentMark(c, s.State, 18, still) + }) + ui.Column(c).Grow(1).Shrink(1).Gap(u).Padding(0, 0, u*2, 0).Children(func() { + head := ui.ButtonBase(c).Justify(ui.Start).Gap(u*2).MinHeight(d.ControlHeight()).Padding(0, u*2). + Radius(theme.ControlRadius).Label(s.Title + ", " + agentWord(c, s.State)) + internal.Ring(head, k.Focus, theme.ControlRadius) + if current { + head.Background(k.Selection).Border(theme.BorderWidth, k.AccentText) + } else if head.Hovered() { + head.Background(k.SurfaceHover) + } + head.Children(func() { + ui.Text(c, s.Title).FontWeight(600).Grow(1).Shrink(1) + if current { + agentCaption(c, msg(c, "agent_step_list.current")) + } + agentCaption(c, agentWord(c, s.State)) + if s.State == AgentDone || s.State == AgentFailed { + agentCaption(c, agentDuration(s.Duration)) + } + if s.Detail != "" { + chev := "chevron-right" + if open { + chev = "chevron-down" + } + ui.Icon(c, icons.Must(chev)).Size(14, 14).TextColor(k.TextMuted) + } + }) + clicked = s.Detail != "" && !head.IsDisabled() && head.Clicked() + if open && s.Detail != "" { + ui.Text(c, s.Detail).TextColor(k.TextMuted).Selectable().Padding(0, u*2) + } + if s.State == AgentFailed { + ui.Row(c).Children(func() { + if agentToggle(c, msg(c, "agent_step_list.retry"), "refresh-cw", head.IsDisabled()) { + r.Retry = s.ID + } + }) + } + }) + }) + return clicked +} diff --git a/agent_step_list_test.go b/agent_step_list_test.go new file mode 100644 index 0000000..fa9d0b4 --- /dev/null +++ b/agent_step_list_test.go @@ -0,0 +1,87 @@ +package mujica + +import ( + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +var agentStepsSample = []AgentStep{ + {ID: "plan", Title: "Read the guest list", State: AgentDone, Duration: 800 * time.Millisecond, Detail: "42 guests, 3 late."}, + {ID: "seat", Title: "Assign the seats", State: AgentFailed, Duration: 2 * time.Second, Detail: "Table 4 is over capacity."}, + {ID: "send", Title: "Send the invitations", State: AgentRunning}, + {ID: "log", Title: "Record the ledger", State: AgentPending}, +} + +func stepTester(steps []AgentStep, opts AgentStepListOptions, got *[]AgentStepListResult) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := AgentStepList(c, steps, opts) + if r.Retry != "" || r.Toggled != "" { + *got = append(*got, r) + } + }, 600, 500) +} + +func TestAgentStepListCurrentDetailRetry(t *testing.T) { + var got []AgentStepListResult + tt := stepTester(agentStepsSample, AgentStepListOptions{Still: true}, &got) + if !tt.HasText("Current") || !tt.HasText("Running") || !tt.HasText("800 ms") { + t.Fatalf("texts %q", tt.Texts()) + } + if tt.HasText("Table 4 is over capacity.") { + t.Fatal("detail shown while closed") + } + _ = tt.Click("Assign the seats") + if len(got) != 1 || got[0].Toggled != "seat" || !tt.HasText("Table 4 is over capacity.") { + t.Fatalf("toggle: %+v", got) + } + _ = tt.Click("Retry") + if len(got) != 2 || got[1].Retry != "seat" { + t.Fatalf("retry: %+v", got) + } +} + +func TestAgentStepListKeyboard(t *testing.T) { + var got []AgentStepListResult + tt := stepTester(agentStepsSample, AgentStepListOptions{Still: true}, &got) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if len(got) != 1 || got[0].Toggled != "plan" || !tt.HasText("42 guests, 3 late.") { + t.Fatalf("Enter on the first step: %+v", got) + } + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyDown) // past Assign the seats onto its Retry + tt.Key(0, ui.KeyEnter) + if len(got) != 2 || got[1].Retry != "seat" { + t.Fatalf("arrows to Retry: %+v", got) + } +} + +func TestAgentStepListDisabled(t *testing.T) { + var got []AgentStepListResult + tt := stepTester(agentStepsSample, AgentStepListOptions{Disabled: true, Still: true}, &got) + _ = tt.Click("Assign the seats") + _ = tt.Click("Retry") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if len(got) != 0 { + t.Fatalf("disabled list reported %+v", got) + } +} + +func TestAgentStepListRejectsDuplicateIDs(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + stepTester([]AgentStep{{ID: "a", Title: "x"}, {ID: "a", Title: "y"}}, AgentStepListOptions{}, nil) +} + +func TestAgentStepListSnapshot(t *testing.T) { + snapshot(t, "agent_step_list", 520, 340, func(c *ui.Context) { + ui.Column(c).Padding(16).Children(func() { AgentStepList(c, agentStepsSample, AgentStepListOptions{Still: true}) }) + }) +} diff --git a/artifact_panel.go b/artifact_panel.go new file mode 100644 index 0000000..189333b --- /dev/null +++ b/artifact_panel.go @@ -0,0 +1,148 @@ +package mujica + +import ( + "fmt" + "log/slog" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// ArtifactKind is what an artifact holds; zero is code. +type ArtifactKind int + +const ( + ArtifactCode ArtifactKind = iota + ArtifactDocument + ArtifactWeb +) + +// Artifact is something an agent made; the caller owns it. +type Artifact struct { + Title string + Kind ArtifactKind + // Language highlights code, as "go" or "json". + Language string + Content string +} + +// ArtifactPanelOptions configure an ArtifactPanel. +type ArtifactPanelOptions struct { + // Preview renders documents and web pages; the caller supplies it. + Preview func() + // Height of the body; 320 DIPs when zero. + Height float32 + Disabled bool +} + +// ArtifactPanelResult reports this frame's events. +type ArtifactPanelResult struct { + Element *ui.Element + // Copied reports the content went to the clipboard. + Copied bool + // Exported asks the caller to export the artifact. + Exported bool +} + +type artifactPanelState struct { + source bool + copiedAt time.Time +} + +// ArtifactPanel shows an artifact, with copy and export. +func ArtifactPanel(c *ui.Context, art Artifact, opts ArtifactPanelOptions) ArtifactPanelResult { + if art.Title == "" { + panic("mujica: ArtifactPanel needs a Title") + } + if art.Kind < ArtifactCode || art.Kind > ArtifactWeb { + panic(fmt.Sprintf("mujica: unknown ArtifactKind %d", int(art.Kind))) + } + if art.Kind != ArtifactCode && opts.Preview == nil { + panic("mujica: ArtifactPanel needs a Preview for documents and web pages") + } + if opts.Height < 0 { + panic("mujica: ArtifactPanel Height is negative") + } + h := opts.Height + if h == 0 { + h = 320 + } + k := Tokens(c) + u := Density(c).Unit() + var r ArtifactPanelResult + r.Element = agentCard(c).Disabled(opts.Disabled).Label(art.Title) + st := ui.Local(r.Element, "mujica.artifact", func() artifactPanelState { return artifactPanelState{source: art.Kind == ArtifactCode} }) + locked := r.Element.IsDisabled() + r.Element.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + ui.Text(c, art.Title).Font(theme.SerifFont).FontSize(FontSize(c, theme.H3Size)).FontWeight(600).SingleLine().Grow(1).Shrink(1) + if opts.Preview != nil { + artifactViewSwitch(c, &st.source, locked) + } + copied := !st.copiedAt.IsZero() && c.Now().Sub(st.copiedAt) < 2*time.Second + label, icon := msg(c, "artifact_panel.copy"), "copy" + if copied { + label, icon = msg(c, "artifact_panel.copied"), "check" + c.After(2*time.Second - c.Now().Sub(st.copiedAt)) + } + if agentToggle(c, label, icon, locked) { + c.WriteClipboard(art.Content) + st.copiedAt, r.Copied = c.Now(), true + } + if agentToggle(c, msg(c, "artifact_panel.export"), "upload", locked) { + r.Exported = true + } + }) + ui.Column(c).Height(h).Shrink(0).Children(func() { + if st.source || opts.Preview == nil { + agentCode(c, art.Language, art.Content, h).Grow(1) + return + } + ui.Scroll(c).Grow(1).Padding(u*3).Radius(theme.ControlRadius).Background(k.Background). + Border(theme.BorderWidth, k.Border).Children(opts.Preview) + }) + }) + if r.Copied || r.Exported { + slog.Debug("mujica: artifact_panel event", "title", art.Title, "copied", r.Copied, "exported", r.Exported) + } + return r +} + +// artifactViewSwitch is the Preview / Source segmented switch. +func artifactViewSwitch(c *ui.Context, source *bool, locked bool) { + k := Tokens(c) + u := Density(c).Unit() + ui.Row(c).Shrink(0).FocusGroup(ui.Horizontal).Border(theme.BorderWidth, k.ControlBorder).Radius(theme.ControlRadius). + Role(ui.RoleRadioGroup).Children(func() { + for _, src := range []bool{false, true} { + label, icon := msg(c, "artifact_panel.preview"), "eye" + if src { + label, icon = msg(c, "artifact_panel.source"), "file-text" + } + b := ui.ButtonBase(c).MinHeight(theme.MinHitSize).Padding(0, u*2).Gap(u).Role(ui.RoleRadio).Label(label). + Disabled(locked) + internal.Ring(b, k.Focus, theme.ControlRadius) + on := *source == src + if on { + b.Background(k.Selection) + } else if b.Hovered() { + b.Background(k.SurfaceHover) + } + b.Children(func() { + if on { + ui.Icon(c, icons.Must("check")).Size(12, 12).TextColor(k.AccentText) + } + ui.Icon(c, icons.Must(icon)).Size(14, 14) + ui.Text(c, label).FontSize(FontSize(c, theme.CaptionSize+1)) + }) + if !b.IsDisabled() && b.Clicked() && !on { + *source = src + slog.Debug("mujica: artifact_panel view", "source", src) + } + } + }) +} diff --git a/artifact_panel_test.go b/artifact_panel_test.go new file mode 100644 index 0000000..a37f441 --- /dev/null +++ b/artifact_panel_test.go @@ -0,0 +1,79 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +var artifactCodeSample = Artifact{Title: "seating.go", Language: "go", Content: "package court\n\n// Seats maps guests to tables.\nfunc Seats() map[string]int {\n\treturn map[string]int{\"Sakiko\": 1}\n}\n"} + +func artifactTester(art Artifact, opts ArtifactPanelOptions, got *[]ArtifactPanelResult) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := ArtifactPanel(c, art, opts) + if r.Copied || r.Exported { + *got = append(*got, r) + } + }, 600, 460) +} + +func TestArtifactPanelCodeCopyExport(t *testing.T) { + var got []ArtifactPanelResult + tt := artifactTester(artifactCodeSample, ArtifactPanelOptions{}, &got) + if !tt.HasText("// Seats maps guests to tables.") || tt.HasText("Preview") { + t.Fatalf("texts %q", tt.Texts()) + } + _ = tt.Click("Copy") + if len(got) != 1 || !got[0].Copied || tt.Clipboard() != artifactCodeSample.Content || !tt.HasText("Copied") { + t.Fatalf("copy: %+v clipboard %q", got, tt.Clipboard()) + } + _ = tt.Click("Export") + if len(got) != 2 || !got[1].Exported { + t.Fatalf("export: %+v", got) + } +} + +func TestArtifactPanelPreviewSourceSwitch(t *testing.T) { + doc := Artifact{Title: "Invitation", Kind: ArtifactDocument, Content: "# You are invited\n"} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ArtifactPanel(c, doc, ArtifactPanelOptions{Preview: func() { ui.Text(c, "Rendered invitation") }}) + }, 600, 460) + if !tt.HasText("Rendered invitation") || tt.HasText("# You are invited") { + t.Fatalf("preview first: %q", tt.Texts()) + } + _ = tt.Click("Source") + if !tt.HasText("# You are invited") || tt.HasText("Rendered invitation") { + t.Fatalf("source: %q", tt.Texts()) + } + tt.Key(0, ui.KeyLeft) // the switch is a focus group + tt.Key(0, ui.KeyEnter) + if !tt.HasText("Rendered invitation") { + t.Fatal("keyboard back to preview failed") + } +} + +func TestArtifactPanelDisabledAndRules(t *testing.T) { + var got []ArtifactPanelResult + tt := artifactTester(artifactCodeSample, ArtifactPanelOptions{Disabled: true}, &got) + _ = tt.Click("Copy") + _ = tt.Click("Export") + if len(got) != 0 || tt.Clipboard() != "" { + t.Fatalf("disabled panel acted: %+v", got) + } + defer func() { + if recover() == nil { + t.Fatal("web artifact without Preview did not panic") + } + }() + artifactTester(Artifact{Title: "x", Kind: ArtifactWeb}, ArtifactPanelOptions{}, &got) +} + +func TestArtifactPanelSnapshot(t *testing.T) { + snapshot(t, "artifact_panel", 560, 300, func(c *ui.Context) { + ui.Column(c).Padding(16).Children(func() { + ArtifactPanel(c, artifactCodeSample, ArtifactPanelOptions{Height: 170, Preview: func() {}}) + }) + }) +} diff --git a/artifact_version_switcher.go b/artifact_version_switcher.go new file mode 100644 index 0000000..2913f14 --- /dev/null +++ b/artifact_version_switcher.go @@ -0,0 +1,89 @@ +package mujica + +import ( + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" +) + +// ArtifactVersion is one saved version of an artifact. +type ArtifactVersion struct { + Label string + Note string +} + +// ArtifactVersionSwitcherOptions configure an ArtifactVersionSwitcher. +type ArtifactVersionSwitcherOptions struct { + Disabled bool +} + +// ArtifactVersionResult reports this frame's events. +type ArtifactVersionResult struct { + Element *ui.Element + // Changed reports *current moved. + Changed bool + // Compare asks to diff current against the previous version. + Compare bool +} + +// ArtifactVersionSwitcher steps between artifact versions. +func ArtifactVersionSwitcher(c *ui.Context, current *int, versions []ArtifactVersion, opts ArtifactVersionSwitcherOptions) ArtifactVersionResult { + if current == nil || len(versions) == 0 || *current < 0 || *current >= len(versions) { + panic("mujica: ArtifactVersionSwitcher needs versions and a current index inside them") + } + for i, v := range versions { + if v.Label == "" { + panic(fmt.Sprintf("mujica: ArtifactVersionSwitcher version %d needs a Label", i)) + } + } + u := Density(c).Unit() + n := len(versions) + var r ArtifactVersionResult + r.Element = ui.Row(c).Shrink(0).Gap(u * 2).AlignItems(ui.Center).Disabled(opts.Disabled). + Label(msg(c, "artifact_version_switcher.label")) + locked := r.Element.IsDisabled() + move := func(d int) { + if to := *current + d; !locked && to >= 0 && to < n { + *current, r.Changed = to, true + } + } + r.Element.Children(func() { + if iconAction(c, icons.Must("chevron-left"), msg(c, "artifact_version_switcher.older")).Disabled(locked || *current == 0).Clicked() { + move(-1) + } + v := versions[*current] + ui.Column(c).Shrink(1).Role(ui.RoleStatus).Label(v.Label).Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + ui.Text(c, v.Label).FontWeight(600).SingleLine() + agentCaption(c, fmt.Sprintf(msg(c, "artifact_version_switcher.count"), *current+1, n)) + }) + if v.Note != "" { + agentCaption(c, v.Note).SingleLine() + } + }) + if iconAction(c, icons.Must("chevron-right"), msg(c, "artifact_version_switcher.newer")).Disabled(locked || *current == n-1).Clicked() { + move(1) + } + if *current > 0 { + label := fmt.Sprintf(msg(c, "artifact_version_switcher.compare"), versions[*current-1].Label) + if agentToggle(c, label, "arrow-up-down", locked) { + r.Compare = true + } + } + }) + if !locked { + if r.Element.Shortcut(0, ui.KeyLeft) { + move(-1) + } + if r.Element.Shortcut(0, ui.KeyRight) { + move(1) + } + } + if r.Changed || r.Compare { + slog.Debug("mujica: artifact_version_switcher event", "current", *current, "compare", r.Compare) + } + return r +} diff --git a/artifact_version_switcher_test.go b/artifact_version_switcher_test.go new file mode 100644 index 0000000..f910887 --- /dev/null +++ b/artifact_version_switcher_test.go @@ -0,0 +1,77 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +var artifactVersionsSample = []ArtifactVersion{ + {Label: "v1", Note: "First draft"}, + {Label: "v2", Note: "Added the quartet"}, + {Label: "v3", Note: "Moved the wine table"}, +} + +func versionTester(cur *int, opts ArtifactVersionSwitcherOptions, got *[]ArtifactVersionResult) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := ArtifactVersionSwitcher(c, cur, artifactVersionsSample, opts) + if r.Changed || r.Compare { + *got = append(*got, r) + } + }, 600, 120) +} + +func TestArtifactVersionSwitcherStepsAndCompare(t *testing.T) { + cur := 2 + var got []ArtifactVersionResult + tt := versionTester(&cur, ArtifactVersionSwitcherOptions{}, &got) + if !tt.HasText("3 of 3") || !tt.HasText("Moved the wine table") || !tt.HasText("Compare with v2") { + t.Fatalf("texts %q", tt.Texts()) + } + _ = tt.Click("Compare with v2") + if len(got) != 1 || !got[0].Compare || cur != 2 { + t.Fatalf("compare: %+v", got) + } + _ = tt.Click("Older version") + _ = tt.Click("Older version") + if cur != 0 || tt.HasText("Compare with v1") || !tt.HasText("First draft") { + t.Fatalf("older: cur %d texts %q", cur, tt.Texts()) + } + _ = tt.Click("Older version") // disabled at the first version + if cur != 0 || len(got) != 3 { + t.Fatalf("past the first: cur %d events %d", cur, len(got)) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyRight) + if cur != 1 { + t.Fatalf("Right: cur %d", cur) + } +} + +func TestArtifactVersionSwitcherDisabledAndRange(t *testing.T) { + cur := 1 + var got []ArtifactVersionResult + tt := versionTester(&cur, ArtifactVersionSwitcherOptions{Disabled: true}, &got) + _ = tt.Click("Older version") + _ = tt.Click("Compare with v1") + if cur != 1 || len(got) != 0 { + t.Fatalf("disabled moved: cur %d %+v", cur, got) + } + defer func() { + if recover() == nil { + t.Fatal("out-of-range current did not panic") + } + }() + cur = 5 + versionTester(&cur, ArtifactVersionSwitcherOptions{}, &got) +} + +func TestArtifactVersionSwitcherSnapshot(t *testing.T) { + snapshot(t, "artifact_version_switcher", 560, 90, func(c *ui.Context) { + cur := 1 + ui.Column(c).Padding(16).Children(func() { + ArtifactVersionSwitcher(c, &cur, artifactVersionsSample, ArtifactVersionSwitcherOptions{}) + }) + }) +} diff --git a/checkpoint_list.go b/checkpoint_list.go new file mode 100644 index 0000000..ff721e8 --- /dev/null +++ b/checkpoint_list.go @@ -0,0 +1,119 @@ +package mujica + +import ( + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/internal" + "mujicaui/theme" +) + +// Checkpoint is a saved point to roll back to. +type Checkpoint struct { + ID string + Label string + Note string +} + +// CheckpointListOptions configure a CheckpointList. +type CheckpointListOptions struct { + // MaxHeight caps the scrolling list; zero means 360. + MaxHeight float32 + Disabled bool +} + +type checkpointListState struct { + asking bool + target string +} + +// CheckpointList marks the current point and confirms rollbacks. +func CheckpointList(c *ui.Context, current *string, points []Checkpoint, opts CheckpointListOptions) ChoiceResult { + if current == nil { + panic("mujica: CheckpointList needs current") + } + if opts.MaxHeight < 0 { + panic("mujica: CheckpointList MaxHeight is negative") + } + seen := map[string]bool{} + for i, p := range points { + if p.ID == "" || p.Label == "" || seen[p.ID] { + panic(fmt.Sprintf("mujica: CheckpointList point %d needs a unique ID and a Label", i)) + } + seen[p.ID] = true + } + maxH := opts.MaxHeight + if maxH == 0 { + maxH = 360 + } + k := Tokens(c) + var r ChoiceResult + r.Element = ui.Column(c).Shrink(0).Disabled(opts.Disabled).Label(msg(c, "checkpoint_list.label")) + st := ui.Local(r.Element, "mujica.checkpoints", func() checkpointListState { return checkpointListState{} }) + locked := r.Element.IsDisabled() + if locked { + st.asking = false // a disabled list closes its confirmation + } + r.Element.Children(func() { + if len(points) == 0 { + agentCaption(c, msg(c, "checkpoint_list.empty")) + return + } + agentRows(c, len(points), func(i int) { + if checkpointRow(c, points[i], points[i].ID == *current, locked) { + st.asking, st.target = true, points[i].ID + } + }).Shrink(1).MaxHeight(maxH).Background(k.Surface).Border(theme.BorderWidth, k.Border). + Radius(theme.CardRadius).Dividers(theme.BorderWidth, k.Border) + label := st.target + for _, p := range points { + if p.ID == st.target { + label = p.Label + } + } + res := AlertDialog(c, &st.asking, AlertDialogOptions{Title: fmt.Sprintf(msg(c, "checkpoint_list.confirm"), label), + Description: msg(c, "checkpoint_list.warning"), ConfirmLabel: msg(c, "checkpoint_list.rollback")}) + if res.Confirmed && !locked && seen[st.target] { + *current, r.changed = st.target, true + slog.Debug("mujica: checkpoint_list rollback", "to", st.target) + } + }) + return r +} + +// checkpointRow shows one checkpoint and reports a rollback request. +func checkpointRow(c *ui.Context, p Checkpoint, current, locked bool) bool { + k := Tokens(c) + d := Density(c) + u := d.Unit() + asked := false + row := ui.Row(c).Key(p.ID).Gap(u*3).AlignItems(ui.Center).MinHeight(d.ControlHeight()+u*2).Padding(u*2, u*3) + if current { + row.Background(k.Selection) + } + row.Children(func() { + ui.Box(c).Size(14, 14).Shrink(0).Draw(func(pt *ui.Painter, r ui.Rect) { + cx, cy := internal.Snap(pt, r.X+r.W/2), internal.Snap(pt, r.Y+r.H/2) + if current { + pt.FillPath(internal.Diamond(cx, cy, 12), k.AccentText) + return + } + pt.StrokePath(internal.Diamond(cx, cy, 10), 1.5, k.ControlBorder) + }) + ui.Column(c).Grow(1).Shrink(1).Gap(u / 2).Children(func() { + ui.Text(c, p.Label).FontWeight(600).SingleLine() + if p.Note != "" { + agentCaption(c, p.Note) + } + }) + if current { + agentCaption(c, msg(c, "checkpoint_list.current")) + return + } + asked = agentToggle(c, msg(c, "checkpoint_list.rollback"), "refresh-cw", locked) + }) + row.Label(p.Label) + return asked +} diff --git a/checkpoint_list_test.go b/checkpoint_list_test.go new file mode 100644 index 0000000..f37f863 --- /dev/null +++ b/checkpoint_list_test.go @@ -0,0 +1,77 @@ +package mujica + +import ( + "fmt" + "testing" + + "github.com/egoist/mygo/ui" +) + +var checkpointsSample = []Checkpoint{ + {ID: "c3", Label: "Seats assigned", Note: "12 files changed"}, + {ID: "c2", Label: "Menu drafted", Note: "3 files changed"}, + {ID: "c1", Label: "Start"}, +} + +func checkpointTester(cur *string, points []Checkpoint, opts CheckpointListOptions, changes *int) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if CheckpointList(c, cur, points, opts).Changed() { + *changes++ + } + }, 560, 420) +} + +func TestCheckpointListRollbackConfirm(t *testing.T) { + cur, changes := "c3", 0 + tt := checkpointTester(&cur, checkpointsSample, CheckpointListOptions{}, &changes) + if !tt.HasText("Current") || !tt.HasText("12 files changed") { + t.Fatalf("texts %q", tt.Texts()) + } + rolls, _ := tt.Find("Roll back") + tt.ClickAt(rolls.X+4, rolls.Y+4) // Menu drafted + if !tt.HasText("Roll back to “Menu drafted”?") || !tt.Focused("Cancel") { + t.Fatalf("confirm: %q", tt.Texts()) + } + tt.Key(0, ui.KeyEnter) // Enter on Cancel cancels + if cur != "c3" || changes != 0 { + t.Fatalf("Enter rolled back: %s", cur) + } + tt.ClickAt(rolls.X+4, rolls.Y+4) + _ = tt.Click("Roll back to “Menu drafted”?") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if cur != "c2" || changes != 1 { + t.Fatalf("rollback: cur %s changes %d", cur, changes) + } +} + +func TestCheckpointListDisabledEmptyAndMany(t *testing.T) { + cur, n := "c3", 0 + tt := checkpointTester(&cur, checkpointsSample, CheckpointListOptions{Disabled: true}, &n) + _ = tt.Click("Roll back") + if tt.HasText("Roll back to “Menu drafted”?") || cur != "c3" { + t.Fatal("disabled list asked") + } + tt = checkpointTester(&cur, nil, CheckpointListOptions{}, &n) + if !tt.HasText("No checkpoints yet") { + t.Fatalf("empty: %q", tt.Texts()) + } + many := make([]Checkpoint, 100000) + for i := range many { + many[i] = Checkpoint{ID: fmt.Sprint(i), Label: fmt.Sprintf("point %d", i)} + } + tt = checkpointTester(&cur, many, CheckpointListOptions{}, &n) + if got := len(tt.Texts()); got > 300 { + t.Fatalf("%d texts built for 100000 checkpoints", got) + } +} + +func TestCheckpointListSnapshot(t *testing.T) { + snapshot(t, "checkpoint_list", 520, 240, func(c *ui.Context) { + cur := "c2" + ui.Column(c).Padding(16).Children(func() { + CheckpointList(c, &cur, checkpointsSample, CheckpointListOptions{}) + }) + }) +} diff --git a/command_execution_card.go b/command_execution_card.go new file mode 100644 index 0000000..347f707 --- /dev/null +++ b/command_execution_card.go @@ -0,0 +1,128 @@ +package mujica + +import ( + "fmt" + "log/slog" + "strings" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// CommandRun is a command run; the caller appends Output. +type CommandRun struct { + Command string + Dir string + // Output is the raw terminal output; ANSI colors are kept. + Output string + Running bool + ExitCode int + Duration time.Duration +} + +// CommandExecutionCardOptions configure a CommandExecutionCard. +type CommandExecutionCardOptions struct { + // Height of the output well; 240 DIPs when zero. + Height float32 + Disabled bool + Still bool +} + +// commandOutput keeps parsed lines; appends parse only new lines. +type commandOutput struct { + src string + lines [][]internal.AnsiSpan + style internal.AnsiStyle + list ui.ListState +} + +func (o *commandOutput) update(out string) { + if out == o.src { + return + } + if !strings.HasPrefix(out, o.src) || o.src != "" && !strings.HasSuffix(o.src, "\n") { + o.lines, o.style = nil, internal.AnsiStyle{} + o.src = "" + } + for _, line := range internal.SplitLines(out[len(o.src):]) { + var spans []internal.AnsiSpan + spans, o.style = internal.ParseAnsi(line, o.style) + o.lines = append(o.lines, spans) + } + o.src = out +} + +// CommandExecutionCard shows a command run; Changed requests an abort. +func CommandExecutionCard(c *ui.Context, run CommandRun, opts CommandExecutionCardOptions) ChoiceResult { + if run.Command == "" { + panic("mujica: CommandExecutionCard needs a Command") + } + if opts.Height < 0 { + panic("mujica: CommandExecutionCard Height is negative") + } + h := opts.Height + if h == 0 { + h = 240 + } + k := Tokens(c) + u := Density(c).Unit() + var r ChoiceResult + r.Element = agentCard(c).Disabled(opts.Disabled).Label(run.Command) + out := ui.Local(r.Element, "mujica.cmd.output", func() *commandOutput { return &commandOutput{} }) + o := *out + o.list.FollowEnd = true + o.update(run.Output) + r.Element.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).MinHeight(theme.MinHitSize).Children(func() { + ui.Text(c, "$").Font(theme.MonoFont).TextColor(k.TextMuted).Shrink(0) + ui.Text(c, run.Command).Font(theme.MonoFont).FontWeight(600).Grow(1).Shrink(1).Selectable() + if run.Running { + agentMark(c, AgentRunning, 16, opts.Still) + agentCaption(c, msg(c, "agent_status.running")) + locked := r.Element.IsDisabled() + if Button(c, msg(c, "command_execution_card.abort"), ButtonOptions{Variant: Outline, Disabled: locked}).Clicked() && !locked { + r.changed = true + } + return + } + commandExit(c, run.ExitCode) + agentCaption(c, agentDuration(run.Duration)) + }) + if run.Dir != "" { + ui.Row(c).Gap(u * 1.5).AlignItems(ui.Center).Children(func() { + ui.Icon(c, icons.Must("folder")).Size(14, 14).TextColor(k.TextMuted) + agentCaption(c, run.Dir).Font(theme.MonoFont) + }) + } + well := ui.List(c, &o.list, len(o.lines), func(i int) { + ui.RichText(c, agentAnsiSpans(k, o.lines[i])...) + }) + agentWell(c, well, h).Height(h).Label(msg(c, "command_execution_card.output")).Children(func() { + if len(o.lines) == 0 { + agentCaption(c, msg(c, "command_execution_card.no_output")) + } + }) + }) + if r.changed { + slog.Debug("mujica: command_execution_card abort", "command", run.Command) + } + return r +} + +// commandExit shows the exit code by icon and word. +func commandExit(c *ui.Context, code int) { + k := Tokens(c) + tone, icon := k.Success, "circle-check" + if code != 0 { + tone, icon = k.Danger, "circle-x" + } + ui.Row(c).Gap(Density(c).Unit()).AlignItems(ui.Center).Shrink(0).Children(func() { + ui.Icon(c, icons.Must(icon)).Size(14, 14).TextColor(tone) + ui.Text(c, fmt.Sprintf(msg(c, "command_execution_card.exit"), code)).TextColor(tone). + FontSize(FontSize(c, theme.CaptionSize+1)).SingleLine() + }) +} diff --git a/command_execution_card_test.go b/command_execution_card_test.go new file mode 100644 index 0000000..82b0da5 --- /dev/null +++ b/command_execution_card_test.go @@ -0,0 +1,98 @@ +package mujica + +import ( + "fmt" + "strings" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func cmdTester(run *CommandRun, opts CommandExecutionCardOptions, aborts *int) *ui.Tester { + opts.Still = true + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if CommandExecutionCard(c, *run, opts).Changed() { + *aborts++ + } + }, 600, 420) +} + +func TestCommandExecutionCardRunningAbortAndFinish(t *testing.T) { + run := CommandRun{Command: "go test ./...", Dir: "~/court", Running: true, Output: "\x1b[32mok\x1b[0m court\n"} + aborts := 0 + tt := cmdTester(&run, CommandExecutionCardOptions{}, &aborts) + for _, s := range []string{"go test ./...", "~/court", "ok", " court", "Running"} { + if !tt.HasText(s) { + t.Fatalf("missing %q in %q", s, tt.Texts()) + } + } + if tt.HasText("\x1b[32mok") { + t.Fatal("escape codes shown as text") + } + _ = tt.Click("Abort") + if aborts != 1 { + t.Fatalf("aborts %d", aborts) + } + run.Output += "FAIL ledger\n" + run.Running, run.ExitCode, run.Duration = false, 1, 3200*time.Millisecond + tt.Frame() + if !tt.HasText("FAIL ledger") || !tt.HasText("Exit 1") || !tt.HasText("3.2 s") || tt.HasText("Abort") { + t.Fatalf("finished: %q", tt.Texts()) + } +} + +func TestCommandExecutionCardAnsiAcrossLinesAndReset(t *testing.T) { + var o commandOutput + o.update("\x1b[31mred\nstill red\x1b[0m plain\n") + if len(o.lines) != 2 || o.lines[1][0].Style.FG.Index != 1 || o.lines[1][1].Style.FG.Index != 0 { + t.Fatalf("lines %+v", o.lines) + } + o.update("\x1b[31mred\nstill red\x1b[0m plain\nnext\n") + if len(o.lines) != 3 || o.lines[2][0].Text != "next" { + t.Fatalf("append: %+v", o.lines) + } + o.update("fresh\n") + if len(o.lines) != 1 || o.lines[0][0].Text != "fresh" { + t.Fatalf("replace: %+v", o.lines) + } +} + +func TestCommandExecutionCardDisabledAndEmpty(t *testing.T) { + run := CommandRun{Command: "sleep 10", Running: true} + aborts := 0 + tt := cmdTester(&run, CommandExecutionCardOptions{Disabled: true}, &aborts) + _ = tt.Click("Abort") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if aborts != 0 || !tt.HasText("No output") { + t.Fatalf("aborts %d texts %q", aborts, tt.Texts()) + } +} + +func TestCommandExecutionCardLargeOutputVirtualized(t *testing.T) { + var b strings.Builder + for i := range 100000 { + fmt.Fprintf(&b, "\x1b[2mline %d\x1b[0m\n", i) + } + run := CommandRun{Command: "yes", Output: b.String()} + n := 0 + tt := cmdTester(&run, CommandExecutionCardOptions{}, &n) + if got := len(tt.Texts()); got > 200 { + t.Fatalf("%d texts built for 100000 lines", got) + } + if !tt.HasText("line 99999") { + t.Fatal("output does not follow its end") + } +} + +func TestCommandExecutionCardSnapshot(t *testing.T) { + snapshot(t, "command_execution_card", 560, 300, func(c *ui.Context) { + run := CommandRun{Command: "go test ./court/...", Dir: "~/projects/court", ExitCode: 1, Duration: 4200 * time.Millisecond, + Output: "\x1b[32mok\x1b[0m court/guests 0.21s\n\x1b[1;31mFAIL\x1b[0m court/ledger 0.08s\n ledger_test.go:14: want 42 guests, got 40\n\x1b[33mwarning:\x1b[0m 1 test skipped\n"} + ui.Column(c).Padding(16).Children(func() { + CommandExecutionCard(c, run, CommandExecutionCardOptions{Height: 140}) + }) + }) +} diff --git a/docs/components/261-tool-call-card.md b/docs/components/261-tool-call-card.md new file mode 100644 index 0000000..71f100f --- /dev/null +++ b/docs/components/261-tool-call-card.md @@ -0,0 +1,47 @@ +# 261 ToolCallCard 工具调用卡片 + +## 用途 + +显示一次工具调用:工具名、状态、耗时,参数与结果可折叠,JSON 自动格式化并高亮。 + +## 最小示例 + +```go +call := mujica.ToolCall{ID: "1", Name: "read_file", Args: "{\"path\":\"ledger.md\"}", + Result: "{\"lines\":40}", State: mujica.AgentDone, Duration: 420 * time.Millisecond} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ToolCallCard(c, call, mujica.ToolCallCardOptions{OpenArgs: true}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ToolCallCard(c *ui.Context, call ToolCall, opts ToolCallCardOptions) ChoiceResult`。`call.Name` 为空时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `OpenArgs` | `bool` | `false` | 参数区初始展开。 | +| `OpenResult` | `bool` | `false` | 结果区初始展开。 | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- `ToolCall` 字段:`ID`、`Name`、`Args`(JSON 或纯文本)、`Result`、`Error`(非空时替代结果并以错误色显示)、`State`、`Duration`。 +- `AgentState`:`AgentPending`、`AgentPlanning`、`AgentRunning`、`AgentWaiting`、`AgentDone`、`AgentFailed`、`AgentSkipped`,越界 panic。状态同时由图标形状和文字表达,不只靠颜色。 +- 仅完成或失败时显示耗时;合法 JSON 以两格缩进格式化,非 JSON 原样显示。 +- 结果超过 200 行时虚拟化,只构建可见行。 + +## 事件 + +- `Changed()`:用户展开或折叠参数、结果。 + +## 键盘操作 + +- Tab 到“参数”“结果”折叠按钮,Enter / Space 展开或折叠。 + +## 限制 + +- 展开状态保存在卡片元素上;在列表中请用稳定 `Key` 包裹每张卡片。 +- 高亮只区分关键字、字符串、数字和标点,不做 JSON 结构校验提示。 diff --git a/docs/components/262-tool-call-group.md b/docs/components/262-tool-call-group.md new file mode 100644 index 0000000..76f405a --- /dev/null +++ b/docs/components/262-tool-call-group.md @@ -0,0 +1,47 @@ +# 262 ToolCallGroup 工具调用组 + +## 用途 + +把连续的工具调用折叠成一组,标题行显示调用次数、总耗时与失败数。 + +## 最小示例 + +```go +open := false +calls := []mujica.ToolCall{ + {ID: "a", Name: "list_dir", State: mujica.AgentDone, Duration: 300 * time.Millisecond}, + {ID: "b", Name: "read_file", State: mujica.AgentFailed, Error: "not found"}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ToolCallGroup(c, &open, calls, mujica.ToolCallGroupOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ToolCallGroup(c *ui.Context, open *bool, calls []ToolCall, opts ToolCallGroupOptions) ChoiceResult`。`open` 为 nil、调用 `ID` 为空或重复时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Title` | `string` | “N 次工具调用” | 替换内置标题。 | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- 组的状态:有调用执行中为执行中,否则有失败为失败,否则为完成。 +- 失败数以文字“N 次失败”显示。 +- 展开后每次调用用 ToolCallCard 显示。 + +## 事件 + +- `Changed()`:用户展开或折叠该组。 + +## 键盘操作 + +- Tab 到组标题,Enter / Space 展开或折叠;组内卡片各自可折叠。 + +## 限制 + +- 总耗时是各调用耗时之和,不扣除并行重叠。 diff --git a/docs/components/263-tool-approval-dialog.md b/docs/components/263-tool-approval-dialog.md new file mode 100644 index 0000000..20932bf --- /dev/null +++ b/docs/components/263-tool-approval-dialog.md @@ -0,0 +1,51 @@ +# 263 ToolApprovalDialog 工具审批对话框 + +## 用途 + +工具执行前请求批准:显示工具名、执行理由和参数预览,允许或拒绝。遵循 Dialog 与 AlertDialog 规则。 + +## 最小示例 + +```go +open := true +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ToolApprovalDialog(c, &open, mujica.ToolApprovalOptions{ + Tool: "delete_files", Args: "{\"glob\":\"*.tmp\"}", Reason: "Clean the build folder.", + }) + if r.Allowed { + fmt.Println("run the tool") + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ToolApprovalDialog(c *ui.Context, open *bool, opts ToolApprovalOptions) ToolApprovalResult`。`Tool` 为空时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Tool` | `string` | 必填 | 工具名。 | +| `Args` | `string` | `""` | 参数,合法 JSON 会格式化高亮。 | +| `Reason` | `string` | `""` | Agent 给出的理由,作为对话框说明。 | + +## 状态 + +- 打开时焦点在“拒绝”;点击遮罩不做任何事。 +- 参数过长时在预览区内滚动,按钮始终可见。 + +## 事件 + +- `Allowed`:点击允许,或焦点在允许上按 Enter / Space。 +- `Denied`:点击拒绝、焦点在拒绝上按 Enter、或按 Escape。 +- `Element`:对话框面板,关闭时为 nil。 + +## 键盘操作 + +- 打开时焦点在拒绝,Enter 只触发聚焦按钮,必须 Tab 到“允许”才能批准。 +- Escape 等同拒绝;Tab 在对话框内循环;关闭后焦点回到打开者。 + +## 限制 + +- 输入法组合期间按 Escape 仍会拒绝(MyGo 不公开组合状态,`ui/editor.go:73`)。 diff --git a/docs/components/264-permission-prompt.md b/docs/components/264-permission-prompt.md new file mode 100644 index 0000000..c3b4e9e --- /dev/null +++ b/docs/components/264-permission-prompt.md @@ -0,0 +1,48 @@ +# 264 PermissionPrompt 权限请求 + +## 用途 + +请求权限:允许一次、始终允许或拒绝,并说明“始终允许”覆盖的范围。 + +## 最小示例 + +```go +open := true +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.PermissionPrompt(c, &open, mujica.PermissionPromptOptions{ + Title: "Write to the ledger?", Scope: "Write access to ~/court/ledger", + }) + if r.Choice == mujica.PermissionAllowAlways { + fmt.Println("remember the grant") + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func PermissionPrompt(c *ui.Context, open *bool, opts PermissionPromptOptions) PermissionResult`。`Title` 或 `Scope` 为空时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Title` | `string` | 必填 | 问题。 | +| `Description` | `string` | `""` | 补充说明。 | +| `Scope` | `string` | 必填 | “始终允许”覆盖的范围。 | + +## 状态 + +- 范围说明放在带锁形图标的框内。 +- 打开时焦点在“拒绝”,点击遮罩无效。 + +## 事件 + +- `Choice`:本帧的选择,`PermissionAllowOnce`、`PermissionAllowAlways`、`PermissionDeny`;无选择为 `PermissionNone`。Escape 记为拒绝。 + +## 键盘操作 + +- 打开时焦点在拒绝;Tab 依次到“始终允许”“允许一次”;Enter 触发聚焦按钮;Escape 拒绝。 + +## 限制 + +- 组件不保存授权,记住“始终允许”由调用方负责。 diff --git a/docs/components/265-agent-step-list.md b/docs/components/265-agent-step-list.md new file mode 100644 index 0000000..5f87bed --- /dev/null +++ b/docs/components/265-agent-step-list.md @@ -0,0 +1,51 @@ +# 265 AgentStepList 执行步骤列表 + +## 用途 + +以时间线显示 Agent 的执行步骤:当前步加框标出,步骤可展开详情,失败步提供重试。 + +## 最小示例 + +```go +steps := []mujica.AgentStep{ + {ID: "read", Title: "Read the guest list", State: mujica.AgentDone, Duration: time.Second}, + {ID: "seat", Title: "Assign the seats", State: mujica.AgentFailed, Detail: "Table 4 is full."}, + {ID: "send", Title: "Send invitations", State: mujica.AgentPending}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if r := mujica.AgentStepList(c, steps, mujica.AgentStepListOptions{}); r.Retry != "" { + fmt.Println("retry", r.Retry) + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func AgentStepList(c *ui.Context, steps []AgentStep, opts AgentStepListOptions) AgentStepListResult`。步骤 `ID` 为空或重复、`Title` 为空时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Disabled` | `bool` | `false` | 禁止展开与重试。 | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- `AgentStep` 字段:`ID`、`Title`、`Detail`、`State`、`Duration`。 +- `AgentState`:`AgentPending`、`AgentPlanning`、`AgentRunning`、`AgentWaiting`、`AgentDone`、`AgentFailed`、`AgentSkipped`,越界 panic。状态同时由图标形状和文字表达,不只靠颜色。 +- 当前步是第一个执行中、等待或规划中的步骤,用选中底色、边框和“当前”文字标出。 +- 失败步下方显示“重试”。 + +## 事件 + +- `Toggled`:本帧展开或折叠的步骤 ID。 +- `Retry`:本帧请求重试的步骤 ID。 + +## 键盘操作 + +- Tab 进入列表;↑ ↓ 在步骤与重试按钮间移动;Enter / Space 展开详情或重试。 + +## 限制 + +- 步骤数量较少时使用;列表不虚拟化。 diff --git a/docs/components/266-agent-plan.md b/docs/components/266-agent-plan.md new file mode 100644 index 0000000..d2f4ec1 --- /dev/null +++ b/docs/components/266-agent-plan.md @@ -0,0 +1,49 @@ +# 266 AgentPlan 执行计划 + +## 用途 + +显示 Agent 的计划清单与进度:随 Agent 实时勾选,用户可勾选、跳过、恢复和新增项。 + +## 最小示例 + +```go +items := []mujica.PlanItem{ + {ID: "a", Text: "Read the guest list", State: mujica.AgentDone}, + {ID: "b", Text: "Assign the seats", State: mujica.AgentRunning}, + {ID: "c", Text: "Order the flowers"}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AgentPlan(c, &items, mujica.AgentPlanOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func AgentPlan(c *ui.Context, items *[]PlanItem, opts AgentPlanOptions) ChoiceResult`。`items` 为 nil、项 `ID` 重复或状态不是待办、进行中、完成、跳过之一时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Title` | `string` | “计划” | 标题。 | +| `Disabled` | `bool` | `false` | 只读显示,隐藏跳过与新增。 | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- `PlanItem` 字段:`ID`、`Text`、`State`(`AgentPending`、`AgentRunning`、`AgentDone`、`AgentSkipped`)。 +- 进度为“已完成 / 未跳过总数”,以文字和细进度条显示。 +- 跳过的项加删除线并禁用勾选;进行中的项显示“进行中”。 +- 新增项的 ID 自动生成为未使用的 `item-N`。 + +## 事件 + +- `Changed()`:用户勾选、跳过、恢复或新增了项,`*items` 已更新。 + +## 键盘操作 + +- Tab 到每项的勾选框(Space 切换)、跳过或恢复按钮;在新增输入框中按 Enter 添加。 + +## 限制 + +- 空白内容不会被添加。 diff --git a/docs/components/267-agent-status.md b/docs/components/267-agent-status.md new file mode 100644 index 0000000..15637fc --- /dev/null +++ b/docs/components/267-agent-status.md @@ -0,0 +1,41 @@ +# 267 AgentStatus Agent 状态 + +## 用途 + +显示 Agent 当前状态:规划中、执行中、等待、完成、失败,用图标形状和文字表达,不只靠颜色。 + +## 最小示例 + +```go +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AgentStatus(c, mujica.AgentWaiting, mujica.AgentStatusOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func AgentStatus(c *ui.Context, state AgentState, opts AgentStatusOptions) *ui.Element`。未知状态 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Label` | `string` | 内置状态词 | 替换显示的文字。 | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- `AgentState`:`AgentPending`、`AgentPlanning`、`AgentRunning`、`AgentWaiting`、`AgentDone`、`AgentFailed`、`AgentSkipped`,越界 panic。状态同时由图标形状和文字表达,不只靠颜色。 +- 执行中显示旋转的菱形;`Still` 或系统减少动画时改为静态图标。 + +## 事件 + +- 无事件;屏幕阅读器以状态角色读出文字。 + +## 键盘操作 + +- 不获取焦点。 + +## 限制 + +- 状态动画只在显示时重绘,隐藏后停止。 diff --git a/docs/components/268-agent-progress.md b/docs/components/268-agent-progress.md new file mode 100644 index 0000000..b25e5d1 --- /dev/null +++ b/docs/components/268-agent-progress.md @@ -0,0 +1,42 @@ +# 268 AgentProgress Agent 进度 + +## 用途 + +显示整体进度和当前动作文字;时长未知时用不确定模式。 + +## 最小示例 + +```go +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AgentProgress(c, 0.4, mujica.AgentProgressOptions{Action: "Reading ledger.md"}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func AgentProgress(c *ui.Context, value float64, opts AgentProgressOptions) *ui.Element`。确定模式下 `value` 不在 0 到 1 时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Label` | `string` | “进度” | 进度名称。 | +| `Action` | `string` | `""` | 当前动作,如“正在读取 ledger.md”。 | +| `Indeterminate` | `bool` | `false` | 不确定模式,忽略 value。 | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- 确定模式显示百分比;不确定模式显示流动条,减少动画时为静态条加“进行中”。 + +## 事件 + +- 无事件;当前动作以状态角色读出。 + +## 键盘操作 + +- 不获取焦点。 + +## 限制 + +- 进度值由调用方计算。 diff --git a/docs/components/269-sub-agent-tree.md b/docs/components/269-sub-agent-tree.md new file mode 100644 index 0000000..5349566 --- /dev/null +++ b/docs/components/269-sub-agent-tree.md @@ -0,0 +1,45 @@ +# 269 SubAgentTree 子 Agent 树 + +## 用途 + +以树显示子 Agent 层级、各自任务与状态,可展开查看下级。 + +## 最小示例 + +```go +agents := []mujica.SubAgent{{ID: "lead", Name: "Steward", State: mujica.AgentRunning, Children: []mujica.SubAgent{ + {ID: "cook", Name: "Cook", Task: "Plan the menu", State: mujica.AgentWaiting}, +}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.SubAgentTree(c, agents, mujica.SubAgentTreeOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func SubAgentTree(c *ui.Context, roots []SubAgent, opts SubAgentTreeOptions) ChoiceResult`。`ID` 为空或重复、`Name` 为空时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Disabled` | `bool` | `false` | 禁止展开与折叠。 | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- `SubAgent` 字段:`ID`、`Name`、`Task`、`State`、`Children`。 +- `AgentState`:`AgentPending`、`AgentPlanning`、`AgentRunning`、`AgentWaiting`、`AgentDone`、`AgentFailed`、`AgentSkipped`,越界 panic。状态同时由图标形状和文字表达,不只靠颜色。 +- 有下级的行显示箭头和“N 个子智能体”。 + +## 事件 + +- `Changed()`:用户展开或折叠了某个 Agent。 + +## 键盘操作 + +- Tab 进入树;↑ ↓ 移动;→ 展开,← 折叠;Enter / Space 切换。 + +## 限制 + +- 树不虚拟化,适合几十到几百个 Agent。 diff --git a/docs/components/270-file-change-card.md b/docs/components/270-file-change-card.md new file mode 100644 index 0000000..045a63f --- /dev/null +++ b/docs/components/270-file-change-card.md @@ -0,0 +1,48 @@ +# 270 FileChangeCard 文件变更卡片 + +## 用途 + +预览一个文件的变更:增删行数、首处修改附近的差异行,提供接受、拒绝和打开完整差异的入口。 + +## 最小示例 + +```go +decision := mujica.FilePending +change := mujica.FileChange{Path: "ledger.md", Old: "Guests: 40\n", New: "Guests: 42\n"} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.FileChangeCard(c, &decision, change, mujica.FileChangeCardOptions{}).OpenDiff { + fmt.Println("open the full diff") + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func FileChangeCard(c *ui.Context, decision *FileDecision, change FileChange, opts FileChangeCardOptions) FileChangeResult`。`decision` 为 nil、`Path` 为空或 `Preview` 为负时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Preview` | `int` | 8 | 从首处修改前两行起显示的差异行数。 | +| `Disabled` | `bool` | `false` | 禁止决定与打开差异。 | + +## 状态 + +- `FileChange` 字段:`Path`、`Old`、`New`;`Old` 为空表示新文件,`New` 为空表示删除。 +- 差异由 `internal.LineDiff`(Myers 行差异)计算,文本不变时只算一次。 +- 新增行带“+”、删除行带“−”和行号,颜色只是辅助。 +- 决定状态 `FilePending`、`FileAccepted`、`FileRejected` 以图标和文字显示;已决定后显示“撤销”。 + +## 事件 + +- `Decided`:`*decision` 被用户改变。 +- `OpenDiff`:请求调用方打开完整差异。 + +## 键盘操作 + +- Tab 依次到“打开差异”“拒绝”“接受”(或“撤销”),Enter / Space 触发。 + +## 限制 + +- 只做行级差异;词级高亮由 Git 组扩展。 diff --git a/docs/components/271-multi-file-diff-review.md b/docs/components/271-multi-file-diff-review.md new file mode 100644 index 0000000..b60c4cb --- /dev/null +++ b/docs/components/271-multi-file-diff-review.md @@ -0,0 +1,48 @@ +# 271 MultiFileDiffReview 多文件差异审阅 + +## 用途 + +审阅多个文件的变更:左侧文件列表,右侧所选文件的完整差异,逐文件接受或拒绝,全部接受,并显示审阅进度。 + +## 最小示例 + +```go +files := []mujica.FileChange{ + {Path: "ledger.md", Old: "Guests: 40\n", New: "Guests: 42\n"}, + {Path: "menu.md", Old: "soup\n", New: "soup\ntart\n"}, +} +decisions := make([]mujica.FileDecision, len(files)) +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.MultiFileDiffReview(c, &decisions, files, mujica.MultiFileDiffReviewOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func MultiFileDiffReview(c *ui.Context, decisions *[]FileDecision, files []FileChange, opts MultiFileDiffReviewOptions) ChoiceResult`。`decisions` 与 `files` 数量不同、`Path` 为空或重复、`Height` 为负时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Height` | `float32` | 420 | 组件高度。 | +| `Disabled` | `bool` | `false` | 禁止选择与决定。 | + +## 状态 + +- 进度为“已审阅 N / 总数”,以文字和细进度条显示。 +- 所选文件用选中底色和左侧竖条标出。 +- 文件超过 200 个或差异超过 200 行时虚拟化。 +- “全部接受”只接受尚未决定的文件,全部决定后禁用。 + +## 事件 + +- `Changed()`:用户改变了任一文件的决定。 + +## 键盘操作 + +- Tab 进入文件列表;↑ ↓ 移动,Enter 选择;Tab 到右侧按钮后 Enter 接受或拒绝。 + +## 限制 + +- 文件很多时方向键只在已构建的可见行间移动,滚动后再继续。 diff --git a/docs/components/272-command-execution-card.md b/docs/components/272-command-execution-card.md new file mode 100644 index 0000000..8d0ca9d --- /dev/null +++ b/docs/components/272-command-execution-card.md @@ -0,0 +1,48 @@ +# 272 CommandExecutionCard 命令执行卡片 + +## 用途 + +显示一条命令的执行:命令、工作目录、带 ANSI 颜色的输出、退出码与耗时,执行中可请求中止。 + +## 最小示例 + +```go +run := mujica.CommandRun{Command: "go test ./...", Dir: "~/court", Running: true, Output: "\x1b[32mok\x1b[0m court\n"} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.CommandExecutionCard(c, run, mujica.CommandExecutionCardOptions{}).Changed() { + fmt.Println("abort the process") + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func CommandExecutionCard(c *ui.Context, run CommandRun, opts CommandExecutionCardOptions) ChoiceResult`。`Command` 为空或 `Height` 为负时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Height` | `float32` | 240 | 输出区高度。 | +| `Disabled` | `bool` | `false` | 禁止中止。 | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- `CommandRun` 字段:`Command`、`Dir`、`Output`、`Running`、`ExitCode`、`Duration`。 +- 输出由 `internal.ParseAnsi` 解析,颜色映射到主题;样式可跨行延续;追加输出只解析新增行。 +- 输出虚拟化并跟随末尾,用户向上滚动后停止跟随。 +- 退出码以图标和“退出码 N”文字显示。 + +## 事件 + +- `Changed()`:用户点击了“中止”;终止进程由调用方完成。 + +## 键盘操作 + +- Tab 到“中止”,Enter / Space 触发;输出区可滚动。 + +## 限制 + +- 只支持 SGR 颜色与样式,其它转义序列原样显示。 +- 不运行命令,也不提供 PTY。 diff --git a/docs/components/273-screenshot-stream.md b/docs/components/273-screenshot-stream.md new file mode 100644 index 0000000..2c2b652 --- /dev/null +++ b/docs/components/273-screenshot-stream.md @@ -0,0 +1,45 @@ +# 273 ScreenshotStream Agent 画面流 + +## 用途 + +查看 Agent 的画面帧序列:默认跟随最新帧,可暂停并逐帧前后查看。帧由调用方提供。 + +## 最小示例 + +```go +var st mujica.ScreenshotStreamState +var frames []mujica.ScreenshotFrame // appended as the agent captures them +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ScreenshotStream(c, &st, frames, mujica.ScreenshotStreamOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ScreenshotStream(c *ui.Context, st *ScreenshotStreamState, frames []ScreenshotFrame, opts ScreenshotStreamOptions) ChoiceResult`。`st` 为 nil、帧没有图像或 `Height` 为负时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Height` | `float32` | 280 | 画面区高度。 | +| `Disabled` | `bool` | `false` | 禁止暂停与逐帧。 | + +## 状态 + +- `ScreenshotFrame` 字段:`Image`(`ui.ImageSource`)、`Caption`、`At`。 +- `ScreenshotStreamState` 字段:`Index`、`Paused`;未暂停时 `Index` 总是最后一帧。 +- 逐帧操作会自动暂停;“回到实时”恢复跟随。 +- 没有帧时显示“等待画面”。 + +## 事件 + +- `Changed()`:用户暂停、恢复或移动了帧。 + +## 键盘操作 + +- Tab 到画面区:← → 逐帧,Space 暂停或恢复;上一帧、下一帧按钮同样可用。 + +## 限制 + +- 不解码视频,帧图像由调用方提供。 diff --git a/docs/components/274-artifact-panel.md b/docs/components/274-artifact-panel.md new file mode 100644 index 0000000..58164e4 --- /dev/null +++ b/docs/components/274-artifact-panel.md @@ -0,0 +1,47 @@ +# 274 ArtifactPanel 产物面板 + +## 用途 + +展示 Agent 生成的产物:代码高亮显示,文档与网页由调用方的预览插槽渲染,可在预览与源码间切换,提供复制与导出。 + +## 最小示例 + +```go +art := mujica.Artifact{Title: "seating.go", Language: "go", Content: "package court\n"} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ArtifactPanel(c, art, mujica.ArtifactPanelOptions{}).Exported { + fmt.Println("save the file") + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ArtifactPanel(c *ui.Context, art Artifact, opts ArtifactPanelOptions) ArtifactPanelResult`。`Title` 为空、`Kind` 越界、文档或网页缺少 `Preview`、`Height` 为负时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Preview` | `func()` | `nil` | 预览插槽;文档与网页必填。 | +| `Height` | `float32` | 320 | 内容区高度。 | +| `Disabled` | `bool` | `false` | 禁止复制、导出与切换。 | + +## 状态 + +- `Artifact` 字段:`Title`、`Kind`(`ArtifactCode`、`ArtifactDocument`、`ArtifactWeb`)、`Language`、`Content`。 +- 预览与源码切换用选中底色加勾号标出当前项。 +- 复制后两秒内按钮显示“已复制”。 + +## 事件 + +- `Copied`:内容已写入剪贴板。 +- `Exported`:请求调用方导出。 + +## 键盘操作 + +- Tab 到切换组,← → 移动,Enter / Space 选择;Tab 到复制、导出。 + +## 限制 + +- 不内置网页渲染,网页预览须由调用方提供(无 WebView)。 diff --git a/docs/components/275-artifact-version-switcher.md b/docs/components/275-artifact-version-switcher.md new file mode 100644 index 0000000..0cabdb2 --- /dev/null +++ b/docs/components/275-artifact-version-switcher.md @@ -0,0 +1,45 @@ +# 275 ArtifactVersionSwitcher 产物版本切换 + +## 用途 + +在产物的多个版本之间切换,并提供与上一版本比较差异的入口。 + +## 最小示例 + +```go +current := 1 +versions := []mujica.ArtifactVersion{{Label: "v1", Note: "First draft"}, {Label: "v2", Note: "Added music"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ArtifactVersionSwitcher(c, ¤t, versions, mujica.ArtifactVersionSwitcherOptions{}).Compare { + fmt.Println("diff v1 and v2") + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func ArtifactVersionSwitcher(c *ui.Context, current *int, versions []ArtifactVersion, opts ArtifactVersionSwitcherOptions) ArtifactVersionResult`。没有版本、`*current` 越界或版本 `Label` 为空时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Disabled` | `bool` | `false` | 禁止切换与比较。 | + +## 状态 + +- 显示版本名、“N / 总数”和说明;第一个版本时“较早版本”禁用,最后一个时“较新版本”禁用。 +- 非第一个版本显示“与上一版本比较”。 + +## 事件 + +- `Changed`:`*current` 改变。 +- `Compare`:请求比较当前版本与上一版本。 + +## 键盘操作 + +- 焦点在组件内时 ← → 切换版本;Tab 到各按钮,Enter / Space 触发。 + +## 限制 + +- 差异视图由调用方打开,可用 FileChangeCard 或 MultiFileDiffReview 呈现。 diff --git a/docs/components/276-sandbox-status.md b/docs/components/276-sandbox-status.md new file mode 100644 index 0000000..495f6da --- /dev/null +++ b/docs/components/276-sandbox-status.md @@ -0,0 +1,43 @@ +# 276 SandboxStatus 沙箱状态 + +## 用途 + +显示沙箱的运行状态、资源占用和剩余时间。 + +## 最小示例 + +```go +info := mujica.SandboxInfo{Name: "sandbox-7", State: mujica.SandboxRunning, + Resources: []mujica.SandboxResource{{Name: "CPU", Used: 1.5, Limit: 2, Unit: "cores"}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.SandboxStatus(c, info, mujica.SandboxStatusOptions{}) +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func SandboxStatus(c *ui.Context, info SandboxInfo, opts SandboxStatusOptions) *ui.Element`。状态未知、资源名为空、`Limit` 不大于 0 或 `Used` 不在 0 到 `Limit` 之间时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- `SandboxInfo` 字段:`Name`、`State`(`SandboxStarting`、`SandboxRunning`、`SandboxStopped`、`SandboxFailed`)、`Resources`、`Expires`。 +- 每项资源显示“已用 / 上限 单位”与细条;达到 90% 时加警示图标和“接近上限”说明。 +- 设置 `Expires` 且运行中时显示剩余时间,每秒刷新;到时显示“已到时”。 + +## 事件 + +- 无事件。 + +## 键盘操作 + +- 不获取焦点。 + +## 限制 + +- 倒计时依赖界面帧,窗口隐藏时 MyGo 暂停帧,重新显示后立即校正。 diff --git a/docs/components/277-mcp-server-list.md b/docs/components/277-mcp-server-list.md new file mode 100644 index 0000000..82a5d34 --- /dev/null +++ b/docs/components/277-mcp-server-list.md @@ -0,0 +1,46 @@ +# 277 MCPServerList MCP 服务器列表 + +## 用途 + +列出 MCP 服务器:连接状态、传输方式、工具数,提供启动、停止与重新连接回调。 + +## 最小示例 + +```go +servers := []mujica.MCPServer{{ID: "fs", Name: "filesystem", Transport: "stdio", State: mujica.MCPConnected, Tools: 12}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if r := mujica.MCPServerList(c, servers, mujica.MCPServerListOptions{}); r.Action == mujica.MCPStop { + fmt.Println("stop", r.Server) + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func MCPServerList(c *ui.Context, servers []MCPServer, opts MCPServerListOptions) MCPServerListResult`。`ID` 为空或重复、`Name` 为空、状态未知、`Tools` 为负、`MaxHeight` 为负时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `MaxHeight` | `float32` | 360 | 列表最大高度,超出后滚动。 | +| `Disabled` | `bool` | `false` | 禁止所有操作。 | +| `Still` | `bool` | `false` | 停止执行中动画;系统减少动画时也自动静止。 | + +## 状态 + +- `MCPServer` 字段:`ID`、`Name`、`Transport`、`State`(`MCPStopped`、`MCPConnecting`、`MCPConnected`、`MCPError`)、`Tools`、`Error`。 +- 已连接时显示“N 个工具”;连接失败时显示错误文字与“重新连接”。 +- 超过 200 台服务器时虚拟化。 + +## 事件 + +- `Action`:本帧请求 `MCPStart`、`MCPStop` 或 `MCPReconnect`,`Server` 为对应 ID。 + +## 键盘操作 + +- Tab 依次到各行按钮,Enter / Space 触发。 + +## 限制 + +- 组件只发出请求,连接管理由调用方完成。 diff --git a/docs/components/278-memory-panel.md b/docs/components/278-memory-panel.md new file mode 100644 index 0000000..e9ff905 --- /dev/null +++ b/docs/components/278-memory-panel.md @@ -0,0 +1,47 @@ +# 278 MemoryPanel 记忆面板 + +## 用途 + +列出 Agent 的记忆条目,支持搜索、行内编辑和确认后删除。 + +## 最小示例 + +```go +entries := []mujica.MemoryEntry{{ID: "1", Text: "Lady Sakiko prefers the east wing.", Source: "Chat"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if r := mujica.MemoryPanel(c, &entries, mujica.MemoryPanelOptions{}); r.Deleted != "" { + fmt.Println("forget", r.Deleted) + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func MemoryPanel(c *ui.Context, entries *[]MemoryEntry, opts MemoryPanelOptions) MemoryPanelResult`。`entries` 为 nil、条目 `ID` 为空或 `MaxHeight` 为负时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `MaxHeight` | `float32` | 360 | 列表最大高度。 | +| `Disabled` | `bool` | `false` | 只读,禁止搜索、编辑与删除。 | + +## 状态 + +- `MemoryEntry` 字段:`ID`、`Text`、`Source`。 +- 搜索不区分大小写,匹配内容与来源;只在搜索词或条目变化时重新筛选。 +- 编辑时出现文本框和保存、取消;删除前用 Popconfirm 确认,确认按钮为危险样式且默认聚焦取消。 +- 条目超过 200 条时虚拟化。 + +## 事件 + +- `Edited`:本帧保存的条目 ID,`*entries` 已更新。 +- `Deleted`:本帧删除的条目 ID,已从 `*entries` 移除。 + +## 键盘操作 + +- Tab 到搜索框、各条的编辑与删除;删除确认中 Escape 取消。 + +## 限制 + +- 调用方原地修改条目文本而不改变切片长度时,筛选结果到下次搜索变化才更新。 diff --git a/docs/components/279-checkpoint-list.md b/docs/components/279-checkpoint-list.md new file mode 100644 index 0000000..3854182 --- /dev/null +++ b/docs/components/279-checkpoint-list.md @@ -0,0 +1,46 @@ +# 279 CheckpointList 检查点列表 + +## 用途 + +列出 Agent 运行的检查点,标出当前点,回滚到其它检查点前要求确认。 + +## 最小示例 + +```go +current := "c2" +points := []mujica.Checkpoint{{ID: "c2", Label: "Menu drafted"}, {ID: "c1", Label: "Start"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.CheckpointList(c, ¤t, points, mujica.CheckpointListOptions{}).Changed() { + fmt.Println("restore", current) + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func CheckpointList(c *ui.Context, current *string, points []Checkpoint, opts CheckpointListOptions) ChoiceResult`。`current` 为 nil、`ID` 为空或重复、`Label` 为空、`MaxHeight` 为负时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `MaxHeight` | `float32` | 360 | 列表最大高度。 | +| `Disabled` | `bool` | `false` | 禁止回滚。 | + +## 状态 + +- 当前点用实心菱形、选中底色和“当前”文字标出;其它点为空心菱形。 +- 回滚用 AlertDialog 确认:默认聚焦取消,Enter 不会直接回滚。 +- 超过 200 个检查点时虚拟化。 + +## 事件 + +- `Changed()`:确认回滚后 `*current` 已改为目标 ID。 + +## 键盘操作 + +- Tab 到各“回滚”,Enter 打开确认;确认框内 Tab 到“回滚”再按 Enter。 + +## 限制 + +- 恢复文件与状态由调用方完成。 diff --git a/docs/components/280-human-input-request.md b/docs/components/280-human-input-request.md new file mode 100644 index 0000000..288fbba --- /dev/null +++ b/docs/components/280-human-input-request.md @@ -0,0 +1,52 @@ +# 280 HumanInputRequest 人工输入请求 + +## 用途 + +Agent 向用户提问:显示问题、可选答案与自由回答,并提示剩余时间与超时。 + +## 最小示例 + +```go +answer := "" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.HumanInputRequest(c, &answer, mujica.HumanInputRequestOptions{ + Question: "Which hall?", Options: []string{"East wing", "Great hall"}, AllowFree: true, + }) + if r.Submitted { + fmt.Println("reply", answer) + } +} +ui.Render(view, 400, 300, 1) +``` + +签名:`func HumanInputRequest(c *ui.Context, answer *string, opts HumanInputRequestOptions) HumanInputResult`。`answer` 为 nil、`Question` 为空、既无选项又不允许自由回答时 panic。 + +## 参数 + +| 字段 | 类型 | 默认值 | 含义 | +| --- | --- | --- | --- | +| `Question` | `string` | 必填 | 问题。 | +| `Options` | `[]string` | `nil` | 可选答案。 | +| `AllowFree` | `bool` | `false` | 允许自由回答。 | +| `Deadline` | `time.Time` | 零值 | 截止时间;零值不限时。 | +| `Disabled` | `bool` | `false` | 禁止回答。 | + +## 状态 + +- 选择选项会清空自由回答;输入自由回答会取代所选选项。 +- 剩余时间每秒刷新;到时显示“智能体已停止等待”并禁用。 +- 回答为空白时“发送回答”禁用。 + +## 事件 + +- `Submitted`:用户发送了 `*answer`。 +- `TimedOut`:截止时间在本帧到达(只报告一次)。 + +## 键盘操作 + +- Tab 进入选项组,方向键选择;Tab 到输入框,Enter 发送;或 Tab 到“发送回答”。 + +## 限制 + +- 超时只在界面帧中检测,窗口隐藏期间推迟到重新显示。 diff --git a/example_agent_test.go b/example_agent_test.go new file mode 100644 index 0000000..0d17a41 --- /dev/null +++ b/example_agent_test.go @@ -0,0 +1,243 @@ +package mujica_test + +import ( + "fmt" + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +func ExampleToolCallCard() { + call := mujica.ToolCall{ID: "1", Name: "read_file", Args: "{\"path\":\"ledger.md\"}", + Result: "{\"lines\":40}", State: mujica.AgentDone, Duration: 420 * time.Millisecond} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ToolCallCard(c, call, mujica.ToolCallCardOptions{OpenArgs: true}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleToolCallGroup() { + open := false + calls := []mujica.ToolCall{ + {ID: "a", Name: "list_dir", State: mujica.AgentDone, Duration: 300 * time.Millisecond}, + {ID: "b", Name: "read_file", State: mujica.AgentFailed, Error: "not found"}, + } + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ToolCallGroup(c, &open, calls, mujica.ToolCallGroupOptions{}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleToolApprovalDialog() { + open := true + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ToolApprovalDialog(c, &open, mujica.ToolApprovalOptions{ + Tool: "delete_files", Args: "{\"glob\":\"*.tmp\"}", Reason: "Clean the build folder.", + }) + if r.Allowed { + fmt.Println("run the tool") + } + } + ui.Render(view, 400, 300, 1) +} + +func ExamplePermissionPrompt() { + open := true + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.PermissionPrompt(c, &open, mujica.PermissionPromptOptions{ + Title: "Write to the ledger?", Scope: "Write access to ~/court/ledger", + }) + if r.Choice == mujica.PermissionAllowAlways { + fmt.Println("remember the grant") + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleAgentStepList() { + steps := []mujica.AgentStep{ + {ID: "read", Title: "Read the guest list", State: mujica.AgentDone, Duration: time.Second}, + {ID: "seat", Title: "Assign the seats", State: mujica.AgentFailed, Detail: "Table 4 is full."}, + {ID: "send", Title: "Send invitations", State: mujica.AgentPending}, + } + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if r := mujica.AgentStepList(c, steps, mujica.AgentStepListOptions{}); r.Retry != "" { + fmt.Println("retry", r.Retry) + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleAgentPlan() { + items := []mujica.PlanItem{ + {ID: "a", Text: "Read the guest list", State: mujica.AgentDone}, + {ID: "b", Text: "Assign the seats", State: mujica.AgentRunning}, + {ID: "c", Text: "Order the flowers"}, + } + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AgentPlan(c, &items, mujica.AgentPlanOptions{}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleAgentStatus() { + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AgentStatus(c, mujica.AgentWaiting, mujica.AgentStatusOptions{}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleAgentProgress() { + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AgentProgress(c, 0.4, mujica.AgentProgressOptions{Action: "Reading ledger.md"}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleSubAgentTree() { + agents := []mujica.SubAgent{{ID: "lead", Name: "Steward", State: mujica.AgentRunning, Children: []mujica.SubAgent{ + {ID: "cook", Name: "Cook", Task: "Plan the menu", State: mujica.AgentWaiting}, + }}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.SubAgentTree(c, agents, mujica.SubAgentTreeOptions{}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleFileChangeCard() { + decision := mujica.FilePending + change := mujica.FileChange{Path: "ledger.md", Old: "Guests: 40\n", New: "Guests: 42\n"} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.FileChangeCard(c, &decision, change, mujica.FileChangeCardOptions{}).OpenDiff { + fmt.Println("open the full diff") + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleMultiFileDiffReview() { + files := []mujica.FileChange{ + {Path: "ledger.md", Old: "Guests: 40\n", New: "Guests: 42\n"}, + {Path: "menu.md", Old: "soup\n", New: "soup\ntart\n"}, + } + decisions := make([]mujica.FileDecision, len(files)) + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.MultiFileDiffReview(c, &decisions, files, mujica.MultiFileDiffReviewOptions{}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleCommandExecutionCard() { + run := mujica.CommandRun{Command: "go test ./...", Dir: "~/court", Running: true, Output: "\x1b[32mok\x1b[0m court\n"} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.CommandExecutionCard(c, run, mujica.CommandExecutionCardOptions{}).Changed() { + fmt.Println("abort the process") + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleScreenshotStream() { + var st mujica.ScreenshotStreamState + var frames []mujica.ScreenshotFrame // appended as the agent captures them + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ScreenshotStream(c, &st, frames, mujica.ScreenshotStreamOptions{}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleArtifactPanel() { + art := mujica.Artifact{Title: "seating.go", Language: "go", Content: "package court\n"} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ArtifactPanel(c, art, mujica.ArtifactPanelOptions{}).Exported { + fmt.Println("save the file") + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleArtifactVersionSwitcher() { + current := 1 + versions := []mujica.ArtifactVersion{{Label: "v1", Note: "First draft"}, {Label: "v2", Note: "Added music"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ArtifactVersionSwitcher(c, ¤t, versions, mujica.ArtifactVersionSwitcherOptions{}).Compare { + fmt.Println("diff v1 and v2") + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleSandboxStatus() { + info := mujica.SandboxInfo{Name: "sandbox-7", State: mujica.SandboxRunning, + Resources: []mujica.SandboxResource{{Name: "CPU", Used: 1.5, Limit: 2, Unit: "cores"}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.SandboxStatus(c, info, mujica.SandboxStatusOptions{}) + } + ui.Render(view, 400, 300, 1) +} + +func ExampleMCPServerList() { + servers := []mujica.MCPServer{{ID: "fs", Name: "filesystem", Transport: "stdio", State: mujica.MCPConnected, Tools: 12}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if r := mujica.MCPServerList(c, servers, mujica.MCPServerListOptions{}); r.Action == mujica.MCPStop { + fmt.Println("stop", r.Server) + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleMemoryPanel() { + entries := []mujica.MemoryEntry{{ID: "1", Text: "Lady Sakiko prefers the east wing.", Source: "Chat"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if r := mujica.MemoryPanel(c, &entries, mujica.MemoryPanelOptions{}); r.Deleted != "" { + fmt.Println("forget", r.Deleted) + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleCheckpointList() { + current := "c2" + points := []mujica.Checkpoint{{ID: "c2", Label: "Menu drafted"}, {ID: "c1", Label: "Start"}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.CheckpointList(c, ¤t, points, mujica.CheckpointListOptions{}).Changed() { + fmt.Println("restore", current) + } + } + ui.Render(view, 400, 300, 1) +} + +func ExampleHumanInputRequest() { + answer := "" + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.HumanInputRequest(c, &answer, mujica.HumanInputRequestOptions{ + Question: "Which hall?", Options: []string{"East wing", "Great hall"}, AllowFree: true, + }) + if r.Submitted { + fmt.Println("reply", answer) + } + } + ui.Render(view, 400, 300, 1) +} diff --git a/examples/gallery/pages_agent.go b/examples/gallery/pages_agent.go index f1cb354..ead48c3 100644 --- a/examples/gallery/pages_agent.go +++ b/examples/gallery/pages_agent.go @@ -1,3 +1,282 @@ package main -var agentPages = []page{} +import ( + "fmt" + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +const agentCategory = "Agent" + +var agentPages = []page{ + {ID: "261", Name: "ToolCallCard", ZhName: "工具调用卡片", Category: agentCategory, Demo: toolCallCardDemo, Code: toolCallCardCode, + Keys: "Tab 到参数、结果折叠按钮,Enter / Space 展开或折叠。"}, + {ID: "262", Name: "ToolCallGroup", ZhName: "工具调用组", Category: agentCategory, Demo: toolCallGroupDemo, Code: toolCallGroupCode, + Keys: "Tab 到组标题,Enter / Space 展开或折叠。"}, + {ID: "263", Name: "ToolApprovalDialog", ZhName: "工具审批对话框", Category: agentCategory, Demo: toolApprovalDemo, Code: toolApprovalDialogCode, + Keys: "打开时焦点在拒绝;Enter 只触发聚焦按钮,Tab 到允许才能批准;Escape 拒绝。"}, + {ID: "264", Name: "PermissionPrompt", ZhName: "权限请求", Category: agentCategory, Demo: permissionDemo, Code: permissionPromptCode, + Keys: "打开时焦点在拒绝;Tab 到始终允许、允许一次;Escape 拒绝。"}, + {ID: "265", Name: "AgentStepList", ZhName: "执行步骤列表", Category: agentCategory, Demo: agentStepListDemo, Code: agentStepListCode, + Keys: "↑ ↓ 在步骤与重试间移动;Enter 展开详情或重试。"}, + {ID: "266", Name: "AgentPlan", ZhName: "执行计划", Category: agentCategory, Demo: agentPlanDemo, Code: agentPlanCode, + Keys: "Space 勾选;Tab 到跳过或恢复;在输入框中按 Enter 新增。"}, + {ID: "267", Name: "AgentStatus", ZhName: "Agent 状态", Category: agentCategory, Demo: agentStatusDemo, Code: agentStatusCode, + Keys: "不获取焦点;屏幕阅读器读出状态文字。"}, + {ID: "268", Name: "AgentProgress", ZhName: "Agent 进度", Category: agentCategory, Demo: agentProgressDemo, Code: agentProgressCode, + Keys: "不获取焦点;当前动作以状态读出。"}, + {ID: "269", Name: "SubAgentTree", ZhName: "子 Agent 树", Category: agentCategory, Demo: subAgentTreeDemo, Code: subAgentTreeCode, + Keys: "↑ ↓ 移动;→ 展开,← 折叠;Enter / Space 切换。"}, + {ID: "270", Name: "FileChangeCard", ZhName: "文件变更卡片", Category: agentCategory, Demo: fileChangeCardDemo, Code: fileChangeCardCode, + Keys: "Tab 到打开差异、拒绝、接受或撤销,Enter / Space 触发。"}, + {ID: "271", Name: "MultiFileDiffReview", ZhName: "多文件差异审阅", Category: agentCategory, Demo: multiFileDiffDemo, Code: multiFileDiffReviewCode, + Keys: "文件列表中 ↑ ↓ 移动,Enter 选择;Tab 到接受、拒绝、全部接受。"}, + {ID: "272", Name: "CommandExecutionCard", ZhName: "命令执行卡片", Category: agentCategory, Demo: commandExecutionDemo, Code: commandExecutionCardCode, + Keys: "Tab 到中止,Enter / Space 请求中止;输出区可滚动。"}, + {ID: "273", Name: "ScreenshotStream", ZhName: "Agent 画面流", Category: agentCategory, Demo: screenshotStreamDemo, Code: screenshotStreamCode, + Keys: "画面区中 ← → 逐帧,Space 暂停或恢复。"}, + {ID: "274", Name: "ArtifactPanel", ZhName: "产物面板", Category: agentCategory, Demo: artifactPanelDemo, Code: artifactPanelCode, + Keys: "切换组中 ← → 移动、Enter 选择;Tab 到复制、导出。"}, + {ID: "275", Name: "ArtifactVersionSwitcher", ZhName: "产物版本切换", Category: agentCategory, Demo: artifactVersionDemo, Code: artifactVersionSwitcherCode, + Keys: "焦点在组件内时 ← → 切换版本;Tab 到比较按钮。"}, + {ID: "276", Name: "SandboxStatus", ZhName: "沙箱状态", Category: agentCategory, Demo: sandboxStatusDemo, Code: sandboxStatusCode, + Keys: "不获取焦点;剩余时间每秒刷新。"}, + {ID: "277", Name: "MCPServerList", ZhName: "MCP 服务器列表", Category: agentCategory, Demo: mcpServerListDemo, Code: mcpServerListCode, + Keys: "Tab 到各行的启动、停止、重新连接,Enter / Space 触发。"}, + {ID: "278", Name: "MemoryPanel", ZhName: "记忆面板", Category: agentCategory, Demo: memoryPanelDemo, Code: memoryPanelCode, + Keys: "Tab 到搜索、编辑、删除;删除确认默认聚焦取消,Escape 取消。"}, + {ID: "279", Name: "CheckpointList", ZhName: "检查点列表", Category: agentCategory, Demo: checkpointListDemo, Code: checkpointListCode, + Keys: "Tab 到回滚,Enter 打开确认;确认框默认聚焦取消。"}, + {ID: "280", Name: "HumanInputRequest", ZhName: "人工输入请求", Category: agentCategory, Demo: humanInputDemo, Code: humanInputRequestCode, + Keys: "方向键选择选项;输入框中 Enter 发送;Tab 到发送回答。"}, +} + +// agentStates are the states a demo can pick from. +var agentStates = []string{"Pending", "Planning", "Running", "Waiting", "Done", "Failed", "Skipped"} + +// agentStatePick is a select over agentStates, logging changes. +func agentStatePick(c *ui.Context, log func(string), v *string) mujica.AgentState { + if ui.Select(c, v, agentStates).Changed() { + log("state = " + *v) + } + for i, s := range agentStates { + if s == *v { + return mujica.AgentState(i) + } + } + panic("gallery: unknown state " + *v) +} + +type toolCallDemoState struct { + state string + failed bool + still bool +} + +func toolCallCardDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "261", func() toolCallDemoState { return toolCallDemoState{state: "Done"} }) + var st mujica.AgentState + overlayControls(c, func() { + st = agentStatePick(c, log, &s.state) + overlayCheck(c, log, &s.failed, "Error") + overlayCheck(c, log, &s.still, "Still") + }) + call := mujica.ToolCall{ID: "1", Name: "read_file", Args: `{"path":"court/ledger.md","limit":40}`, + Result: `{"lines":40,"truncated":false}`, State: st, Duration: 420 * time.Millisecond} + if s.failed { + call.Error = "permission denied: court/ledger.md" + } + if mujica.ToolCallCard(c, call, mujica.ToolCallCardOptions{Still: s.still}).Changed() { + log("folded or unfolded a section") + } +} + +func toolCallGroupDemo(c *ui.Context, log func(string)) { + open := ui.Local(c.Root(), "262", func() bool { return true }) + calls := []mujica.ToolCall{ + {ID: "a", Name: "list_dir", Args: `{"path":"court"}`, Result: `["ledger.md","menu.md"]`, State: mujica.AgentDone, Duration: 300 * time.Millisecond}, + {ID: "b", Name: "read_file", Args: `{"path":"court/wine.md"}`, Error: "not found", State: mujica.AgentFailed, Duration: 1200 * time.Millisecond}, + {ID: "c", Name: "grep", Args: `{"pattern":"Sakiko"}`, Result: `{"matches":3}`, State: mujica.AgentDone, Duration: 500 * time.Millisecond}, + } + if mujica.ToolCallGroup(c, open, calls, mujica.ToolCallGroupOptions{}).Changed() { + log(fmt.Sprintf("group open = %v", *open)) + } +} + +func toolApprovalDemo(c *ui.Context, log func(string)) { + open := ui.Local(c.Root(), "263", func() bool { return false }) + if mujica.Button(c, "Run delete_files", mujica.ButtonOptions{}).Clicked() { + *open = true + log("asked for approval") + } + r := mujica.ToolApprovalDialog(c, open, mujica.ToolApprovalOptions{Tool: "delete_files", + Args: `{"glob":"build/*.tmp","dry_run":false}`, Reason: "The agent wants to clean temporary files from the build folder."}) + if r.Allowed { + log("allowed") + } + if r.Denied { + log("denied") + } +} + +type permissionDemoState struct { + open bool + grant string +} + +func permissionDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "264", func() permissionDemoState { return permissionDemoState{grant: "none"} }) + ui.Row(c).Gap(12).AlignItems(ui.Center).Children(func() { + if mujica.Button(c, "Ask to write", mujica.ButtonOptions{}).Clicked() { + s.open = true + log("asked for permission") + } + ui.Text(c, "Grant: "+s.grant) + }) + r := mujica.PermissionPrompt(c, &s.open, mujica.PermissionPromptOptions{Title: "Write to the ledger?", + Description: "The agent wants to record tonight's guests.", Scope: "Write access to ~/court/ledger and its subfolders"}) + if r.Choice != mujica.PermissionNone { + s.grant = [...]string{"none", "once", "always", "denied"}[r.Choice] + log("choice = " + s.grant) + } +} + +type stepDemoState struct { + steps []mujica.AgentStep + disabled bool +} + +func agentStepListDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "265", func() stepDemoState { + return stepDemoState{steps: []mujica.AgentStep{ + {ID: "read", Title: "Read the guest list", State: mujica.AgentDone, Duration: 800 * time.Millisecond, Detail: "42 guests, 3 arrive late."}, + {ID: "seat", Title: "Assign the seats", State: mujica.AgentFailed, Duration: 2 * time.Second, Detail: "Table 4 is over capacity."}, + {ID: "send", Title: "Send the invitations", State: mujica.AgentPending}, + }} + }) + overlayControls(c, func() { overlayCheck(c, log, &s.disabled, "Disabled") }) + r := mujica.AgentStepList(c, s.steps, mujica.AgentStepListOptions{Disabled: s.disabled}) + if r.Toggled != "" { + log("toggled " + r.Toggled) + } + if r.Retry != "" { + log("retry " + r.Retry) + for i := range s.steps { + if s.steps[i].ID == r.Retry { + s.steps[i].State, s.steps[i].Detail = mujica.AgentRunning, "Retrying with a larger table." + } + } + } +} + +type planDemoState struct { + items []mujica.PlanItem + disabled bool +} + +func agentPlanDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "266", func() planDemoState { + return planDemoState{items: []mujica.PlanItem{ + {ID: "a", Text: "Read the guest list", State: mujica.AgentDone}, + {ID: "b", Text: "Assign the seats", State: mujica.AgentRunning}, + {ID: "c", Text: "Order the flowers"}, + }} + }) + overlayControls(c, func() { + overlayCheck(c, log, &s.disabled, "Disabled") + if mujica.Button(c, "Agent finishes a step", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() { + for i := range s.items { + if s.items[i].State != mujica.AgentDone && s.items[i].State != mujica.AgentSkipped { + s.items[i].State = mujica.AgentDone + log("agent checked " + s.items[i].Text) + break + } + } + } + }) + if mujica.AgentPlan(c, &s.items, mujica.AgentPlanOptions{Disabled: s.disabled}).Changed() { + log(fmt.Sprintf("plan changed (%d items)", len(s.items))) + } +} + +type statusDemoState struct { + state string + still bool +} + +func agentStatusDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "267", func() statusDemoState { return statusDemoState{state: "Running"} }) + var st mujica.AgentState + overlayControls(c, func() { + st = agentStatePick(c, log, &s.state) + overlayCheck(c, log, &s.still, "Still") + }) + ui.Row(c).Gap(8).Wrap().Children(func() { + mujica.AgentStatus(c, st, mujica.AgentStatusOptions{Still: s.still}) + for _, v := range []mujica.AgentState{mujica.AgentPlanning, mujica.AgentRunning, mujica.AgentWaiting, mujica.AgentDone, mujica.AgentFailed} { + mujica.AgentStatus(c, v, mujica.AgentStatusOptions{Still: s.still}) + } + }) +} + +type progressDemoState struct { + value float64 + indeterminate bool +} + +func agentProgressDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "268", func() progressDemoState { return progressDemoState{value: 0.4} }) + overlayControls(c, func() { + if ui.Slider(c, &s.value, 0, 1).Width(200).Changed() { + log(fmt.Sprintf("value = %.2f", s.value)) + } + overlayCheck(c, log, &s.indeterminate, "Indeterminate") + }) + action := "Reading ledger.md" + if s.value > 0.5 { + action = "Writing the seating chart" + } + mujica.AgentProgress(c, s.value, mujica.AgentProgressOptions{Label: "Preparing the ball", Action: action, Indeterminate: s.indeterminate}) +} + +func subAgentTreeDemo(c *ui.Context, log func(string)) { + disabled := ui.Local(c.Root(), "269", func() bool { return false }) + overlayControls(c, func() { overlayCheck(c, log, disabled, "Disabled") }) + agents := []mujica.SubAgent{{ID: "lead", Name: "Steward", Task: "Prepare the ball", State: mujica.AgentRunning, Children: []mujica.SubAgent{ + {ID: "music", Name: "Musician", Task: "Hire the quartet", State: mujica.AgentDone}, + {ID: "kitchen", Name: "Cook", Task: "Plan the menu", State: mujica.AgentWaiting, Children: []mujica.SubAgent{ + {ID: "wine", Name: "Sommelier", Task: "Choose the wine", State: mujica.AgentFailed}, + }}, + }}} + if mujica.SubAgentTree(c, agents, mujica.SubAgentTreeOptions{Disabled: *disabled}).Changed() { + log("expanded or collapsed an agent") + } +} + +type fileChangeDemoState struct { + decision mujica.FileDecision + disabled bool + preview float64 +} + +func fileChangeCardDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "270", func() fileChangeDemoState { return fileChangeDemoState{preview: 8} }) + overlayControls(c, func() { + overlayCheck(c, log, &s.disabled, "Disabled") + overlaySlider(c, log, &s.preview, "Preview", "lines", 2, 12, 1) + }) + r := mujica.FileChangeCard(c, &s.decision, agentDemoChange, mujica.FileChangeCardOptions{Preview: int(s.preview), Disabled: s.disabled}) + if r.Decided { + log(fmt.Sprintf("decision = %d", s.decision)) + } + if r.OpenDiff { + log("open the full diff") + } +} + +var agentDemoChange = mujica.FileChange{Path: "court/ledger.md", + Old: "# Ledger\nGuests: 40\nWine: claret\nMusic: none\nHall: east wing\n", + New: "# Ledger\nGuests: 42\nWine: claret\nMusic: quartet\nFlowers: lilies\nHall: east wing\n"} diff --git a/examples/gallery/pages_agent_code.go b/examples/gallery/pages_agent_code.go new file mode 100644 index 0000000..1503640 --- /dev/null +++ b/examples/gallery/pages_agent_code.go @@ -0,0 +1,196 @@ +package main + +// Code snippets of the Agent pages, the same as their compiled Examples. + +const toolCallCardCode = `call := mujica.ToolCall{ID: "1", Name: "read_file", Args: "{\"path\":\"ledger.md\"}", + Result: "{\"lines\":40}", State: mujica.AgentDone, Duration: 420 * time.Millisecond} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ToolCallCard(c, call, mujica.ToolCallCardOptions{OpenArgs: true}) +} +ui.Render(view, 400, 300, 1)` + +const toolCallGroupCode = `open := false +calls := []mujica.ToolCall{ + {ID: "a", Name: "list_dir", State: mujica.AgentDone, Duration: 300 * time.Millisecond}, + {ID: "b", Name: "read_file", State: mujica.AgentFailed, Error: "not found"}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ToolCallGroup(c, &open, calls, mujica.ToolCallGroupOptions{}) +} +ui.Render(view, 400, 300, 1)` + +const toolApprovalDialogCode = `open := true +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.ToolApprovalDialog(c, &open, mujica.ToolApprovalOptions{ + Tool: "delete_files", Args: "{\"glob\":\"*.tmp\"}", Reason: "Clean the build folder.", + }) + if r.Allowed { + fmt.Println("run the tool") + } +} +ui.Render(view, 400, 300, 1)` + +const permissionPromptCode = `open := true +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.PermissionPrompt(c, &open, mujica.PermissionPromptOptions{ + Title: "Write to the ledger?", Scope: "Write access to ~/court/ledger", + }) + if r.Choice == mujica.PermissionAllowAlways { + fmt.Println("remember the grant") + } +} +ui.Render(view, 400, 300, 1)` + +const agentStepListCode = `steps := []mujica.AgentStep{ + {ID: "read", Title: "Read the guest list", State: mujica.AgentDone, Duration: time.Second}, + {ID: "seat", Title: "Assign the seats", State: mujica.AgentFailed, Detail: "Table 4 is full."}, + {ID: "send", Title: "Send invitations", State: mujica.AgentPending}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if r := mujica.AgentStepList(c, steps, mujica.AgentStepListOptions{}); r.Retry != "" { + fmt.Println("retry", r.Retry) + } +} +ui.Render(view, 400, 300, 1)` + +const agentPlanCode = `items := []mujica.PlanItem{ + {ID: "a", Text: "Read the guest list", State: mujica.AgentDone}, + {ID: "b", Text: "Assign the seats", State: mujica.AgentRunning}, + {ID: "c", Text: "Order the flowers"}, +} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AgentPlan(c, &items, mujica.AgentPlanOptions{}) +} +ui.Render(view, 400, 300, 1)` + +const agentStatusCode = `view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AgentStatus(c, mujica.AgentWaiting, mujica.AgentStatusOptions{}) +} +ui.Render(view, 400, 300, 1)` + +const agentProgressCode = `view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.AgentProgress(c, 0.4, mujica.AgentProgressOptions{Action: "Reading ledger.md"}) +} +ui.Render(view, 400, 300, 1)` + +const subAgentTreeCode = `agents := []mujica.SubAgent{{ID: "lead", Name: "Steward", State: mujica.AgentRunning, Children: []mujica.SubAgent{ + {ID: "cook", Name: "Cook", Task: "Plan the menu", State: mujica.AgentWaiting}, +}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.SubAgentTree(c, agents, mujica.SubAgentTreeOptions{}) +} +ui.Render(view, 400, 300, 1)` + +const fileChangeCardCode = `decision := mujica.FilePending +change := mujica.FileChange{Path: "ledger.md", Old: "Guests: 40\n", New: "Guests: 42\n"} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.FileChangeCard(c, &decision, change, mujica.FileChangeCardOptions{}).OpenDiff { + fmt.Println("open the full diff") + } +} +ui.Render(view, 400, 300, 1)` + +const multiFileDiffReviewCode = `files := []mujica.FileChange{ + {Path: "ledger.md", Old: "Guests: 40\n", New: "Guests: 42\n"}, + {Path: "menu.md", Old: "soup\n", New: "soup\ntart\n"}, +} +decisions := make([]mujica.FileDecision, len(files)) +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.MultiFileDiffReview(c, &decisions, files, mujica.MultiFileDiffReviewOptions{}) +} +ui.Render(view, 400, 300, 1)` + +const commandExecutionCardCode = `run := mujica.CommandRun{Command: "go test ./...", Dir: "~/court", Running: true, Output: "\x1b[32mok\x1b[0m court\n"} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.CommandExecutionCard(c, run, mujica.CommandExecutionCardOptions{}).Changed() { + fmt.Println("abort the process") + } +} +ui.Render(view, 400, 300, 1)` + +const screenshotStreamCode = `var st mujica.ScreenshotStreamState +var frames []mujica.ScreenshotFrame // appended as the agent captures them +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ScreenshotStream(c, &st, frames, mujica.ScreenshotStreamOptions{}) +} +ui.Render(view, 400, 300, 1)` + +const artifactPanelCode = `art := mujica.Artifact{Title: "seating.go", Language: "go", Content: "package court\n"} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ArtifactPanel(c, art, mujica.ArtifactPanelOptions{}).Exported { + fmt.Println("save the file") + } +} +ui.Render(view, 400, 300, 1)` + +const artifactVersionSwitcherCode = `current := 1 +versions := []mujica.ArtifactVersion{{Label: "v1", Note: "First draft"}, {Label: "v2", Note: "Added music"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.ArtifactVersionSwitcher(c, ¤t, versions, mujica.ArtifactVersionSwitcherOptions{}).Compare { + fmt.Println("diff v1 and v2") + } +} +ui.Render(view, 400, 300, 1)` + +const sandboxStatusCode = `info := mujica.SandboxInfo{Name: "sandbox-7", State: mujica.SandboxRunning, + Resources: []mujica.SandboxResource{{Name: "CPU", Used: 1.5, Limit: 2, Unit: "cores"}}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.SandboxStatus(c, info, mujica.SandboxStatusOptions{}) +} +ui.Render(view, 400, 300, 1)` + +const mcpServerListCode = `servers := []mujica.MCPServer{{ID: "fs", Name: "filesystem", Transport: "stdio", State: mujica.MCPConnected, Tools: 12}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if r := mujica.MCPServerList(c, servers, mujica.MCPServerListOptions{}); r.Action == mujica.MCPStop { + fmt.Println("stop", r.Server) + } +} +ui.Render(view, 400, 300, 1)` + +const memoryPanelCode = `entries := []mujica.MemoryEntry{{ID: "1", Text: "Lady Sakiko prefers the east wing.", Source: "Chat"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if r := mujica.MemoryPanel(c, &entries, mujica.MemoryPanelOptions{}); r.Deleted != "" { + fmt.Println("forget", r.Deleted) + } +} +ui.Render(view, 400, 300, 1)` + +const checkpointListCode = `current := "c2" +points := []mujica.Checkpoint{{ID: "c2", Label: "Menu drafted"}, {ID: "c1", Label: "Start"}} +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + if mujica.CheckpointList(c, ¤t, points, mujica.CheckpointListOptions{}).Changed() { + fmt.Println("restore", current) + } +} +ui.Render(view, 400, 300, 1)` + +const humanInputRequestCode = `answer := "" +view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + r := mujica.HumanInputRequest(c, &answer, mujica.HumanInputRequestOptions{ + Question: "Which hall?", Options: []string{"East wing", "Great hall"}, AllowFree: true, + }) + if r.Submitted { + fmt.Println("reply", answer) + } +} +ui.Render(view, 400, 300, 1)` diff --git a/examples/gallery/pages_agent_more.go b/examples/gallery/pages_agent_more.go new file mode 100644 index 0000000..dbc4b9b --- /dev/null +++ b/examples/gallery/pages_agent_more.go @@ -0,0 +1,285 @@ +package main + +import ( + "fmt" + "image" + "time" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +type multiFileDemoState struct { + decisions []mujica.FileDecision + disabled bool +} + +var agentDemoFiles = []mujica.FileChange{ + agentDemoChange, + {Path: "court/menu.md", Old: "soup\nroast\n", New: "soup\nroast\ntart\n"}, + {Path: "court/old-plan.md", Old: "Hold the ball in the cellar.\n"}, +} + +func multiFileDiffDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "271", func() multiFileDemoState { + return multiFileDemoState{decisions: make([]mujica.FileDecision, len(agentDemoFiles))} + }) + overlayControls(c, func() { + overlayCheck(c, log, &s.disabled, "Disabled") + if mujica.Button(c, "Reset", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() { + clear(s.decisions) + log("reset") + } + }) + if mujica.MultiFileDiffReview(c, &s.decisions, agentDemoFiles, mujica.MultiFileDiffReviewOptions{Disabled: s.disabled}).Changed() { + log(fmt.Sprintf("decisions = %v", s.decisions)) + } +} + +type commandDemoState struct { + run mujica.CommandRun + disabled bool + lines int +} + +func commandExecutionDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "272", func() commandDemoState { + return commandDemoState{run: mujica.CommandRun{Command: "go test ./court/...", Dir: "~/projects/court", Running: true}} + }) + overlayControls(c, func() { + overlayCheck(c, log, &s.disabled, "Disabled") + if mujica.Button(c, "Print a line", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() { + s.lines++ + color := []string{"32mok ", "33mwarn", "31mFAIL"}[s.lines%3] + s.run.Output += fmt.Sprintf("\x1b[%s\x1b[0m court/case%d 0.%02ds\n", color, s.lines, s.lines) + log("printed a line") + } + if mujica.Button(c, "Restart", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() { + s.run.Running, s.run.Output, s.lines = true, "", 0 + log("restarted") + } + }) + if mujica.CommandExecutionCard(c, s.run, mujica.CommandExecutionCardOptions{Disabled: s.disabled}).Changed() { + s.run.Running, s.run.ExitCode, s.run.Duration = false, 130, time.Duration(s.lines)*time.Second + s.run.Output += "\x1b[31maborted by user\x1b[0m\n" + log("abort requested") + } +} + +type screenshotDemoState struct { + st mujica.ScreenshotStreamState + frames []mujica.ScreenshotFrame + disabled bool +} + +// agentDemoFrame paints a frame with a moving block. +func agentDemoFrame(i int) mujica.ScreenshotFrame { + img := image.NewRGBA(image.Rect(0, 0, 320, 180)) + for y := range 180 { + for x := range 320 { + o := img.PixOffset(x, y) + v := uint8(235) + if x >= 20+i*24%260 && x < 60+i*24%260 && y > 60 && y < 120 { + v = 120 + } + img.Pix[o], img.Pix[o+1], img.Pix[o+2], img.Pix[o+3] = v, v-10, v-20, 255 + } + } + return mujica.ScreenshotFrame{Image: ui.NewBitmap(img), Caption: fmt.Sprintf("Clicked button %d", i+1), At: time.Duration(i) * 2 * time.Second} +} + +func screenshotStreamDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "273", func() screenshotDemoState { + return screenshotDemoState{frames: []mujica.ScreenshotFrame{agentDemoFrame(0), agentDemoFrame(1)}} + }) + overlayControls(c, func() { + overlayCheck(c, log, &s.disabled, "Disabled") + if mujica.Button(c, "Capture a frame", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() { + s.frames = append(s.frames, agentDemoFrame(len(s.frames))) + log(fmt.Sprintf("frame %d arrived", len(s.frames))) + } + }) + if mujica.ScreenshotStream(c, &s.st, s.frames, mujica.ScreenshotStreamOptions{Height: 220, Disabled: s.disabled}).Changed() { + log(fmt.Sprintf("frame %d, paused = %v", s.st.Index+1, s.st.Paused)) + } +} + +type artifactDemoState struct { + kind string + disabled bool +} + +func artifactPanelDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "274", func() artifactDemoState { return artifactDemoState{kind: "Code"} }) + overlayControls(c, func() { + if ui.Select(c, &s.kind, []string{"Code", "Document"}).Changed() { + log("kind = " + s.kind) + } + overlayCheck(c, log, &s.disabled, "Disabled") + }) + art := mujica.Artifact{Title: "seating.go", Language: "go", + Content: "package court\n\n// Seats maps guests to tables.\nfunc Seats() map[string]int {\n\treturn map[string]int{\"Sakiko\": 1, \"Uika\": 2}\n}\n"} + opts := mujica.ArtifactPanelOptions{Height: 200, Disabled: s.disabled} + if s.kind == "Document" { + art = mujica.Artifact{Title: "Invitation", Kind: mujica.ArtifactDocument, Content: "# You are invited\n\nThe masquerade begins at nine.\n"} + opts.Preview = func() { + mujica.Heading(c, "You are invited", mujica.HeadingOptions{}) + ui.Text(c, "The masquerade begins at nine.") + } + } + r := mujica.ArtifactPanel(c, art, opts) + if r.Copied { + log("copied to the clipboard") + } + if r.Exported { + log("export requested") + } +} + +type versionDemoState struct { + current int + disabled bool +} + +func artifactVersionDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "275", func() versionDemoState { return versionDemoState{current: 2} }) + overlayControls(c, func() { overlayCheck(c, log, &s.disabled, "Disabled") }) + versions := []mujica.ArtifactVersion{{Label: "v1", Note: "First draft"}, {Label: "v2", Note: "Added the quartet"}, {Label: "v3", Note: "Moved the wine table"}} + r := mujica.ArtifactVersionSwitcher(c, &s.current, versions, mujica.ArtifactVersionSwitcherOptions{Disabled: s.disabled}) + if r.Changed { + log("version = " + versions[s.current].Label) + } + if r.Compare { + log("compare " + versions[s.current-1].Label + " and " + versions[s.current].Label) + } +} + +type sandboxDemoState struct { + state string + cpu float64 + expires time.Time +} + +func sandboxStatusDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "276", func() sandboxDemoState { + return sandboxDemoState{state: "Running", cpu: 1.2, expires: time.Now().Add(10 * time.Minute)} + }) + names := []string{"Starting", "Running", "Stopped", "Failed"} + state := mujica.SandboxStarting + overlayControls(c, func() { + if ui.Select(c, &s.state, names).Changed() { + log("state = " + s.state) + } + overlaySlider(c, log, &s.cpu, "CPU", "cores", 0, 2, 0.1) + if mujica.Button(c, "Extend 5 min", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() { + s.expires = s.expires.Add(5 * time.Minute) + log("extended") + } + }) + for i, n := range names { + if n == s.state { + state = mujica.SandboxState(i) + } + } + mujica.SandboxStatus(c, mujica.SandboxInfo{Name: "sandbox-7", State: state, Expires: s.expires, Resources: []mujica.SandboxResource{ + {Name: "CPU", Used: s.cpu, Limit: 2, Unit: "cores"}, {Name: "Memory", Used: 3.1, Limit: 4, Unit: "GB"}, + }}, mujica.SandboxStatusOptions{}) +} + +type mcpDemoState struct { + servers []mujica.MCPServer + disabled bool +} + +func mcpServerListDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "277", func() mcpDemoState { + return mcpDemoState{servers: []mujica.MCPServer{ + {ID: "fs", Name: "filesystem", Transport: "stdio", State: mujica.MCPConnected, Tools: 12}, + {ID: "gh", Name: "github", Transport: "http", State: mujica.MCPError, Error: "401 Unauthorized"}, + {ID: "db", Name: "postgres", Transport: "stdio", State: mujica.MCPStopped}, + }} + }) + overlayControls(c, func() { overlayCheck(c, log, &s.disabled, "Disabled") }) + r := mujica.MCPServerList(c, s.servers, mujica.MCPServerListOptions{Disabled: s.disabled}) + if r.Action == mujica.MCPNone { + return + } + log(fmt.Sprintf("%s: %s", r.Server, [...]string{"", "start", "stop", "reconnect"}[r.Action])) + for i := range s.servers { + if s.servers[i].ID != r.Server { + continue + } + switch r.Action { + case mujica.MCPStop: + s.servers[i].State = mujica.MCPStopped + default: + s.servers[i].State, s.servers[i].Tools, s.servers[i].Error = mujica.MCPConnected, 5, "" + } + } +} + +type memoryDemoState struct { + entries []mujica.MemoryEntry + disabled bool +} + +func memoryPanelDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "278", func() memoryDemoState { + return memoryDemoState{entries: []mujica.MemoryEntry{ + {ID: "1", Text: "Lady Sakiko prefers the east wing.", Source: "Chat, 3 Oct"}, + {ID: "2", Text: "The quartet needs two days' notice.", Source: "Plan, 1 Oct"}, + {ID: "3", Text: "Claret is served after nine.", Source: "Ledger"}, + }} + }) + overlayControls(c, func() { overlayCheck(c, log, &s.disabled, "Disabled") }) + r := mujica.MemoryPanel(c, &s.entries, mujica.MemoryPanelOptions{Disabled: s.disabled}) + if r.Edited != "" { + log("edited " + r.Edited) + } + if r.Deleted != "" { + log("deleted " + r.Deleted) + } +} + +type checkpointDemoState struct { + current string + disabled bool +} + +func checkpointListDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "279", func() checkpointDemoState { return checkpointDemoState{current: "c3"} }) + overlayControls(c, func() { overlayCheck(c, log, &s.disabled, "Disabled") }) + points := []mujica.Checkpoint{{ID: "c3", Label: "Seats assigned", Note: "12 files changed"}, + {ID: "c2", Label: "Menu drafted", Note: "3 files changed"}, {ID: "c1", Label: "Start"}} + if mujica.CheckpointList(c, &s.current, points, mujica.CheckpointListOptions{Disabled: s.disabled}).Changed() { + log("rolled back to " + s.current) + } +} + +type humanDemoState struct { + answer string + free bool + deadline time.Time + disabled bool +} + +func humanInputDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "280", func() humanDemoState { return humanDemoState{free: true} }) + overlayControls(c, func() { + overlayCheck(c, log, &s.free, "AllowFree") + overlayCheck(c, log, &s.disabled, "Disabled") + if mujica.Button(c, "Start a 30 s timer", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() { + s.deadline = time.Now().Add(30 * time.Second) + log("timer started") + } + }) + r := mujica.HumanInputRequest(c, &s.answer, mujica.HumanInputRequestOptions{Question: "Which hall should host the masquerade?", + Options: []string{"East wing", "Great hall"}, AllowFree: s.free, Deadline: s.deadline, Disabled: s.disabled}) + if r.Submitted { + log("answer sent: " + s.answer) + } + if r.TimedOut { + log("timed out") + } +} diff --git a/file_change_card.go b/file_change_card.go new file mode 100644 index 0000000..76785dc --- /dev/null +++ b/file_change_card.go @@ -0,0 +1,85 @@ +package mujica + +import ( + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// FileChangeCardOptions configure a FileChangeCard. +type FileChangeCardOptions struct { + // Preview is the diff lines shown; zero means 8. + Preview int + Disabled bool +} + +// FileChangeResult reports this frame's events. +type FileChangeResult struct { + Element *ui.Element + // Decided reports that *decision changed. + Decided bool + // OpenDiff asks the caller to show the full diff. + OpenDiff bool +} + +// FileChangeCard previews a file change to accept or reject. +func FileChangeCard(c *ui.Context, decision *FileDecision, change FileChange, opts FileChangeCardOptions) FileChangeResult { + if decision == nil || change.Path == "" { + panic("mujica: FileChangeCard needs a decision and a Path") + } + if opts.Preview < 0 { + panic("mujica: FileChangeCard Preview is negative") + } + preview := opts.Preview + if preview == 0 { + preview = 8 + } + u := Density(c).Unit() + var r FileChangeResult + r.Element = agentCard(c).Disabled(opts.Disabled).Label(change.Path) + dc := agentDiffOf(r.Element, change) + locked := r.Element.IsDisabled() + r.Element.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).MinHeight(theme.MinHitSize).Children(func() { + ui.Icon(c, icons.Must("file-text")).Size(16, 16).TextColor(Tokens(c).TextMuted).Shrink(0) + ui.Text(c, change.Path).Font(theme.MonoFont).FontWeight(600).SingleLine().Grow(1).Shrink(1) + switch { + case change.Old == "" && change.New != "": + agentCaption(c, msg(c, "file_change_card.new")) + case change.New == "" && change.Old != "": + agentCaption(c, msg(c, "file_change_card.deleted")) + } + agentDiffStats(c, dc.add, dc.del) + agentDecisionMark(c, *decision) + }) + from := max(0, dc.firstEdit-2) + shown := dc.lines[from:min(len(dc.lines), from+preview)] + if len(shown) > 0 { + agentDiffView(c, shown, 320).Font(theme.MonoFont) + } + ui.Row(c).Gap(u * 2).Justify(ui.End).Wrap().Children(func() { + if Button(c, msg(c, "file_change_card.open"), ButtonOptions{Variant: Ghost, Disabled: locked}).Clicked() && !locked { + r.OpenDiff = true + } + if *decision != FilePending { + if Button(c, msg(c, "file_change_card.undo"), ButtonOptions{Variant: Secondary, Disabled: locked}).Clicked() && !locked { + *decision, r.Decided = FilePending, true + } + return + } + if Button(c, msg(c, "file_change_card.reject"), ButtonOptions{Variant: Secondary, Disabled: locked}).Clicked() && !locked { + *decision, r.Decided = FileRejected, true + } + if Button(c, msg(c, "file_change_card.accept"), ButtonOptions{Disabled: locked}).Clicked() && !locked { + *decision, r.Decided = FileAccepted, true + } + }) + }) + if r.Decided || r.OpenDiff { + slog.Debug("mujica: file_change_card event", "path", change.Path, "decision", int(*decision), "open", r.OpenDiff) + } + return r +} diff --git a/file_change_card_test.go b/file_change_card_test.go new file mode 100644 index 0000000..0c93ff4 --- /dev/null +++ b/file_change_card_test.go @@ -0,0 +1,84 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +var fileChangeSample = FileChange{Path: "court/ledger.md", + Old: "# Ledger\nGuests: 40\nWine: claret\nMusic: none\n", + New: "# Ledger\nGuests: 42\nWine: claret\nMusic: quartet\nFlowers: lilies\n"} + +func fileChangeTester(d *FileDecision, ch FileChange, opts FileChangeCardOptions, got *[]FileChangeResult) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := FileChangeCard(c, d, ch, opts) + if r.Decided || r.OpenDiff { + *got = append(*got, r) + } + }, 560, 400) +} + +func TestFileChangeCardStatsPreviewAndDecide(t *testing.T) { + d := FilePending + var got []FileChangeResult + tt := fileChangeTester(&d, fileChangeSample, FileChangeCardOptions{}, &got) + for _, s := range []string{"court/ledger.md", "+3", "−2", "Pending", "Guests: 40", "Guests: 42", "Flowers: lilies"} { + if !tt.HasText(s) { + t.Fatalf("missing %q in %q", s, tt.Texts()) + } + } + _ = tt.Click("Open diff") + if len(got) != 1 || !got[0].OpenDiff || d != FilePending { + t.Fatalf("open diff: %+v", got) + } + _ = tt.Click("Accept") + if d != FileAccepted || !got[1].Decided || !tt.HasText("Accepted") { + t.Fatalf("accept: %v", d) + } + _ = tt.Click("Undo") + if d != FilePending { + t.Fatalf("undo: %v", d) + } + tt = fileChangeTester(&d, fileChangeSample, FileChangeCardOptions{}, &got) + for range 3 { + tt.Key(0, ui.KeyTab) + if tt.Focused("Reject") { + break + } + } + tt.Key(0, ui.KeyEnter) + if d != FileRejected || !tt.HasText("Rejected") { + t.Fatalf("keyboard reject: %v", d) + } +} + +func TestFileChangeCardPreviewLimitAndNewFile(t *testing.T) { + d := FilePending + var got []FileChangeResult + tt := fileChangeTester(&d, FileChange{Path: "a.txt", New: "1\n2\n3\n4\n5\n"}, FileChangeCardOptions{Preview: 2}, &got) + if !tt.HasText("New file") || !tt.HasText("+5") || !tt.HasText("2") || tt.HasText("3") { + t.Fatalf("texts %q", tt.Texts()) + } +} + +func TestFileChangeCardDisabled(t *testing.T) { + d := FilePending + var got []FileChangeResult + tt := fileChangeTester(&d, fileChangeSample, FileChangeCardOptions{Disabled: true}, &got) + _ = tt.Click("Accept") + _ = tt.Click("Open diff") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if len(got) != 0 || d != FilePending { + t.Fatalf("disabled card acted: %+v %v", got, d) + } +} + +func TestFileChangeCardSnapshot(t *testing.T) { + snapshot(t, "file_change_card", 520, 330, func(c *ui.Context) { + d := FilePending + ui.Column(c).Padding(16).Children(func() { FileChangeCard(c, &d, fileChangeSample, FileChangeCardOptions{}) }) + }) +} diff --git a/human_input_request.go b/human_input_request.go new file mode 100644 index 0000000..1d4a6cf --- /dev/null +++ b/human_input_request.go @@ -0,0 +1,126 @@ +package mujica + +import ( + "fmt" + "log/slog" + "slices" + "strings" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// HumanInputRequestOptions configure a HumanInputRequest. Question is required. +type HumanInputRequestOptions struct { + Question string + // Options are suggested answers; AllowFree adds a free one. + Options []string + AllowFree bool + // Deadline is when the agent stops waiting; zero waits forever. + Deadline time.Time + Disabled bool +} + +// HumanInputResult reports this frame's events. +type HumanInputResult struct { + Element *ui.Element + Submitted bool + // TimedOut reports the frame the deadline passed. + TimedOut bool +} + +type humanInputState struct { + draft string + expired bool +} + +// HumanInputRequest asks the user a question before a deadline. +func HumanInputRequest(c *ui.Context, answer *string, opts HumanInputRequestOptions) HumanInputResult { + if answer == nil || opts.Question == "" { + panic("mujica: HumanInputRequest needs an answer and a Question") + } + if len(opts.Options) == 0 && !opts.AllowFree { + panic("mujica: HumanInputRequest needs Options or AllowFree") + } + k := Tokens(c) + u := Density(c).Unit() + var r HumanInputResult + r.Element = agentCard(c).Border(theme.BorderWidth, k.Info).Role(ui.RoleGroup).Label(opts.Question) + st := ui.Local(r.Element, "mujica.humaninput", func() humanInputState { return humanInputState{} }) + left := time.Duration(0) + if !opts.Deadline.IsZero() { + left = opts.Deadline.Sub(c.Now()) + if left <= 0 && !st.expired { + st.expired, r.TimedOut = true, true + } + } + r.Element.Disabled(opts.Disabled || st.expired) + locked := r.Element.IsDisabled() + r.Element.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Start).Children(func() { + ui.Icon(c, icons.Must("user")).Size(18, 18).TextColor(k.Info).Shrink(0).Margin(2, 0, 0, 0) + ui.Text(c, opts.Question).FontWeight(600).Grow(1).Shrink(1) + }) + if len(opts.Options) > 0 { + items := make([]RadioItem[string], len(opts.Options)) + for i, o := range opts.Options { + items[i] = RadioItem[string]{Value: o, Label: o} + } + chosen := *answer + if RadioGroup(c, &chosen, items, RadioGroupOptions{Label: opts.Question, Disabled: locked}).Changed() && !locked { + *answer, st.draft = chosen, "" + } + } + submit := false + if opts.AllowFree { + in := TextInput(c, &st.draft, TextInputOptions{Placeholder: msg(c, "human_input_request.free"), + Label: msg(c, "human_input_request.free"), Disabled: locked}) + if in.Changed() && !locked { + *answer = st.draft + } + submit = in.Submitted() + } + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + humanInputClock(c, opts.Deadline, left, st.expired) + blank := strings.TrimSpace(*answer) == "" + if Button(c, msg(c, "human_input_request.send"), ButtonOptions{Disabled: locked || blank}).Clicked() { + submit = true + } + r.Submitted = submit && !locked && !blank + }) + }) + if len(opts.Options) > 0 && !opts.AllowFree && *answer != "" && !slices.Contains(opts.Options, *answer) { + panic(fmt.Sprintf("mujica: HumanInputRequest answer %q is not an option", *answer)) + } + if r.Submitted || r.TimedOut { + slog.Debug("mujica: human_input_request event", "submitted", r.Submitted, "timed_out", r.TimedOut) + } + return r +} + +// humanInputClock shows the time left, or that it ran out. +func humanInputClock(c *ui.Context, deadline time.Time, left time.Duration, expired bool) { + k := Tokens(c) + text, tone := "", k.TextMuted + switch { + case expired: + text, tone = msg(c, "human_input_request.timeout"), k.Warning + case !deadline.IsZero(): + text = fmt.Sprintf(msg(c, "human_input_request.left"), agentDuration(left.Truncate(time.Second))) + wait := left % time.Second + if wait == 0 { + wait = time.Second + } + c.After(wait) + } + ui.Row(c).Grow(1).Gap(Density(c).Unit()).AlignItems(ui.Center).Role(ui.RoleStatus).Label(text).Children(func() { + if text == "" { + return + } + ui.Icon(c, icons.Must("clock")).Size(14, 14).TextColor(tone) + ui.Text(c, text).TextColor(tone).FontSize(FontSize(c, theme.CaptionSize+1)) + }) +} diff --git a/human_input_request_test.go b/human_input_request_test.go new file mode 100644 index 0000000..cb82671 --- /dev/null +++ b/human_input_request_test.go @@ -0,0 +1,94 @@ +package mujica + +import ( + "strings" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func humanTester(answer *string, opts *HumanInputRequestOptions, got *[]HumanInputResult) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := HumanInputRequest(c, answer, *opts) + if r.Submitted || r.TimedOut { + *got = append(*got, r) + } + }, 560, 400) +} + +func TestHumanInputRequestOptionAndFree(t *testing.T) { + answer := "" + opts := HumanInputRequestOptions{Question: "Which hall for the ball?", Options: []string{"East wing", "Great hall"}, AllowFree: true} + var got []HumanInputResult + tt := humanTester(&answer, &opts, &got) + _ = tt.Click("Send answer") // disabled while blank + if len(got) != 0 { + t.Fatal("blank answer sent") + } + _ = tt.Click("Great hall") + if answer != "Great hall" { + t.Fatalf("option: %q", answer) + } + _ = tt.Click("Or write your own answer") + tt.Type("The garden") + if answer != "The garden" { + t.Fatalf("free: %q", answer) + } + tt.Key(0, ui.KeyEnter) + if len(got) != 1 || !got[0].Submitted { + t.Fatalf("Enter: %+v", got) + } +} + +func TestHumanInputRequestDeadline(t *testing.T) { + answer := "East wing" + opts := HumanInputRequestOptions{Question: "Which hall?", Options: []string{"East wing"}, Deadline: time.Now().Add(75 * time.Second)} + var got []HumanInputResult + tt := humanTester(&answer, &opts, &got) + found := false + for _, s := range tt.Texts() { + found = found || strings.HasPrefix(s, "Answer within 1 m 1") + } + if !found { + t.Fatalf("countdown missing: %q", tt.Texts()) + } + opts.Deadline = time.Now().Add(-time.Second) + tt.Frame() + tt.Frame() + if len(got) != 1 || !got[0].TimedOut || !tt.HasText("The agent stopped waiting") { + t.Fatalf("timeout: %+v", got) + } + _ = tt.Click("Send answer") + if len(got) != 1 { + t.Fatal("answer sent after the deadline") + } +} + +func TestHumanInputRequestDisabledAndRules(t *testing.T) { + answer := "" + opts := HumanInputRequestOptions{Question: "Which hall?", Options: []string{"East wing"}, Disabled: true} + var got []HumanInputResult + tt := humanTester(&answer, &opts, &got) + _ = tt.Click("East wing") + if answer != "" { + t.Fatal("disabled request changed the answer") + } + defer func() { + if recover() == nil { + t.Fatal("no options and no free answer did not panic") + } + }() + humanTester(&answer, &HumanInputRequestOptions{Question: "x"}, &got) +} + +func TestHumanInputRequestSnapshot(t *testing.T) { + snapshot(t, "human_input_request", 520, 300, func(c *ui.Context) { + answer := "Great hall" + ui.Column(c).Padding(16).Children(func() { + HumanInputRequest(c, &answer, HumanInputRequestOptions{Question: "Which hall should host the masquerade?", + Options: []string{"East wing", "Great hall"}, AllowFree: true}) + }) + }) +} diff --git a/internal/diff.go b/internal/diff.go index ccc9071..332c68f 100644 --- a/internal/diff.go +++ b/internal/diff.go @@ -2,7 +2,7 @@ package internal import "strings" -// DiffOp says whether a diff line is kept, removed or added. +// DiffOp says a line is kept, removed or added. type DiffOp uint8 const ( @@ -11,14 +11,14 @@ const ( DiffInsert ) -// DiffLine is one line of a line diff with its 1-based line numbers; 0 means absent. +// DiffLine is a numbered diff line; 0 means absent. type DiffLine struct { Op DiffOp Text string Old, New int } -// SplitLines splits text into lines without their line breaks; "" has no lines. +// SplitLines splits text into lines; "" has none. func SplitLines(s string) []string { if s == "" { return nil @@ -26,7 +26,7 @@ func SplitLines(s string) []string { return strings.Split(strings.TrimSuffix(s, "\n"), "\n") } -// LineDiff returns a shortest edit script turning a into b (Myers, O((N+M)D)). +// LineDiff returns a shortest edit script from a to b. func LineDiff(a, b []string) []DiffLine { // Common prefix and suffix need no search. pre := 0 @@ -49,7 +49,7 @@ func LineDiff(a, b []string) []DiffLine { return out } -// myers appends the edit script of a to b, numbering from offsets ao and bo. +// myers appends the edit script, numbering from ao and bo. func myers(out []DiffLine, a, b []string, ao, bo int) []DiffLine { n, m := len(a), len(b) total := n + m @@ -80,7 +80,7 @@ func myers(out []DiffLine, a, b []string, ao, bo int) []DiffLine { } } } - // Walk the trace back from (n, m), collecting moves in reverse. + // Walk the trace back, collecting moves in reverse. var rev []DiffLine x, y := n, m for d := end; d >= 0; d-- { diff --git a/mcp_server_list.go b/mcp_server_list.go new file mode 100644 index 0000000..649fdaa --- /dev/null +++ b/mcp_server_list.go @@ -0,0 +1,144 @@ +package mujica + +import ( + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// MCPState is a server connection; zero is stopped. +type MCPState int + +const ( + MCPStopped MCPState = iota + MCPConnecting + MCPConnected + MCPError +) + +// MCPServer is one configured MCP server; the caller owns it. +type MCPServer struct { + ID string + Name string + Transport string + State MCPState + Tools int + // Error explains MCPError. + Error string +} + +// MCPAction is a list request; zero is none. +type MCPAction int + +const ( + MCPNone MCPAction = iota + MCPStart + MCPStop + MCPReconnect +) + +// MCPServerListOptions configure an MCPServerList. +type MCPServerListOptions struct { + // MaxHeight caps the scrolling list; zero means 360. + MaxHeight float32 + Disabled bool + Still bool +} + +// MCPServerListResult reports this frame's request. +type MCPServerListResult struct { + Element *ui.Element + Action MCPAction + // Server is the ID the action is for. + Server string +} + +// MCPServerList lists MCP servers with start, stop and reconnect. +func MCPServerList(c *ui.Context, servers []MCPServer, opts MCPServerListOptions) MCPServerListResult { + seen := map[string]bool{} + for i, s := range servers { + if s.ID == "" || s.Name == "" || seen[s.ID] || s.Tools < 0 || s.State < MCPStopped || s.State > MCPError { + panic(fmt.Sprintf("mujica: MCPServerList server %d needs a unique ID, a Name, a known State and Tools >= 0", i)) + } + seen[s.ID] = true + } + if opts.MaxHeight < 0 { + panic("mujica: MCPServerList MaxHeight is negative") + } + maxH := opts.MaxHeight + if maxH == 0 { + maxH = 360 + } + var r MCPServerListResult + r.Element = ui.Column(c).Shrink(0).Disabled(opts.Disabled).Label(msg(c, "mcp_server_list.label")) + locked := r.Element.IsDisabled() + r.Element.Children(func() { + if len(servers) == 0 { + agentCaption(c, msg(c, "mcp_server_list.empty")) + return + } + k := Tokens(c) + agentRows(c, len(servers), func(i int) { + if a := mcpServerRow(c, servers[i], locked, opts.Still); a != MCPNone && !locked { + r.Action, r.Server = a, servers[i].ID + } + }).Shrink(1).MaxHeight(maxH).Background(k.Surface).Border(theme.BorderWidth, k.Border).Radius(theme.CardRadius). + Dividers(theme.BorderWidth, k.Border) + }) + if r.Action != MCPNone { + slog.Debug("mujica: mcp_server_list action", "server", r.Server, "action", int(r.Action)) + } + return r +} + +// mcpServerRow builds one server, returning its pressed action. +func mcpServerRow(c *ui.Context, s MCPServer, locked, still bool) MCPAction { + k := Tokens(c) + d := Density(c) + u := d.Unit() + words := [...]string{"stopped", "connecting", "connected", "error"} + word := msg(c, "mcp_server_list."+words[s.State]) + act := MCPNone + ui.Row(c).Key(s.ID).Gap(u*3).AlignItems(ui.Center).MinHeight(d.ControlHeight()+u*2).Padding(u*2, u*3). + Label(s.Name + ", " + word).Children(func() { + switch s.State { + case MCPConnecting: + agentMark(c, AgentRunning, 16, still) + case MCPConnected: + agentMark(c, AgentDone, 16, still) + case MCPError: + agentMark(c, AgentFailed, 16, still) + default: + ui.Icon(c, icons.Must("wifi-off")).Size(16, 16).TextColor(k.TextMuted) + } + ui.Column(c).Grow(1).Shrink(1).Gap(u / 2).Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + ui.Text(c, s.Name).FontWeight(600).SingleLine() + agentCaption(c, s.Transport).Font(theme.MonoFont) + }) + line := word + if s.State == MCPConnected { + line += " · " + fmt.Sprintf(msg(c, "mcp_server_list.tools"), s.Tools) + } + agentCaption(c, line) + if s.State == MCPError && s.Error != "" { + ui.Text(c, s.Error).TextColor(k.Danger).FontSize(FontSize(c, theme.CaptionSize)).Selectable() + } + }) + if s.State == MCPError && Button(c, msg(c, "mcp_server_list.reconnect"), ButtonOptions{Variant: Outline, Disabled: locked}).Clicked() { + act = MCPReconnect + } + if s.State == MCPStopped { + if Button(c, msg(c, "mcp_server_list.start"), ButtonOptions{Variant: Secondary, Disabled: locked}).Clicked() { + act = MCPStart + } + } else if Button(c, msg(c, "mcp_server_list.stop"), ButtonOptions{Variant: Secondary, Disabled: locked}).Clicked() { + act = MCPStop + } + }) + return act +} diff --git a/mcp_server_list_test.go b/mcp_server_list_test.go new file mode 100644 index 0000000..a3954ee --- /dev/null +++ b/mcp_server_list_test.go @@ -0,0 +1,91 @@ +package mujica + +import ( + "fmt" + "testing" + + "github.com/egoist/mygo/ui" +) + +var mcpServersSample = []MCPServer{ + {ID: "fs", Name: "filesystem", Transport: "stdio", State: MCPConnected, Tools: 12}, + {ID: "gh", Name: "github", Transport: "http", State: MCPError, Error: "401 Unauthorized"}, + {ID: "db", Name: "postgres", Transport: "stdio", State: MCPStopped}, + {ID: "web", Name: "browser", Transport: "sse", State: MCPConnecting}, +} + +func mcpTester(servers []MCPServer, opts MCPServerListOptions, got *[]MCPServerListResult) *ui.Tester { + opts.Still = true + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := MCPServerList(c, servers, opts) + if r.Action != MCPNone { + *got = append(*got, r) + } + }, 600, 460) +} + +func TestMCPServerListStatesAndActions(t *testing.T) { + var got []MCPServerListResult + tt := mcpTester(mcpServersSample, MCPServerListOptions{}, &got) + for _, s := range []string{"Connected · 12 tools", "Connection failed", "401 Unauthorized", "Stopped", "Connecting"} { + if !tt.HasText(s) { + t.Fatalf("missing %q in %q", s, tt.Texts()) + } + } + _ = tt.Click("Reconnect") + _ = tt.Click("Start") + if len(got) != 2 || got[0].Action != MCPReconnect || got[0].Server != "gh" || got[1].Action != MCPStart || got[1].Server != "db" { + t.Fatalf("actions %+v", got) + } + tt = mcpTester(mcpServersSample, MCPServerListOptions{}, &got) + tt.Key(0, ui.KeyTab) // filesystem's Stop + tt.Key(0, ui.KeyEnter) + if len(got) != 3 || got[2].Action != MCPStop || got[2].Server != "fs" { + t.Fatalf("keyboard stop: %+v", got) + } +} + +func TestMCPServerListDisabledAndEmpty(t *testing.T) { + var got []MCPServerListResult + tt := mcpTester(mcpServersSample, MCPServerListOptions{Disabled: true}, &got) + _ = tt.Click("Reconnect") + _ = tt.Click("Start") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if len(got) != 0 { + t.Fatalf("disabled list acted: %+v", got) + } + tt = mcpTester(nil, MCPServerListOptions{}, &got) + if !tt.HasText("No MCP servers") { + t.Fatalf("empty: %q", tt.Texts()) + } +} + +func TestMCPServerListManyServersVirtualized(t *testing.T) { + servers := make([]MCPServer, 100000) + for i := range servers { + servers[i] = MCPServer{ID: fmt.Sprint(i), Name: fmt.Sprintf("server-%d", i), State: MCPConnected, Tools: i % 30} + } + var got []MCPServerListResult + tt := mcpTester(servers, MCPServerListOptions{}, &got) + if n := len(tt.Texts()); n > 300 { + t.Fatalf("%d texts built for 100000 servers", n) + } +} + +func TestMCPServerListRejectsDuplicateIDs(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + var got []MCPServerListResult + mcpTester([]MCPServer{{ID: "a", Name: "x"}, {ID: "a", Name: "y"}}, MCPServerListOptions{}, &got) +} + +func TestMCPServerListSnapshot(t *testing.T) { + snapshot(t, "mcp_server_list", 560, 330, func(c *ui.Context) { + ui.Column(c).Padding(16).Children(func() { MCPServerList(c, mcpServersSample, MCPServerListOptions{Still: true}) }) + }) +} diff --git a/memory_panel.go b/memory_panel.go new file mode 100644 index 0000000..fd275f5 --- /dev/null +++ b/memory_panel.go @@ -0,0 +1,159 @@ +package mujica + +import ( + "fmt" + "log/slog" + "strings" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// MemoryEntry is one memory; the caller persists it. +type MemoryEntry struct { + ID string + Text string + // Source says where it came from, as "Chat, 3 Oct". + Source string +} + +// MemoryPanelOptions configure a MemoryPanel. +type MemoryPanelOptions struct { + // MaxHeight caps the scrolling list; zero means 360. + MaxHeight float32 + Disabled bool +} + +// MemoryPanelResult reports this frame's in-place edits. +type MemoryPanelResult struct { + Element *ui.Element + // Edited and Deleted are changed IDs, else "". + Edited string + Deleted string +} + +type memoryPanelState struct { + query, editing, draft string + confirm string + // The filter reruns only when query or entries change. + key string + shown []int +} + +// MemoryPanel lists memories with search, inline edit and confirmed delete. +func MemoryPanel(c *ui.Context, entries *[]MemoryEntry, opts MemoryPanelOptions) MemoryPanelResult { + if entries == nil { + panic("mujica: MemoryPanel needs entries") + } + if opts.MaxHeight < 0 { + panic("mujica: MemoryPanel MaxHeight is negative") + } + maxH := opts.MaxHeight + if maxH == 0 { + maxH = 360 + } + u := Density(c).Unit() + var r MemoryPanelResult + r.Element = agentCard(c).Disabled(opts.Disabled).Label(msg(c, "memory_panel.title")) + st := ui.Local(r.Element, "mujica.memory", func() memoryPanelState { return memoryPanelState{} }) + locked := r.Element.IsDisabled() + r.Element.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + ui.Text(c, msg(c, "memory_panel.title")).Font(theme.SerifFont).FontSize(FontSize(c, theme.H3Size)).FontWeight(600).Grow(1) + agentCaption(c, fmt.Sprintf(msg(c, "memory_panel.count"), len(*entries))) + }) + SearchInput(c, &st.query, SearchInputOptions{Placeholder: msg(c, "memory_panel.search"), Disabled: locked}) + memoryFilter(st, *entries) + if len(st.shown) == 0 { + agentCaption(c, msg(c, "memory_panel.empty")) + return + } + agentRows(c, len(st.shown), func(i int) { + idx := st.shown[i] + ui.Column(c).Key((*entries)[idx].ID).Children(func() { memoryRow(c, entries, idx, st, locked, &r) }) + }).Shrink(1).MaxHeight(maxH).Dividers(theme.BorderWidth, Tokens(c).Border) + }) + if r.Deleted != "" { + for i, e := range *entries { + if e.ID == r.Deleted { + *entries = append((*entries)[:i:i], (*entries)[i+1:]...) + break + } + } + st.key = "" // refilter + } + if r.Edited != "" || r.Deleted != "" { + slog.Debug("mujica: memory_panel change", "edited", r.Edited, "deleted", r.Deleted) + } + return r +} + +// memoryFilter recomputes matches when inputs change. +func memoryFilter(st *memoryPanelState, entries []MemoryEntry) { + key := fmt.Sprintf("%s\x00%d", st.query, len(entries)) + if len(entries) > 0 { + key += fmt.Sprintf("\x00%p", &entries[0]) + } + if key == st.key && st.shown != nil { + return + } + st.key = key + q := strings.ToLower(strings.TrimSpace(st.query)) + st.shown = st.shown[:0] + for i, e := range entries { + if q == "" || strings.Contains(strings.ToLower(e.Text), q) || strings.Contains(strings.ToLower(e.Source), q) { + st.shown = append(st.shown, i) + } + } + if st.shown == nil { + st.shown = []int{} + } +} + +// memoryRow shows one entry or its editor. +func memoryRow(c *ui.Context, entries *[]MemoryEntry, idx int, st *memoryPanelState, locked bool, r *MemoryPanelResult) { + e := &(*entries)[idx] + if e.ID == "" { + panic(fmt.Sprintf("mujica: MemoryPanel entry %d needs an ID", idx)) + } + u := Density(c).Unit() + ui.Column(c).Gap(u).Padding(u*2, 0).Children(func() { + if st.editing == e.ID && !locked { + TextArea(c, &st.draft, TextAreaOptions{Label: msg(c, "memory_panel.edit"), MinHeight: 60}).Input.AutoFocus() + ui.Row(c).Gap(u * 2).Justify(ui.End).Children(func() { + if Button(c, msg(c, "memory_panel.cancel"), ButtonOptions{Variant: Secondary}).Clicked() { + st.editing = "" + } + blank := strings.TrimSpace(st.draft) == "" + if Button(c, msg(c, "memory_panel.save"), ButtonOptions{Disabled: blank}).Clicked() && !blank { + e.Text, st.editing, st.key = strings.TrimSpace(st.draft), "", "" + r.Edited = e.ID + } + }) + return + } + ui.Text(c, e.Text).Selectable() + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + agentCaption(c, e.Source).Grow(1) + if agentToggle(c, msg(c, "memory_panel.edit"), "", locked) { + st.editing, st.draft = e.ID, e.Text + } + del := ui.Row(c) + del.Children(func() { + if agentToggle(c, msg(c, "memory_panel.delete"), "trash-2", locked) { + st.confirm = e.ID + } + }) + open := st.confirm == e.ID && !locked + res := Popconfirm(c, del, &open, PopconfirmOptions{Title: msg(c, "memory_panel.confirm"), Description: e.Text, + ConfirmLabel: msg(c, "memory_panel.delete"), Danger: true}) + if st.confirm == e.ID && !open { + st.confirm = "" + } + if res.Confirmed { + r.Deleted = e.ID + } + }) + }) +} diff --git a/memory_panel_test.go b/memory_panel_test.go new file mode 100644 index 0000000..3d2db38 --- /dev/null +++ b/memory_panel_test.go @@ -0,0 +1,96 @@ +package mujica + +import ( + "fmt" + "testing" + + "github.com/egoist/mygo/ui" +) + +func memorySample() []MemoryEntry { + return []MemoryEntry{ + {ID: "1", Text: "Lady Sakiko prefers the east wing.", Source: "Chat, 3 Oct"}, + {ID: "2", Text: "The quartet needs two days' notice.", Source: "Plan, 1 Oct"}, + {ID: "3", Text: "Claret is served after nine.", Source: "Ledger"}, + } +} + +func memoryTester(entries *[]MemoryEntry, opts MemoryPanelOptions, got *[]MemoryPanelResult) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := MemoryPanel(c, entries, opts) + if r.Edited != "" || r.Deleted != "" { + *got = append(*got, r) + } + }, 560, 560) +} + +func TestMemoryPanelSearchEditDelete(t *testing.T) { + entries := memorySample() + var got []MemoryPanelResult + tt := memoryTester(&entries, MemoryPanelOptions{}, &got) + if !tt.HasText("3 entries") || !tt.HasText("Claret is served after nine.") { + t.Fatalf("texts %q", tt.Texts()) + } + _ = tt.Click("Search memory") + tt.Type("quartet") + if tt.HasText("Claret is served after nine.") || !tt.HasText("The quartet needs two days' notice.") { + t.Fatalf("search: %q", tt.Texts()) + } + _ = tt.Click("Edit") + tt.Key(ui.Cmd, ui.KeyA) + tt.Type("The quartet needs a week's notice.") + _ = tt.Click("Save") + if entries[1].Text != "The quartet needs a week's notice." || len(got) != 1 || got[0].Edited != "2" { + t.Fatalf("edit: %+v %+v", entries[1], got) + } + _ = tt.Click("Delete") + if !tt.HasText("Forget this memory?") || len(entries) != 3 { + t.Fatal("delete did not ask first") + } + _ = tt.Click("Cancel") + if len(entries) != 3 { + t.Fatal("cancel deleted") + } + _ = tt.Click("Delete") + tt.Key(0, ui.KeyTab) // Cancel has the focus; Tab to Delete + tt.Key(0, ui.KeyEnter) + if len(entries) != 2 || got[1].Deleted != "2" || !tt.HasText("No memories match") { + t.Fatalf("delete: %+v %+v %q", entries, got, tt.Texts()) + } +} + +func TestMemoryPanelDisabled(t *testing.T) { + entries := memorySample() + var got []MemoryPanelResult + tt := memoryTester(&entries, MemoryPanelOptions{Disabled: true}, &got) + _ = tt.Click("Edit") + _ = tt.Click("Delete") + if tt.HasText("Save") || tt.HasText("Forget this memory?") || len(got) != 0 { + t.Fatal("disabled panel acted") + } +} + +func TestMemoryPanelManyEntriesVirtualized(t *testing.T) { + entries := make([]MemoryEntry, 100000) + for i := range entries { + entries[i] = MemoryEntry{ID: fmt.Sprint(i), Text: fmt.Sprintf("fact %d", i), Source: "import"} + } + var got []MemoryPanelResult + tt := memoryTester(&entries, MemoryPanelOptions{}, &got) + if n := len(tt.Texts()); n > 300 { + t.Fatalf("%d texts built for 100000 entries", n) + } + _ = tt.Click("Search memory") + tt.Type("fact 99999") + if !tt.HasText("fact 99999") || tt.HasText("fact 0") { + t.Fatal("search over many entries failed") + } +} + +func TestMemoryPanelSnapshot(t *testing.T) { + snapshot(t, "memory_panel", 520, 360, func(c *ui.Context) { + entries := memorySample() + ui.Column(c).Padding(16).Children(func() { MemoryPanel(c, &entries, MemoryPanelOptions{}) }) + }) +} diff --git a/messages_agent.go b/messages_agent.go new file mode 100644 index 0000000..6bd824e --- /dev/null +++ b/messages_agent.go @@ -0,0 +1,127 @@ +package mujica + +func init() { + addMessages(map[string][2]string{ + "agent_status.pending": {"Pending", "待开始"}, + "agent_status.planning": {"Planning", "规划中"}, + "agent_status.running": {"Running", "执行中"}, + "agent_status.waiting": {"Waiting", "等待中"}, + "agent_status.done": {"Done", "已完成"}, + "agent_status.failed": {"Failed", "失败"}, + "agent_status.skipped": {"Skipped", "已跳过"}, + + "tool_call_card.args": {"Arguments", "参数"}, + "tool_call_card.result": {"Result", "结果"}, + "tool_call_card.error": {"Error", "错误"}, + + "tool_call_group.count": {"%d tool calls", "%d 次工具调用"}, + "tool_call_group.failed": {"%d failed", "%d 次失败"}, + + "tool_approval_dialog.title": {"Allow this tool to run?", "允许运行此工具?"}, + "tool_approval_dialog.tool": {"Tool", "工具"}, + "tool_approval_dialog.allow": {"Allow", "允许"}, + "tool_approval_dialog.deny": {"Deny", "拒绝"}, + + "permission_prompt.deny": {"Deny", "拒绝"}, + "permission_prompt.always": {"Always allow", "始终允许"}, + "permission_prompt.once": {"Allow once", "允许一次"}, + "permission_prompt.scope": {"Always allowing covers", "始终允许的范围"}, + + "agent_step_list.current": {"Current", "当前"}, + "agent_step_list.retry": {"Retry", "重试"}, + + "agent_progress.label": {"Progress", "进度"}, + "sub_agent_tree.children": {"%d sub-agents", "%d 个子智能体"}, + + "file_change_card.stats": {"%d added, %d removed lines", "新增 %d 行,删除 %d 行"}, + "file_change_card.pending": {"Pending", "待审阅"}, + "file_change_card.accepted": {"Accepted", "已接受"}, + "file_change_card.rejected": {"Rejected", "已拒绝"}, + "file_change_card.new": {"New file", "新文件"}, + "file_change_card.deleted": {"Deleted", "已删除"}, + "file_change_card.open": {"Open diff", "打开差异"}, + "file_change_card.undo": {"Undo", "撤销"}, + "file_change_card.reject": {"Reject", "拒绝"}, + "file_change_card.accept": {"Accept", "接受"}, + + "multi_file_diff_review.title": {"Review changes", "审阅变更"}, + "multi_file_diff_review.progress": {"%d of %d files reviewed", "已审阅 %d / %d 个文件"}, + "multi_file_diff_review.accept_all": {"Accept all", "全部接受"}, + "multi_file_diff_review.empty": {"No changes to review", "没有需要审阅的变更"}, + + "command_execution_card.abort": {"Abort", "中止"}, + "command_execution_card.exit": {"Exit %d", "退出码 %d"}, + "command_execution_card.output": {"Output", "输出"}, + "command_execution_card.no_output": {"No output", "没有输出"}, + + "screenshot_stream.label": {"Agent screen", "智能体画面"}, + "screenshot_stream.waiting": {"Waiting for frames", "等待画面"}, + "screenshot_stream.prev": {"Previous frame", "上一帧"}, + "screenshot_stream.next": {"Next frame", "下一帧"}, + "screenshot_stream.pause": {"Pause", "暂停"}, + "screenshot_stream.live": {"Go live", "回到实时"}, + "screenshot_stream.counter": {"Frame %d of %d", "第 %d / %d 帧"}, + "screenshot_stream.following": {"Live", "实时"}, + + "artifact_panel.copy": {"Copy", "复制"}, + "artifact_panel.copied": {"Copied", "已复制"}, + "artifact_panel.export": {"Export", "导出"}, + "artifact_panel.preview": {"Preview", "预览"}, + "artifact_panel.source": {"Source", "源码"}, + + "artifact_version_switcher.label": {"Versions", "版本"}, + "artifact_version_switcher.older": {"Older version", "较早版本"}, + "artifact_version_switcher.newer": {"Newer version", "较新版本"}, + "artifact_version_switcher.count": {"%d of %d", "%d / %d"}, + "artifact_version_switcher.compare": {"Compare with %s", "与 %s 比较"}, + + "sandbox_status.starting": {"Starting", "启动中"}, + "sandbox_status.running": {"Running", "运行中"}, + "sandbox_status.stopped": {"Stopped", "已停止"}, + "sandbox_status.failed": {"Failed", "故障"}, + "sandbox_status.high": {"Near the limit", "接近上限"}, + "sandbox_status.left": {"%s left", "剩余 %s"}, + "sandbox_status.expired": {"Time is up", "已到时"}, + + "mcp_server_list.label": {"MCP servers", "MCP 服务器"}, + "mcp_server_list.empty": {"No MCP servers", "没有 MCP 服务器"}, + "mcp_server_list.stopped": {"Stopped", "已停止"}, + "mcp_server_list.connecting": {"Connecting", "连接中"}, + "mcp_server_list.connected": {"Connected", "已连接"}, + "mcp_server_list.error": {"Connection failed", "连接失败"}, + "mcp_server_list.tools": {"%d tools", "%d 个工具"}, + "mcp_server_list.start": {"Start", "启动"}, + "mcp_server_list.stop": {"Stop", "停止"}, + "mcp_server_list.reconnect": {"Reconnect", "重新连接"}, + + "memory_panel.title": {"Memory", "记忆"}, + "memory_panel.count": {"%d entries", "%d 条"}, + "memory_panel.search": {"Search memory", "搜索记忆"}, + "memory_panel.empty": {"No memories match", "没有匹配的记忆"}, + "memory_panel.edit": {"Edit", "编辑"}, + "memory_panel.save": {"Save", "保存"}, + "memory_panel.cancel": {"Cancel", "取消"}, + "memory_panel.delete": {"Delete", "删除"}, + "memory_panel.confirm": {"Forget this memory?", "删除这条记忆?"}, + + "checkpoint_list.label": {"Checkpoints", "检查点"}, + "checkpoint_list.empty": {"No checkpoints yet", "暂无检查点"}, + "checkpoint_list.current": {"Current", "当前"}, + "checkpoint_list.rollback": {"Roll back", "回滚"}, + "checkpoint_list.confirm": {"Roll back to “%s”?", "回滚到“%s”?"}, + "checkpoint_list.warning": {"Changes made after this checkpoint will be discarded.", "此检查点之后的更改将被丢弃。"}, + + "human_input_request.free": {"Or write your own answer", "或填写你的回答"}, + "human_input_request.send": {"Send answer", "发送回答"}, + "human_input_request.left": {"Answer within %s", "请在 %s 内回答"}, + "human_input_request.timeout": {"The agent stopped waiting", "智能体已停止等待"}, + + "agent_plan.title": {"Plan", "计划"}, + "agent_plan.progress": {"%d / %d done", "已完成 %d / %d"}, + "agent_plan.doing": {"In progress", "进行中"}, + "agent_plan.skip": {"Skip", "跳过"}, + "agent_plan.restore": {"Restore", "恢复"}, + "agent_plan.add": {"Add", "添加"}, + "agent_plan.placeholder": {"Add a step", "新增一项"}, + }) +} diff --git a/multi_file_diff_review.go b/multi_file_diff_review.go new file mode 100644 index 0000000..8d1eaf4 --- /dev/null +++ b/multi_file_diff_review.go @@ -0,0 +1,158 @@ +package mujica + +import ( + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/internal" + "mujicaui/theme" +) + +// MultiFileDiffReviewOptions configure a MultiFileDiffReview. +type MultiFileDiffReviewOptions struct { + // Height is 420 DIPs when zero. + Height float32 + Disabled bool +} + +type multiFileDiffState struct{ selected int } + +// MultiFileDiffReview reviews many file changes, one diff at a time. +func MultiFileDiffReview(c *ui.Context, decisions *[]FileDecision, files []FileChange, opts MultiFileDiffReviewOptions) ChoiceResult { + if decisions == nil || len(*decisions) != len(files) { + panic("mujica: MultiFileDiffReview needs one decision per file") + } + if opts.Height < 0 { + panic("mujica: MultiFileDiffReview Height is negative") + } + seen := map[string]bool{} + reviewed := 0 + for i, f := range files { + if f.Path == "" || seen[f.Path] { + panic(fmt.Sprintf("mujica: MultiFileDiffReview file %d needs a unique Path", i)) + } + seen[f.Path] = true + reviewed += agentB2I((*decisions)[i] != FilePending) + } + h := opts.Height + if h == 0 { + h = 420 + } + k := Tokens(c) + u := Density(c).Unit() + var r ChoiceResult + r.Element = agentCard(c).Height(h).Disabled(opts.Disabled).Label(msg(c, "multi_file_diff_review.title")) + st := ui.Local(r.Element, "mujica.mfdr", func() multiFileDiffState { return multiFileDiffState{} }) + st.selected = max(0, min(st.selected, len(files)-1)) + locked := r.Element.IsDisabled() + r.Element.Children(func() { + ui.Row(c).Gap(u * 3).AlignItems(ui.Center).Children(func() { + ui.Text(c, msg(c, "multi_file_diff_review.title")).Font(theme.SerifFont).FontSize(FontSize(c, theme.H3Size)).FontWeight(600) + agentCaption(c, fmt.Sprintf(msg(c, "multi_file_diff_review.progress"), reviewed, len(files))).Grow(1) + all := reviewed < len(files) + if Button(c, msg(c, "multi_file_diff_review.accept_all"), ButtonOptions{Variant: Secondary, Disabled: locked || !all}).Clicked() && !locked && all { + for i := range *decisions { + if (*decisions)[i] == FilePending { + (*decisions)[i] = FileAccepted + } + } + r.changed = true + } + }) + frac := 0.0 + if len(files) > 0 { + frac = float64(reviewed) / float64(len(files)) + } + agentBar(c, frac, fmt.Sprintf(msg(c, "multi_file_diff_review.progress"), reviewed, len(files))) + if len(files) == 0 { + agentCaption(c, msg(c, "multi_file_diff_review.empty")) + return + } + ui.Row(c).Grow(1).Shrink(1).Gap(u * 3).AlignItems(ui.Stretch).Children(func() { + row := func(i int) { + if multiFileRow(c, files[i], (*decisions)[i], i == st.selected) && !locked { + st.selected = i + slog.Debug("mujica: multi_file_diff_review select", "path", files[i].Path) + } + } + var list *ui.Element + if len(files) > agentVirtualRows { + list = ui.List(c, nil, len(files), row) + } else { + list = ui.Scroll(c).Children(func() { + for i := range files { + row(i) + } + }) + } + list.Width(240).Shrink(0).FocusGroup(ui.Vertical).Border(theme.BorderWidth, k.Border). + Radius(theme.ControlRadius).Padding(u) + ui.Column(c).Grow(1).Shrink(1).Gap(u * 2).Children(func() { + i := st.selected + if fileChangeDecide(c, &(*decisions)[i], files[i], locked) { + r.changed = true + } + }) + }) + }) + if r.changed { + slog.Debug("mujica: multi_file_diff_review decide", "reviewed", reviewed) + } + return r +} + +// multiFileRow is one listed file; it reports a choice. +func multiFileRow(c *ui.Context, f FileChange, d FileDecision, selected bool) bool { + k := Tokens(c) + u := Density(c).Unit() + row := ui.ButtonBase(c).Key(f.Path).Justify(ui.Start).Gap(u*2).MinHeight(Density(c).ControlHeight()). + Padding(0, u*2).Radius(theme.ControlRadius).Label(f.Path) + internal.Ring(row, k.Focus, theme.ControlRadius) + dc := agentDiffOf(row, f) + switch { + case selected: + row.Background(k.Selection).DrawOver(func(p *ui.Painter, r ui.Rect) { + p.Fill(ui.Rect{X: r.X, Y: r.Y + 4, W: 2, H: r.H - 8}, k.AccentText, 1) + }) + case row.Hovered(): + row.Background(k.SurfaceHover) + } + row.Children(func() { + agentDecisionIcon(c, d) + ui.Text(c, f.Path).Font(theme.MonoFont).FontSize(FontSize(c, theme.CaptionSize+1)).SingleLine().Grow(1).Shrink(1) + agentDiffStats(c, dc.add, dc.del) + }) + return row.Clicked() +} + +// fileChangeDecide shows a full diff and its decision buttons. +func fileChangeDecide(c *ui.Context, d *FileDecision, f FileChange, locked bool) bool { + u := Density(c).Unit() + changed := false + holder := ui.Column(c).Key(f.Path).Grow(1).Shrink(1).Gap(u * 2) + dc := agentDiffOf(holder, f) + holder.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + ui.Text(c, f.Path).Font(theme.MonoFont).FontWeight(600).SingleLine().Grow(1).Shrink(1) + agentDecisionMark(c, *d) + }) + agentDiffView(c, dc.lines, 1e5).Grow(1).Font(theme.MonoFont) + ui.Row(c).Gap(u * 2).Justify(ui.End).Children(func() { + if *d != FilePending { + if Button(c, msg(c, "file_change_card.undo"), ButtonOptions{Variant: Secondary, Disabled: locked}).Clicked() && !locked { + *d, changed = FilePending, true + } + return + } + if Button(c, msg(c, "file_change_card.reject"), ButtonOptions{Variant: Secondary, Disabled: locked}).Clicked() && !locked { + *d, changed = FileRejected, true + } + if Button(c, msg(c, "file_change_card.accept"), ButtonOptions{Disabled: locked}).Clicked() && !locked { + *d, changed = FileAccepted, true + } + }) + }) + return changed +} diff --git a/multi_file_diff_review_test.go b/multi_file_diff_review_test.go new file mode 100644 index 0000000..a8d5455 --- /dev/null +++ b/multi_file_diff_review_test.go @@ -0,0 +1,118 @@ +package mujica + +import ( + "fmt" + "testing" + + "github.com/egoist/mygo/ui" +) + +func reviewFiles() []FileChange { + return []FileChange{ + fileChangeSample, + {Path: "court/menu.md", Old: "soup\nroast\n", New: "soup\nroast\ntart\n"}, + {Path: "court/old.md", Old: "gone\n"}, + } +} + +func reviewTester(d *[]FileDecision, files []FileChange, opts MultiFileDiffReviewOptions, changes *int) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Padding(8).Children(func() { + if MultiFileDiffReview(c, d, files, opts).Changed() { + *changes++ + } + }) + }, 760, 520) +} + +func TestMultiFileDiffReviewPerFileAndAll(t *testing.T) { + files := reviewFiles() + d := make([]FileDecision, len(files)) + changes := 0 + tt := reviewTester(&d, files, MultiFileDiffReviewOptions{}, &changes) + if !tt.HasText("0 of 3 files reviewed") || !tt.HasText("Guests: 42") { + t.Fatalf("texts %q", tt.Texts()) + } + _ = tt.Click("court/menu.md") + if !tt.HasText("tart") || tt.HasText("Guests: 42") { + t.Fatal("choosing a file did not show its diff") + } + _ = tt.Click("Reject") + if d[1] != FileRejected || changes != 1 || !tt.HasText("1 of 3 files reviewed") { + t.Fatalf("reject: %v", d) + } + _ = tt.Click("Accept all") + if d[0] != FileAccepted || d[1] != FileRejected || d[2] != FileAccepted || !tt.HasText("3 of 3 files reviewed") { + t.Fatalf("accept all: %v", d) + } +} + +func TestMultiFileDiffReviewKeyboard(t *testing.T) { + files := reviewFiles() + d := make([]FileDecision, len(files)) + n := 0 + tt := reviewTester(&d, files, MultiFileDiffReviewOptions{}, &n) + _ = tt.Click("court/ledger.md") + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyEnter) + if !tt.HasText("gone") || tt.HasText("Guests: 42") { + t.Fatalf("keyboard choice: %q", tt.Texts()) + } +} + +func TestMultiFileDiffReviewDisabledAndEmpty(t *testing.T) { + files := reviewFiles() + d := make([]FileDecision, len(files)) + n := 0 + tt := reviewTester(&d, files, MultiFileDiffReviewOptions{Disabled: true}, &n) + _ = tt.Click("Accept all") + _ = tt.Click("Accept") + _ = tt.Click("court/menu.md") + if n != 0 || d[0] != FilePending || tt.HasText("tart") { + t.Fatalf("disabled review acted: %v", d) + } + var none []FileDecision + tt = reviewTester(&none, nil, MultiFileDiffReviewOptions{}, &n) + if !tt.HasText("No changes to review") { + t.Fatalf("empty: %q", tt.Texts()) + } +} + +func TestMultiFileDiffReviewManyFilesVirtualized(t *testing.T) { + files := make([]FileChange, 100000) + for i := range files { + files[i] = FileChange{Path: fmt.Sprintf("f%06d.txt", i), Old: "a\n", New: "b\n"} + } + d := make([]FileDecision, len(files)) + n := 0 + tt := reviewTester(&d, files, MultiFileDiffReviewOptions{}, &n) + if got := len(tt.Texts()); got > 400 { + t.Fatalf("%d texts built for 100000 files", got) + } + if !tt.HasText("f000000.txt") { + t.Fatal("first file missing") + } +} + +func TestMultiFileDiffReviewNeedsMatchingDecisions(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + d := []FileDecision{} + n := 0 + reviewTester(&d, reviewFiles(), MultiFileDiffReviewOptions{}, &n) +} + +func TestMultiFileDiffReviewSnapshot(t *testing.T) { + snapshot(t, "multi_file_diff_review", 760, 420, func(c *ui.Context) { + files := reviewFiles() + d := []FileDecision{FilePending, FileAccepted, FileRejected} + ui.Column(c).Padding(12).Children(func() { + MultiFileDiffReview(c, &d, files, MultiFileDiffReviewOptions{Height: 390}) + }) + }) +} diff --git a/permission_prompt.go b/permission_prompt.go new file mode 100644 index 0000000..ac13a5c --- /dev/null +++ b/permission_prompt.go @@ -0,0 +1,76 @@ +package mujica + +import ( + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// PermissionChoice answers a PermissionPrompt; zero is no answer. +type PermissionChoice int + +const ( + PermissionNone PermissionChoice = iota + PermissionAllowOnce + PermissionAllowAlways + PermissionDeny +) + +// PermissionPromptOptions configure a PermissionPrompt. Title and Scope are required. +type PermissionPromptOptions struct { + Title string + Description string + // Scope says what "always" covers, as "Write access to ~/court". + Scope string +} + +// PermissionResult reports the choice made in this frame. +type PermissionResult struct { + Element *ui.Element + Choice PermissionChoice +} + +// PermissionPrompt asks allow once, always, or deny; Deny has focus. +func PermissionPrompt(c *ui.Context, open *bool, opts PermissionPromptOptions) PermissionResult { + if opts.Title == "" || opts.Scope == "" { + panic("mujica: PermissionPrompt needs a Title and a Scope") + } + var r PermissionResult + was := *open + k := Tokens(c) + u := Density(c).Unit() + r.Element = Dialog(c, open, DialogOptions{ + Title: opts.Title, Description: opts.Description, KeepOnBackdrop: true, HideClose: true, + Actions: func() { + if Button(c, msg(c, "permission_prompt.deny"), ButtonOptions{Variant: Secondary}).AutoFocus().Clicked() { + r.Choice = PermissionDeny + } + if Button(c, msg(c, "permission_prompt.always"), ButtonOptions{Variant: Outline}).Clicked() { + r.Choice = PermissionAllowAlways + } + if Button(c, msg(c, "permission_prompt.once"), ButtonOptions{}).Clicked() { + r.Choice = PermissionAllowOnce + } + }, + }, func() { + ui.Row(c).Gap(u*2).AlignItems(ui.Start).Padding(u*2, u*3).Background(k.Background).Radius(theme.ControlRadius). + Border(1, k.Border).Children(func() { + ui.Icon(c, icons.Must("lock")).Size(16, 16).TextColor(k.Info).Shrink(0).Margin(2, 0, 0, 0) + ui.Column(c).Gap(u / 2).Shrink(1).Children(func() { + agentCaption(c, msg(c, "permission_prompt.scope")) + ui.Text(c, opts.Scope) + }) + }) + }) + if was && !*open && r.Choice == PermissionNone { + r.Choice = PermissionDeny // Escape + } + if r.Choice != PermissionNone { + slog.Debug("mujica: permission_prompt choose", "choice", int(r.Choice)) + *open = false + } + return r +} diff --git a/permission_prompt_test.go b/permission_prompt_test.go new file mode 100644 index 0000000..bba25c7 --- /dev/null +++ b/permission_prompt_test.go @@ -0,0 +1,78 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func permissionTester(open *bool, got *[]PermissionChoice) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if Button(c, "Ask", ButtonOptions{}).Clicked() { + *open = true + } + r := PermissionPrompt(c, open, PermissionPromptOptions{Title: "Write to the ledger?", Scope: "Write access to ~/court/ledger"}) + if r.Choice != PermissionNone { + *got = append(*got, r.Choice) + } + }, 600, 400) +} + +func TestPermissionPromptChoices(t *testing.T) { + for _, tc := range []struct { + tabs int + want PermissionChoice + }{{0, PermissionDeny}, {1, PermissionAllowAlways}, {2, PermissionAllowOnce}} { + open := false + var got []PermissionChoice + tt := permissionTester(&open, &got) + _ = tt.Click("Ask") + if !tt.Focused("Deny") || !tt.HasText("Write access to ~/court/ledger") { + t.Fatalf("Deny focused %v, texts %q", tt.Focused("Deny"), tt.Texts()) + } + for range tc.tabs { + tt.Key(0, ui.KeyTab) + } + tt.Key(0, ui.KeyEnter) + if len(got) != 1 || got[0] != tc.want || open { + t.Fatalf("tabs %d: got %v open %v", tc.tabs, got, open) + } + } +} + +func TestPermissionPromptEscapeAndBackdrop(t *testing.T) { + open := false + var got []PermissionChoice + tt := permissionTester(&open, &got) + _ = tt.Click("Ask") + tt.ClickAt(5, 395) + if !open || len(got) != 0 { + t.Fatal("backdrop acted") + } + tt.Key(0, ui.KeyEscape) + if len(got) != 1 || got[0] != PermissionDeny { + t.Fatalf("Escape gave %v", got) + } +} + +func TestPermissionPromptNeedsScope(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + open := true + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + PermissionPrompt(c, &open, PermissionPromptOptions{Title: "x"}) + }, 200, 200) +} + +func TestPermissionPromptSnapshot(t *testing.T) { + snapshot(t, "permission_prompt", 600, 340, func(c *ui.Context) { + open := true + PermissionPrompt(c, &open, PermissionPromptOptions{Title: "Write to the ledger?", + Description: "The agent wants to record tonight's guests.", Scope: "Write access to ~/court/ledger and its subfolders"}) + }) +} diff --git a/sandbox_status.go b/sandbox_status.go new file mode 100644 index 0000000..e9390bd --- /dev/null +++ b/sandbox_status.go @@ -0,0 +1,107 @@ +package mujica + +import ( + "fmt" + "math" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// SandboxState is a sandbox's lifecycle. The zero value is SandboxStarting. +type SandboxState int + +const ( + SandboxStarting SandboxState = iota + SandboxRunning + SandboxStopped + SandboxFailed +) + +// SandboxResource is one metered resource, as CPU or memory. +type SandboxResource struct { + Name string + Used, Limit float64 + // Unit follows the numbers, as "GB" or "cores". + Unit string +} + +// SandboxInfo is the sandbox the caller reports. +type SandboxInfo struct { + Name string + State SandboxState + Resources []SandboxResource + // Expires is the shutdown time; zero means none. + Expires time.Time +} + +// SandboxStatusOptions configure a SandboxStatus. +type SandboxStatusOptions struct { + Still bool +} + +// SandboxStatus shows sandbox state, resources and time left. +func SandboxStatus(c *ui.Context, info SandboxInfo, opts SandboxStatusOptions) *ui.Element { + agent := map[SandboxState]AgentState{SandboxStarting: AgentPlanning, SandboxRunning: AgentRunning, SandboxStopped: AgentSkipped, SandboxFailed: AgentFailed} + state, ok := agent[info.State] + if !ok { + panic(fmt.Sprintf("mujica: unknown SandboxState %d", int(info.State))) + } + for _, r := range info.Resources { + if r.Name == "" || !(r.Limit > 0) || r.Used < 0 || math.IsNaN(r.Used) || r.Used > r.Limit { + panic(fmt.Sprintf("mujica: SandboxStatus resource %q needs a name and 0 <= Used <= Limit", r.Name)) + } + } + k := Tokens(c) + u := Density(c).Unit() + word := msg(c, "sandbox_status."+[...]string{"starting", "running", "stopped", "failed"}[info.State]) + card := agentCard(c).Label(info.Name + ", " + word) + card.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + ui.Text(c, info.Name).FontWeight(600).SingleLine().Grow(1).Shrink(1) + AgentStatus(c, state, AgentStatusOptions{Label: word, Still: opts.Still}) + }) + for _, r := range info.Resources { + frac := r.Used / r.Limit + ui.Column(c).Gap(u).Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + agentCaption(c, r.Name).Grow(1) + if frac >= 0.9 { + ui.Icon(c, icons.Must("triangle-alert")).Size(12, 12).TextColor(k.Warning).Label(msg(c, "sandbox_status.high")) + } + ui.Text(c, fmt.Sprintf("%s / %s %s", sandboxNum(r.Used), sandboxNum(r.Limit), r.Unit)). + FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum").TextColor(k.Text) + }) + agentBar(c, frac, fmt.Sprintf("%s %.0f%%", r.Name, frac*100)) + }) + } + if !info.Expires.IsZero() && info.State != SandboxStopped && info.State != SandboxFailed { + left := info.Expires.Sub(c.Now()) + text := msg(c, "sandbox_status.expired") + if left > 0 { + text = fmt.Sprintf(msg(c, "sandbox_status.left"), agentDuration(left.Truncate(time.Second))) + wait := left % time.Second + if wait == 0 { + wait = time.Second + } + c.After(wait) + } + ui.Row(c).Gap(u * 1.5).AlignItems(ui.Center).Role(ui.RoleStatus).Label(text).Children(func() { + ui.Icon(c, icons.Must("clock")).Size(14, 14).TextColor(k.TextMuted) + agentCaption(c, text) + }) + } + }) + return card +} + +// sandboxNum prints a resource amount with at most one decimal. +func sandboxNum(v float64) string { + if v == math.Trunc(v) { + return fmt.Sprintf("%.0f", v) + } + return fmt.Sprintf("%.1f", v) +} diff --git a/sandbox_status_test.go b/sandbox_status_test.go new file mode 100644 index 0000000..2a8815b --- /dev/null +++ b/sandbox_status_test.go @@ -0,0 +1,68 @@ +package mujica + +import ( + "strings" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +func sandboxSample(expires time.Time) SandboxInfo { + return SandboxInfo{Name: "sandbox-7", State: SandboxRunning, Expires: expires, Resources: []SandboxResource{ + {Name: "CPU", Used: 1.5, Limit: 2, Unit: "cores"}, + {Name: "Memory", Used: 3.8, Limit: 4, Unit: "GB"}, + }} +} + +func TestSandboxStatusResourcesAndCountdown(t *testing.T) { + info := sandboxSample(time.Now().Add(90 * time.Second)) + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + SandboxStatus(c, info, SandboxStatusOptions{Still: true}) + }, 480, 300) + for _, s := range []string{"sandbox-7", "Running", "1.5 / 2 cores", "3.8 / 4 GB", "Near the limit"} { + if !tt.HasText(s) { + t.Fatalf("missing %q in %q", s, tt.Texts()) + } + } + left := "" + for _, s := range tt.Texts() { + if strings.HasSuffix(s, " left") { + left = s + } + } + if !strings.HasPrefix(left, "1 m ") { + t.Fatalf("countdown %q", left) + } + info.Expires = time.Now().Add(-time.Second) + tt.Frame() + if !tt.HasText("Time is up") { + t.Fatalf("expired: %q", tt.Texts()) + } + info.State = SandboxStopped + tt.Frame() + if !tt.HasText("Stopped") || tt.HasText("Time is up") { + t.Fatalf("stopped: %q", tt.Texts()) + } +} + +func TestSandboxStatusRejectsBadResource(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + SandboxStatus(c, SandboxInfo{Name: "x", Resources: []SandboxResource{{Name: "CPU", Used: 3, Limit: 2}}}, SandboxStatusOptions{}) + }, 200, 200) +} + +func TestSandboxStatusSnapshot(t *testing.T) { + snapshot(t, "sandbox_status", 440, 230, func(c *ui.Context) { + info := sandboxSample(time.Time{}) + info.Resources = append(info.Resources, SandboxResource{Name: "Disk", Used: 12, Limit: 40, Unit: "GB"}) + ui.Column(c).Padding(16).Children(func() { SandboxStatus(c, info, SandboxStatusOptions{Still: true}) }) + }) +} diff --git a/screenshot_stream.go b/screenshot_stream.go new file mode 100644 index 0000000..86df6d9 --- /dev/null +++ b/screenshot_stream.go @@ -0,0 +1,125 @@ +package mujica + +import ( + "fmt" + "log/slog" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// ScreenshotFrame is one caller-supplied frame of the agent's screen. +type ScreenshotFrame struct { + Image ui.ImageSource + Caption string + // At is the time since the run started. + At time.Duration +} + +// ScreenshotStreamState is the shown frame; unpaused, it follows the newest. +type ScreenshotStreamState struct { + Index int + Paused bool +} + +// ScreenshotStreamOptions configure a ScreenshotStream. +type ScreenshotStreamOptions struct { + // Height of the viewport; 280 DIPs when zero. + Height float32 + Disabled bool +} + +// ScreenshotStream shows screen frames live, paused or stepped. +func ScreenshotStream(c *ui.Context, st *ScreenshotStreamState, frames []ScreenshotFrame, opts ScreenshotStreamOptions) ChoiceResult { + if st == nil { + panic("mujica: ScreenshotStream needs a state") + } + if opts.Height < 0 { + panic("mujica: ScreenshotStream Height is negative") + } + for i, f := range frames { + if f.Image == nil { + panic(fmt.Sprintf("mujica: ScreenshotStream frame %d has no Image", i)) + } + } + h := opts.Height + if h == 0 { + h = 280 + } + k := Tokens(c) + u := Density(c).Unit() + n := len(frames) + if st.Index < 0 { + panic(fmt.Sprintf("mujica: ScreenshotStream Index %d is negative", st.Index)) + } + if !st.Paused || st.Index >= n { // frames may be dropped while paused + + st.Index = max(0, n-1) + } + var r ChoiceResult + r.Element = agentCard(c).Disabled(opts.Disabled).Label(msg(c, "screenshot_stream.label")) + locked := r.Element.IsDisabled() + step := func(d int) { + if n == 0 || locked { + return + } + st.Index = max(0, min(n-1, st.Index+d)) + st.Paused, r.changed = true, true + } + r.Element.Children(func() { + view := ui.Box(c).FillWidth().Height(h).Center().Clip().Radius(theme.ControlRadius). + Background(k.Background).Border(theme.BorderWidth, k.Border).Focusable(). + Label(msg(c, "screenshot_stream.label")) + internal.Ring(view, k.Focus, theme.ControlRadius) + view.Children(func() { + if n == 0 { + agentCaption(c, msg(c, "screenshot_stream.waiting")) + return + } + ui.Image(c, frames[st.Index].Image).Fill().Fit(ui.Contain).Label(frames[st.Index].Caption) + }) + if !locked { + switch { + case view.Shortcut(0, ui.KeyLeft): + step(-1) + case view.Shortcut(0, ui.KeyRight): + step(1) + case view.Shortcut(0, ui.KeySpace): + st.Paused, r.changed = !st.Paused, true + } + } + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + if iconAction(c, icons.Must("chevron-left"), msg(c, "screenshot_stream.prev")).Disabled(locked || st.Index == 0).Clicked() { + step(-1) + } + pause := msg(c, "screenshot_stream.pause") + if st.Paused { + pause = msg(c, "screenshot_stream.live") + } + if Button(c, pause, ButtonOptions{Variant: Secondary, Disabled: locked || n == 0}).Clicked() && !locked { + st.Paused, r.changed = !st.Paused, true + } + if iconAction(c, icons.Must("chevron-right"), msg(c, "screenshot_stream.next")).Disabled(locked || st.Index >= n-1).Clicked() { + step(1) + } + counter := fmt.Sprintf(msg(c, "screenshot_stream.counter"), min(st.Index+1, n), n) + agentCaption(c, counter).Role(ui.RoleStatus) + if n > 0 { + f := frames[st.Index] + ui.Text(c, f.Caption).SingleLine().Grow(1).Shrink(1) + agentCaption(c, agentDuration(f.At)) + } + if !st.Paused && n > 0 { + AgentStatus(c, AgentRunning, AgentStatusOptions{Label: msg(c, "screenshot_stream.following"), Still: true}) + } + }) + }) + if r.changed { + slog.Debug("mujica: screenshot_stream move", "index", st.Index, "paused", st.Paused) + } + return r +} diff --git a/screenshot_stream_test.go b/screenshot_stream_test.go new file mode 100644 index 0000000..bd52c20 --- /dev/null +++ b/screenshot_stream_test.go @@ -0,0 +1,110 @@ +package mujica + +import ( + "fmt" + "image" + "image/color" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +// screenshotFrames makes n solid frames of shifting colors. +func screenshotFrames(n int) []ScreenshotFrame { + out := make([]ScreenshotFrame, n) + for i := range out { + img := image.NewRGBA(image.Rect(0, 0, 160, 90)) + for p := 0; p < len(img.Pix); p += 4 { + img.Pix[p], img.Pix[p+1], img.Pix[p+2], img.Pix[p+3] = uint8(60+i*40), 90, uint8(160-i*20), 255 + } + img.Set(10, 10, color.White) + out[i] = ScreenshotFrame{Image: ui.NewBitmap(img), Caption: fmt.Sprintf("Step %d", i+1), At: time.Duration(i) * time.Second} + } + return out +} + +func screenshotTester(st *ScreenshotStreamState, frames *[]ScreenshotFrame, opts ScreenshotStreamOptions, changes *int) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if ScreenshotStream(c, st, *frames, opts).Changed() { + *changes++ + } + }, 600, 420) +} + +func TestScreenshotStreamFollowsPausesAndSteps(t *testing.T) { + var st ScreenshotStreamState + frames := screenshotFrames(3) + changes := 0 + tt := screenshotTester(&st, &frames, ScreenshotStreamOptions{}, &changes) + if st.Index != 2 || !tt.HasText("Frame 3 of 3") || !tt.HasText("Live") { + t.Fatalf("live: %+v %q", st, tt.Texts()) + } + frames = append(frames, screenshotFrames(4)[3]) + tt.Frame() + if st.Index != 3 || !tt.HasText("Step 4") { + t.Fatalf("new frame not followed: %+v", st) + } + _ = tt.Click("Previous frame") + if !st.Paused || st.Index != 2 || changes != 1 || !tt.HasText("Step 3") { + t.Fatalf("step back: %+v", st) + } + frames = append(frames, screenshotFrames(5)[4]) + tt.Frame() + if st.Index != 2 { + t.Fatal("paused viewer moved") + } + _ = tt.Click("Go live") + if st.Paused || st.Index != 4 { + t.Fatalf("go live: %+v", st) + } +} + +func TestScreenshotStreamKeyboard(t *testing.T) { + var st ScreenshotStreamState + frames := screenshotFrames(3) + n := 0 + tt := screenshotTester(&st, &frames, ScreenshotStreamOptions{}, &n) + tt.Key(0, ui.KeyTab) // the viewport + tt.Key(0, ui.KeyLeft) + tt.Key(0, ui.KeyLeft) + tt.Key(0, ui.KeyLeft) // stops at the first + if st.Index != 0 || !st.Paused { + t.Fatalf("left: %+v", st) + } + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeySpace) + if st.Paused || st.Index != 2 { + t.Fatalf("space: %+v", st) + } +} + +func TestScreenshotStreamEmptyAndDisabled(t *testing.T) { + var st ScreenshotStreamState + var frames []ScreenshotFrame + n := 0 + tt := screenshotTester(&st, &frames, ScreenshotStreamOptions{}, &n) + if !tt.HasText("Waiting for frames") || !tt.HasText("Frame 0 of 0") { + t.Fatalf("empty: %q", tt.Texts()) + } + frames = screenshotFrames(3) + st = ScreenshotStreamState{} + tt = screenshotTester(&st, &frames, ScreenshotStreamOptions{Disabled: true}, &n) + _ = tt.Click("Previous frame") + _ = tt.Click("Pause") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyLeft) + if n != 0 || st.Paused || st.Index != 2 { + t.Fatalf("disabled moved: %+v", st) + } +} + +func TestScreenshotStreamSnapshot(t *testing.T) { + snapshot(t, "screenshot_stream", 520, 330, func(c *ui.Context) { + st := ScreenshotStreamState{Index: 1, Paused: true} + ui.Column(c).Padding(16).Children(func() { + ScreenshotStream(c, &st, screenshotFrames(3), ScreenshotStreamOptions{Height: 200}) + }) + }) +} diff --git a/sub_agent_tree.go b/sub_agent_tree.go new file mode 100644 index 0000000..c142006 --- /dev/null +++ b/sub_agent_tree.go @@ -0,0 +1,104 @@ +package mujica + +import ( + "fmt" + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// SubAgent is one agent in a hierarchy. +type SubAgent struct { + ID string + Name string + Task string + State AgentState + Children []SubAgent +} + +// SubAgentTreeOptions configure a SubAgentTree. +type SubAgentTreeOptions struct { + Disabled bool + Still bool +} + +// SubAgentTree shows nested agents and their states. +func SubAgentTree(c *ui.Context, roots []SubAgent, opts SubAgentTreeOptions) ChoiceResult { + seen := map[string]bool{} + var check func([]SubAgent) + check = func(list []SubAgent) { + for _, a := range list { + if a.ID == "" || a.Name == "" || seen[a.ID] { + panic(fmt.Sprintf("mujica: SubAgentTree agent %q needs a unique ID and a Name", a.ID)) + } + seen[a.ID] = true + check(a.Children) + } + } + check(roots) + var r ChoiceResult + r.Element = ui.Column(c).Shrink(0).FocusGroup(ui.Vertical).Disabled(opts.Disabled) + open := ui.Local(r.Element, "mujica.subagents.open", func() map[string]bool { return map[string]bool{} }) + r.Element.Children(func() { + var rows func([]SubAgent, int) + rows = func(list []SubAgent, depth int) { + for _, a := range list { + if subAgentRow(c, a, depth, (*open)[a.ID], opts.Still) { + (*open)[a.ID] = !(*open)[a.ID] + r.changed = true + slog.Debug("mujica: sub_agent_tree toggle", "id", a.ID, "open", (*open)[a.ID]) + } + if (*open)[a.ID] { + rows(a.Children, depth+1) + } + } + } + rows(roots, 0) + }) + for id := range *open { + if !seen[id] { + delete(*open, id) + } + } + return r +} + +// subAgentRow builds one row, reporting an expand or collapse. +func subAgentRow(c *ui.Context, a SubAgent, depth int, open, still bool) bool { + k := Tokens(c) + d := Density(c) + u := d.Unit() + parent := len(a.Children) > 0 + row := ui.ButtonBase(c).Key(a.ID).Justify(ui.Start).Gap(u*2).MinHeight(d.ControlHeight()). + Padding(0, u*2, 0, u*2+float32(depth)*u*5).Radius(theme.ControlRadius). + Label(a.Name + ", " + agentWord(c, a.State)) + internal.Ring(row, k.Focus, theme.ControlRadius) + if row.Hovered() { + row.Background(k.SurfaceHover) + } + row.Children(func() { + chev := ui.Box(c).Size(14, 14).Shrink(0) + if parent { + name := "chevron-right" + if open { + name = "chevron-down" + } + chev.Children(func() { ui.Icon(c, icons.Must(name)).Size(14, 14).TextColor(k.TextMuted) }) + } + agentMark(c, a.State, 16, still) + ui.Text(c, a.Name).FontWeight(600).SingleLine().Shrink(0) + ui.Text(c, a.Task).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize+1)).SingleLine().Grow(1).Shrink(1) + agentCaption(c, agentWord(c, a.State)) + if parent { + agentCaption(c, fmt.Sprintf(msg(c, "sub_agent_tree.children"), len(a.Children))) + } + }) + if !parent || row.IsDisabled() { + return false + } + return row.Clicked() || !open && row.Shortcut(0, ui.KeyRight) || open && row.Shortcut(0, ui.KeyLeft) +} diff --git a/sub_agent_tree_test.go b/sub_agent_tree_test.go new file mode 100644 index 0000000..8961923 --- /dev/null +++ b/sub_agent_tree_test.go @@ -0,0 +1,81 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +var subAgentSample = []SubAgent{ + {ID: "lead", Name: "Steward", Task: "Prepare the ball", State: AgentRunning, Children: []SubAgent{ + {ID: "music", Name: "Musician", Task: "Hire the quartet", State: AgentDone}, + {ID: "kitchen", Name: "Cook", Task: "Plan the menu", State: AgentWaiting, Children: []SubAgent{ + {ID: "wine", Name: "Sommelier", Task: "Choose the wine", State: AgentFailed}, + }}, + }}, +} + +func subAgentTester(opts SubAgentTreeOptions, changes *int) *ui.Tester { + opts.Still = true + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if SubAgentTree(c, subAgentSample, opts).Changed() { + *changes++ + } + }, 560, 300) +} + +func TestSubAgentTreeExpandByPointerAndKeys(t *testing.T) { + changes := 0 + tt := subAgentTester(SubAgentTreeOptions{}, &changes) + if tt.HasText("Musician") || !tt.HasText("Running") { + t.Fatalf("texts %q", tt.Texts()) + } + _ = tt.Click("Steward") + if changes != 1 || !tt.HasText("Musician") || !tt.HasText("Waiting") || tt.HasText("Sommelier") { + t.Fatalf("click: changes %d texts %q", changes, tt.Texts()) + } + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyDown) // Cook + tt.Key(0, ui.KeyRight) + if !tt.HasText("Sommelier") || !tt.HasText("Failed") { + t.Fatal("Right did not expand Cook") + } + tt.Key(0, ui.KeyRight) // already open: nothing + tt.Key(0, ui.KeyLeft) + if tt.HasText("Sommelier") || changes != 3 { + t.Fatalf("Left: changes %d", changes) + } +} + +func TestSubAgentTreeDisabled(t *testing.T) { + changes := 0 + tt := subAgentTester(SubAgentTreeOptions{Disabled: true}, &changes) + _ = tt.Click("Steward") + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyRight) + if changes != 0 || tt.HasText("Musician") { + t.Fatal("disabled tree expanded") + } +} + +func TestSubAgentTreeRejectsDuplicateIDs(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + SubAgentTree(c, []SubAgent{{ID: "a", Name: "x", Children: []SubAgent{{ID: "a", Name: "y"}}}}, SubAgentTreeOptions{}) + }, 200, 200) +} + +func TestSubAgentTreeSnapshot(t *testing.T) { + snapshotAfter(t, "sub_agent_tree", 540, 200, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { SubAgentTree(c, subAgentSample, SubAgentTreeOptions{Still: true}) }) + }, func(tt *ui.Tester) { + _ = tt.Click("Steward") + _ = tt.Click("Cook") + }) +} diff --git a/testdata/snapshots/darwin/agent_plan-dark.png b/testdata/snapshots/darwin/agent_plan-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..726c0f655bf2ef98aa82850f6dd9f2f6ab48ddd9 GIT binary patch literal 22491 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/agent_status-dark.png b/testdata/snapshots/darwin/agent_status-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..aac7f1ca350c0ff6d2738bb9f0ea626b561e3c3b GIT binary patch literal 8602 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/agent_status-light.png b/testdata/snapshots/darwin/agent_status-light.png new file mode 100644 index 0000000000000000000000000000000000000000..753bb619bd66f9cddbe99b6393d862b329054e27 GIT binary patch literal 8321 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/agent_step_list-dark.png b/testdata/snapshots/darwin/agent_step_list-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0fbe6b5fcf5bf7e27b154753436a9d6e256371 GIT binary patch literal 21118 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/agent_step_list-light.png b/testdata/snapshots/darwin/agent_step_list-light.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f70fa3ef3a295f6b88d2ae4c72523f2a91277f GIT binary patch literal 20677 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/artifact_panel-dark.png b/testdata/snapshots/darwin/artifact_panel-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5f0cd25734078fc27bc84d7f07e89eb370eeac01 GIT binary patch literal 23276 zcmd?QWl$td8!g!A;4t{$Ft{_g%i!+rFu1$BySohT?hb>yySqDsG8q@RB zH}(f3#)RCnJ_XlO!&ZPoEk`L=?(|_M}?Wm7nxICzg%7#iJu| z(1eB-3tF*C@$|tal;-Q#`1jLCSBqqeR%(Po+R3|H4(;%;u#0KR=>`^fwP1hrYi~+; zH4+k%SLSS4Wc!x&3!=7?DPHHRGDo>=&ofD1Ii0WS69@@RpcxHNs;N|$Ypb-CJE$C% zkEtYAQ2*~An38ELXZqyCMb71Pb?H*5ArEKgJ@lSu&XMNY%&u6j_Vv8

1+u?Fv2N z=h_<1)w(~9j`e&H;eU;KG&zr`P1)wS0hx%vPKk)fngv!{1eoSa)uc+}U)If+Dnh-; z{$l{|zHwekYDczbR?wNdxorJC!=iNxNR0|nOvNW)|BGQvl8I}i(9_Ze(HzHR{d7PY zg=|=%|&(wUmVOB?>!Em^FM=>5%k^3HWninhg zzTO1K-A@zIZMWRVyw{v>$^x3*R{qI{=l}sj!?RibDd!gf3G?8D1aQFb?(VO2Fn_zG zWK>osCgf#QU;*-~x)}J`pfSAKOYZE9nr%s`gD+reYAPx!>mVsg&fQNe8pnt8X60*7 zgX^bH7_gh6%)ETpuC>TzyhCn&YfU0j9)D6R75 zesI|K-=C6Y4u||xwewnveD<20hCS-|$`xr|328j zv(Sfy8Cj%Y#=9jC?&c4n<<;v%7BMaa0~A}tLI4nYNh|Ezj|zra8au0k(U%i?AmgMPMLkz0UAQlo z*H-<3J|sl2@bFD7u6AwOUk&nNWT9WPxgi4k!om|u8~LtyJ~WwTo159l@3(&r{rwwV zGOaC`3QVr8mDkeZZhy#ugbLTDuX&8-`Vjfl)D;l$6DMtKZq7rZ>@F-Ko6fp3_>o2r zubP^y5=Br21sIu{Qc_Y{?J?Ebap!+(%0WbwF}rQi>@pE^7s2os;5d4ErTua~u4a?0 zrtD9@YsbN(`y1j?`zt!Bi|^GuHO;70iu-RVp6{sPfjz)nDb4co3Ou~`Yv_U)J{BR* zXOvUo^wIQ1jDy{R&|Fx);68ofK@r4>hkcU$Sw)^qL+)VFJZr7?>^14cxFim*)3~Dk z2UmY#bW)`5&u~g{VH|mPqL&xyaNX7UnAy8vQ@Ht^l!)}JhHBo zFYO7`An*{QzyP4nn6|1h3N>B{&uGlkvVaVWr(UI#xt@xi#ItL$-hDf1Hmxv$Buunn zgF1c{cnOg2c{gR|^$9aEDT;}i`Uu{NR~dA4A@h4bq5^&wFgv^`F54T4MMg#{nA5Fl zxMR^n7Zu&(E-OvSWF4)>5|+?WiVJHBJrVNox_)FNB)m1#UG;}rIwgY_h(+J<*AW6{ zmX_#ANTf-^b6R`6IlI6yx<8~M9nqDz)BC(P-};YTXD z$FIaZahZLY#F|7SMMDV9@9{yTsPWT1HFw!yx_{7}4B*GAd!>#r(x}P03`-jOC`%oqZ*eto&5EPE2|G^2JNf zW_OB~3K+od#}CH^b{B5%hkLdLLx%=bIEPHFmp;Ea;98OCr@qe)y>=AEG!x@(r+r&% z^N_mb!_c>w?k5`>aq&k!svvjycEIZb-Z|xO?-^3FVP_Y=EB_t&ov7>u`95p1r=yNs3 zbXvTaVJ``Z@JWISlAPg%r6n4wF})54At50=fZf1#Wz3_vR%V%l!w-PpO^HHPmo675 zTxx4ytR*LojdgBS{?7dD^vUjCAMbYn8b_L&@P)qhtY1acn9tKqkY~!&H))ONGdeqo zX2>zs=hOiJD36q84`x*p6WVeNxx>gcARG41euI8jlp7r%2M3tZIg$7i(b1V3R{Fk- zRb6CxF)Kk_Z?koUMRWm8Z#vste8f6+u-Yj~j5)YDPflaxq$L+;zj1mjgst~I-9mOY zHWt>_#+6c@K2Q;2Cc4io`xY+Ms?hkD=gsDd2un#x;he~oR+4H-Gbg8{WLdG5)s`+S z4ERY}zHs1_jgA{JrP(|>%~RHNdI50205R^l0{j7Eiavz6nS*Ee>+XpULmth^PvM(& z)B6r{j!K3~aVs(1>09O2G)nu5KW(?zvkY4;&Lz33n(C_U!;&Bs;rzt-a)jO8c{Pm>tr?-b2&n-}qxn99)5p zH!#M#In72OLGRym=~F4pCeNGh*tdSqa}^E?z^T8}rsweZjHyqWKy@5RdB4cfLQV&tt>xcHbA*W0cZt~VjgWuMKolZ)%MT+I&bQg zd33C&8B>ga&yFU4;sb$n!ZT#tUCwnflJA!m3k_5S!xwf=dCg5^=m(PV!eZ2Aki%kn zK3{Y6bf`p7^+0)NVBd4F31TtPhm`2_JUTTgN#Ktv0yOiDp}d!u!_G@VK!C8bb27+I z^*e0dd!^WQMTe&yYI8UY5CHmzcflY}U|CRU*E%dKOJ^uR10@X*a6lx_f`6X(oL1Nl z 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/artifact_panel-light.png b/testdata/snapshots/darwin/artifact_panel-light.png new file mode 100644 index 0000000000000000000000000000000000000000..1b1f06b2106091c682a41326527e00a2aaf777fb GIT binary patch literal 22104 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/artifact_version_switcher-dark.png b/testdata/snapshots/darwin/artifact_version_switcher-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1db4321c1a0aceda3d77b7f7d230d9d413e646 GIT binary patch literal 6383 zcmds6^;Z;Jw+2K~1W}QaR=Nb~knWadKw3&*=vHcw4ymCeMi|KfX_$GDZWtJbZWuti z!-32CzW4qS_pWu;v*V|;_I~z0d$03VS6hXQgq8#c2Zu~eRZ$-Y2T$N$HzUHkM^4)t zUK||i1~o;w_x`!N3jy!bj0*@4Z`jzZiHTEQzBiIf;ZmQjS9QTnIs0bFRc091U{*SL zJ=-0A4R_0nErn0f)H~Nh%re8NNSq()B`ZzpCoeGFFfb)2C%cU(0J}47{tU@Eeh6I} z6ps!%i1^DK3_QR}C(-^;eoch;Fyks1<|IY%EOV|E%SN0mZYI<@f>|SX=ons#1@D@gkdRtDS-&td zblclY)t^^sNX9|DLu`N_MVs)b-Mx}L+3}J3Z_2F8S|l|8Uf)^xvWL{HVg1TzY3=RF zDdhj4E3bR=$sLE^hzbdLTDCEr4e8vF|Hb4XmntfGclTT+Bw9~MV~-$fb%K0G=H}d2 zao_$HQOYv96GZ6g872@GfXC89)8G1l;8#?B$-^T(ffFrF29Bd)If2?-Y08lV3oQU1 zT85rA-ANoJvVTEfFP4^;7FE?^oD>S_Fz$k2sYE=Pw~Ip1t&7uJ79n6a%@UY(@}5b zP}2?9H>RsYOpSr-z-GlaEScOK&jv7Ichg9qk+Jcp&NgEC&+ESJx)%dnTxwD#JcKvm zXKe&h@*)7hW`h>p`kR>)184{qYc5hDBqFRiIJC31b6vUG0Tsd=D%MInJC8JHySvzL zZ)~R4`1&Z=P89#3k|J_c^@zs*7bcD#LCecao7VF|l788ZAcAzM{g!}oRVLj6ECoJ{ z-Klrr^M-uk)?TG#l>8I;K6HHS`==0>g|XyAb?wEbjg*Flsg7cH#m>%)fq}cL?))pS zJ>aM3L`p?f`}qT42`NvW4qSMm*B){BvF)sVvqfSn?!RSRvQ0!OzlDh}XV|x3bm#v` zkp5Trgo{D0AT*cyHgNf{Mr>t|Je0q>YeB~iU(Pi?%=QP==@|YDrWoGZ@8DoFgt>r@ ze6f3Ds$$%@&3Jy=Q~#|x3Hec&Uvxjmy-QeF1T`t!#ad%eXzu$ji0(D)Qpg*J4X3Fp zw@CpO7ILHH_4X6+4DVDV8@m-j#8E|O?(N1v%xzQoYfZb4$#oOqSWwb0AMaHepTNMY zKv$}Cb+8IWqzq_c5VO{CIzeC`sb z7I|8F`j!;qWz3%l3iZ}+uc*?vb7Bs^H;J-P$OD_DoY3dvU&~HEnIiYYdeI4^-2D8+ zr{?(?*}R$kZalooCCJSw7)y+VqE(vj(KBD@0blth`k8Xw6P4 z<~|ajqyo$5Pj>1i>%!i7u$;Nt3SG78Lv?SD;OOvGNh+aXbai6k#I_BLjh9u!kWUb` zwmksR=WHa=@aR1uQ2_;b22n;R$IT;33+rAcIB2}1uCBw*&2#%tT@E2dy&L^JvYf`J z7ff{ldg#Sil^-UFp8~7v5C>^O?4E=()WWlV2m6}M!SJ#Mk_%}UqVPkjb$N*H8}&F3 zM*KIg6tZZum(gkTcg7(`Q6L7%ylcGBUM-`EDP&-eWGu(CSiUq)YWiFe9cPoBl@?~c za}eqFePBJ8)((qw{crSESyU9Ty1WJS5VdZp)IAzxVL z>;`uGP%``>*!O5?6cXhh%(XF5*0dW9k?UD3?iZXek(a>o z8buXzM?-%O`K_z$Q>XV9#$i^5E@@GPo(JET%YAYbWR}h_Wq-B>o+_}+UP>R`&9hSw zo0`pnL|oM#B{rEEaiyrEMEwmofKhl>f*I^L1;JRcXW{RNIKK_ZHXnLUeAnL~0irbF z>2wLJuI@o z*?4qS#h~2bEx#9C9n?b3Vl<->rt3B?VZtlzF7|#(lxh@cR{P-}Iq4hW)+yCbFaDVw zei8R+Kf&~m*xW#JxAvpN4`W-naTfK|@y9*U_0^XeB}g~9YIicCwb|JhD5J+o@u+aV zhI}tqgH>ruz$nv|$jAB%7d1Uk45|CIn1tKaW-^SScXs+zQ|51z7KBl>tTyP0q3@z4 z1MG?Q_wjENs%I%7(iiuvy|?eZNs{ca`lBHG%LZPE{>=PDluAChd9zO0t`-S;+w>q^ z^w>uKd=Z0k5fVl$)}SJVY)7vS5QD8$t2@oCJhaSRlasX~BB=4n`77)ZZsFnJB|bqy z!`dmV<$P+7ImMfd*1%w}r)y|o#QGp=vhJ$6x|Kg9NQo$5V5@;`er@Ba_)I~rc>m<2 zdTeaaU(_R$-35#`#yB0pNJ+D~>GOs?$m%+2q~ZK729Si{uSNZ;r>>p0Ft0s4PS2#G z`Qw=}5>%Oq+O3QdeGjI^5gYouwf3HZ1h%f_6Vo%@4)Z=kFS zHb51$U*X9pM5(d7AH#i{RnR&vs+&{DnHr){6s)!Iyy&J#35g$ANk4)d=_pXOHXZDxUGO|$N!WWRt| zYfTOk5E>qF{Sj4ol$m+Efy?rrDNzeY-%_qHD--aDXqdB4qPVA(+QYwbuWt%H+L`TDpC9)5H>_(er>Q8+F+e%EB zBpK)ezLaX_HprZrl|mZlT%%?7jWEY~b9$D8xjb$eLqX8u0xSIsv<@LbGET|e0h6>Z zktP`Uy8W_KHk=8*ShL|^-@GFb78V>%$=R4E7T?=%v@oj((Z$PMK*piC1dH01UxFBYx>dpn2wg@sW(z{}>k;y>TVFN1pRJ-Ac@rc&5F zQDtKKR{IQJ4qxAwIUR3RpU0#dnKYHu;M-!c*WNxgw=LqE*X$=TyU1rU2m9n_X4WW? z(K7ka!oxNh@QzA}2w&Aiz7Gh*BzIHe>GSKC-C?q~C%qUJy(D}_lDrn(^yS`&I=vGV zXeXFmXcUwcaXtnWZF#rUFNGeV!1WPahTlP$WaSf^+t+Jq3KnJ6ywLL7pdNL?{5?pt zg!`Ad!EG8^b@PeY-)kPNH#duxDK|p?4Wf71C3rS5~5 z`{RY)5_BTHGb4*STPb;mF-q<5?@cW>XW_p_EN6V294&#@QjCbngzB80o9&IQ-E?;R zsJ0udpINMgxp}sPj`!iJcw9#$(psz_Mq}3R*8A=<+K-{h!*>Cxnc5Hjp|B`eh8scq zI!HHylO*ZoUEmF0Wd?0Mo?yCsIRw54cL56PI|)0lT{J4I&5>T^IEtSDUglX2ElmoI zxmUc2%qX&4Iy%b+$2u|s+V;}V4yuOS_O{JVP_KEF&bSHDAvfavHlg5)mz!`rC>D0Jv~>8+K1Y$7#0`baAdxy@0>4X&*@ZPQkx3d^Dn zlGTpS%l%L{W6j*LVThu-$s7&s)0vt>^U?G&RY@9-JU-0q59*zGW|M0@x;9fIp69SM zg(oGo5sUk^qSyZ)^%~O>cB?Vw0~%c}cS$)4smChCkV&&a?H}VT?1JL_0psC*w+@3V z&K&BHX02x`b2Qiix$;g9&3q2`dGblRm{xH7zAT0PcDA>%(DYbV=)6;x%C6^;cr)+6NltXX_hErm zegFYft-HsV1uNFE3ih_hxDMq^`^t^=Ei%c78lk*ds7q%0QIR6jLQtSV`P$n3Y3(tC z{kaW(G7jZC@D5WmG5#%FrYabYs7^YXmQH$jvZfFb!Snc5@5$CdX8zy4veI6?&%gR? zjn&caqoTLOU*2hcWjb&>d79!mUNn{Cb_~D0{FvfYir%2npj<1OVKWUL5r8H$#f&X~ ze?FMu-$XjdUEWNec>6tp?BdR=7BfPe+8-1q?YruKls(R+1v`&&Y;TuxY$jC*$6LBi zwv?O4;8rIs1w}->G*q>qFuiZY~#IVhWXs{X2KEB|aS^I@7o!G0AFz{80zXG^Tw4{k+ zyjcVCDpS3fmG#t|>Q$GbeMu=*9_NfY9jsCb%5O5EX`{n&baO(^3-)6KkJdF*{@#k zyDz|leiU~OXa=_9lx7RDcFHHw%humzc5bAyR^^a9^DeE=X1Z;h9Uf~ZS4 z4tg8Ce(}9=%upA21VqRmd7mFQcgR6Do}b8Lz8SuMzAIa{w0s6}EGP`>#s)WA?3bFu z^*9IyxqiyrVF*vX3i{(8kzz-6Zn#~X?~g)+18A7|Q!PTU7AZxWV@^Pro`F?mtkcCzO1eMh6mWIn2`MB&S=O*J#S^Sc|(GlQV= zn5hQejj^%50a$U};9)>%vB7{1tU|=40&>zI*%s>Z_^$8Q#!-IQYsXI>6l%yje$Cby z-;2KZSBbd7l6t#qE(^ zMn5-dX$d-=OLnO@d!4o|)%MjYNmE&G($O5=uJ5!gr=d5Vvck%((nBq@RVm^krB;fP zoE(kvtf@=$^&73(paGpIf$)cK*W-B4&|oSEPYkV_7-NJd=ucwMZ&}K(irT}u$PiU# zxi5*2&s#~)_ph$T@(ak_=CBXq*pybR>wU<`Rfgi8C`ny@Mi2Bd3RT!nO?TP7DX={2 z;_+KC;C|xKBO^`gHsaHMUdt_RRA#A)e)!qLh8x0X z!H%UkVOEt!E@v%2@Tk0Ky-8Roh$2x<>^IC>@A&{(zds0&Kcn^KGlrsYL*e_Msw7Fz zi2x62ww?OF9=-J;%V*fX->_4?y?qDQp{rfp(0-oR22gru__&!lT2~LiO+r3s*22Ll z)39%5+X0U_UbHMv?-@jjm*{uLurOvbhHdq^s}aN8_EKj9TV&OqF(~WJ4%%<9=Ag28 zu`^?nJl@ZxGV-s>{6lR|dM0hDl2n{IZ546j@RX zgi4Rp$=K9tO*G>k(o#PnNOCOJH5oBkubIJ*DAb4Un_RV?@6*pz1bB$izmBkW8Jzn& z-a|$w>)bx0%rE+n!-VDIh1npjr8MCZeWwJvho)p$(H_An7t7BwY^ThHnv0xaxV2O5VopZc;C4(a*Ah9w9!hQR^>AMq2uKM@AQ zX|Xg@wK>-v9|RmEB>L9dsp6zrQ&icIQvFVMRstIer4wg;>qgr5Jp}(ZPnLiDiePjv zHG}QMjo|&EoNn+<#=?s3~bHR>^+|{~x1PFRuUq literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/artifact_version_switcher-light.png b/testdata/snapshots/darwin/artifact_version_switcher-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdbb71e67bada6a838ad692f9dcf0e788808d65 GIT binary patch literal 6098 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/checkpoint_list-dark.png b/testdata/snapshots/darwin/checkpoint_list-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a31d5238791cf74c9fd1ca09fa58cfe05115423a GIT binary patch literal 15247 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/command_execution_card-dark.png b/testdata/snapshots/darwin/command_execution_card-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc61aa57c659ceb6acbefaf132702a8a429764d GIT binary patch literal 22439 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/file_change_card-light.png b/testdata/snapshots/darwin/file_change_card-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ba001c481fe601231911b146e9e18847358782f6 GIT binary patch literal 23061 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%0Dv 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/mcp_server_list-dark.png b/testdata/snapshots/darwin/mcp_server_list-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a8a5a4d82ad3ea02f94f8744ad6a82c29b3c8d55 GIT binary patch literal 26561 zcmd421yEhj_9l7=BtUR?cXzko4#C|axLeQz1ShzAaCi6MA-FpScXvN??tku`-^_be zucm5Vy?VQL?cMZYcdy>v>+7|?wRXf;C26G3_@4m)0FtbXgem~=ffWFNl7ssIsrlJ= z4Y^r{%Swo>PuAX(SO0L$mt0FJen44E+aEXs14JXA9LM4rePt3|j%~?)~ z_NbM}xO;i(;+vGr<=7pxoJgbrQ6PSXqlC!utH;?42NgXShD=oE|NplHhR?Epn7spI z`$mFNKtFiAS0Qi6`Z`0$ks3EHJ>}W04=uEqm{sqNN-^s5*V|lH&%^j z4bHej(_(%O@g5r0{1EtMm-#kn1lsRIcxj8$@m)%GZr`FY`_U~^HX$rQuT(9X9Sr2= zL9k4cK2xZQ+bm3h+=8hDUX~Km85_YC3Q{X{ zw96a+bwF1MBjMLc-p?jTRY1Z`}G0ABGiR*I0=S2O>X+9R_W^G*b(Nc5vi#qUug*mIcXhUamW8`+2uEU zjs0rBUjIJdG^#T^88wZTA^PrLDXCH* z1A{2Ojgi9R^ib1pbkFtlGK#?G zb>JxW{*)#^X;+7Z1q{BvCIIU8JoV5_dI_7HWhjt;MnDjHo$RsqxhQabN+qmrBIU9k z*$(;mF@#>jN!|RrpZLxyK?}{eY+5$&xJ}c3_Fqur9`q=N#as*lhc0NrP(y8$pIF-7 z;O*YPM+ZSHD2|j84qoh-f^6AP`j3l&7kQmFCVoCA?oYeUOjeCQ_x1$4E;{1kJHG>= zXH^qJ>0xUOJDA0rX?iGO?o>#>^wX@9j&K*d>9NBDEUK8JT)Ru~C|3Vg&^h z;j}y~;CZ8-ZtpV^&x>UvBhYvDhsr@ycw&A^PKl!}w%_kC9)bry`$vq3M^{^q{K(6z zyOUG8*+szD1q;XRXf~~`o=VsGV^}?8=xs{FkoTKaBg`=uQh7MSFekqEH+q#zici*|qN^cES8 zD=RTQT~IH)E-8T?0gER2Q`Lx}U6_T6jmm2wX~a2XQBFCx%?UEZd7HPzB8J4BonnRb zuUekcjM!T0nu~LDd|6|fk5^50W)hG^NJJEReN7*;6D+p%bOSu|&>83z z5q6d{XsRNsGuY0iH;G(Ks_T?!uQGthZ7Dnc-+q3yUPVTMV-`&TVxRL*}8Qqn|eF`6x zD4bniw6T9tzq^aR-w%oUNH{z$FZ(lcP9c-ud1WpFtza&*+1KfHz&bOIT13mUBQRWP z*H=*@EY^3=iCu43dg1z}L8#2l<9!oW6}w`bp)hAm;bWxq` zo8qSc+J9u~QY};D<7#ohh@ZaQ%+VZ{BHTQpYZ2OT#|uArI?mvq40OST`xF#t{Og_l zs|dU-=~tNV3?DipWNPfEZS}$rh!jqu+6^_!rV&}_=~wIT#L4B-h%YWK^fdh`{Aa#z zAC0%XuguMLJ|`EArW7jsIuN2|KRxG9Tj671jj;wsd!o$NUQE)za@s{#?JU%)S@;Psb z+XM(3(XiCimPP1Raj$Jc7H0w_64D*Uz3iZh<;b3De!!efbC0-Q7^9B!hvn#nzFkL9%>+;a&;jrPw+euWiag?1m*BPvcN1@=p-CED z2TtfefNeNGQ)jws9MlOQ^;QObe3N8Ph=kpi6#cCby z`7m9kxuvB}ixVE63S02QC`nTzr(frKK|vqpXUYA+Q!64m?S-D)zeqT_RlB-+p^N=@tG21BX}~msy|HPG6c;KzJ?M@my8qh_?*>CMdyGJzv#&9lV5o_WP1c4X7KKJeJHHlv@^k=9 z;Fnk<0`qqsrncy4os$*OCB(%#-4hAu{(*wP&N=>zrI zZD1)?9$X%Y=Q)uKMe>hiZmYhQo9pm~_!YX7* z8@;3-<5&oupF178Ug^6fTqMo4wRDlH8QSWW6TX#KR=&94d%|IFfHi^+{PL?r{QiE9 zJaOG8;m~?Y%Lq(~=IP-kgFTkp@NRM3@Ve^we)EJSe>lNaC*ObYaiX!7lYyZ^@Lhf- zub&204E$uA*xalsZ<`5b1Z@}|4a)Zb@1I(Pgt{Jp4?8nf<8h5h-+j%xW-7^trdhaC zG46GLcI6`E{dyN;8K>VSIGLXJRF=!Nd+M=Y1p@wS++PYxQl#MW5)#-W`5mi_T1n%E zXQki6qU}og1tst+}~q;R%L$q6mih z@B?qQWb7(8KF7JPxth#Z<Dc~16@}}l1%V}td+H;w~s8=xA=bzI#9@iQzSwc zcsPZ?eHFR>_v7XB1gooq@$m@h!@m|muZIP(Ej4~ucMMwB2jkgXhC9`JH)gkq>i`PO z;I7=L-@4(b+wg9QJi{$(c7&XtU?4p|EZnnrQl1JB;%*+Coe7UGo*)U>=0$AY*n?1X z86CgbxIF%mZJ#WWnTt>Kv43u)hDkH`hc5F zrXp|jLf=`Yh`KT`lDYG70RwWvPKOhJLHPt3=Tz7H%uGrx_%c)r6n(hrMMG=F?OJ4H z$Bod>T6R0JEt#$`VOq!fQ*KHImeHngc&#IPc?l|^w0nMGI1e25y@Ac4|GpJz752Zt zP2#TV-yjI{rJX14{blPUm0c~#-qb;Jk(-kn#ZIy~PxS70l1w{3euj{c!D02^<70g- zoUq790ymS|yuh6K!uRvZZnd&=4hsv7G3cR78i9l{k>tG|8_}(0!S*So8TK@ODNQkH zVC-${j&kh)G9n`4DT~Pgi}^STeE90sVE3CeMC%SdP1HBC7J1g?y*LdG1v6j{l+EIm zC|L^jupdWFZcKK5w@~_x82Fp?%J}mQZsXYv$~{f7wszX5iL23(u7&BV@WqN(JTpaH zu+te=$fuzF`{oY){?fMcUaN!%&&RQh{Bq{_VCRP@LtH&IZ7+XidVDt|h$wantLi*2 z@?MMS4X~;fd*c%m4kA5e4VF*OlR4C!Y;tdRYczV@38Q=HvL%6mITca;>Ljs`>#)Gd zk;Uoh>+EAb8spG*{)aE7e^CVPzjjnIWyzyU_=(?u$oE&Z_4fC%x}Wa%(N0_60(uFq z-E1=n&Rv9hm5_eu!X|&iLb4;;J-l$H=s7jfgZh=K1`1^-`6Qv14YsXl-pxk2x^4u1I2kNpU#G+J02Ip(iBW zLOnIELG*UvW{x`FQansV;_RwHIPC7lpO1X?%L86H^XTOINicinT5gC9-IVtSYk=}20IZ>ZIJsJs0s+m(q8(gc;<%Q`JM>S%JKkB3@a%Nh&aC6vR ze$?3CKixb#x(8JmvB$i?_1FFiNWVFF&Q%fto~q-=?69Hb&2|bo6JB(?`y8CVEy|Bd z5&l%gpthlrxFmf{n=R1rB5`N7!mO%ch6|Cl-aba&RC(j z=(>8F^dZR9HKoAeTUrjM%C?*^7#nLB8yDf^N|g><)z)c_SRugAOkcWS=~O21yWczB zV|ydU&dKoaE)D*>1ZmN;KDV-XNX4Hk=X{5YH4S1P1U6VIJlxOB%)AzKx?J>9By>yF z(Pzscd`{zX&1e~FbuQXV?m(gR^l<0U`a+6&=!`(JJ}jcjfre{}tNB&Gk9VpK#O%2I z&Lo?_kPrT5W|5xcLe6m_cbTQrP^^4b@t4F>WVyYl>Fjr&S+UqoK>BQ`YdfESRPZOu zgMAWykH6!~CRcr=!BdfG;UnCdvUD`e`hRl{E_migyGnOsvtENHs?XP9k-4~9n4@&< z%q*NYr|M3qEb8K;Dj7?U-}k1`zF~yCB&uCkV|lgmv&C;vg^h5BK6{I|ct78cUg%1C zM(#AYUdLw36~v%sY@h3TdLp}iWzDIcKtuT9T7z{iuf&FiTcsm<2hcoH&zRD#wR&IU zIAA_s>H^v2%l;la8pA?`sKJM4hVeKz_p-M(NpTOa-_C0z8y=ANm0JDP#}OC*u!DCc zd%RQPZsZX4LcaL(rTdd0iL%X(R0t{qq z?FwmcGYd1%2N}sl7Fes@>m!fn1#JzMyerFgVCER-Td)!B4^g-_-W7<8J|mC~YIlFx z>#4!5VN)tf^aA9^!Y7oLwqH$1>#+@?eEC2M6$g+36utn;ijsA~g~JC(e}_)4z3jL< zs`GkaAyBqsej@7^R$A2s?3-SpR`vLUdyI*Dtjx)_aowx;R}4|eKsa-}y6OV>?R>ts zE643g5IK{GsGF6)v&Ys%T&;oGC~VM_j-sr}k?=F6tfl33U1F0vif+!u{%PxX(XZR_ zI}gz{f&R*lEN>NAIkIlyR4}5iwYDVLJ9)zm+H+FXzQnOH5~($& zdPoVB!13=>bK8`zvl?Sq^;uHG{Vd4qUFy>_MEf4Nt57a)lI1LT zY>)fIJ}8Dz6EiERtr?{8{FHz!s}nbt?z@-8F;yGQ>~AS2Ne2QM723 zc`WnlNKH+g)LbjH$yJWb&!r5{nMrzH+NUJGYU<3BrO<|#c&p%y#Tkdfa8Ra^2}yEL zmdCtbI=eITkaO~;bcBh4d|{y+2Dz@0}fS z`*#jeB5?433Z5D^@>QH%diI1kKWB47&=V0Q4OiwigF+))f9YM; z5_U4=UcrV~QQ`Qy=f;0yj0(ruu8Im1Y7%SH^s<8)YVtV6LD%VP^=SpXGGu;;Bq_`n+)v1=P#Jg!T8ba@M{_pVu-Z{|#4p zu_R!|B^>6nyZ?oa2tni>CtluABu^~Jt{18qI;lAMx2D?B|4<;elogQ!3wP|=dD)%z zu4a+nDoG*lD`!(9yQL>*xH5_@j3{FMw9};e2jf<#Sl7(wz+O}sHcTe^?1vZXyZIMza2SzMNMmiTa^Ea6>`+F z+5Hc*@!$CI-(6{#|G>%r`JZkgq|t?HKN5?OT;cv{btVyd2E(!X^C!r0pR@{B%=|BH zLf?%e4TIsM{GSx;zp6MrTxGzM8}7d)o$W6K8ssnJb+9%6_RYM^6ov=EeWqUs5R^2# z_NDHoJeHpXC0v{SjF2__$+BOxR2!iFaUk@gdK`IIi-k#`g{Ka`-aa_fAhZ)8bt@_A z+Osp6?K6=rkotynGw!+14ogp28uv>q=rjEPr-edTI!Y!cMNRLOqtBUAG2}?}OZb|LPgR(H)?5(Z)Hl=7K zf$&e?Z#wWthgZQ%NUI(fLI40OH}_}5O_9YgNtoPE*q=Vuu4RQUIHKZVo7!88HV$o` z8snhvDmNNG!E5_}NXZS@qcMJp7^W9t`|-^|3V4?sZJ1LH{X-lc{%ABcM7D6IXEyZ5NjEf>WvHX$^D41jwdQMz9s5by zGu2SV$WM)9>-TuyPX~Kz|2=Q!tpLb-g8%QsokS+HF0Jr;n-BZus=$UwkvLM*bB~S& zh3RL2;MyJ^4^@&KW#WSK8xU$@T)B0!LxwHSsvuP|>)`-W)zqZwXGL)3hbNj1=jUI+ z-go2f$i_vljM5>CmqCTOx^{E-s9&wUYI+U@#r=huou6KQIv)MzHe3Jq*!3v=gNfr| z&~Gn)VN8SUJ$W&lkCTaVls>{Qf75JkkL3wC=jN0C?8a_@VF9GVWJTr8!XAp4k@?g^ z>gDk!2pwk!iSYT|!lrg<^*`tY{(Z?*q!U0%iCQL{?d{FOF@49z?7Y^W`AB}vFk#gC zdejYs0^sB8YF2w4?T>eSL5?p4KK)h9+hWV|V9sI791034E?$_bJ)F8s)8v-c(4Z3Z zg+fcm@6I{5Q<9!}V)P+6X)`1S1k7BQH;f$Rcfa=~)I$oEYFF?G!F`YtmPV67C-GW( z*2cmH6kuv$=Jw&r&cS}P(=FLS>}7O?*3|f)waPgP7vT_Dga3zxw#?BgWuz7|%M!a= zt-zk3(X-=|6Bb(9^nLuRfkK3?eBr!W9zH${!0*OysPSdfbA7^@F7Mvw*$LNjdc|0P zUk#aBnmQcp{3{#NI+{9aItH)+Ts%CciprzyJBW9fqOp*qv2c5b0^rkK%HkL~N_BBC znCvneuT6Vq{qNfLU%E2{51(AJ2zm2E?BDT^A;RF|6BDoE;=e2YO%P0Jq>Psdc0?>F zFnyvyjiLeosEWc0c`|jEu9bhEY%#=-sNH@~|aN4P$0)ACjM}#XxUma*9B8g6q7`i3Q21^Z!09cFgVt>YLZeQRTYVB5d1|Bk*a8oN-m@QXCf5Zs8C*f6SrO7V}5#p!U)YOy{^eIdp zcdl(ABR6w$b>+|X#uP=RpZ`joXwZ=(EkTUb)kRK{qUXw>H@7&60~bixXBZ#yM2I8( z;^9zIt3?^VN&a)B7B1_A3H9^A(^F$(GaB@lFJrh16WN}mLUpZWTkym?UQm&w4k?-f z$>Nk?p72v*|?rYgD59mo| z3kD!VsR{^Cr-ueKdb$w{#Q)jz(9zSGQjEr0^d1E72vMO&Xfr-N<{BX(B3s+oXzS_h z?qmJ*RQu_{CLk>@Kl=x6Q5ixj*~`lEvBlE`n6N8w7ss*kg~R=6%_=A=yShKod+6-S zz6{)+iF_W~Pu(#U_6L*Pb8EVgSlKy5BO)x{vv=DG39}_1B0#a3{W?AtLEX8agfD8I#&Kv9Ccg50YI9=vyjel$dL1YOWxbSp|iJZ5ahfc}HO`iKO zKQjSC{kJ{k2#FKCeomT;vD!8@Ly5+mjwAy=aaVz`lf6BU!%XE}WL9?e>;71ph(`&* zr0B~`e7uEO3Q}DRvc!>hRPF>48SY*V9eFy$dNlI_oj$3lUqTi>DRA(qXsa7YdYI;B zW<`Y(4hL@g>&#XTUP?JlS-hF#{pKi$;$r{O!+&9Op^l^sdpaY>iSD-ruD+|+Uo}0s zOThsF0goIX{O*epk?=XKrgEfz`~&6x=<&a?9fnM($WjI_DDC(t{dkM&g7<^4G-+CA zJK{e(ov4_1P;fB$pU=t{xJDuf(Bgft8D8rp=ety((Nq)Me>UTw;M)OsS$U1S#QAA| zh0NW)pf{Wuo7V5yAN9<1OA|*s;zxhjoq?1E*Leg52Xm%=iTZFWMo6$1;i5AA#<~t0 zRO{J8*k=1(%jxRYI6w8ZrrMg8rG^*?i$qx%hKe3Znp+v;!PBzz*uQn%T*qUwb4P(s za7{p<8g)(-v-&!6e8{6j9KsKOOj(+kLy&E5D+czssgOW`C~{EfO6hjqajE1z0RO^zjz7zDfC z(zx|v-ycDCoH5tj_X`Cg&usRZ-@P%qk3LAMi2MEB4MJ1KgKRuF(gOK+f4-m&Yz(c0 z?S+!UZDpD|iTg!Xahd6Q7Ms_1L={BVvu_0iq_Oz|>C9GR!#0GU)KD_wAkhNje>d>X=ld8$rHaNZ?HI;(coYYJU&yckLK>Zgz?Gy#rnj8 zY)b`+={Bim{aEV z8ESGAJnS-8=3_L&Zn4#dNc~HIHq} z3=>}7P0-dAM#N{l+q1k}$u2*!JX&_sE!$OYXuyWg!A0iwg2U1+KY-L@{cr6QseGuH zfx*rbLTX|H2LM2F?xiLz-I2M7Aqa9bH|Kn~?}9cW)WqEOn!rjZ%gG4|+$y@BVIvon z?I_T!$~@_Ds0N>xYV0&=Fej(#;^Jl~UA(md0^Du$wH+ql%WyWpk2gD(34;3Bn$nV} zy(Lh#p^`FR0dYI}xuO9weJktI-2|vNZy?LUURH5YIfhis(s4Si6 z$J^Z$E=3a5igbSpP6+(biKG{YbGbu0>O3T>DamA1{h8sZx-jm7STH7qP7R4VlJ?Yk z9op1&cfU_zsl3RaFM{6+f>X zM}|x|kW?GQ{+&hd(5%wiKhj%X@NTPIN|6FD7Hgrx6mE2I&||k;x2qyJ+`PQJ|GC%( zHrRNL96fCK*;|{J=Hws)HkTp>8gG`z$4~pnU*+`F^*#2EnE+pI5k@^7K>6jx896zM zd58X&8z=I8Kd|;dAD}yNKEWDxrK}DeY2!70UxZzyA>MCOmx;vMh}1v?1l&+buGrYD z_NM><$cAHIWs0tli@lS$g>#qg0>5ggq@V1?r)9)@;`I0&Zy~5_sQY#aqQa=CsJxG6 zVBK>si1+tDNj}W7vus&{UjaS@)L#OUi@Y=x{cNN>q%9YdlmNf`eg#0R(c|OtBCPo< zcslelbqz@>55=S(Os?vT-Fn&y8S!TqJ8hJ1fsyssB^?{@@2QC?`>v;HnqffxKoVO~ zZ>$hYAd%LNCanV>c-9*NZcAR@OVO=(&GR zwqVEZ@JW2vsFl%K@|r2;WYpJzY5=phgq#DZGu|I!4EpKSQwzL?ZKDr`ifELOL0vODa#Kdmg~ zPISFr$m0M2ACa117kUVd57G=GjfAdGZ0{*Id%OkXt>h2UKh3uq{LY;b;blj+x^TOF z-pj4AfCljUgy`W&PTe6lH&3QB`66*lg0!B2_?*_PMU7$W19 zzt>;43x+WkhO1XPUPvN?imVSBCaDWkwdS&VocQdfUn`^d7F}Gf=rwIqnmpYcRyzHR zjpM|o6?y&4$1{rXbhP&R16nqoczb@~O2+qt&JpxD!HGbBAs@p-1^@bfaNak$0&+N2 z%{$x3Q}2!S6R*bzVw|p(zcYetOybgdwoeI?5X(GEuVsFIp71nn(e+}Dff-_wz{6jQ zICFc+m2^bSmRm%zm>caO1l#75hlYk>s4@=>R@Q&hrY^QPJUV7XGFqA+uPCiqWgPU5M~%F-bBI( zV#5xprl8cp`;WA_y$)fqN0`eNUA?>r>v#D3c0nh8E0-YG!N)7X+@-_bxkEuY-??Ul4LnFP*tr*wLc!XcyIu|7|H92$|SzI`C$P9Qj?KpmtX+D zs;UEV`U}%#_AHF5wUVO^&QHoO7KFY%zm+XRLWeZ(>MmA)1W8CxfFd<5XX$QgD>$${ zG~2CZ6&2~3>C`3W$cUTPvcg8%+Uoe57t#5xw3u+-Hwc#kTIq-#zIVl`sRXk_#}83m zLMXul@wtS}LyfOeg6nuk`*lKgBfU}IiCuk`(5I*3#3+~XXNLqt=5Ftt=Ld0a(PP+t z(H@@~`>>Pkc|ZwM&;Oa49}zylHf&TOJr#0iMgpbgADkR9UkHcHt`F9=S8wf~`2qq| zs-Z^bkMwnm8-5u0nwFa?IB0o-fB*Wjw7NXrfEC4HdmR2_2dtlcI$B|)%5nKp191%@ zN(u3Lg$@rt+uE3*AS1ayT-qKJpuu?UbakQENvNq6p|hrq624{q7=YGCbmsRgdn!et4m_3;OPtKQs|DVVGBk{9gFw zdUf4Wq`kvuTbX7!SBaaaU^tf-lepXX16lkCC5-5M$FF8>Mu?9M7sO&h@K!_h7%40# zryTi_7+Tqeo-puN`XbTsZayhxghD&dURF@Bgt$2R@{%m-@$Ssn$vzwm3Z9a~dMCt@ zg_3ma6Zi3pBu-b@cXQffn%d}XGK-lvJ|mObzq=gnc^FZ`pLdEW8?p4+AQHJlx}`H` zZ>#dN8_R#`@q{%|;36!c9po&P3Ps_6Hdj;ASce3nelR66f-QDDJQSB5uPM=B*w{Hs zEAc8)d4=_?roOG2<5DM&IH)IUH8oXVUnx&ao}FSf-?=>?Bl~&@%WiyJnjH^@exrDV z&U8SLx5X4S$CaXvH`K2!ZSSh8hBi{%bm%R$AC@1}RkKX(ec9GMW|!?l|O zCx=P?G&MH6J9RWRaYpcd)zbP12$y&xA~MLysWxZVA&)ODFK=z*=jP;OIPO=8My#x2 zJSK3`IpSHw0DRTrDWGR*N7K}V4xjPsZ?0AyOElo%wKkjbbo<3{^`vFOO18aY* zy88+iQRl`gP;*Qz+S>O|elw%!--<^wVez-*@rw39F_M{{A8Y~qI@}@}$__Uq?36n^8fnRK-|@z2$3Q>Uep5zFcn z5Qtag_H57A)s|ixasRVp&jpJ`*5C0FW~S$pzCn`8$TkfFw#f~z?t)Q~L}kdnf6UJd zF}0z-c*DY)LgOID{9N<8t<+_x=?GlCYLSfpYfe=iM{*_tnh5URnhI>rIk!O;aPTih zOoZT>DRfY@n_KL9>rc??l^0{EdvMr8Q{>AJiUtd`mFP@Q@|57$+gujqY^9?M5^YTW zTodb*gp7{>D~p}fvZb_S)iTDD?WW48MQ(fFtx@O>$31LDMEJt#pA*!DX#D{{j86Id zxW{K^7~Qry`|?%uoJ=Q<*jQKL;Q?{JEFymv-ksL=>A;wfX*qzDI@?!veV#DHQ2Gu_ zAEh?d|J2642loEW;J@K3W~)d^)|mep6T{t9o64dyfOC6nW&82*yFs_VZC`g!Y{v5t z1l1oH%5_&)v?PL$4y}Oi<2@&tx+yF=bNx70w$|@l4hA+uMWc(3TPW~%ZdFW7_!dqw%9u{TfnI5`F1WEZ$NtHKc< z7(I`U_p8F;Xr9F&TtVT$TUO`C$V~jt_%`AOf-#0YzPHa7iW*H{aUKTGb4<%_*Vgqc z9YFxV0I0pVs+jnEAMbRRo0r|?dcSG3XpkMzhvxm@K}(_slMtd`5T{9m*R`=KtR%lM z*ktKDm;7MvycrDjiv|1gDh<#VXfZa5fWr_k(f(9+{?igF_cT zlHJvZGC`>Er?{cTv6B$J+x4g%+fd8P_9mFbso3f08c7`btx9ia!yg0OVOFM|;eNGp zU_|%{P`i9KLYIyp{sFYs#s!&H@i5@R)K|!sFY+6dIf?V`a(g%Hmlbm#Q=Prq zB2zTu6H;{1`7q)bb47@efY`sGEcga-4~+~rGW4~b$~td*jEEY8_L8-FFy{m|`>{5=P7iEwC&Tudvuf2nCuf%uWRy?UH2*sVuM#SPXkNxCBMpE6lGxn$lcA*+BhY66EptVyGl7wiil)x`!baWB zd@3^WyK^VNYobbENGcSl(;+6Q(^i%JvaUQ#?Dh*h)OzC~T36CB+OcXxgokJUt;O2f z<|jDl?O`Y>vD1aZ5qaHhr=5!uld0Xv!Nycju?-$+1*5*adEv=tgIu?@%j;ESfclY} z;cRNqjmZ73JCBS`R2L8cG-|(m+e5VHa-W{seB@i3rCD)44UbHKc-7(s1ui7GXi+$) zewj-sbImQ$B3kSu=6V{78Mn{96s*Toz$h2#d7pt zb}IHK>-Xp#H&h`1(_A_xf3_5P{K{$@`0dwWfpYgVgg|02#34;IdATQfKE1hs0H}{- zk51c$2y3gwiQdXehH9BY-LZ)#R34tt3dzGWzgH61!u!zOoKdwLc|0Pmx35XfW6Q-K zRaMnK^ZH?bxrqEyh;2RPXygP9U~ohVEDyc8Dt=}a`G!4mvvLF8`++~jHA8JstIPm*cOLHB=rcU4r3PFvD~8#Xh| zNc8-+v_{AB9BumvYo-;MSIdd#$nc#++h2@6*~8<8IyE=#w{olvd%9g;$h)YSk}Lsx z`YA9kcqA<6osw#DnE*Ra^v6BS>DV%-1y#|q;2@2X%nr)t>f`It>m36O|X#?Xx`$ zb6a4+zOzk;(7hcr;qa*PMTC$%a*UHTc3Y!{O0+_U&7Bb$)_@rZ+d(W5!k>!hi&s!|w;saV<+t18@Iyh3;4=#YbFa z#ClyHjB5mp43*M=we(aam;Mbt2|_iqUq?}!+?vl=7b4de+K?A~8y$VD=SF^=K&T?J8#<3 zVw+i*o}GFm-)BKDb5nLP)ylO3t)%f``VEQ_DJVWz7VhzITUC_dSy@8^Ce}y6tW-z+ zNrhR*^nQv}p%Y3FfQ4oQ;t^wADDp{D=NVP%)ku&_wzl=~I*NKbPp9Ir1oQJ@h6JhQ>Q8I$a2@p5UnIc97;M zb2xx`bG;~)$S=u@*V5Xt9wFs_|Ab!FSc(Uv)%fdRf3`)ZsqO2|2Ko1U;SQ>$-jTn5 zWI`$ni^}g8(jVWqwg|X1(gi?QrrODMSGquwVrmVSmGIt6Ad*2gKCrm*ulM8cOmrM zeA3l5N0%i}hGeqOFSO0Q{NDKhFhtUkn4k9A*=3VNQgo)b?PUIi#?7-VNm-B-PROlmL<@GdV%Nm=KgY$tXNIWw$hUZ)9cd?#Fm~Z*} z#SpBJoM49Z(GwP`j0^Kmnn0n5A=wq|^Khyff%OT5mjC=Dp2{452=RLaaHK15Z};y% zKTziqP|~;1Ck?db;I?$p9S9o`G&tHL!b?h1CH#D$0vUA(=7~^;A@(yTVY0Zm@HOwv z_fAjCDG^9A|74e!PibujwmI~dN~q3HOl$T_s)8>s+kBqbT;H1J=3+M5g@uz$#Y0Wb z#Cl;5CLB=o>Sty%7Z)EUZ<8`&JQygBcXI#%RLtjaLB93RAy<2wG}jJia&q4(?5=bj zK@iR?EUThQsPj?4%Y$>ai(w&7<<>=#FVRL&7!wj}`6VPC`ag%K?s=-0p)e(_`P zq-kTS%L~m5t7geC6%Oo4GRn*QP3v}BgyuEWDOHaS9TCDQT>kh!oZ&-$d7G`!5iYVW zD@Xnr^Zr1VG-8e(iTsAbH3u;*KAoX(T855iUz6wGtNcpzVjpb6?m+(M*#$mM?H zDc+6kjYl)R(K2>Ht&+yIe_r6Ret<88`>%!dpEV`~S!9q145T$a?*BJ!kN?D`{zr<& z|8qqSyqI^E7Azl!UAW@^EQa+yoV7={KGp}wVS2yGR*3K)&G^p%AoBlTixPt3|4VPh zlK)N<`Cn@Pl{fN#P*IppPI3f`>w`*&kZbX3}skBX=o(B`G8h0`{?^1 zL3Fl?E5>ifIV-W3V?eH0%b_8uUWC_!=UTX7#(&XMGI1i)8E_~#CE>Nk`5y;NW&O-B zI=Zr*eoG=bsX*(`0dTk=MP+}LAMts;Jt)A1RR(%SdINm4NK%=NY#&$@;v=j(D1d&} z8IQeh@A$Z^AU!iZ^UL|=v?ez!U~|M}`TjU+K@*#TqQGKL<3$7w1fS9*iX+8iWTN# z&CJ}~_no^`KR-c;+Yl8s3VeN1x7L|Yg0;Cgq}+dpt7R?F)5|bw%aMn~idD;QUyQaR zu>T22dea9NmY18FC=I8UweljO#6nma#wdMrt6$(_5U8QK`Sm_inUjmlThj0N*d|Ks zM^^SJkDa$7eKL`7W2^*u@>&fm=Ugt%p*%-1u}FHji5Z@XAkAl17M2!eVQ&J-X-G~2 ztWR-NgAgS9U;+-n8s-4$tcA5?)Lh#LD3Y!q{5VLQ5+-kC)bnME0QYcbe;@Z@n?Nkj z>N?O+`+>*wTipYEmEUv2vNN^%) z3HqNn?i*S#XAA|H@98amhpZRs<-w12G1Wq>K#B=vc5aTg&FJbng=c5#lc5Q zT>R`%*=Y8NbK9zQeVoPrBs=!y`Pm@rOoy0R$XE2Xy-G+ZNLj>-2SV~wZS@veXe6RY zP$yEM!?O)J29V0!mhWkBxyv4p)sj@4KA*ENrZi_rusdzfCjpQqVktz#zMvnkeu5k<2Qrk~gL%D> z=nf>p7Eb!l`gq=flcnzW=kxy5UpuPhP``ZUx}V0Hjz}Xd0Qe$jlcG+4c0tmbmVL85 zWF-xonU&QEnQ*^ILyv`{zvU~Ps}Bik>@{wb>O3OfZcYg*(Pf&pb|kPnm8XAs@yka0stKCWs#BfYe*ToPT%lx3Ca1lzd70(s2ZkwJ>dfa z@=G2-4FBave&fjLl0?F#PDJM`RjI=T{3?{tB;OgMM~g)Z(C*Hwtel%4_c^KoL$Zw* z78fs$w`<);Lw9<73o0u)xv@>e#rpvO_q)2LpZNF~I9!nLS7@=hAYVSdKuXO`?u||E z>Y59C`aK3Z20Y`?(FCC;B?&Wj>6#=x;8@R%?}IbG$Y|*wj%{o{pX1Twf!K(cs)qKl zpQx>@98|ti|L4WOdBI0O=t{=1@C6ch^oT}t=WzYXC0*Uk#jEG%;__pDz!w=Az`OQO z1>}qa1OP;78yYzqn(Jj0J6c&!LsDBh=@L!U%gOp@^slskicM<>Vym6LU(25e>M%nP zZ?Q6xGKL#1Ir;l!eEjqS*bx*1Jmq_Rn-=hla#;TheuGww@EI(+@M{EudBDVk_>l$} zcLEjk(o)ij)TRy{Sa7|%B&|?LGAE$w36=k}*8IaF!411i1XIv(7 z)&(Gh+0)Na-HZ&{NJKM77rl@fQ@r_ou_VuX}55~)@ZBe5Jg&7~pSG-M);UF874pKtOP(hK~p;RNYD9W@qDNNtS zR($;YXbNKNPudy9@^X3)1qNup$czkK@Nd#k6SdR(j;ZPC7=IHlAow?gyM-iJqQX>_ zmU^A6D|`FAtgH&?>G3HPQ_ZfZLL%wa-A7=LvzqF%VJ&}(@E={#i3Qn3gM{22Z*K;< zb<0`Z?@(M^8fN8W*-8w|bS%uwJuZ9Sv~X&=3U03FGc`2aiO(mHkj7JM*7Wh3mVO5$ zWO>Jrp7k{Zp^ropc%Gi6K{lvnZcW_KY{BH$exMR0vr5s6)bt#KO_2QqKpT?~6AxQV zY`XA9XT7t|F_{HbH*Fec0tGIcWNL0^Wqy5jY33M`%TH=t&DEcuR~8bS-+~Z%*@Sy> z@lzX9Y!G6DXMmWU$A|NvDTi z$X(GUoP}?bX4h~mW$FS#wr@4dsZl1yg zJ<$3chL`t~Ku@Xp$CuV7~$RnZ^_vT-~}g*{$b#3s@9}zkqY~%FHp$J7EI8 zTZMbHix!NBUOPw;y%HfWQ@6u3+9o3M)$nv#-F;3n?qV<4Vs&!z03e?`zw%Puq2yp; zIa|pw#K*y7zlA$~)RC=MbAr8m=6ry#vDqRzx*vJ)QAAQg#p%V1-S1(|xeuS=C{~7ON?(r5|Dhg@_7w@~@jqUC2-QA_TzJH^=+B3|ShN^am zr)%`I^(G#W%4e^lUM0uKWZ`KZdJGIIEiw!YLB=%B&1LxE(a{uZ{Y=+JU+*(0lxHYs zm4O~qgSC!#(U_txC1K@BCqDuGCa6#NWRQAOm2-rKHrm^eooo zH`k4I`%XLeF!i1=b0GctMw0`Ip&@kSH=V~2x0k?kqQ=vLlnHmhF%NX?S2WoQ#d=*1 zr`(i=f)Iuof-z?}b7^XALPEX@9v#nPmd3bbS{O@BZZ#Xb@WfPCsAU&od*;br(`R)p zK?EEhM3o^vIHq4F19EfTxEMk86!PtZA$6!|oKR{h)y&3;@)$Fqa*QPp^M8*xs_~RE z5X#9$H-WwyTgzLlPzRF{DSN@XjpU@zZGx*WwNGGOifr$6cOM8*B$pNM z(hKTs82X&vf)rL~rq?9eDDctWua>(E|9BY@Kp*>y_*J=?NnvuC;5xn=-zss`84PHCXX$pWdsi43@-AZzl(O9=Alq;$1 z05wnD<4nm&_VqWiw4K`c*qqOw8|OH!A&{CHG{_rp+z^j;ot}0%dgT#ZkFKZS^#1c_ zAGc926qKh(lz0Z@u|b^1z{NoSif=R*PF=LO#^t`{`INmP`zDO~#O&OiaFPC}Ty*SR zCUK=xZ>90Gz7OOx-T(q1_!dzU4J<+B{b{OM(=RMs|O|FRa6T;BL1C-zu!y1bE zZ!>m9=8`7ziZ&>626AF5?k~xyWwJKKEFDgfFh-_YqY9%Ykq) zGuS~D?0tGWUWJ8)udJ-tNW%s0Y$Is9U7eg75c^7PREZ!ZxcYW>_EW}Ki=txsfddi)fblUml(*E_{r~r!n-l z#5!#IL(|z6EVZwPDn9(h01xu@rFH-+n!+m1^_9Hx6=Hq)P?(%zJytGr0!{j+QL)(Q zS(-_XqGAM!S3`UN$1@epOQ(^E8KgsLO$EEtzv5A%L%p+aza;OF#-nz_X{f2Y8a#K- z+gQ~elW-12>Ju$l*bT6**Et9u4^w+lhsS3x2d&2O4@b~6e)6B-vw!*Qo_HWC38A{| zvwOlAw=7SGr~3fEf*h$%Xv1Df?o)jHxNe)|gQofjY5aRQ9RJQW#dF}~2%0|Gt5}`@ z2soQ}p{e~#EAmt;v@oY&q18b!*`e{%s*kC5NKW$aD&B&lJusE|kC0;M0mOGQS5q8jT&^YAH%>C!qvYLr90VrdD)e1Qh)+i31>Jgi6Y~0THG<0gEe=UBq1{46gKPXicSR}h z2RkLFb+toayI75r2bl-8-kq_rEag6i7}>DC#c<~8zo{O|in2J^Jmwg6<(=|C6*viG zFeS7EkESh5Fkp3{l}yzMtTbw*;3Q4sGc_Vkx&r0CjqN$sbFX=752B9%iC170bU0L( zhL0MC{W9ey1RV|{(sOdOadVaX=pxboNzb}qPP-S{HV;16C(>-`t7}R95f|PKkL%q1 zB_&Z%{E3D2t>v+ar2)bNK9AIG4kx1V{H$=nI=6=Ol8yt`4;-l`PY;Z0Y95b`@bN3I z5r?+{@G-`y85C(>I>qYSHIj1o*g2_Bwk)$55?aYX&1!&DT}{a22XJdQyc;C_tt5oW z1NQt&=lcxd;N%H`)YDwTBGb?z?=>{5DqJ_+;935`u+AFiAEQ5aIjyz8>94B7vFU7$ zyac*BcQ7+i0(6IEvZ)^M69Fk zv%Sw0^)o7uGBo(Epzmj5EV1`6xi3=#&ASOuV?;_sbEHA)`2DDSc4JXx_)#pUhy;OD zS~?SHxTmx?kwJ*yWi}(RbllIyJ(lup#&+a!)X4Po!P@Rm%pjwTjCl-!AD=Tb1Ma@? zQ`68eb5a+YxU8fAae$(wJubXxn%U9@#)$Ml6(`_H>hm%j$&ech*ztXRT{}&h_3|O^ zM-=F~3!jHh&on}T@j+3C$lKJkR;dI5RnJ5~3#JF~a4E~p`~FdtGoSEW%tpymU?hfr zQ0F6v6m5|3z>!o@*OONpW%bA<`XdN6n>@%gk4mRS0rgkzJ%zOZ^s8Kh$80ri)jSY9 zg*ORpZ~hbB{jb^ie*yUak2lJaqG?u!#Jh2*{>6+YAmOoWKz*J3^rn^y2RZrnM9=cj zBXF=pB>n!QmmxsM91{PZFnXp6{I3*Y+;OCFk&7l9Q+8$c<1i8Vd@!-#VW;5*l-pW- z1R{UQw1;d&gug@GnX96w0GpYLdl!>C_$B%L%3c8Gn$CT5XXlF6;G>I;jVLUP>k1gw zmAD!CcX2aPv_t}U#E$k{esD#+76V^Gv2K;z&dN6XJ-Z)n{$XHX@?=cA*Jh(l)!>r& z?wzWS_#Ws3lT(mfb>C|5w5hNW*3>fDISA}7&q1<1huYxN_FJa&YBqJjO)6d6om(JCd zDOBn{aaeu*q&AyYs8s*xpp}slly~rn%J-q6<}f2X$nKtto$X5uRD^cIKuyY2n%7}u zRFz;(%7o^?-10hN$ybo9r!!G7oQ@b*^IX{7HM)=ze zNo8SS$s*BU>S2`6R5d2Q$}d-ldQ3aE4-*I9e9F~AUZyHAIy#h^aI=Gx7VCQW)Yq;N zn5A9uU(H@C$=XFW3ZNT7e+kdASF2>RKLrKC&&mkmx(AlYw{84QRWC)CW$40Hkr zl~UDqo9P<50eL+e4r@a6N8*c$xGjn@#l4TavzZ8N5rA}DO8O9AJn3}pMsk#M<9bN< zdUu2F@*sZaWEZ>T;cZMmsbbyf?yd9F8PRvYGIK+??mm%y_9pZpe1bMI{=HU_Ud3~L zMO?`2(i~;U1H|&y`Qm{N2cFAqqh_LD|G(U=mhB{jklB?Cb5riIEy2Jz4QHjuO8#M- zKv8J%r~G_?v9DTSLmsejSX)`4K|adYe)Z4@XrLyNjsb!b5P}@-E06abh(b^6+=Xdq zH~=aJ0LkiVuNSXZeJr!8KAbgk9`RO{laRz^XPb|VK)-|=+yEX34Ph?}+C~W(JtEOC z|1MxSxB;P~qua|-&BP~qXvM6oAY2{Y{O&%n)s5019DQ4tWx zX5ujWD?k~c0sURxF*|O_4*hRckFtPhpf&6(-@Uy+WtvrzX8Z~E>=FymJ`jlUo;I`% zJyAi1KwVrG^f!yd;|DW)ZFTirelvfFmF@<_bw3;ev1>Z`bqX&aLp{;a?kwTTdBToA zbGk0r!Gd@L_FEepYD5S`-LE#N{iPT7o4L7|;L_XIav_js=NHzxmz_S!|IRIHCEGXb zu94>Bo&>f}V7CHSZ)VVl4(aXhFXzhGnYf7b((0XRWeW2BYfY7fM#r<`3j568Y3=Wv zPQ`-c7TE0{Ineo4GdsOYF31p(E)M3z#KJ;_3=Z=>&FZf^X(JB;w!Kdel$35s+|nZs zAnKpG51#iYcgN)9F>B-n6vexN6MwU$%G|@Vj*NKn1MBB&;jp)tE7o#td-=JVn)033 zy470Gb)A|fTOu00ex;A{sUVM)g_=gjy3Y1{@lS~xAcn=jqY4n>(T^^T&$LzakGJrf z2g(@+UgBl1@0}6Yb_XIRE!|a&@-Nb%+mchYJ zu|3!%RJBybNE_KY;{qYidThw#vwSM?Br`I|!uCTs1_Bir+qe{1;$FVg50B6eF#_wy z_IMhFj?RRlY_EQ-w|93~Yv#maN3UDy2n2Bbsd`5_(3LW?!+-WDMM6+;<0w)|`f>}b z8>Zh`v(w%{j^gD#KdMWsM{ZkhZ!3WTCLi+haug_yrreuxS~C~mw<#&PkS-tg_4S!B z5k{rSexgvj0U6M_$+Ssgrr)hYNO`BhLC5pSO3k4{8)5Zf;qMabbdf2ziy`t`TLH8> zMZY@1+M?D$*wxH50WAHhf-}({N<^(-w>r;j{%5yZyevJDr_k>!&F;^{OIyC2=B6`A z+(k+9mcoixYP?%sp*Cae?HDA9l~q1@5H5a{!mje0urQ#R<^$d8Q8u=XjUq9F;Q|vfiTXzuR->wd z0|LoN@7?)}7SZUp#FVR_U(v(XdG^U)0SiIsY0jj*scB{~r`u*4TI*M4td~F`-)D_6 z<)$#D`zaIsHdU10L+Go}^I_@Y>SV(^L}wlSOZK7{4&!5Emsw;ZHy{yj-?p@pCL{Ys} zJdoK2*ULs`+pQqQVibt+$QK-J+)~qoks-cR;2L2TK!NPer9z#Z%0ZlMKDdyPk#V$} z5!`K?Tbmpc#fOn^m@mA!`!lP5e#Y%u#-O1d8bZv^{ri5Tbk#OP1A`h5YzVPI5^hh6PZoP zQ@0#mr>@K@lwaRmcKaW;7jV4tbVV*aJsOMs(dcco#f>W7!D>Ye`<&+daAkE574mJI z57CjQm|V3Zx;qulxkZ5KF;b}W6bEJ6V`U)<6BVn;&!9u!iGKNrbJrCLiQMY11% z+%T~bY`&5UZ#<+hgdL={#lQr1+nVgAJE|%we9pSGTB84z^6g@L|H zhPHds0tje5DpumQnQ~@=!)3Br9oB1?2BY6y1u9nKk(H!qUH7R zGIu+u80HnBJp%WZhBS@IN!RC<9x)on6aBmP7Ja3*(w?u_Kwc4EG#t76M+%r+jxiZ=0oIj<#R=- zv*LG151ggW#Yb85R|AYqU%$;r*}&q-2y~RRaTCmN7a#mN|3Cg1C_aa36YdYd8ikx6 zXEniIsH}PgW$8S%B2A4ncHE5vnM#(b&TyNx4q36yIHKhPhRaL`yEZwYYz9S&qAXp| z4UDEy$J19ySy?)(E$)HRS!$QwzZEFtCRZ$^7k0JaJNY{0TBd&)~)%c>3r}Uz;@6LH=`CzeO>%jN=s|Pu4tttS`3f@Jmv$D=NPc# z(bBANuEfHI3~P8kCKY2wZuL1xlqo1F86$TwlvA(k40}`~osD^O&|*A^=u^B%DaJCs z&vcOI9IOIv_bh>BXchBHSTb)msn0Vyx8Zbp{8s9IMU^A+Og!ek)cu%tL$H8DD&t=k z=SGG2(>5Z(hDpbGL;~Vio_e-6e0Px%Np5H5HXl`n{zT>|hw)>*yYu-{zSeK~?Lmzy zxX`68IJ9Zc%&mj2RMfvS`MarJeXm-+xM`S^H?LATR$Z{k!v)vz+d%Fot(|o}xF( zc+*Toe(EH6fQWvrg^^W)ID!DG6D0=7xN&G1xXO?f)WpGEHM^=;aykgN#5F7aYb=zuUbL z*`qtR=gLyKjmlhb$|vn2yt8d?NZZcE#^F)%mXGcs`@(RF9}rY}@Dsv|bDn8Ael>A9 z@aU$`0?L_$-#P7~ldHXM#VdOs6**Op_`2|gu&g=Ao9YA&7yjW;OA4snN-$ba^2U;i zioTw<>hOr@>vIKFb24RpMa3t2XW}O4-Ecg7tXlWF*;gIzpujJzPu-S=c6A68QwTL* zBg`vSZk`Famr!j*BdubNF%gT!T!p!7yCVajJHC1rw&kX`NhseaiHe#I^#rsyG zf~_?zRoSYKfPH!1Lw5yX{S=mTZB28imoVYqM!%#%)FIn#!W{o_qlCI}ljWs5X!qP} zYd|L%pGajufB}hjnBR*pGc}dN@GiYe5-H-Q5k}PpVr;Rb@*LmIj62b{(ZHJOlBpMH zR;_e&Ee5w6Yhi^0l7;>gW+rB!#0ySmUiQI3s7Li<&~|NY-NH_{YWb~}0iirS zT#+4c8{BCo;AhV+yKPc!IUsL*eZ|94i-0P6I{TrWWfPQPKmlE}^1}H5D5sT=-oKXo zQ=%0QJltfZhkX0@ych#}O=2Q0R=?XvU8hG`Vq|}$P5v|;MI>XGkw;<(6i?OLyfUo@ zmUghrri9N8l~U0l=WgeRhS2uLi&IUAn7vNh+X-NdHH#av*#fDO_uA|nZOIIES>@-o zf>u#*GqJxif%Dp6oIv=9M+{(b%66)WIN}6t74u^^{q8myE^Wh_iD1sXv0Q|qreb{y z*q&`jIE(X%=U^OHqQZW4u^q_9q;=da5Kuc8U{*-lJ?;s^5;|nK?bskxuVV{>(9toz zj5J%)#!|_`MO5nY%&r9J>7o1TdCls2%DdsCqP*6!A<(iagQDx$SvcvvA|f?U3qu$y z_Gy+H2hpFVgPT;s7M*MLrMdZ)K1R>J1@CNszsjgnAAdj}!@TMxAu2${Jc_AYtIijI za9_2^7v((>El^;I#ge{Y(7+?-2CL}ZVaJUCMqrS#V=ZBFy`#y(Z$$q zST@Z@VI*R@$xBPFO!T-w}YkOF0$gyJotN*%zYJ52?+)`~6 z5sex8zvI8>3Cv5>MzdZ TGOGr!E?iDpNvcTVh2Q@H4zt9| literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/mcp_server_list-light.png b/testdata/snapshots/darwin/mcp_server_list-light.png new file mode 100644 index 0000000000000000000000000000000000000000..75ca50a4537029178f537016e729a3725208c73e GIT binary patch literal 26213 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 SjRnkfkg|e?e5I`UyZ-^TOL7YU literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/memory_panel-dark.png b/testdata/snapshots/darwin/memory_panel-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f6834cf714b9bdb9252b60674bd17d6676eaec GIT binary patch literal 28687 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 z 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/multi_file_diff_review-dark.png b/testdata/snapshots/darwin/multi_file_diff_review-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3c55b799e6e0477086e28eeb22253cee768850 GIT binary patch literal 40763 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/permission_prompt-dark.png b/testdata/snapshots/darwin/permission_prompt-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d1bd8d5d2ca6f68ee2acfba54afaa56aa0888936 GIT binary patch literal 24519 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%0D)R?a8q=Bvi6t_CJx*S=K6ah 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 D7tzpN literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/sandbox_status-light.png b/testdata/snapshots/darwin/sandbox_status-light.png new file mode 100644 index 0000000000000000000000000000000000000000..6a92c0653e5876bb772bd20e68af71b9763f08c6 GIT binary patch literal 11551 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/screenshot_stream-light.png b/testdata/snapshots/darwin/screenshot_stream-light.png new file mode 100644 index 0000000000000000000000000000000000000000..408ca79f98a6e8b22968ed62de1e8018190860a5 GIT binary patch literal 7643 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/sub_agent_tree-dark.png b/testdata/snapshots/darwin/sub_agent_tree-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ab686fe38934c743d49cece2937f643cf100a0be GIT binary patch literal 20444 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 N-yC6MTnWD!|8E$ysY3t& literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/sub_agent_tree-light.png b/testdata/snapshots/darwin/sub_agent_tree-light.png new file mode 100644 index 0000000000000000000000000000000000000000..6309770160231733fb52af4955a0c36e7cba6e90 GIT binary patch literal 19589 zcmeFYWo%qg(?W@cvW?RR$P)67aM ztu*s%wWqFHt<&AN@2yj(>ZzydhAYZTA|v1<0002wpHgDV001N*`29b4NboCTRV^O? zAS?S*OhnZ)>paUtH*x9nc`7kDE*OoJ>^#~Ql^!cT8cG!vZlR(%2D`i3uC{sd^r59j ze{F4X)5h-1xQzB|0UM?lgot7wYd^YaNF5nOU|igXcgS^7L_pqW&8EZD+xri}BmU4t z{yksyptGwQI8=CO$iOZH)?*Sy`u|`4?;21^LHPQy7oFGIUP#uOHfAl3DmFE{{OxaQ zQDwBbXu0rziL5+5c@OE`+wy1ifM4#+;cpRC%@(lGxeX6VXjH!vDP zZzbIg%=ZrdPTJd%hWb9rH9-Ho{QQw#;jMrF0MXs%npKCHKU)RX^*-Ls^Xq4>UwqUB z5RnSy6}i~C1}gVv#<{|lRqF4sC)qi_NkAnAO&A}UAJyo$;v>seTqnf@eJMFASv}RJ zkFKaJjfB<54j1bu*p7Gm2OpGIU*2b4&(Zw-f!50sAbo)Klj<(C?Qyi@;bu#zN_KiV z>Eyz<%jPNYJ!p4FqxawR_VLWe+(s4zKzvY^x{Ed#h-iV`Kt1TF) z%Dcw5H~Cko40Dj+B*SNv3ZO7#Vso12=yw~pWEgu`yKmVf8qOxMW} zDz|CZoiwkfxf2nxKdF+P{JPTmVipAnSnj!FfGu>LDfmTvSz~8Ml!|_=l-W{Tsy9Ps zb98`}#p4|)QP_iBE-U!qHf(Tn`Yf_(c>Ay)eD@`WImX)B+Vb#B#BWT3pW5#sTL3_L z>t~{rLU~P%n`7GJw)?WX|mMI}fK$Q;Yr-1>ey$wTKJ42&(liy=! z)FM~x<#mGBY1ei!oBwO5jg`^k=NrS1ADA+Na45c0wDfv!n-RgmXKd}~tI5Y;dpS;v zM5(kU%sz*D@18N2M?jW~?&S%jib_a1#MT#L;o@7GUakvPYVbL5=0a(`PjWT?qC$zu z!_6lqCQ(*i4!%*a6|eFvADA8O%sUe25a%1^!w3B{ZMdJmN0<1LJH^GpuJ?KATp_5Y z<++P6^Cw`mVf61E1YO|7Y0AV#=PcPq13g>}&^s_1ss*%g zYjR7|$zXvuFf`_r0BzeZZk$Ki1^~D`TI-69aFI${OP_`o2%;aNtvxv`xQ+(LuubYU zo4EHCqVe^ki$ut+;tu~zPK=G%*jtw<($U1`B4yxwpYX#6Y)ijmAu>d!Z?c;x4C3Pv zsHJEiKtoQY=iK2;XiUxt5=6y@d)zs?+&L1kYmlPqcDh!#l%z-(^K$dKy17=b)WO;Q1W5xtz4u z@m~9<7C%a0jcFYJY`!}&dMnL{eYSH_PwE2^M2hT&+?rtT*5bk2$s<#&%m>G(z@iW? z=Dc?rU2#iqM|1&Rnz^kE!NXD|b>$Q&-@64a62E>yEc{Y;8@|Q03l7(7O+m z{;AbFLRa*_PJv(yJp-Lg0nJG0Pq1MoCyDzKKIj$#0Bu$3KO_mpgB21pqTpiL?q)Ph z^72Irj!(WKT|Zv(DUVjgNm2Io`SG>*8#_4I7z)qLkU;?~UomAETn24*)Gs%ECGiO| z-aons2v$0Q{H{-zPy{xSEiExwS#J>>0f&pq=He8QdaC2lfOY>~!}<(6yXqJcAq))f z@VuDZiw}2-$Zqecz6{9+K)~apJa**^i6m%{fbcsfr>(u!+T-BXPpM6M$sf`7nfBvrhdfl(z z!)wF?-+CF%nZtD(j3*+@-CfMRN*cyo$PR;kCk`AcaGf2WiseQf-o027Q6M2Bt0k#b zeHdOO{G%ES89XUJ0R-s$Z2fEOG@nvt#*l)AgNbv1lRronht|Q@8S+Dv!h`}K>~8?n zWF-CyMI1{*h)#bf0|$!>6LoF21KvC<=_}Pt)fmtr{Z1(P1|=???Pr3zM;P0QiOB;5 z+xc?1P?=Vo?BR^+*hweykUs=@CnP8f5(C_5Y--7_W{Cd%E>|PYF-g9?J z<~nI)MZg8y7T5z5)bo?G@YVLT==b92hV>Yl8e=~E#0(UsWnt3jX-+z$V>(ZH;_Ts? z^FB&8ePl`OlwVM7!z@S4uOp0Ho!zVOZPr~OGBhbzn7QCYy+y&BAU`7 z4EW$Y;oPS!gOh#BR-=!KK!{Cnh+3=)Mr@u+<7hDKrV!)Mpl z>D%1qr1>-Gx5t)Vhws`jARw`H^2YP`juBbt*UR`3Q>9En3(Rkl&F-?&5z>y_x;i!l zjcHbPHgfsO_-6zQ3k#{hPF)^b7NewRxR*?w3@AX*A>0hcFr!=XD#`Wjq}^%tx{I@be*F4m&Ao$XJ;pTj{N%D?&Q%NqSOHW=-Hh2`Ao#e=CtnrANN#>onIPlN1FRfX3dI%hZ9CY|}0K$DAK^+;q7%GW3 zL3>2Tw#K@8YTcIuZlgAx)y>t(8xbklw8@ysNy$leFFuI)xFV#eQfA8J;kamcfkQ(> z19N*9S`JWv{?w4+oS5XX1LOF%;&wCBza=H+=0=AXXBQV|OsQibqWR(JKP@CnRq0{i zHPPFlfA^(jq^oPFF-Sux>T46X^Ult%&(E(nHB{XyJy0A-a-Dv_j(;INi(8nVM~X&D zu7+_YO&!rI>1>nr5XpShE-ttoMFBlS0P5_XT1E&$jIEU21%6N`$8c%J|17RHi)HM} zX;j7`Jon(^AmgF>=!23_a$2cg!&~8bnjFlj^X36F(Hf5VSlpPfGOZ6)7(&(l z29JV>m+nw)0|3yX^ck`m8Qsy)VMz!={q8HPtn_~KdV_mG83z3PUF0(=LzzHquOQ(y zlnshHhKL+|e0qQad~g2#6Q6P+ye+p9*TIQr{crGJYIO|k-)gc9WQGY?^x|y9`#VM? z0AWdu(79q0fMK}dPz($!s2_97=9-E>*?zA7mNHP=XZ zu^>==VkeRx^W+0T_JOQTj)_+XDMe;njk-Ftd=)Y)&@hv97I2Od_%SdO_c#uss@4=8@( zE1&z99o*@KxsUru1)hzpzrkXhk=5s79lzQh9v;C!b(97wh;-CDW$Nh8vkMG$EjNT? zE4U8d#P1}pZ=S4-S_$7C(_(5SZGkI(B7T;WHpvmYKfV=RfPoSqkC!X4Z^&UNJ9koJ zW7O>nqOggAQo5H0Ip)d~p2t}d{fy;&G=aLqdR@lA#Y+3#S%IzV8w!7|9!Q}-$hU#h-H-DzDe95Bz$n1hvo}+;?CmK^4<*km7||y zX$!pxP@u)EsARyO9=K4_|7k^MWnAw$yh&tAcjVA)pSrp%ezgW!>fa>{2UBFK!%_I9tcnV&-?H>ORayogfNFGhaxV&p&|QP z;d;QEoqJ5u>5T$ctQUv>S86xC6lFq5in)qOV#C?o@^si?6k_T?G#?R81MOe84hH-; zC_cDOqBnO}cUSWwvn(MOzpZ@VJ&vB*T7?HV?8t@r*?DT4E1@ou35_DKqlbnx8WtSv zejif+0s!~O4?KE=pQO1(BKY|Dr6fCE=wJXXr^A_^ky#Kb5C3{UJ3YVroErVR zOT_#OdwPzosc{kEP}*$d%FN8n!2!p>*cns0EVc);2pLvw>+9=lXIJ@blT`$otN!Lcaz*<~u}Tq@{*ggC3Z}yL^7P?7Dgy;U_xrS2Yv*?UZ)EkY zrL8?Jf=}`_-Gv|5@CwwaV`$J;4tBsyUz}kVM=&$l$-8kG} zo)BQ+;3`KeW8OccR7@~3Uf{sF0eI)Dn5ZmXX+6d~I%9^5DJ!eaYJ%R^aBnSsOHsbU zzJgbVmPH65M7ggD7a!laaoHBz+w~;XBxR~9Gn{Kqd6wCr?R~xb9I}V>&@`$rvaqw1 z&moP*fv{ZFYj-&u3>Tq(K!MR_e9sbhG|MQ9wT%@9JTzV_J7X2&(0VR4dieM698FEl zr^E}*by(~s=7;8BBzj^XZ&6~A^ZC-GTk?DbAEddaX;EYb4;>Wv8Q2KSVPc{eKf^^1 z7u$7i8!avb!)!!;Tf-m3p#$uh*tJogw4^irQ zhnm{?s83-Sa%>)3;Dd^a&A#5k3J7fI=&WI!(BUEtd3Y8Ww4b99q+UNeZ5_&;^FFJa?a9Tj&)nHTO@xCSslDPEX)sf9ot&@*TcjhlcmdREwprWl*=*8 zRi(+%_;@?~UN|J^lZXE5<8vr06@!5TIDaXf(zUcZ+eW#)GTr*&G6aVwbo9j`gb5j} zm{R#H^e^J7zSjE{QU|y)k{WQa!~WjaI*eb>&QJLr`uGP+@zH%Q$J;6Vg+ymbc{+JD zk~QRdM6rgbhiWcsQukQEo}Ho6w*tV{V2Ou@7ayM!@5zG}I}A60;^of36E9VCssiM@ zCxZQ5@6lj@Tdyc5XD9L;v^LVpKF2OMA;(n3_*sSrQ3win*SbNz2WKLkx!zks%R-j= zitFiZwNE~B3#It@1cKhb_}!f3aeX*FZ@C~3rn-1FRH*Y;(@op>F-MMDSt5x`Tt;`l|#OkaI5#7n@4#kU7 zPM1x|Ohf{3f8OEo3WR`NYSuaFR_)^zDazEiu5_ONU2HBtzplyTCjsF4pl5)N4p^(- z?6WkfkW3IC>*Hc;7*GoKZ+8#UMWyc#jdBEBRhzdXHS1mPMFd9^GfGDfXXU_m?75j4 zGs8R*Vr=Kv@fVIt3XjWYXuES6Fg^$oB@6%F5Z3?C!nDZjd=)4|iD|@&o3*M!6w=ox zLLSd;{$$aGkSk7|NH&lcSdT|YNEt7MfvNJyrH1i4Vkb$KlM+{%3BC_{&IKcPDtBAk zcPA-5r#wG@=U|TtJ=|D+=y>ivwMH|-ya(R7U6&L!%K9`dTBD{HjC)6xs0q>afnFP2 z(@THngTYCn`~C8(+?kq-I(a<2NZg3em>hj_#p4YMGV;#Nb9gQmNJbg&4vwnYm)~_F zs^tE60{^BVM(1FFL~+c6S~*QCC!ITkyGzr^>S?0>onp@CaO|5a_0s@SEXh;+$Z8_p z3tL%H5G*O`zohc&nr>VVv_8^)GO`e9Eu7{{WY9wrc&6@RqyG*kzD?;UPt+qn7fQmCS~3@N{{ z5C>Svzm!1!m)!c46b#%Xtyi^GRr=J2g^|TX`?ft{`m;EoYa;$%GG<`Ll&1O~=Lyo5 zE>X4T@#Sv4?*Sfp=C<;~HfE!WVsWTxMBFO3t>`n`=K@>HV%vFUh^*-qRRS{*=2i1b zAUTqWt?79Qx13)cX9{nZv22!t#d`#nL+nKgb*49o&l{*2+1v+L3nUM8gb_k^`?}%u;Hnm^ zN!GpdRO!(~e>(ltV5>n*PsPj~7IM4Cy!j#v^WUTxCtX_FUfurWLr+G%-T4)xe%Sfo zeyiD34Lp^!&Pcx49rWYS+f)9{{R%})cx&HzF!(0~an4*q;#~MLV%XRO&>ysvfgkS_ zWO;xEOimVJWbBfJ{sb%_*u)a?E|yqPKuQ%W6Y;sq>M}^c8@h z)rqevf7Cn+PUm%(T-?{sfdTAto!5{1j$@KXkR#t4XMAABXylTr zBVp`V$LST%=TppVg%U}Rr=aILrG~t}|J03>mIhQ;SFTp8g1kIvErOOUef{%Gu|ZdX zB5m|5Kd@)BUW*bP1%Ezz4Nsq}k6kYm8IR4>&|-heKF}!e?;1{GoBVo(EtTL0PWi1; zu`V@@V7Ctm>M;ja%$^BN)I<6uMd}Diih%4-StVLb!8xBW{*5O;OJU~r+qEE8*goZ@JTy2XBq9nE=}w!><{54>eVx4iIN4WFrEiv2 zRAVaJ>@caU5>N4AZZD_`G8(~U_Z!!|s+Z8&U}}rpdrr*+MrjilqmU*2`o?}_{#BxX zD2il{Z(zyM(LlOeRaLP_y*#uX84&@6je~>gG2ekVoB2i8*-7b}M88kT+xle31<9_% zl_Ah!si!!XvAL;148EAEbcfeR{hBdb-h=K!SwufjG~dzL9U+rosKIE1p)1u*U@XVZ zAWj37jc?!hR6JTc5i|Ag#18YP=gk$IFnN57!^UPa$~SD(vZpZ7{Clg^?C$LLkYDR3 zZ9fGQ!F+3-c3MUfeHmsQ(aPLMDGDyP@G9d*tIZbpzOYQbf zQ06S4Vv+$SKMl9Di0Mvtf5$3sw6;O5wYBZ(yV?O;yKW6l>~6ts*Lqi8T^?} z&5_uEs{TRYD5u<7e=%Zc$5*{3+xYPEk^S<-9~7dUM1XWz&QmC4?JIkGigj1sY$;mh z%6UnD?omTFZ2zw1_&v|}=^JdTNcmDQjeU6cd{=nbn7vGQQOXys?eaeD#E`PEdk{G> zJ|RyiC~|&2L6Ka;MixJJwca!3AB>6~X5-=8_K8B@ju8aOWUQwU8~>4e4*PJt)M=)oYNpdmM0dt&O1?}P2O8o5n|s=)Kqww|3;9B2+AR|P76;JI`#X7R{_lI9;1m`eR?u&F z5w&Rl-mc1}hQ;cSB9{Sso!zPMY!_colt|1?{Ex-9FMIa`mDmWCA-Of6q{US8!3O%b z=Bl=`WxFDR8MJR{NbD}`!Ex2ucEbrGNQgN^vc<|PG3Pp54qqyRCkc;&x`M)0sGV2s zJV)>8zF1(m@)CvLKUWlkPp~w# zn9VIuHAvO9L?p!Z$Cs9&KN17u zeFPTt;PCue(N%JK(Z}2(JElic9ku!q(!<(mZK5GrURHj3{_Yy`XPoyJJu}@)e<;bM zoZQ&;<6}dk?@$z;=rK{O(iREj#X44IM#@dhaGA%44>&6bFX~C=r~LsRO>$(l>1X{F z@c{+#K@z^W#2i&`dVge(MZcrN`w606^EPbQp)_!qBdXqHQv{xeuinm9lU#`i?NZ5x zvnF4WF8i#{m~#j-_u@MErGkM{TA9>+@j0 z1d8}%r1ZqDhf%iq4o{{sSNbsz(!2v|)R^;dFSjFm-alOETXxrZ|0v4B6UR+fK>_n0wjtmgnH6F=_&ZyJbT>5aeX#Y%gq!<&>=& zli&+Wbq&8U;>pS!z8*h_ZL5i&e!DYZK^o}qE-i9wlzHawH?N8&EDoNM*)b3GR`_)| z%VI3P$e3T}KD_j%wWy9k6Lk_r5j?(jmG?b~SFC_{U>^9{gDlbvGeK^C*D;27BnUbZ zLKQtZQCLUZ<(2iv?@shzGL-uDE5v4L*tJ`rxLwQZL7OwvE;q;h@r>vjF^GNi`XcN- zmjSK?DqAELMAuWFUoWrfv7HHpGigAYKvXby!lA~otL?PJXBhQ;-PiMQP*$W^m^!hT zvgG{p$-YpfJ+e{;JSiA!z)~*c@u=%9>)&o_Z|}!<<_<1IYyH%+`e_wvVdKUfV}eUv zg}vG3m$)2Sf9&eDQftPReohB>Z@G2z?LpciMi3{yyx@&k`BTClQMx~SgBfh ztINGnZY~8RfD@{nX!FLAk6E zZ0lUpQIme|T7dKLZf|?>{v{NDtmVh<({i=Ew!GYAxzjb-Josm6nhdIa{e9xwTB%%i zR`P@AH&0Q~(;X58@Lt5jJ=Rdn1D^a{aHEZ%=lVK4va!+J*0z6D$=UIhAR*3EgfYd3 zTPWx$Z0j4wLa4cs5i|P2pr40W^N~gayB7qq z@3zl%BRz@XrlAtvQOrzq8!rcw;HoLU-DbNB2-Uw>`IjR|q*;2R!6*cXW4|96m><}H zy%Okva_q`G<&=|+;R=R^;ZET&9tfJ8Rg-(07JsI0ehdS{KKp~rcR2em{sXl^)$(%p z>7G0v4cj_>r38W(Rsg*>)HSeGO19dscew3ggH!nXBj`V{UeQl%s)Q6c64ZlK#Z<*J zc=tT&8Ka?x^sC5ZZ2qZUK4+l9C8eBOVlM3mpy;Df(VSqm(zI- zX@t)|o-m-IF3DC99C31&l^a`bvsybmZtm-2Cm_g7snyg`E?|l4;^O+w!Sp-WXsMQ} zwdr4r{aX63gA$3td_~#PSNYeYl7;X1b_W%5OEnfWe@TeA^9)o}?*7Q>T&=fPDwn6p z4xOrv1^wRSIQMyJfC1x0sZPh2NYL8GEO}$Sk=*qo7{cnkJjH@(vxWwjDVpqU z$NMcC_1>;iYa^piHREmnB2{{xn@jZB z7pu~OLwHop+NPMwOC$;H$~+?nS>oIKe@MziLSTe~N!fd4Mn}>ah^>tPKdc zSM`67CZ+JV*XOmr0L+9E5w-yi!O3tmATF1sE^-X_dhL$0@co0jx-Oy2UdvqQd6DzluXa z2aj73N@Fu|^7wGdS)yAl@M**YBOtM0=n+(tLe-V(h#aCNvgIRlHyX?S=TH2SQ8g*) zRzLx@0X_hLj6%MN86r~n z99VIf2n0+lT6#s*yfRH{dfEsCnTCqUDddN6M*>6EZqdEPJMu(SS|&y9ye46*z}Z`! zpNMR;OHm{Wh{d{pNH#sD%l1#`;gu!E-%J%&HX242h`EC{Q`KD>wifQ%spp_<~;MXvS+P>QFTp<@uvUHkogYVRS z6qahU%aYS!CMzJUVQl!V6W?bbMd!E{TqEb=XkJ-cio>YDN(lqs;;smkC?W!a6&^u0H#-Fl2a2&F#8ACHyPxKK%40&wiYN<*wW{}S?Yg7 z{YH0+{Y?SIWjKHK(7(z{V8K><$IAf- zAD_4n!=H#(Y`1WDGATuE_YYrQYw4BiYkF7YORDqj98lop#{2D=0}>FR%j{rfJLs~3 z+`-$~BjAdecQ{w_$Glk7N-!`ui>m8IW~9&G*F;dHuLtGRkLPOi_{%Z22e9)ADq7n_ zo@h9O-p`LYWx|jZQ=bVO$d+*>K*B@q<9&f5{7c;sFkJr3zd#NoAG)qkTpzrcx;=}U zTfw;>C2_7Yqhs{fjUdWTkhu8#=9lSkYS(#B$vjK98y;v!>P@{{K&_97X`tm-I`Q=e=<+|X$7II zrL%j_(TyL)svb>|)H-Bj7FgXYn*s^M(Xc9C!;2*I6`Q^{M?VnP*fV3E(dp-={v8&0 z8ONZ$D%y6=mktk)sLUM8>8|Br&%V)p3dWFBNZw>DoU;Ptv72@Z&1_J$t0~_AzKEx@)Sd zZw}WZR8i4lxI7)QTQ1G-xslcnY%&;iG-TAm=Hg-$E1kOl?FxJD_mAGvCrcBd<9GQi zu(72_r2^c7UaO*P0lheHpLkdpctjX50859ne-o1g`1s~7T}yU8^I#yIw=Mm-uxcGB zUwMakEhp<2%))5hwh2Y}Su&HpfkW7sw zX>D$gp18TR#3@&$r%zs;VcvbNg8(ESsENZ2I=A=??mUy9J{{mJ}(Cd`&R`vx$ht8pIlrZ zBO$QjM+y3^*TLLT&zlpTTe<_+x<20$g|`3r|CrrKd{A+Ba9~M1>3Wfvee zv?5$eg#!HJPCelWZ6@{U8Ts}4T1oNo@u5p1Kl(~p^>Y(8TRt^0S%apEMiWi+D6~qq z8K3w(MiTQ=*Mr_y-l!Lx&^^DOB1!Qe)l_I^NZeAzBB`az9)sx zb~{P>Z22+X+zrhov648PK?(6ev0aaxkQ{_SDJgGb2B3PJ3mHnDx%kc!!fehmZ(~84 z7!1HLBb_AnFvCW>8B&Pdg4HYs-MYEt$NWg%oNR>g?xlqXvEaSd-!jjxw?3Q`nkl;E z3ep_^pH>Hz4qX(eoB#kq&ByyAU+yi;gV9}3XQ%fQ$@Ase0L?X`VbaJxOZTn2iOSg| zQ6`fTCI%cVY~9vbTRIAu3wqfL0px6veBO&0#(`oj*psBGA_@k6P&6;RC%KK-EK;kc zXe@j=y+Oz25j=lRmVp42uW^O`nHZD>T-!W{kJu2e#mz3zG1Jq+0(3jIHTBhBq-IaI z?6kJ%PDkHQApIcNF`dN+t4EKQ%jPdKJ9!6(zm`f4iV5D#yB8~~sX7v2$k*?OsvNz) z`+D%FOIS=R5DHW)mzPxL$Wm)mj{nBu&9?VEW*){RBOxab7%rxoLM}9E^w2b2DVMc}aallG{&HgkKGA z_by}N&h<04>AIy$J2JUR_{}e)X2q@8660G9c5?x)*ZnV%hqoA7 zTKWr{i#>F1dl~z|1VX9czD_xf1+a(TWxg4jM@A&?XPY#8e7uj|)K>ac$!l~`fmOLz zi}Nwdl=A%ST!<~s&BIe-zqP;JOUpo)8b-yJ>&H*#w2=HBl;218KG`^}0s&yv%WAz^ zcfY@O!c@T`EyJ?kYL7l~PW>$3ddJF^J2)Y+LyXoD@?XJb=+6fImYcAXpcplu>O;o0 z`tFU7taCKIL^CnL;OODP#@8Sx0X%~V5pQAkEMG4YOFgN!r@%xiVlYZ1c>HOpQI7= znX*mjlLDM%OuBiNK~3fPTC*D_9aja*mMN(;0K=PxWw7g;4A0bd{X`Z%wkC9O5UowS47rWQpG#3tn>0koKAQ z`FDqtC@4?>$|^m#*Jr!{$ZB~$PDK%NGy$y~G^HKz0f51e9vT?vu5Fz%WR=xY6RBo3 z^Gzr%4J|E|?9R(?uOA#t{sIUK`+D?hD6jlWOI$|9<~%|CJASkjWqVsk8ZR~`40vr3 zzwX1p$ye;0V{{GOsSWQ97wL}- z4$G4I9fvmZ0)8cIgaX>k@gbJqcixGF6G{AN^9;Wtc1z{*`8+NpBqVGsOaqqpm2*CA zGzke)S6I7#iiY}crReacHg}bH@lxNr;qD(E-6E+B{2muHb9VZ6IxC5x|0Wr_to*{c z<69MXe{@HJ>xgCHx+`T|Bvim2OBAEVyZ^I(E)%4kuUt%t3V%s#@7d1RJ5P9ieqIHy zu3c?!>KQCin7&np+G{vXgHwlVlYq`_e&F-^d8EHtb-=K9RM&l-G=h6}nI>ydtBlTSfHM~eeap`#QmX(Pyf7=DCXhvwJ zYQ_=?_P2g5P2z+Bmiv~H#Kg6g!p`FK8880Evdo5& zp}YAb+)jU!FoG9 z+NqA5)P!MrC+C{8MjXY+}>+aKj`Wl3+mbZ)DQN#e+j&S&OHXEyoph!&$s9j5Ocr44kNR zlatwJMCr#XY9J~&A@GN63nBG}M*#q~V(6}6P8PEyJiPWu_e z^<6YoV5cpcwF&qL_`Ew)4%MA3o|@Fe1Gp^YcNUDBwZYw-b3i^V9ggB2W0DGFH$y{3 zvf+|kmLt89ZpV=fYa-14!Z^C8W%?@|g@eo9NLg!)cjwRP%Do?IL(>fCIYRfRSpib| zrs!awS_`~ApX=1;OYu`DwME)}N#3kLMw{>1e_h)29Nx;!j8Bgw zmFlOrh4h)AxG}gCy1lLR*Xg!CnV5~}>)Q!l7?Z6*qW!kD0pG$3#SpMvJZ?6u^(n{Yv6P3ZKeRF~?ld!|&WM-# zvGpV;rCY3C8A~LXzhF(2O{lV{u(=Eiv4<4aj_Dpo(%8OflYoJM7}3bq@Y8g5x7Z1+ zHs0zy*4XqTszu4Lx%^ydI2TR0Bk^43zU0Y0QLwPSnMsRBdGB`4 zA%yfVOqk6rMw_3B4KYOvc%Kee+*;#klvrV#c2o#<2)>MuG`g;tP>@*2>i@M@(;B^KYqJ zO%6#)B??C-$HQa7ou3>NA5jROZ?{vLS+PJ@`x(0{9b_+2I&)NIu?HiBEfjqZ-91X8$NXx{479*oei z+8zYfUy1E~QCfRI3U%Ad*e7yN)E$H!v62H z*bCNdP}Dug-Y^Q0tF!ot|3~AI1QnkdjLjfg#`0<^+fO*!2kM_wES6QNXqJUIkQcyRQT~Emk)?IFf0qz%OFzpx`{Uh1f^-pT=Yn zRoEC+M~E}xA`sxke+h}EjaXe<+i3wQG&Qx5@cBuUE={Em@cQikrFr{ocD0I%M#fSA z(j2?J9+n(dM9{bE+FLkCQfEFfe_T#`FxxXfe)s0z1EGAfRFIWnnZCz;19vbowCQoJ z*LbJcE-_uCM(_>B$j5*gGJy>NBska{HYUcYFQLE^+)r!1+%1_x&pY$hWb`=N_r8v)%80X7g8mpXVzGWp#}Y$dgsG zaI$M$C@nqu^3GeYxqH4JR=OnsTLcBhcg5<3W)nsqy3g#weJ$B*%etI^Jbg`)MoQSJ z=QWXe=8ib0os$iP%zY534BwFvGbUt{#w5Raq4`8|_J-Zi&hEp2QF(Lr^y0&^b0 z9oW@b-&0@Ew0m-tJET$)a=?>cwhrbySKmLx-A54;3&L(|3SmF8IKZhc5l$@`bivZ8 zW+m9?wA62SaVQp1OLw`$ffzk;|a*Nco(Q;KOk0t@9M?@pt|)5c{L= zD_3~Y)NrW4h#$`M*}WuC@bvijdHCp4swB>hcjJa)Sb;?7W7WW*@o(;%P>^!Dt&P>d z)TaU}CORf2dT_3Y@H-F^1_^Gckww79ZzH|rq*_X|-si#j{k(PH2R%K4Q*D(V|5b7J z;nlx9;KL@wMHnPN@ovfl5p+v4=kZs&zU<=NETnB|aSn@x7Xl&VcCnh?+q?5=>tn18 zVjOvAgTD4O{+{jld$&GliUs(2kUE=_(=+|6Z>_~XDnb_k@I2b^HEX2@J?}pj4g;@F zPh$+QpVk}w|1*Dp#lfi1nrh(3N$(seQMu7{@{@Cofin2%BOM7-Ja_8@Gx6koW*BsS zaedZcA;B!91F?IP0rSAnPMnwLzb^kzsC6R794kuj9 z%XOd-&w{<^L)oH)9gx@D&T%(9o*zh7!{VW`N==VN;D|AgP@~sFeTmuW-NB+)|J{@M za44TPBQaS;N3Bwoo<}fCl8ay3Vj3BCVDJv7lD?uzySf&5)e(JmE)j|m;wsHNIsqQpnv-*n)tu({dE*)?ut-~ZRy$7qFiw?5G4 zWmm)C7c(iqCE)RMNpj22LponIB>38Xo!0v^gv-Vz1Q2j}nbX2K^G5QSEz!t@i*&^9 z!dd!R->AZG5o6)|<2^r7941bYg4gRXtd~HbAobob@thfRY=2x z0Vt~JKP+DnzkMujMe>S)6`STt`ytg43+}wte@-+A*a~-02wN2g1azHuB^XGftDxsT z?_p?1KW5hUfKf7*8P-AZ0XW_8T|(?MrDzBm1Je#QlQs7ab5Oq_b2mS}4+J{xZ=)3} zhi{QQzrNMT>mma@cTZ>zCC77X@YxNZ0llt9i->0s046yms9CUSk^HAv!Nbk^@7CC= zDPw2H2oNAq2!42A$?`iNsA+C#>Zz1n$Z8%R(0i~xM#UwautekFYiuK_Gu*CnbdC5! z^fOnnb}my;qR`3IbN_wi4h&D<2H5=-D;H9onbZ9$o!begV(Q!LSCZ^pR?X-5umRiP zZwVyiT=*{&H&PxBJ&b_UY*oew)z9D0W0@>Hx2tPfIJXVV`{2&`VV1~^9$yvIDPU_W zNc52k1*P>$!Pm~l#^q6W(I0qsGNK~X^TZ6M!#!_8O8uWYlMq)@H{Zv+A0OQe`1KId$VW1`m8!_CBAx;cO&)a>*L%*0GYPk_UQ{-*u{ z)&c{DI&AEw{alOO)rGIZER#~@0&T?TfipM-)AQdnBNnNtc(}d~i-?8<@F(0$sfnxU z$gC|JVh&~)S0qGMjxD3EUo51(kOKf9VGy_Fi;l0Xq+UGnT=Pua4>dJ zyH8yo=rLyV(rPO|zigb6zJ-{%WMN?Z8ueUBzsvkqNp`@%G^2V%3(ww`WQ?CEmBk<{ z(UM@eHzBe^3O-e_H0MJ{JECYJWR)8s#Hhg8&%jsUVUK{H%VC%xN^om;)?Rmic11Cl{riDjPk{FiM#y$cJ?T}?hgR^-P> zytps}fiqicD1hUW6DOySCn#4Zx0B@i(+4jrpzFB3LSt)7%VqMt#Gu&2!+kcdyL9c` z8{BKHuWdE^T)X7#9M$RT{f5GXkQStqqai9VXKthx)=p zbb|Cc*EunFvbebD)h&27T$M43U#$F-6qR3-*mLO1@x_Uqy={-0^O$a&b+syOvh;zb zjH{blNP+WHf$`PF%&!-m#4=Lo-G1Qv2qmRy29qeOP|D;OaM{~?oDob4;oux)D->P& zkT)CfUa#8tcdF^THRq*qyml*JAGDaVmEc)N!?Hk!K|}h%SCyn&6Xe2;ao$X5)GmRG z*7OUjAt$C@cY2v^&VRnRBuhs>Y(Kh}yfe$v7#PF=NtTkfz_p_(ZYKUNepP8Tl^=<< zz+WR-O$J^!?}Hq4Hd$HO)TVxdQ%|_w7Q0Pm(kiG$j7H*$Uv?^fJbyEA0Ph=gfkdy23afF%V^~ z2q=hbRt$^cf}w!`f`Eus>L^eGZ4glwD`5+Wv4B_vp^+*^plCuxKtL9)kxdK=7>3Gb zBvJ_p0|8_)A#7Q1ZjTRr?X)xPTkqV5`*gmUbLX7z|NXx6KNO12Io%pTp*{oO`*Vk; zwypt3a|HjM-veyp1RHG?sL@HKAQF|r6dNXAil(_4SJ*bU z>^@pdAd@7g^Q~WX`5f(Ya>WJH5<8}7&KGkD9YHn$_jCuZiH`Xy%GoxW2#ek521fHr z;Wz;#k}dCuj!qbq1}Z$?swf33N&x%&So>Hrd-{WROKT-rn8k%<({Q&>gwRX~V5*=^ zT|*r+8vn}^~v(pADH|W=Lr4nYU!mjw**tO=x z8h%WR6uZM0$q#x;ORJ(JE_H*aKq1w1UK6PywOV(xgzRk@^h0(wiA16+#FIO!?bd|N7L3u55FqA!1>A z6P&;pljlb=R~F*(@XI+&dVjHqY5a}RrG?#kMW5K9!~)}sdi1tP?kGRf6)YkSEqz^w`x^|L*cU66RyFJQrRkFIzbaR3AqsUUfs(U=6H$+DhlJnLqPtXDb zIP$=Yk3oTG0}KYkCUJbqHW;hN76CCPFau64Fd&7}`?(9UlZc@DdH?d2unE^0EM{hAX31h^i`8OgnBHffeeRw4^3@Pp>ILZGNRThZ2dX6;RWs@e|YFl)6 z6NP<^>|%>_k`n$91B?a?!k{=3!k~+l^Na!4M`yRsa}T|d_wZy@6VxLm%jd(*k^5Id zn2vV7M%iWjfwES5$p#AEWIfZG>IhL4okDcIi|#EuyuFX4_TRTWQ{?k58a^La7Tavw z?6I=T55loTD0z^gP6fwqgh9T?8Pz`JIW;#G2d6FkuKXQF=#TFqEQfXyrw5jh0|Tze z{Ba~*ceR@^2I}-`*Ix*tVdl}Xl}vy;1hyG_5op*jg$Ml z{;RDQDCLwt3!j8;kLUZzeZ_K3gU35p4*eLw9|bAY1@07QiL=s4{V{Z)z06zX!|+I^ zH@$t1&({`7NJyynCnQqXXn8I{J!AlpGIRtO9R*e6Qkj-kMS#(JDUl1;(pPR~xhh}W z(k4|(stW>@RVw|jsS)45g4Yqeb_+{%leclAgG2fIR?T^Qh8_XBE_uf$+v<)|KfSiR zK1l=;Kw^K2_Y(g>yfU}Piyj3y?sJkLK!St4Q+^cyBLIy9kpLk9K?1P|6A19e-9IJJ zgLvi|U8YQ~!A?sg;~=q@_!HMl=r0Tw3Jzxx1_$*M{GV2ZYVahZ%Yxl-H!g8Cf!>=4 zH!j5XC*Z*ELE#|%(-3xu@IPJrx3+)v_&;_zmn#r3!qRJm^@kDm>en}SnSnUGd4@SM z`Tst4D4e-Cod3O3XbCDR7}#vCEV&W?R1w|q(OAI($`_$FZMZG(Xc2^7(e6(a^v6~3SAB>yXwr)d&fZ4CN`PC(c!{8ae-?s8By^wqb5a^TMyK80I;4U) zMsj`C>AGhhHQ@}C;zkMu9X%&8QQ8M4pcg_nDYPRpIvQ1Iw0~pJrkEM7M=Cjq@AE;>O!TBL|9OXKz;Ld`Y{^e@$zllYpDQ=^sxdqe;F z@UG+cs_n23A6HyF{74QrGK>=*&1qSjd=eZ_hyeNpgq z>DwM%Tzy~?Zs8e$Ns06L)WU-KE;#clS^9-_O%ZE(aWNdeNR`dGyHoGz<>rdDijopB z08NMo4}Gk8Z4KfR10Me%*gD)k1MoIq)xmBH!`VcEaGZt_D-5Zkth}@G8N0T&1{~g= z53h-dg}?FK%pVn1mCHz;v!l}?W2P^uPd*OEr6NS2|5oNgLJkr?J-g2EW9Jv1oK<(b zUy5o+RMkvRSt1DFkwp=Y`%-dakg+THIrd$j`=!OhWX5BBF<4&il*NMLrG6NykMJmX_9?ls2(Ww?&_VrB{-5ch#KXL2oCk)@V63;a-35G$@<|B)IS~vx7NFRkQ+eD;HPS!vl1kjubRxudVSp!}D}>B#xsg z(m_2*Xmy@XSor0Xl$1DH#C9X+ez%~wc@q^C*_DTBd%Z?eml@^tF?aajkV-2{%c=49 z)VNJ9hrji*Q^xcT3=hVWVvgM^Ear|gbhZ`Cp3RYTX!(~uh-1EUfl%TlO z66`?2_Z(@W_`B*D(7&;cSnjZKM6yAwNvn}XCtD(y-AG^(T{rJ+3>D?bnMovmf%v-{;vXf0s_mh*f90WE7>uilJZndj4NOIhK zTl)Z9bv3nVMU%C44I^nn+KJijZ%Y>jj@kkaq||Xfy%FjtUm6w#&mVfephXhw7S!2+9ESaAp?M_x%EVE!YlGht#+`n8-98?k` zBNM}Be+#~2*YoyZVWo9?G=n%jExL`5kKdUC*#@dQYVzW~_u!8G&24056|E!|VG!EW zw1u^`oa7h*BoWn%$XVI9Izvo{ch9$eXsslxm8on2ku$xlQ^Qy}ZqH^`UOR8=wY>OT7d zwO8>x71eR@>io<^3RBSZ`Xt!xw4)JTa$@-iER+=$(LDZ0NLiXH-$_~!!bYzk)yMD@ z3VexHyA~yr-_#;Eno^KcBZ?2QelG0l5^fGfLQ0%xuD2IoSX%Pkuh^56WPe!*w1$f| zw@9vW+3a|nvAVbs1+5tSO)iL_n{C@#)9BIKu_l`(Qw08a!5` z7PYnYpKyk#Q=eO1rTkv7YS$WrRpjplOIKpiynyvP5TYk8W!J&hpXR5w4o*kAh=bW) z85T4(b!6Mt#nYmBNJT+2+xCc=tC^YE89hA5`WEJ z^joypdIR^F=I*0!w{Cn6J`nP$E^ac!q!5A{60AuKk$Fo7ks6 z1Go$Ra5|j2mS|0oX^-9s2P+S7r9QRoODr)y$I%#I^UE$#r}5C#PDo3O_JZ{*^zJ58 z;T1fX!E%5Iip$$!m}pII8%43zTcgu$_q?7{>13Ay%B}MaM5yI*ucKXK%g-2~U!Oqy^@d2#t!zMdV~k%{WjuTAG@c z7ZylKOD4cZ*R4{%$-h6jIV6>Mn3?3F`7J!slbz~P?Y3;nTiV$&3_;c=?|_z`3@ zXRLV@A?kifnvWQiKwMQ}mFpcvb&(swEs^T#*%inXolEIuImCkHY~E8eYd)CRU-Ibd zyVBDP_HPRK4PtKH?(2+sqfhD~{0m1gQ)`4l(2>~(ABy%DZ>T4$qMV$uP7Yw@v7Y=9!{(WJZwuz; z%#>}NjO#|jDRD00;gq2MRz8OidL!S-jfSI!arGQ^iHV;jA#lsoX}Y~G1#{rg4u_SI zXn+*u1KmFN_5rUZ0bOIv((Xi+nc2w*D>`=`@GYS3<_t9JLueUP^Ri{5b!W3mYfGz% ziNUd^)A^rSC4tSgI()nAX>q(3!ViiI?21lKe%lh82shQy;q9>(7G9#&{j9j?=E6i($dW**l=&cx~!>L?@mA#w@TKI z;|EKaMSZ2%{n~|hp0DzzKd{=n zn~QB{;(ePRw~gzk2HiK_JhIo;-v0a65w^XrWjrJ^gC76_uLfMm-T;lt-(j!0eL9Y^HZeW1aXqcC>L_to@ zEh~$s+gFcWP+()qm95ED-;^bjJS6YbnEZ)c&oW{L;x8~BQJtTEqv;)&H#*o`T3>DY zi~gc03^xx54uwXwbaG{(B4i;H!SGR#GDsAm&41q+YPTi3gFnl-@c5FT3 zNs1KyO@4F9H9?(b^&W5pogha$S%plN?!akDgErB>@vH9#lsXSQzDNr4jh*{ z<Wu2e-L4a`FHt7tfStlVJsHUUS;WaII zvz29}_c_0!?z@~C5iy>T-C!uMcdTSGW7cVMkjy@3N9hrN06+Y0T#=y#->_-Q<-}oW z!T%w`)X~|gNHBv8{neREM=L{5SM|BDRz0_d94S0KLrX?>I5i~&ccmw>JsZp)FIvva z?tLBQ&$IU=hQD zpI-cWy%Qd)at3%?Ubv(gtu7-c(PdQ?^mKIRdM3U4426#t5ks)ivdZ-_10IA-KZqgw ze>;1(sB3F#vUT1g1tFwP2vbro2Tjr>_y+(SZMl9LyK?}cT?V~L_W zl_MarQz5%uttnDb5&j@$oN-U)Y)aU@ZZ$35tFSuB=6g>bGoCXS`8?q!Eh;G)FsuV= z?hXj#9W;wY=W244G0>5egeEbc$rbbpwh00Ye@MUpI=B7;ey#s@Z2u286EOX~@Y4wB zfoHT%b@{O*SZi#ldGw_`Zq^%5ynY+T`0@<~RComnN^*Q8b&I8?&B8Ndt5M#mBlwO@ zGL=L&aSL1#DM3IZBHX67?z)?3qPcTjv-5I^DZMS01&`2JGG!9UeCqS+O2TaFx5u={ zbf%lHSquym6cQ2%iG)O4908%AP(Tp)|AjXSFIfl`0M1;`&vgp5cD+}F7|-X~#uJSW zP7ZY~4XjV0`K6(u>&>#*FW*8?q)0VzP6#cgW2ztnU}B>ZFn>&pZrjOjy)=biZ#2Wr z&iVv%z!lc-Bn7pu9EVL+ZzcudRQIj%kk(VPaKgT!JMZXEtomjT#l7@{ib6TC0Ng>%d>J6HI z-0#+$c0DmZuKanx=fm5)rHoHURp3}{cw}^TR)&?iZ8YR}gPQ9$_oiPotyt&lDhSij zh_0>%7-EN;W^HZl`^H77Nh+g_u>_BX4^rZA>(imw$SU3ihTevA3vGmbpq;-)Yv?`_ zfB*FS@lp*@c%#KS7$|T4qj#w@^Yi^Rb&!@Y9uDGb?U-V0W`97SBGMk7kbtIzC}1p{ z7Ho%@ZQf!L+IlZw*YmdVTt_?NES1m`s_gDThjrZe~`-t+74>W9zfGgM2hW zZVhIAhDyEnK1psZQ*CQ!ptN&7UdDRkNT_K!8M9A^ZZMFfsmf2OtWL&u-ICJMlLn7G zygZ|#Vv>_o=z!+IOy<6}EaVsaTq!#|%0+F136+YuvifMJw(nu&EvWT&RFVj|AozKf z-|HDpL_P$x+X|CSak1H68>3WFeN)x@*>dU+6jHPqpbTN}%%-O%n_R-CbXo)QDGYQY z1u*ufAB@{R?|S5c-uUHO^Xf!m(GQ9>(an;cC(SZt2cvvfn|0;+nM@3HZZ<~BlZ)us z=;xsfJ7nn*D2KXrb{qG{z@G3TrcE%lz7%bc-l@0F%*sY~xvtmU$LwxRMO9S|*=Fot zn2o01mUd>3H{Yk*IJj5WS3lksQ-LZ}*_D;mZDZGco2`J3EL&PxCNCLg#863HajF%J z>jizIlbKaGK#ZUBEM(ScYJbDg(P9S*g5!G=zB605{q`|Eh%~>IweFrN(S&7Xjhgv> zLKL%C{4LNw69-owk00sylAVi9S3^n9yC6XQ+eT)_`wRWHq6KcFkCSa&&vwRTH$Ey} zz1hgpcK0owgVkvxrI`*`?B4$V3gL;WktGwht>w=QtnNiwSnMTJNG`7RHPJjl(9j1y zP!M}pN1p3D1HT?tcB%?9vm@8TqbgZ>vPgPMx4sl(z8X=2%F^oFhZ`P;vp7?6;s72u zXZ{@Qc_M@*78V=zRK(r~m)e#uASA<1kLPREsueZcokNapULR#&@Ghz$16n)U_p7GU z)3eJ;%be_Mw{_y+LCh^}uoK1?FkHLx%PUG^E0q$9&CECz5J5n=qKEfH>U?}UyVOB` zj$R>fW%04{8jUkZQ|%6mod2H2Mv|V^qsu2+FpI^jZD}C3`c?|vrJzuxTvk{ge~PN2 zG~ZAbel5>eC;N(^X<%dHV}6Oe@r$DVDPIw3_u+gk<_AU5K{8|jj<2Jdvj~O`**pe{c(JvwY) zR-8|GG6kv|P)cX#XHw%-4mc=i`{aW|mfL8|n>soO#ty?yz$lE93n<76155E-sq&4r ztY$`br_b%THX#K~-LV_{$k=GYSOK7EzaxOM(C~4&K505V0QrfY?FFRHE4RRj<6sz zTdOX+fPq0neL2;&-njiL{twYARW;?su8#uztF}zL>TPh44K&xz$5{)I-u;EUsW%>c z`st9vrP@EetXtWlq$b9}k(O4MG%NM9Yim?-=i&vkhv@r=d3}cAG$b=URl>&O3~k!B zlA?po9@mz2>Qogr)=;o;1m^k<)oK-yQsa)xCJ{wU`ETt}C}q}9Rc_mAdFBcht5*DP zzN(svMib{9+dD<$A>#7yJ3d8D0y`wA#q;aik|oUPiaW_m;h;2W#|!x<|#xk|9n_bKz-l zABbAysniitJi|PL~fQ)U~8{c2`zaN5vuGRD|5^ z{WVdou#ylm2$u>~vS|r%^2zxDCok{qS^WE;oH%R9^NTw&H?HVrW4z^z)5&%D8iML^LJ_l9X{Vq5&b`5H~lq>ECX#l|n2^t`De@Ah~as%-)ZOkZo{v z0v=*c+K0ckX^n{-DF5DMMvRuae=tto>MT;Wd@=A9{8+;0 zBY+3H<#nQmolT{*v&`Nw8E^~+17TpTT3uu+)o~tTu(mW!5!32)0B&*@tIlZJmNv$C zT^jgp)~!UPc@dU5Pwlwu%s;1loAc}-Ajbskv6RW>{(_7-Bi9ecjA?9gaxr_ziG@0D z5oL=fYr}^me6eB$4nzYM%9bvhL}KdMGOSLbe2b+0%_ceqTyR#KxAZO zG5>_kvhXoV-VJYTbXvO)4u=?gu+65{7D&@AbJz;f*`d2Q<@fi^2^EVLDDv`dNRPQr z{+^0xe+7H@ft~343I1hn0A7NM>38X3ON>z0kfVQeqF8bvMEA-tdLos2v zv!^K=#|%FaOKX!XMSL{QN*6H^3*^Xkvuix%08ORD!u;!SncIBAE^)t*AyLa=mELP4 z`!*TbX^~K4^xS>+VLgQ<1F`}_kWgN!LgM#3Q_n+PtbBUrtwv)d%yKiH>ol=~xl3Oz z!dvu9R+%n$jg*dcYWnQl9~8Lx7dx|z?C54UF#12dRCJ6~H64xB8Df!XQ^voAknAH$ zo0O+f-;~iIHq)LO`b24!U7V;lt-a|p#7RwGQbZ`0EfjU+P>$-bSNhI1j_2y2!H{6Y z=?i#bfLfG&3mKe6%tNpC7Pf|Pb91R{GC`_rXyrNogMiXYM_2Lmn)(R>f?~ajQRM?F zz$0~3HI3x*Xo!)L(~%8nBvmBE#>Br#>dn(F?^ZdCqpniDz*h=#=&(2COXu>4wC zDx#;RelaWv5f=&sqd_R;Ek^xROwpKu`#gDzcrN0AOQSn%gci z2F+$`=m_75VpxQ;Pfl!34h^k_yQjc^hZ=Oyrb)hsk1!${aCy$_0~Hb7myC>nhBr~y z`aC@6k8Jm%L>c#cABo&Y6n1%hh>eOSzxGhr$pZ!mF86YqW=g~oN$GU6l%mFO)=5Za za#~ptz@gyuBT3V9MV}T%))U>&PXIe|XzWRfWmuTF@ZaG`LP)dZmi459J#&R*@cfzb zhSB`72ITPgGcl$orKEiihLB%fZOGv*=ic5rrHUe8U}GYqw|-?MH?Zln6kOgk&4tbU z+5R{i>3IWC1Le{lUelb%Nkby>y2kH#IaNj9bLEY*yy3O5Gpm4=tXa#soOmF3NGmn7 z1vno|phnsBd1r2LdJi-N+5;`G5=@|aQn=|1ThaUR+r6*F<^I$^&vp-Yc9(pvyNb(g zB;gxaYcI~@oY}s-O6=HeW1PlW1Cnd?_WAbq>iF|hr?Xx>zSP?V|NhQuw|cdG7TzrsIuw zv`YL6WWb}ue>wlWC_?=V8~XA7KjCq-e)lnC&h*AT1@`!;){;J!y$25pE$Q*UZ|Emq z-nHEZe|;W-zs%56H@EJdJaS+-PX^MzlM}#qcv!`X#YGoc`YfL6$)!#e)3p_n;gMpp z;Q~t+2aTboIY+AGh&_%FBR7rG_nzvyWOU@@tTd^DdB}~~@Rd%2GX%tkZ8Xg>L+s1V+)uwl$+ z=V^MlyJ#3#g%9$RdRyC!DUA}!!5dG!`iJ&&abtV6f)=-!`=I%>K1TCg$S`wm#f6-Mg|g(%Yu3CTXww77Of&hs5Nf> zxBbgC>J1a!$lR{>?(peo$*4$N6zO)aR|}SM+dr7Kb}l|fAH(-qn_VxLY0gX>qH5o( z0iv?SWr9}W@~mnD311W(bb2(B5zxJA?T@HyJ{8TH`zXaA z0`rZ5)>yGXmQ^Un1<3jf=_neC#h*o`OnCmdE-8*(Ji(mDo?F z^tum^{~(}aXZ=2c4KD(65Ub8E7^(nIgnR~@Ut;z6ynxV%&IK3R&BzXi?jhp=eSMDN z9~hqlLMYHfQz@M6J-HpURaKSQoSpJC@!783D0?R zE|0e`*ud+G&u8NK5PySK?K}pGK7I89DioE9%keI54UJg~<+Zndurveh%+jz+T<)h? zz;yIS$|)X16)7Jpv9z{zI1uat2-;JdiW7o;TbfM951<1pW=oa71sa$Z0?4tVO+`!S zPt(PjhrmO0%P2HnZeWn+_5>v=;-23nIAW$Z-mN@>6*+mC6Em{XQU=wGEFrwS>XeJU z^bGG%ZY^ApucfRQOC^HyUoO3($=<{9My^dtsBnPbe5h)9ONC`PK5Eis!8b{d!JoQv zYN89occ>H(llzU?FA6(^_3^WdRm-&NGSc3bVkxaFNIM+e)-3fKmtwL)iz6rUSc$Y48fF3!)JHFQ=9?GK22;S`ptVL3w^Zi`0Dz61#xj-UQlNC*m1nj#3G{*V)Nmzy2yt0RH| z;5N}qL6?tDBV9)qZC|+Ia-OqRyZDtQO5=VI<_QS}2SG!j&b3qvMJRtOv5WO{^&rXk zg=Iz_TKFU@zq(Qz-m%(AhxXoqr}atq6Fd$CN#KPo5C!E=PCCNT&LPu4ApDuNO#x97 z8=KS0;HC&gpid{y3T6NS;&!ZUAk|9rRbz*?$*X-i#dO%2J35RNf(#Y{y7x_* ziOJc<9~9s<%N(@#%#a z0YWeN6L`)aWbgK6@}JJ=Bt%?p-3~ryCyj%&==6F}P|)^{wfrd=({xxP=NDVm7um2@ z*~Ebc#?IE~PP1pwi`jPC=nYh?gw=Hbr{LJ-aTCNg{2V%(k0c#-xDJozn(jBngSMAF z5BxgLe?$l}2A-g6H*-o0`|v$Ns$HvtFGorFggt9%H;2I5-BU@T|bW=xAtGHf_3}3FMWVp?B(=Lh918R$x?8b|>Y|VR8A*m$>Dl&U z;>s`cc|uH>5U99|4Z!KCl7_~Z?bexoP0`HE5HkNma>e97oqTY|HQQ>oIBIZkHyD5V zw{Ul~udd33uh%~G7fpN>CAHqQlDNIcK4mXPoL#p&f4s6cnSYG!+UzuuPNqsum*r6= zK^i+zQP8Zio!(m3TDJvw@OB7U-s}HfI~N(e<;f^05Rc8_@mL!g0?goV>pT6^F&;)C z5RlSez7dT}$y>I%x3ypJAl~0?87$+oA%(kNQuD*Wdx=e-ewRaUu-N;CyNS21cDEJ|ZK%`ta>zb7{%dwa3EH#>VAo zCd05!f&?i#*2>Ma7|RbMi|##mv$}f9?)^e7Wf>C&Q^V`!MY$Lm3kweu3lA}}xui6jQ3#T{CK8Je8i={oZ9HLfJH1*{*s0%X}!jwyOG?y_ZrSK zt!HPUh0{vG&}%19MM+&@x?CbD@KbNfe|gAIVIn$XN)B$l*|xSm;oWf?H17vR>U8{A z6h0$Dq=@4)j#4-=8ByMkrxLfVyF2I8OMD=5YvG|*|8O6%o0v2IwyIMSLYy#BB`TC> z(bntDUNu!(ki85K3yU1T4Ca<5LzOJGlAp#jVD}>RP(3q~D=n+W8Kc!zPW@?cWc@RrW18dRqVIex+i~PE6w+;jHf$&V7;-U_`DeIL^fmMFnuu}KSYZ_^ z_c@8h2uqqVS6Xq^kZC3JEC)cQD&4ufI2u3EyiZtA3)+zY5j^OMP;saG$Ax}NLkk_t z$R;B4bJ*i&PmI&!Mt95W7RT$YPqx|TaeYP*T}MFlsnXpTe%8~VvM=Z7^_le^kzOC; z{mO1|P~7&Lt=1bQ*RDAbbB+k3rQsw%~+2MImT=wTf#CEgq0Gp76m-w>N*YzCgm932p zDqOy1?<(cIA2jL=se4b$zR#xt{kTJZ96xjwFi}wUIq|tk&f;o?`{5`NTqO!f6UShj z6hGf~>LOFAp$Hjg6`bbhrRbHT;6CP^71H;WESn;ZJnB%-7t)++x^IZlqU5LnHn+=^nJzE4Wg&sj z4qYKwi|eK52=}P@sc|tdN~@~aG3GvAc0PuOQxfJP#bdIcKHE`#f)fBw?J5dFOvsVj~o>c5L8&5s$$jjmU>2M2nQ=QGa`Vxkm%sI;4IkU%UZM zr)@P;b5aNDHB%O=HL`MAc3<_8eu0yHB})V$ktev#Ng+AUfmV_jzMNz__cSoMwto!4RG8PQan0pzh{(2Wcqdtj6mhL zx4T|;!&5|PcGF}S2;m^bameNBC>sYkw=%SM1gG2)+8(2K1Rb&m64D0C+FG6dsy$@q zr&cKwO2uff{H^xb=_ODzkHb^TO+@rtU!tO%NxA`)1O!R|EDj7qf-beSC+p0aoAUOkn3u;yM{2etl zbzw9j52Ys_roKEjD#7or?`C#1iHx5^SyNicxcvB_nSg{0hyP;qeiZF7QE!n>x6!WD z9`QPV)ig96<Q17?6&g|$gM_C4^(qegJg4b9bM+tT_b4fJ)nr($k?-q0w2;bdldDxHXU z02TV>kKj(<%J}C33E7m4?CiAMBD2gWfSI(1-gg?{3~))$LFpPjX)=V*AhSTLSk~=u z?Rt^Yk(SPwVC8t6<)o>Q{e`(aGxK(O;#@xKRTk*)5 z3%Id8Zt*0S$cl=OabmbTBDcA{rbu*h<;MPi(Nz;6)c;^53ueQ+i4TWAa^)z_tBAWjZj4I+q^b5 zJE1&o{3pxvwV!(^APYke6&k31A4|KE#*_N^&|Jk5ylg6kW3^I}F;i z=>P{9eT<=MD6oDkrhri+dmR2Zj`C$fv_u}`I&Wa8qD&d>e1&bTug|b9208AnasdKZ^-7}_GmtD`(EG)NZ^79ETZ5}D!(fFwNVet8PtN? zsD7&$R73xNckAA+`h^t*7Znp7dDE5ad6CWvLU8k~Ywze97C~p`fIOhy&(h z{DoH_g_2+9tX0jLRwH$NY{K>mF)SrY3G+gNu#o<$$hyNy=H=3=Vw;0w`HSTun&0VL zfD>%8$C;;-1*L8w7M{h`3y;H5a{pDyI8M^}rCBs@$#i614djO=)un=~8c2vlpQm_~7e7(&w+f)GMTGG2|^Wza8!J+!r`eEh8y1 zS#7z+J+rQZ_$NIHn7Kj>k+4&=R61tdYJuEg@vk(ezfOaBJ_%S}{#c2yHVyslT-!2$ z_uo>HVsRvvZA}i*B~@v{(~-Hpd&QYRXt@4Y5z8X-C%@P|%B0)bF42pkdV zugW_cBGO++&wNS$M>C#$r3o~+!wa&b4EIc|6>4Y$47C0py^yiRLLSG#x5eeRbZ(^g{D^SmWf9+|d%zuI^L z$eHR%9EE?6r?T$~4_A~S#!jnaUEuD9!fuLU@m)@R@e-*nJ~A+@{l(qAvd1*}1zYTy z9x`UL%U^`Zz^I=H5d3(dq)ljdcmw$@5`c~P2klR=&95?0Q_G)eSo*~w;!H{dLE~>F zDO+y<^eRnec0Q`pGZpKMrF&!m8cvG*u`~N8I z>ufP9uB=Vgqzxn?TdWb~{tj@2zvojATxdqcI$flj;O6SVk@(3&}}po96DH7Ty?E%luT?X ztNkINh)BZX2!zs&5fj>&c8}U*6jf3*HmI!nhr5X4#kx%zi+@Y#51~U>UTpI!yI7Lj%}ladnL*`-AF;{lig+AO`EX6=7|OM% zM?0(!Y&+AZFgg46%{^AJs7BDxEp!t9qTUsWUBYUb6wj{Ove%A@*2-UhTdO8fa({X2*~>_Y zxtW}XDy#V>nVdHePpO&Omc(qoP*)ssa=kW)yq+umiarP-TF~nvF;)JOUo)8=HVPV6 zi&yWH&-uT2%;Nv_0;yI)#?jm=Hf zt9~E9H@>qg!IN;mwDQ$a^L-ks_U3D#V2P%yIMQAJD%J~J4`d|45DxgOc;SsAj7ABU z(S1B@u57C#l$XpSPnueBxds_THE`S);Cwt`b->JouHUk9Mn%2arrcCzoRe4o~-zh#62~t~rx#GF#etND(?t4kQkT=fSS?fD zpuvuDh&(y7ps5E*$y2v*TYHOmL7^w?|{^? z%dg?$@BEq46_N6Ax%H7SWA4EGZ**sQ{#h932Im`yZG=Miolsdz+k!;Ip~!=O-a%un+E!~FXATB|qWKjb zxM(?M?Jbd_i%W4xizZDMy`Bf%-UXB$enAIOedSVLWD8c!fh@qqaX*AmDz5XY;9teN zT>BY}-Zk77-S9QM9Xc`uEM=DzY98rXSLU79sBZ)^7RE8)ge_*@i)-s1k?F^HXTRCk zX{hfWy@+1%6}Z7tj8S$_=Qb~QN2HCKbW`2P9h`rR$Se6&YO+eMZ`WiQZ83E5{P}p| z3CIs#atBav*xqkNtHiv#x0fT>hTy#ti@{&3y_}e^~h zwk);aN4m4Ob{2`DBTaSy7p7wdMqmEM%m7FLdvu&w%Hc_fuF3Sq69rY)aMPjJWTxqp zN;URC?cqE|JN}a~w8pW1AcCb`QpM|nOVOg>tU=b~c~A2e+k$`}`3vW}Pca8R;UKcceVJ!FcXHP_Uf^`o(kq*4msE0JO|tS-7}R$y z-kzpri-+`%bBy|~itiJlWJFZ^S>fCdP3+^iojRo~QYN~qedr$+l&u-b-6xABtxMk7 zO)4jS#%F+t{Gv@a*WSi9!O6w@akgNo+2|0}*qO{H3ZyiW+LmjWyD|A`ynBwynLoKD zpD3wUtN!cH!7E?>ol!UjP9h|YIeBNjI6&`h=PD66N)dS(nk}i){0* zoZ6S!dW-L<;dBELs@C1;F!bF|h(ysx!{+978-wW=L>Q<=HHr5m7+UK5>YVS{r5-#C z%%9s|s*#&;DRhk6V{nSAK%#?AMbQN_^Oy{WKuihXydgfa#|e5 zKm?6*I!uoMz(iId3JNkFN1sMQkG?CB^CDtOwHRHDlacO5gPCa#Z#i>2WK4WngfGFE ztFCx4A=5)mJ6==nG|zzpPeM_^bv@;tOd3jcG2#hIIkvVKNp6?p&q3&EpW87qU8P*c z_0dkX){`wzVvZ@)ec$N^VPwc%%rgH;;JhB>i@mMbR_U=wEuT=9bP{kAsh2Z68AYW= zP980$qzooc)|V)GWjqI-EkjgCqyC7Is3P2BQ!sFds?3x5dE$Ga%MR@%qx{B|KU3Q7!f6U7l~`8zf7!Q1Ms3LA&N8D}ej-ost`n7S0lrRA~bD+w%Kz z!(ybL20tYth4hN9BzNuu(mfR+1UEuHZT2VB^Hlj9!LIF|R5o6LlpOeE`{WKEv!%5JtY9E^Eg z1-IEg60aeRc7GL@V<``?z+8&l+5aT{|36LKhlM~gUVV?ya0N2cXjG;E0-P=#+3JlG zY(#`Q*I9J#?UCXAgi~jEw(WYF1`hq5-`wnxA+mK`dHrTi*;<{y2bQwsii$U;-Y%qG zu88e5Fp;kBI)~b6gIw{Yfd9)e!1^CH->ydx-Im0WXk$Q%w%a91o+$lmThGH_wcKO= zt*0wtYh_Dy%h)!$JEJH8O*C{S;q|5bUIq&{jT7k1{#zV-;B!9HW(8U@u>)Azm=A*E zPwRy75=K)Y?CQtP?Ny`2&DFk{b`I$4I-}E)GQ7dj3M$J>n#)Tk6pfgN@DVa(*rsFH zWK7{AQLium%9%$30l>qN;Kl{Tu!TNKZ4&nxZR%KIt0FKSXoLn~dzHE$*vEhQr@Bl4ND9bvrlFViN} zM=x^dw_o9ePDeJKBl)wYy5sMhpoJ*-41LckSHWTq?iI(D0cA!HQ$thfU1ZiV8KZPH zt@#BmG}$qvd?v3-46pS0;UTm_HThlZ!|`)ZI$NdcZ_`wmUJ0p^%9KA!!Xl#0r`U zu!j(#ep&BHdBU*Gk1w?bQR|UF>aq4v>80O@)~_t`S>J7MEH>pq>%Z<>LDwa;9%n(>2Ymw2o3imkXY(Ds>21KW9O zWxactl7U!au$9lq-QHV@r?M9#6GIjGU9;@*)}Z7FgfU zPf^2B#bP^;Sajv|27@@`2SppvWajR&nGgWOvlQoLcBi?Fi$=oLffuCE{G!u{QW0%e zXXNweZ|AOE4Nw`qtn@4s)yjY}!3s!;CoRd9D9b~g1cz!BlyB1N#3Xq~SrrUX)V47! z;_w3y0KH_>tDd~DQ*#a!e7zTLgF@gbf^H<^EnT)D+HDoxg9`!BGpQr+5fVb^^IB0VTk{3r=RIh*Gqz7qN~F<=~jy5$zAm-SwR;)`FB1LNamX!uUKBx zR9Dj3g;I)g@FN=0foCF|_Pes2U9jfj+)*YLQSY}+Tju1h3ODNo$AlyFAs>|aZLk-8 zQ!dy_rCJj}&b_(wBhIR~j_y^gvInCWZyl%++!I-OZn*sM2Yo{lth3lEA&#@r%c^Nd zFEATC(owK1^0%LJpTPcgC}p|L zoR`tBYhk`Co6#iWFkvaPcT2G2G=ygOsa^g?G3?&tD_qEB&0)2TS_ZoWv?pYzCK>oZ z*cfL!RLMD5uybJK-o7fKzplmyygt@gU0BzFb*)|0j`-S&{!;GkG#3*`iH%ufA9|b> zqC{oC#saVId$oZ^33W>f_Vhw(mtYz@%+Z#41=-JZuPY~WTc~GN)S4Y6RNK4SqATsp z%1RPkTOI2B97iM>67BL!J<=Wy~fK8UD62=(n4#AV5yn?k-oU;|1)X zU0~ZN;bm4n0NjHb#?tZnVy6!6-uV{`C>EN9Ya6s{I$dbsYf#-o8MTOoK@{suUkhvm%!6XXIPtrK*QHkaVHInDZEp*Y)Js(~@xo?XOBJs2HI+k9 zP^GX+DxJVc;R!E|Gk^8OSZg*&CS2T~Rk@{wi5&CEI61l*?E_KJZjQLKUB5FcXO`4B z_~i{a_8S`9zK599lh}87ajqxMxXaU$oV^n-b}}Oa7f)81rB3erF%-nZlHuj`>roXC zi+sww{QgyY?9jw8WDkW}`R@E)V>L3VpCN?FPM-9$Gyhv`9bw@zn&Q&%fx^u;YNqS{ z2RF~qr0l^Y|GDo!CqUk^+p$W|oaDTQBy{7onzW(G}QR?cAUPd^y@ zt#zp$P;g6Wp`zf-cY*32@teF8#I@F*zpxWCK8LAD!Ah*y`tO<_#sYYh^8^>erH1hE z6iA45!EZzKo1Ac+IL22Kz`?<>MEft+0u2Y-%(of1gd``AfS7i1!oNJ&SDp?AJcH^Ntm69KZ7ehCd1y|E+H}S<{}CW|?k?M@wm9haO5gsz08g!TJdOL?`+eo>zuC53@I6%lCP0g9R{iB;N zFzzWnnPj7eM+CjKka3KS!>ghTmSTev;|hoNqJuDm12Jgv1}N8N887?c|As~vL9UC6 z!mp_xf$_6~-^yS8gGcjEZr(%&aH+x1=-7i5`7VGdYw|7!;T8PV-xNtd5Aqu1Iv<4Z zhZhHNFO4ds&m=OS3S;9qTUuI{m=sBg_2FD!-?aBTMxwKojGOMKR4sCS=>Zd ziLSbch5|;CzdsL^bOhWdrB|@IL7R+vtxd`n1-)1H@!tIh4?H%?W*Rm`OJ#M*ZgZ+b z4^J~C^9Lrhhb2#AFloN{@zg&9XXkXV?Cmuj9Hz{1( z!r>@4j$bA$|Ky*T%(N}J&jw-00p!Ryzv@fx5Dwo8I$tf(vN0exA^b~!9U>G>zMOx3 z)rvN?$?HlyPl&omTaD32F6LK)LhCz=&A3yF0cZa}K?s9*n?egGPzKS;2^@e~=Rf72 z26J)%lq>4XhQNj9zmUa(*}ksF)i+%VO=H#4RsAEbNqG$%^FMq& z|2?2JovKa$7FhW?t+W3BMPL;6fFuaQ9VgYVv}bUz^#?zsJ)2v;c!5|=Pnp()&E0Kj z?c;ho(4~|@DDG!(v6Knq*iRHm`rB^TKL=I0V@S*rs7{siYaLm;fw+kanVNYrPW`UT zW9tvr$-C`ok|iI6mY6aJzjvuE3NO>SNmRYaZ#%52BK&QZE_Xpn&x}2sr}BN4T*~Xl z3kr2|OP)7=@6kxC#9TpcJ4`Ny+n#kp@H%a*P=t|jbL`^`eA8=R9&AK- z?wqZSgq2gWcB^SN$L^$F@Ik;u=uIs%7L@LqTH!i=f zXL9E~7UuYyYj{bEFAiPjpwO&rX0|?WXB9l0)7}CIM6ICFN#gVEgjfrY3mQ}2Cd7-q zl$jC@z*h@%^%w4mCkQOdiZR(r0J8HEqcxKxmZrz#o}J zN{LT0A9{~DY^iH~1Su8rQQt{T(NGupf~qJ@15 z6Eis^0mR|E28CB4fr!L>?)z&#g$re(j1)?42b1oFY`Zc)?YD}`o!lUwIaSGviX52i zlp6f}mSi@pV6msCr_nG^m&uX%FN5Yk3>O>Ey*-d?lTBUC71H|2DWSu&CM{!Yu|!s* zh4*pmhYQ4H&S`$%JLtL`EB62yi(m1;acYW=ovduH)bv~s%u$;KtynISgKY1v-^)-ERYimqK0$H0-inAjsl$$M{ zLkk=2N2aVIZitn$!N#)kcb=1(`>8nK-p63Jb($ugzPjMon| z`QX%4T;qd=js9CjRJFm3Cac1*vKM1mjNF49$SBhns7b1<#K?FaZ}&l-!CXg5Bd}r{ z7vszKcP4Le{kXR}aC(_oE19d^4r%bO!X15X?cBaF1nI^PG>sSAPohT!66MUGw>tuY zR1bX{%znt!KvVO)cXV!h-6Qd@h9b)vEiicp)r;od&-OP1&(z*EQ|B)!6$SEWCm6iZ z5TH*bOjqdvomUI}s6TyeJ8-zIIB=GrVFwo4j%b6;nf*M0He~UJ70mjrPgWhfN~aKp zX9Y7(`QCXc-Jb^D6x~*n7F84&S;EvsJz6t6ynER_hKq1fBK20ParAdzoh5XM?<*+c z6&4;lU}?QK+=P3wHCt_E-wscDIlG2F!32mz9+`eKGZto5l~Saku|MBqk?MDmrA$wV z=Is9EO^)`rkKt6lkrr>6#Eje=x9Jo{PEXhzz836>Qp$=R>Dn+g^zq7s8MWi}f1f|( z6$XvYP^sE{F)@V5wo&a7cI^?4P{ZCuqjlaZF0fLLqNEgu2|;g(KySs-Y^IcunQEVC zrdx2SzmrIwB{H)c-S}Mse^r+M`Kl!o(;E<-8po-sLTX`ba8eSPK+PHvb7u!n9UzOj zV$U0sCF2Ur0GOPgpZwqok~y^i@;15{fZpuQj4&e(#4c>H)v@8Wm(I-AUne5%7A&; zNojwHZ3EJ1wQ;u-DUz1RECe+6sM_rKWTUDZ#Vdc6>wiyjrU_87tfY#%G!kQXukdZK zRVZ4%Yr7ss3lQKk04-X+!$bU^h&T}l7u>X#l*Q{1>ar%OW*3;ltN4W?4Lbjd(C*H| zsqbR12rE?yk&NS{>hdMuq(zIw5|VSU>fxer%)8g<2< zMjjAe2b--cms>!I)JcBg4bLJ;;A#3)E*HCC!oy}mp3@xGW)&x)6@{OuoyDP2=)yXe zLTQJ2OJYdC1!5)F-8)9?T>@_^g80SqwDsOGqHpw&@w6{{AeSqx>OD}__wBjtE}TxR zq41l0deHXIsp_QcOBEPNpyyzZ{LS|S55?AN);ZAM70xa*@5av02ZnPbL{?2&kCKpS z`Tkh-qiPGYzaQ=2IC{>N8}G_OnR4#zBO}E~nSv>fm|FL%^Pc&23hj)wHOqZG0GY~2 zPt&HP?9A2`dok>?*N;oz0#13>?0DFnmI<;x+vq4gC37bMl_OJMjHC*6a(y49_@q#G-j;b5s!XH6Y~%bI3ewxJ!b`e;xzYKaa@U zWhC|w8NnFX?^&Gdi%I`J>tS-)#S}R#iDS`%VWA@*qh#HmJfj6=nk7>`EG#k@Nx4}> ymt*SHtfb_iRkjfFM1S;%`2W}b&L=`3C&DX@uE0J_u*A_7{Gq0-tyHFH9{68kZNwY^ literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/tool_approval_dialog-light.png b/testdata/snapshots/darwin/tool_approval_dialog-light.png new file mode 100644 index 0000000000000000000000000000000000000000..77c70a644b54efeec7c4a5b9b6db700f42caa7ab GIT binary patch literal 24229 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 YUOTWYA%BMb^$7Nokx&$`6f+F?9}F8K@&Et; literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/tool_call_card-light.png b/testdata/snapshots/darwin/tool_call_card-light.png new file mode 100644 index 0000000000000000000000000000000000000000..68ca034e43c047134110f18ff91d9a1a2e323137 GIT binary patch literal 13488 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/tool_call_group-light.png b/testdata/snapshots/darwin/tool_call_group-light.png new file mode 100644 index 0000000000000000000000000000000000000000..f7acfa463ca7e11141a1ffbbaec8afc56a3b8261 GIT binary patch literal 16891 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 literal 0 HcmV?d00001 diff --git a/tool_approval_dialog.go b/tool_approval_dialog.go new file mode 100644 index 0000000..7509c91 --- /dev/null +++ b/tool_approval_dialog.go @@ -0,0 +1,65 @@ +package mujica + +import ( + "log/slog" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// ToolApprovalOptions configure a ToolApprovalDialog. Tool is required. +type ToolApprovalOptions struct { + Tool string + // Args is the call's arguments, JSON when valid. + Args string + // Reason says why the agent wants to run the tool. + Reason string +} + +// ToolApprovalResult reports the choice made in this frame. +type ToolApprovalResult struct { + Element *ui.Element + Allowed bool + Denied bool +} + +// ToolApprovalDialog asks to approve a tool call; Deny has focus. +func ToolApprovalDialog(c *ui.Context, open *bool, opts ToolApprovalOptions) ToolApprovalResult { + if opts.Tool == "" { + panic("mujica: ToolApprovalDialog needs a Tool") + } + var r ToolApprovalResult + was := *open + u := Density(c).Unit() + r.Element = Dialog(c, open, DialogOptions{ + Title: msg(c, "tool_approval_dialog.title"), Description: opts.Reason, KeepOnBackdrop: true, HideClose: true, + Actions: func() { + // Deny first: a reflexive Enter never runs the tool. + if Button(c, msg(c, "tool_approval_dialog.deny"), ButtonOptions{Variant: Secondary}).AutoFocus().Clicked() { + r.Denied = true + } + if Button(c, msg(c, "tool_approval_dialog.allow"), ButtonOptions{}).Clicked() { + r.Allowed = true + } + }, + }, func() { + ui.Column(c).Gap(u * 2).Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + agentCaption(c, msg(c, "tool_approval_dialog.tool")) + ui.Text(c, opts.Tool).Font(theme.MonoFont).FontWeight(600) + }) + if opts.Args != "" { + agentCode(c, "json", agentPrettyJSON(opts.Args), 260) + } + }) + }) + if was && !*open && !r.Allowed { + r.Denied = true // Escape + } + if r.Allowed || r.Denied { + slog.Debug("mujica: tool_approval_dialog choose", "tool", opts.Tool, "allowed", r.Allowed) + *open = false + } + return r +} diff --git a/tool_approval_dialog_test.go b/tool_approval_dialog_test.go new file mode 100644 index 0000000..331255e --- /dev/null +++ b/tool_approval_dialog_test.go @@ -0,0 +1,97 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +type approvalApp struct { + open bool + allowed, denied int +} + +func (a *approvalApp) view(c *ui.Context) { + Use(c, Settings{}) + if Button(c, "Run", ButtonOptions{}).Clicked() { + a.open = true + } + r := ToolApprovalDialog(c, &a.open, ToolApprovalOptions{Tool: "delete_files", Args: `{"glob":"*.tmp"}`, Reason: "Clean the build folder."}) + if r.Allowed { + a.allowed++ + } + if r.Denied { + a.denied++ + } +} + +func newApprovalApp() (*approvalApp, *ui.Tester) { + a := &approvalApp{} + tt := ui.NewTester(a.view, 600, 500) + _ = tt.Click("Run") + return a, tt +} + +func TestToolApprovalDialogDenyFirst(t *testing.T) { + a, tt := newApprovalApp() + for _, s := range []string{"delete_files", "Clean the build folder.", ` "glob": "*.tmp"`} { + if !tt.HasText(s) { + t.Fatalf("missing %q in %q", s, tt.Texts()) + } + } + if !tt.Focused("Deny") { + t.Fatal("Deny does not have the focus") + } + tt.Key(0, ui.KeyEnter) + if a.denied != 1 || a.allowed != 0 || a.open { + t.Fatalf("Enter: denied %d allowed %d open %v", a.denied, a.allowed, a.open) + } + if !tt.Focused("Run") { + t.Fatal("focus not restored") + } +} + +func TestToolApprovalDialogAllowByTabAndBackdrop(t *testing.T) { + a, tt := newApprovalApp() + tt.ClickAt(5, 495) + if !a.open || a.denied != 0 { + t.Fatal("backdrop click acted") + } + tt.Key(0, ui.KeyTab) + if !tt.Focused("Allow") { + t.Fatal("Tab did not reach Allow") + } + tt.Key(0, ui.KeyEnter) + if a.allowed != 1 || a.denied != 0 || a.open { + t.Fatalf("allowed %d denied %d", a.allowed, a.denied) + } +} + +func TestToolApprovalDialogEscapeDenies(t *testing.T) { + a, tt := newApprovalApp() + tt.Key(0, ui.KeyEscape) + if a.denied != 1 || a.allowed != 0 || a.open { + t.Fatalf("Escape: denied %d allowed %d open %v", a.denied, a.allowed, a.open) + } +} + +func TestToolApprovalDialogNeedsTool(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + open := true + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ToolApprovalDialog(c, &open, ToolApprovalOptions{}) + }, 200, 200) +} + +func TestToolApprovalDialogSnapshot(t *testing.T) { + snapshot(t, "tool_approval_dialog", 560, 380, func(c *ui.Context) { + open := true + ToolApprovalDialog(c, &open, ToolApprovalOptions{Tool: "delete_files", Args: `{"glob":"build/*.tmp","dry_run":false}`, + Reason: "The agent wants to clean temporary files from the build folder."}) + }) +} diff --git a/tool_call_card.go b/tool_call_card.go new file mode 100644 index 0000000..164e6ec --- /dev/null +++ b/tool_call_card.go @@ -0,0 +1,79 @@ +package mujica + +import ( + "log/slog" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// ToolCall is one tool invocation; the caller owns it. +type ToolCall struct { + ID string + Name string + // Args and Result show as JSON when valid. + Args string + Result string + // Error replaces Result when the call failed. + Error string + State AgentState + Duration time.Duration +} + +// ToolCallCardOptions configure a ToolCallCard. +type ToolCallCardOptions struct { + // OpenArgs and OpenResult start the sections expanded. + OpenArgs, OpenResult bool + // Still stops the running animation. + Still bool +} + +type toolCallCardState struct{ args, result bool } + +// ToolCallCard shows a tool call with foldable arguments and result. +func ToolCallCard(c *ui.Context, call ToolCall, opts ToolCallCardOptions) ChoiceResult { + if call.Name == "" { + panic("mujica: ToolCallCard needs a Name") + } + k := Tokens(c) + u := Density(c).Unit() + var r ChoiceResult + r.Element = agentCard(c).Role(ui.RoleGroup).Label(call.Name + ", " + agentWord(c, call.State)) + st := ui.Local(r.Element, "mujica.toolcall", func() toolCallCardState { + return toolCallCardState{opts.OpenArgs, opts.OpenResult} + }) + r.Element.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).MinHeight(theme.MinHitSize).Children(func() { + agentMark(c, call.State, 16, opts.Still) + ui.Text(c, call.Name).Font(theme.MonoFont).FontWeight(600).SingleLine().Grow(1).Shrink(1) + agentCaption(c, agentWord(c, call.State)) + if call.State == AgentDone || call.State == AgentFailed { + agentCaption(c, agentDuration(call.Duration)) + } + }) + if call.Args != "" { + r.changed = Collapsible(c, &st.args, CollapsibleOptions{Title: msg(c, "tool_call_card.args")}, func() { + agentCode(c, "json", agentPrettyJSON(call.Args), 240) + }).Changed() || r.changed + } + body, title := call.Result, msg(c, "tool_call_card.result") + if call.Error != "" { + body, title = call.Error, msg(c, "tool_call_card.error") + } + if body != "" { + r.changed = Collapsible(c, &st.result, CollapsibleOptions{Title: title}, func() { + if call.Error != "" { + ui.Text(c, call.Error).TextColor(k.Danger).Selectable() + return + } + agentCode(c, "json", agentPrettyJSON(body), 320) + }).Changed() || r.changed + } + }) + if r.changed { + slog.Debug("mujica: tool_call_card toggle", "tool", call.Name, "args", st.args, "result", st.result) + } + return r +} diff --git a/tool_call_card_test.go b/tool_call_card_test.go new file mode 100644 index 0000000..770a4c1 --- /dev/null +++ b/tool_call_card_test.go @@ -0,0 +1,103 @@ +package mujica + +import ( + "fmt" + "strings" + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +var toolCallSample = ToolCall{ID: "1", Name: "read_file", Args: `{"path":"court/ledger.md","limit":40}`, + Result: `{"lines":40,"truncated":false}`, State: AgentDone, Duration: 420 * time.Millisecond} + +func TestToolCallCardShowsAndFolds(t *testing.T) { + call := toolCallSample + changes := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if ToolCallCard(c, call, ToolCallCardOptions{}).Changed() { + changes++ + } + }, 500, 500) + for _, s := range []string{"read_file", "Done", "420 ms", "Arguments", "Result"} { + if !tt.HasText(s) { + t.Fatalf("missing %q in %q", s, tt.Texts()) + } + } + if tt.HasText(` "path": "court/ledger.md",`) { + t.Fatal("arguments shown while folded") + } + _ = tt.Click("Arguments") + if changes != 1 || !tt.HasText(` "path": "court/ledger.md",`) { + t.Fatalf("changes %d, pretty JSON %q", changes, tt.Texts()) + } + tt.Key(0, ui.KeyTab) // keyboard reaches the Result fold + tt.Key(0, ui.KeyEnter) + if changes != 2 || !tt.HasText(` "lines": 40,`) { + t.Fatalf("keyboard fold: changes %d", changes) + } +} + +func TestToolCallCardErrorAndPlainText(t *testing.T) { + call := ToolCall{Name: "shell", Args: "not json at all", Error: "permission denied", State: AgentFailed, Duration: 3 * time.Second} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ToolCallCard(c, call, ToolCallCardOptions{OpenArgs: true, OpenResult: true}) + }, 500, 400) + for _, s := range []string{"Failed", "3.0 s", "Error", "permission denied", "not json at all"} { + if !tt.HasText(s) { + t.Fatalf("missing %q in %q", s, tt.Texts()) + } + } +} + +func TestToolCallCardRunningHidesDuration(t *testing.T) { + call := ToolCall{Name: "search", State: AgentRunning, Duration: time.Second} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ToolCallCard(c, call, ToolCallCardOptions{Still: true}) + }, 400, 200) + if !tt.HasText("Running") || tt.HasText("1.0 s") { + t.Fatalf("texts %q", tt.Texts()) + } +} + +func TestToolCallCardLargeResultIsVirtualized(t *testing.T) { + var b strings.Builder + for i := range 100000 { + fmt.Fprintf(&b, "row %d\n", i) + } + call := ToolCall{Name: "dump", Result: b.String(), State: AgentDone} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ToolCallCard(c, call, ToolCallCardOptions{OpenResult: true}) + }, 500, 500) + if n := len(tt.Texts()); n > 200 { + t.Fatalf("%d texts built for 100000 rows", n) + } + if !tt.HasText("row 0") { + t.Fatal("first row missing") + } +} + +func TestToolCallCardNeedsName(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ToolCallCard(c, ToolCall{}, ToolCallCardOptions{}) + }, 200, 200) +} + +func TestToolCallCardSnapshot(t *testing.T) { + snapshot(t, "tool_call_card", 460, 300, func(c *ui.Context) { + ui.Column(c).Padding(16).Children(func() { + ToolCallCard(c, toolCallSample, ToolCallCardOptions{OpenArgs: true}) + }) + }) +} diff --git a/tool_call_group.go b/tool_call_group.go new file mode 100644 index 0000000..dbe5a61 --- /dev/null +++ b/tool_call_group.go @@ -0,0 +1,75 @@ +package mujica + +import ( + "fmt" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// ToolCallGroupOptions configure a ToolCallGroup. +type ToolCallGroupOptions struct { + // Title replaces the built-in "N tool calls". + Title string + Still bool +} + +// ToolCallGroup folds tool calls under a count, time, failures summary. +func ToolCallGroup(c *ui.Context, open *bool, calls []ToolCall, opts ToolCallGroupOptions) ChoiceResult { + if open == nil { + panic("mujica: ToolCallGroup needs open") + } + seen := make(map[string]bool, len(calls)) + var total time.Duration + failed, running := 0, false + for _, call := range calls { + if call.ID == "" || seen[call.ID] { + panic(fmt.Sprintf("mujica: ToolCallGroup call IDs must be unique and set, got %q", call.ID)) + } + seen[call.ID] = true + total += call.Duration + failed += agentB2I(call.State == AgentFailed) + running = running || call.State == AgentRunning + } + k := Tokens(c) + u := Density(c).Unit() + title := opts.Title + if title == "" { + title = fmt.Sprintf(msg(c, "tool_call_group.count"), len(calls)) + } + state := AgentDone + switch { + case running: + state = AgentRunning + case failed > 0: + state = AgentFailed + } + summary := title + " · " + agentDuration(total) + if failed > 0 { + summary += " · " + fmt.Sprintf(msg(c, "tool_call_group.failed"), failed) + } + return Collapsible(c, open, CollapsibleOptions{Title: summary, Trigger: func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Children(func() { + agentMark(c, state, 16, opts.Still) + ui.Text(c, title).FontWeight(600).SingleLine() + agentCaption(c, agentDuration(total)) + if failed > 0 { + ui.Text(c, fmt.Sprintf(msg(c, "tool_call_group.failed"), failed)).TextColor(k.Danger). + FontSize(FontSize(c, theme.CaptionSize+1)).SingleLine() + } + }) + }}, func() { + for _, call := range calls { + ui.Column(c).Key(call.ID).Children(func() { ToolCallCard(c, call, ToolCallCardOptions{Still: opts.Still}) }) + } + }) +} + +func agentB2I(b bool) int { + if b { + return 1 + } + return 0 +} diff --git a/tool_call_group_test.go b/tool_call_group_test.go new file mode 100644 index 0000000..2e96b31 --- /dev/null +++ b/tool_call_group_test.go @@ -0,0 +1,72 @@ +package mujica + +import ( + "testing" + "time" + + "github.com/egoist/mygo/ui" +) + +var toolCallGroupSample = []ToolCall{ + {ID: "a", Name: "list_dir", State: AgentDone, Duration: 300 * time.Millisecond}, + {ID: "b", Name: "read_file", State: AgentFailed, Error: "not found", Duration: 1200 * time.Millisecond}, + {ID: "c", Name: "grep", State: AgentDone, Duration: 500 * time.Millisecond}, +} + +func TestToolCallGroupSummaryAndFold(t *testing.T) { + open, changes := false, 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if ToolCallGroup(c, &open, toolCallGroupSample, ToolCallGroupOptions{}).Changed() { + changes++ + } + }, 500, 600) + for _, s := range []string{"3 tool calls", "2.0 s", "1 failed"} { + if !tt.HasText(s) { + t.Fatalf("missing %q in %q", s, tt.Texts()) + } + } + if tt.HasText("read_file") { + t.Fatal("calls shown while folded") + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if !open || changes != 1 || !tt.HasText("read_file") || !tt.HasText("grep") { + t.Fatalf("open %v changes %d texts %q", open, changes, tt.Texts()) + } +} + +func TestToolCallGroupRunningAndEmpty(t *testing.T) { + open := false + calls := []ToolCall{{ID: "x", Name: "fetch", State: AgentRunning}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ToolCallGroup(c, &open, calls, ToolCallGroupOptions{Title: "Research", Still: true}) + ToolCallGroup(c, &open, nil, ToolCallGroupOptions{}) + }, 500, 300) + if !tt.HasText("Research") || !tt.HasText("0 tool calls") || tt.HasText("1 failed") { + t.Fatalf("texts %q", tt.Texts()) + } +} + +func TestToolCallGroupRejectsDuplicateIDs(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("no panic") + } + }() + open := false + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ToolCallGroup(c, &open, []ToolCall{{ID: "a", Name: "x"}, {ID: "a", Name: "y"}}, ToolCallGroupOptions{}) + }, 200, 200) +} + +func TestToolCallGroupSnapshot(t *testing.T) { + snapshot(t, "tool_call_group", 460, 330, func(c *ui.Context) { + open := true + ui.Column(c).Padding(16).Children(func() { + ToolCallGroup(c, &open, toolCallGroupSample, ToolCallGroupOptions{}) + }) + }) +}