─── Section: AGENT ──────────────────────────────────────────── showConfigAgent renders agent runtime knobs — concurrency, timeouts, subagent depth, workspace sandbox — plus the security-related envs that live inline with the agent executor. Split from /config security intentionally: this block is a
()
| 608 | // intentionally: this block is about *behavior*, the security block is |
| 609 | // about *policy*. |
| 610 | func (cli *ChatCLI) showConfigAgent() { |
| 611 | sectionHeader("🤖", "cfg.section.agent.title", ColorLime) |
| 612 | p := uiPrefix(ColorLime) |
| 613 | |
| 614 | // UI style — now drives both /coder and /agent timelines. Resolved |
| 615 | // through agent.DefaultUIStyleFromEnv so the same parsing rules apply |
| 616 | // everywhere (legacy name "CHATCLI_CODER_UI" retained for back-compat |
| 617 | // after the cross-mode unification). |
| 618 | coderUIEffective := agent.DefaultUIStyleFromEnv().String() |
| 619 | coderBanner := strings.TrimSpace(strings.ToLower(os.Getenv("CHATCLI_CODER_BANNER"))) |
| 620 | coderBannerEffective := i18n.T("cfg.val.on") |
| 621 | if coderBanner == "false" || coderBanner == "0" || coderBanner == "no" { |
| 622 | coderBannerEffective = i18n.T("cfg.val.off") |
| 623 | } |
| 624 | kv(p, "CHATCLI_CODER_UI", envOr("CHATCLI_CODER_UI")) |
| 625 | kv(p, "CHATCLI_CODER_UI (effective)", coderUIEffective+" — applies to /coder AND /agent") |
| 626 | kv(p, "CHATCLI_CODER_BANNER", envOr("CHATCLI_CODER_BANNER")) |
| 627 | kv(p, "CHATCLI_CODER_BANNER (effective)", coderBannerEffective) |
| 628 | |
| 629 | fmt.Println(p) |
| 630 | subheader(p, "cfg.sub.agent.parallelism") |
| 631 | kv(p, "CHATCLI_AGENT_PARALLEL_MODE", envOr("CHATCLI_AGENT_PARALLEL_MODE")) |
| 632 | kv(p, "CHATCLI_AGENT_MAX_WORKERS", envOr("CHATCLI_AGENT_MAX_WORKERS")) |
| 633 | kv(p, "CHATCLI_AGENT_WORKER_TIMEOUT", envOr("CHATCLI_AGENT_WORKER_TIMEOUT")) |
| 634 | kv(p, "CHATCLI_AGENT_WORKER_MAX_TURNS", envOr("CHATCLI_AGENT_WORKER_MAX_TURNS")) |
| 635 | kv(p, "CHATCLI_AGENT_SUBAGENT_MAX_DEPTH", envOr("CHATCLI_AGENT_SUBAGENT_MAX_DEPTH")) |
| 636 | kv(p, "CHATCLI_AGENT_SUBAGENT_MAX_TURNS", envOr("CHATCLI_AGENT_SUBAGENT_MAX_TURNS")) |
| 637 | kv(p, "CHATCLI_AGENT_PARALLEL_TOOLS", envBool("CHATCLI_AGENT_PARALLEL_TOOLS")) |
| 638 | kv(p, "CHATCLI_AGENT_MAX_TOOL_CONCURRENCY", envOr("CHATCLI_AGENT_MAX_TOOL_CONCURRENCY")) |
| 639 | kv(p, "CHATCLI_AGENT_INLINE_CODE_STRICT", envBool("CHATCLI_AGENT_INLINE_CODE_STRICT")) |
| 640 | |
| 641 | fmt.Println(p) |
| 642 | subheader(p, "cfg.sub.agent.token_efficiency") |
| 643 | kv(p, "CHATCLI_AGENT_EARLY_EXIT", envOr("CHATCLI_AGENT_EARLY_EXIT")) |
| 644 | kv(p, "CHATCLI_AGENT_EARLY_EXIT_TURNS", envOr("CHATCLI_AGENT_EARLY_EXIT_TURNS")) |
| 645 | kv(p, "CHATCLI_AGENT_SMART_ROUTE", envOr("CHATCLI_AGENT_SMART_ROUTE")) |
| 646 | |
| 647 | fmt.Println(p) |
| 648 | subheader(p, "cfg.sub.agent.execution") |
| 649 | kv(p, "CHATCLI_AGENT_CMD_TIMEOUT", envOr("CHATCLI_AGENT_CMD_TIMEOUT")) |
| 650 | kv(p, "CHATCLI_AGENT_SOURCE_SHELL_CONFIG", envBool("CHATCLI_AGENT_SOURCE_SHELL_CONFIG")) |
| 651 | kv(p, "CHATCLI_AGENT_TMPDIR", envOr("CHATCLI_AGENT_TMPDIR")) |
| 652 | kv(p, "CHATCLI_AGENT_KEEP_TMPDIR", envBool("CHATCLI_AGENT_KEEP_TMPDIR")) |
| 653 | kv(p, "CHATCLI_MAX_COMMAND_OUTPUT", envOr("CHATCLI_MAX_COMMAND_OUTPUT")) |
| 654 | |
| 655 | fmt.Println(p) |
| 656 | subheader(p, "cfg.sub.agent.coder_denial") |
| 657 | kv(p, "CHATCLI_MAX_CONSECUTIVE_DENIALS", envOr("CHATCLI_MAX_CONSECUTIVE_DENIALS")) |
| 658 | kv(p, "CHATCLI_MAX_TOTAL_DENIALS", envOr("CHATCLI_MAX_TOTAL_DENIALS")) |
| 659 | |
| 660 | fmt.Println(p) |
| 661 | subheader(p, "cfg.sub.agent.per_agent") |
| 662 | perAgent := collectPerAgentOverrides() |
| 663 | if len(perAgent) == 0 { |
| 664 | kv(p, "CHATCLI_AGENT_<NAME>_MODEL", i18n.T("cfg.val.none_set")) |
| 665 | kv(p, "CHATCLI_AGENT_<NAME>_EFFORT", i18n.T("cfg.val.none_set")) |
| 666 | } else { |
| 667 | for _, line := range perAgent { |