671f9cbafa
Profile isolation is a ContextVar; plain threading.Thread targets start with an empty context, so the plugin's nine daemon threads (session init, prewarm, first-turn base/prefetch, prefetch, sync, memwrite, async writer, context prefetch) resolved ambient state — config path, active host, hermes home, oauth token paths — against the DEFAULT profile whenever they ran under a routed profile's turn. Adds spawn_context_thread(), which copies the caller's context at spawn time so the thread sees the profile scope it was created under, and routes every plugin thread spawn through it. Defense-in-depth under the bound-config work: even ambient resolution on these threads now lands on the right profile. The copy_context approach follows the gateway's own _run_in_executor_with_context pattern; #81401 applied it to the init thread, this extends it to all nine spawns. Co-authored-by: angel12 <angel12@users.noreply.github.com>