0 && warningAt > pickerAt);
+});
+
+test("the warning copy comes from the shared helper, not inline text", () => {
+ // Guards against a surface hand-rolling its own wording, which is how the
+ // machine name drifts out of sync with the actual run location.
+ // An explicit prop wins over the AgentRunLocationContext fallback, so the
+ // call site must keep that precedence rather than reading only one source.
+ assert.match(
+ collapsedSource,
+ /agentAccessWarningText\( mode, runLocation \?\? inheritedRunLocation, \)/,
+ );
+ assert.match(collapsedSource, /]*> \{warningText\}/);
+});
+
+test("primary respond-to copy does not expose implementation jargon", () => {
+ const primaryFieldSource = respondToFieldSource.slice(
+ respondToFieldSource.indexOf('data-testid="agent-respond-to"'),
+ respondToFieldSource.indexOf("const HEX_64_RE"),
+ );
+
+ for (const jargon of ["Nostr authors", "!shutdown"]) {
+ assert.doesNotMatch(primaryFieldSource, new RegExp(jargon));
+ }
+});
diff --git a/desktop/src/features/channels/ui/EditRespondToDialog.tsx b/desktop/src/features/channels/ui/EditRespondToDialog.tsx
index 11a2dcd09d..d9f091e902 100644
--- a/desktop/src/features/channels/ui/EditRespondToDialog.tsx
+++ b/desktop/src/features/channels/ui/EditRespondToDialog.tsx
@@ -1,6 +1,7 @@
import * as React from "react";
import { useUpdateManagedAgentMutation } from "@/features/agents/hooks";
+import { runLocationForBackend } from "@/features/agents/lib/agentAccessWarning";
import { CreateAgentRespondToField } from "@/features/agents/ui/RespondToField";
import type { ManagedAgent, RespondToMode } from "@/shared/api/types";
import { Button } from "@/shared/ui/button";
@@ -54,9 +55,9 @@ export function EditRespondToDialog({