From b003e15e6c52d2f5fd9be508915a8d14b373f0a0 Mon Sep 17 00:00:00 2001 From: schickling-assistant <261620128+schickling-assistant@users.noreply.github.com> Date: Tue, 10 Nov 2026 19:10:48 +0100 Subject: [PATCH] feat(ios): bind test-client commands to native identity and controls agent-identity: agent/compoundingtech/st-ios agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.12.5 agent-runtime: OMP 18.12.5 agent-model: openai-codex/gpt-6.1-sol --- apps/ios/App.tsx | 3 +- apps/ios/ClientControlIndicator.tsx | 38 +++++++++ apps/ios/ClientControlNative.tsx | 112 +++++++++++++++++++++++++ apps/ios/clientControlProfile.test.mjs | 18 ++++ apps/ios/clientControlVisible.ts | 27 ++++++ apps/ios/store.tsx | 22 ++++- release-notes/ios-client-control.json | 2 +- 7 files changed, 217 insertions(+), 5 deletions(-) create mode 100644 apps/ios/ClientControlIndicator.tsx create mode 100644 apps/ios/ClientControlNative.tsx create mode 100644 apps/ios/clientControlProfile.test.mjs create mode 100644 apps/ios/clientControlVisible.ts diff --git a/apps/ios/App.tsx b/apps/ios/App.tsx index a4deff4a3aa..05481036c31 100644 --- a/apps/ios/App.tsx +++ b/apps/ios/App.tsx @@ -32,6 +32,7 @@ import { quality } from './qualityNative'; import { qualityVisibility } from './qualityView'; import { parseFabricProofLink, type FabricProofInput } from './fabricProof'; import { DiagnosticsBoundary } from './DiagnosticsBoundary'; +import { ClientControlNative } from './ClientControlNative'; // The chrome is native: one UITabBarController (react-native-screens' tabs, through // @react-navigation/bottom-tabs' native navigator) holding a UINavigationController per tab @@ -244,7 +245,7 @@ function AppContent() {
} /> : -
+
} ; } diff --git a/apps/ios/ClientControlIndicator.tsx b/apps/ios/ClientControlIndicator.tsx new file mode 100644 index 00000000000..dfa1bb10399 --- /dev/null +++ b/apps/ios/ClientControlIndicator.tsx @@ -0,0 +1,38 @@ +import { StyleSheet, View } from 'react-native'; +import { theme } from './theme'; +import { Button, T, useTextAppearance } from './ui'; + +/** The app-internal view of an active client-control grant; not a wire type. */ +export type ClientControlGrant = { runId: string }; + +/** + * Shown while a run may drive this client: what is controlling it, and how to stop it. + * Renders nothing without a grant. Test-mode only until a generated grant source exists. + */ +export function ClientControlIndicator({ grant, onRevoke }: { grant: ClientControlGrant | undefined; onRevoke: () => void }) { + const appearance = useTextAppearance(); + if (!grant) return null; + return ( + + + Controlled by run + {grant.runId} + +