Skip to content

Sonny: /config, chime and view in config.toml, and a side chat that can fork with every tool - #315

Merged
lydakis merged 14 commits into
mainfrom
claude/project-thread-npa7di
Oct 29, 2026
Merged

lydakis merged 14 commits into
mainfrom
claude/project-thread-npa7di

Conversation

@lydakis

@lydakis lydakis commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner

Requested by George · project thread

What

Full-fork side chat. Setting [sonny] side_chat = "fork" in ~/.agent/config.toml makes /side fork the agent with no allow list. 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").

A side chat forked with every tool writes a file beside the lead

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:

  • ↑/↓ picks a key.
  • ←/→ steps a key that has a few values (efforts, web_search, side_chat, chime, verbose) through them and back to its default.
  • Enter types a key that takes a name (model, provider, judge.model); an empty value sets it back to its default.
  • ⌫ sets a key 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.

/config over the composer

Chime and view move to config.toml. [sonny] chime and verbose (true or false) replace the same keys in ~/.agent/sonny/settings.json. /sound and /verbose now write config.toml, and switching one back to its default removes its line. Only fullscreen stays in settings.json, because inline mode is being removed on the full-screen polish branch. No migration: a verbose or chime already in settings.json is no longer read (no backward compat, by design).

How

  • agent_client::config: adds SideChat with sonny.side_chat, and sonny.chime / sonny.verbose, which must be booleans. Adds config::write(path, &[(key, Option<toml::Value>)]): None removes the key's line, and the table header too if the table is left empty. set now wraps write. A write that changes nothing leaves the file untouched.
  • sonny/src/config.rs: the /config view (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; only fullscreen stays in JSON.
  • main.rs: /side reads the config when it opens a side chat; adds /config to the command menu, event loop and drawing.
  • README: /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.
  • Live run against a local daemon on a synthetic Responses model, in tmux:
    • With fork, /side shell:echo … > side.txt wrote the file in the lead's folder. With the default, the same call was refused.
    • /config set side_chat, chime and verbose, and the file came out as expected.
    • /sound wrote chime = false.

🤖 Generated with Claude Code

https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE

`[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
@lydakis lydakis self-assigned this Oct 29, 2026
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-29T05:20:55.575509Z 48e1b90 New commits
🔒 Security Review ✅ Completed 2026-10-29T05:23:52.641109Z 48e1b90 New commits
ℹ️ 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" or "@codex security review".

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
@lydakis lydakis changed the title Sonny: /config, and a side chat that can fork with every tool Sonny: /config, chime and view in config.toml, and a side chat that can fork with every tool Oct 29, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread client/src/config.rs Resolved
Comment thread sonny/src/main.rs Resolved
… 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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread sonny/src/main.rs Resolved
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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread sonny/src/served.rs Resolved
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

lydakis commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

The rust failure on 2c24057 isn't from this PR. Main itself doesn't compile at cc10fb8. restamp (from #318) calls Places::plist at sonny/src/trigger.rs:2377, and #344 removed that method, so the build fails with E0599. This PR doesn't touch trigger.rs. No fix is on main yet, and the triggers work is fixing it there. I'll merge main into this branch once it builds, and merge this PR when CI is green.


Generated by Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013jkdGFnmxBQ9BRPqGJYwrE
@lydakis
lydakis merged commit 296d253 into main Oct 29, 2026
4 checks passed
@lydakis lydakis mentioned this pull request Oct 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants