- public_link checks the action before the confirmation gate, so an unknown
action is told so instead of being asked to confirm nothing in particular
(the 4/4 finding).
- linkView is a struct like shareView; toShareView builds the five share
results, and a fresh share is read back so it carries the person's name
like every other path.
- PublicShareURL trims a trailing slash off a hand-built base URL.
Co-Authored-By: Claude Fable 5 <[email protected]>
list_shares, share_garden, remove_share and public_link (get / enable /
rotate / disable) wrap the sharing service. They change who can see a garden
beyond the screen, so they are gated twice: the prompt tells the model to say
exactly what it would do and ask, and the tools refuse without confirmed=true,
which their descriptions allow only after a yes in the conversation. The
refusal names the action, so the question the model asks is precise.
share_garden changes the role of an existing share instead of failing on it;
remove_share takes the email list_shares reports; an unknown email explains
that the person has to sign in once first. public_link returns the address
(PANSY_BASE_URL + /g/<token>, via the new Service.PublicShareURL), never a
bare token.
delete_planting is the hard delete for a plop that was never really planted,
as opposed to remove_planting's "it came out"; it is recorded, so undoable.
Co-Authored-By: Claude Fable 5 <[email protected]>