Repository navigation
Sonny: /config, chime and view in config.toml, and a side chat that can fork with every tool - #315
Conversation
`[sonny] side_chat = "fork"` in ~/.agent/config.toml makes /side a full fork of the agent: its tools, its folder, its approvals. The default, "answer", keeps today's copy that calls no tool. /config (or /settings) lists every key config.toml takes over the composer, with its value or default: ←/→ steps a key with a few values, Enter types a name, ⌫ takes a key back to its default. Each change is written at once, comments and order kept; config::write takes a key's line out (and a table left empty) for its default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
`[sonny] chime` and `verbose` (true or false) replace settings.json's, and /config lists them beside the rest; /sound and /verbose write them there, a default as no line. Only the screen stays in settings.json, until inline goes. config::write takes any TOML value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 698a88d7d0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… its tasks config::write checks the file it would write holds each key as asked: a key written as a dotted key or an inline table is refused by name rather than reported saved. A side chat forked from a lead takes that lead's project for resolve_task, which it inherits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
config.toml's new senders key is listed in /config; MCP servers keep their own /mcp. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b89853a329
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The lookout answers a served call with the caller's name, so a lead's fork started tasks named after the fork and removed tasks of the wrong project. A caller named SOURCE.side-HEX now calls as SOURCE, for every served tool; side_source also gives resolve_task its project. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 69b3cdec50
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
A task named like shop.side-feed matched the side chat pattern, so its served tools ran as shop. /side now records the agent it copies as the copy's creator, and served tools run as that agent only for a bot named by /side, made by that agent, and expiring as a side chat does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
|
The Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
Requested by George · project thread
What
Full-fork side chat. Setting
[sonny] side_chat = "fork"in~/.agent/config.tomlmakes/sidefork the agent with noallowlist. The copy keeps every tool its agent has (shell, writes, Sonny's declared tools), works in the same folder, and runs under the same approval gates. The default,"answer", keeps today's copy (allow: []), which calls no tool. The side chat's opening line tells you which kind you opened ("a copy of X that can do anything it can" or "that answers without acting").With the default, the same prompt's shell call comes back
refused: shell (tool_not_available)./config(unlisted alias/settings) shows every key config.toml takes above the composer, each with its value or what its default is:web_search,side_chat,chime,verbose) through them and back to its default.model,provider,judge.model); an empty value sets it back to its default.Each change is written to the file right away. The person's comments and key order are kept. A file that doesn't parse is refused with its error, the same way every other reader refuses it. On full screen the conversation moves up so every key fits. Changes to the chime or the view apply right away.
Chime and view move to config.toml.
[sonny] chimeandverbose(true or false) replace the same keys in~/.agent/sonny/settings.json./soundand/verbosenow write config.toml, and switching one back to its default removes its line. Onlyfullscreenstays in settings.json, because inline mode is being removed on the full-screen polish branch. No migration: averboseorchimealready in settings.json is no longer read (no backward compat, by design).How
agent_client::config: addsSideChatwithsonny.side_chat, andsonny.chime/sonny.verbose, which must be booleans. Addsconfig::write(path, &[(key, Option<toml::Value>)]):Noneremoves the key's line, and the table header too if the table is left empty.setnow wrapswrite. A write that changes nothing leaves the file untouched.sonny/src/config.rs: the/configview (setting list, keys, rows) with unit tests. One test checks that every listed key is one the reader accepts.sonny/src/settings.rs: reads chime and verbose from config.toml; onlyfullscreenstays in JSON.main.rs:/sidereads the config when it opens a side chat; adds/configto the command menu, event loop and drawing./side,/config, the config table, and where settings are kept.Testing
cargo test -p sonny -p agent-client,cargo clippy --all-targets,cargo fmt --check: all clean.fork,/side shell:echo … > side.txtwrote the file in the lead's folder. With the default, the same call was refused./configsetside_chat,chimeandverbose, and the file came out as expected./soundwrotechime = false.🤖 Generated with Claude Code
https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE