mirror of
https://github.com/nearai/ironclaw.git
synced 2026-09-03 08:06:01 +08:00
Reworks how the bot handles being in a Slack channel or Telegram group, replacing the shared-thread model with ephemeral-per-ping threads, and removes the owner-vs-actor concept from run scope. - Presence is the admission (no per-extension allowlist). Each ping mints a fresh pinger-owned thread, event-idempotent (redeliveries replay, no orphan threads), pre-loaded with channel/thread history hydration. Reply placement via `can_reply_in_threads`; authority-bearing prompts (approval/auth) go privately to the pinger; unpaired users get an addressed-only nudge. DMs keep their persistent per-user thread. - Per-event reply targets: each run replies via its own reply target, so impersonation is blocked, authority-bearing payloads resolve only for the pinger, and a stale/cross-event reply ref is denied. - With owner == actor everywhere, the owner-vs-actor apparatus is deleted: `ResolvedBinding.owner_user_id`, the run_delivery two-scope split, the scattered actor-first keying patches, and the dead `ProcessGateOwnerMatch`. The run-user resolution machinery (the actor-first ladder, `TurnThreadOwner`, `TurnActor`) is kept and reframed — WebChat (=caller), triggers (=creator), subagents (=inherited), and system runs (=SYSTEM) resolve their user differently; the `Ownerless -> SYSTEM` host path is preserved. - Untrusted channel-context sanitizer strips bidi/zero-width `Cf` characters, not just `Cc` controls. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>