From 49f7fe9b004ebe76a9df97f26d8c0dbabc69d6ff Mon Sep 17 00:00:00 2001 From: schickling-assistant <261620128+schickling-assistant@users.noreply.github.com> Date: Tue, 10 Nov 2026 16:55:44 +0100 Subject: [PATCH 1/3] feat(ios): gate test client control pending canonical codegen 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 | 36 +++++++++++ apps/ios/README.md | 2 + apps/ios/clientControl.test.mjs | 86 +++++++++++++++++++++++++++ apps/ios/clientControl.ts | 52 ++++++++++++++++ apps/ios/clientControlFeed.test.mjs | 33 ++++++++++ apps/ios/clientControlWire.ts | 21 +++++++ apps/ios/feed.ts | 21 +++++++ release-notes/ios-client-control.json | 11 ++++ 10 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 apps/ios/ClientControlIndicator.tsx create mode 100644 apps/ios/ClientControlNative.tsx create mode 100644 apps/ios/clientControl.test.mjs create mode 100644 apps/ios/clientControl.ts create mode 100644 apps/ios/clientControlFeed.test.mjs create mode 100644 apps/ios/clientControlWire.ts create mode 100644 release-notes/ios-client-control.json 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} + +