From fc615ca32ff2ab9fb0f64f3f9d24cd145bb53367 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:53:59 +0800 Subject: [PATCH 1/7] feat(provider-routing): add native Codex account handoff Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../codex-account-settings.css | 29 ++ .../codex-account-settings.tsx | 143 ++++++++ .../workspace-settings-page.tsx | 2 + loopx/chat_server.py | 5 + loopx/presentation/codex_accounts_api.py | 108 ++++++ loopx/presentation/configuration_api.py | 4 + packages/README.md | 4 +- .../loopx-codex-provider-routing/NATIVE.md | 136 ++++++++ .../loopx-codex-provider-routing/OPERATOR.md | 3 + .../loopx-codex-provider-routing/README.md | 42 ++- .../loopx-codex-provider-routing/RUNBOOK.md | 4 + .../extension.toml | 2 +- .../pyproject.toml | 8 +- .../smoke/codex_provider_routing_smoke.py | 2 +- .../smoke/native-policy.test.mjs | 50 +++ .../loopx_codex_provider_routing/native.py | 326 ++++++++++++++++++ .../native_host.py | 319 +++++++++++++++++ .../native_policy.ts | 97 ++++++ .../native_policy_bridge.ts | 7 + .../templates/codex-app-config.toml | 28 +- .../templates/legacy-cpa-config.toml | 22 ++ tests/presentation/test_codex_accounts.py | 277 +++++++++++++++ 22 files changed, 1578 insertions(+), 40 deletions(-) create mode 100644 apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.css create mode 100644 apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx create mode 100644 loopx/presentation/codex_accounts_api.py create mode 100644 packages/loopx-codex-provider-routing/NATIVE.md create mode 100644 packages/loopx-codex-provider-routing/smoke/native-policy.test.mjs create mode 100644 packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native.py create mode 100644 packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py create mode 100644 packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy.ts create mode 100644 packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy_bridge.ts create mode 100644 packages/loopx-codex-provider-routing/templates/legacy-cpa-config.toml create mode 100644 tests/presentation/test_codex_accounts.py diff --git a/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.css b/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.css new file mode 100644 index 0000000000..1550f76734 --- /dev/null +++ b/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.css @@ -0,0 +1,29 @@ +.personal-codex-accounts { display: grid; gap: 20px; padding: 8px 0 24px; color: var(--pw-text); } +.personal-codex-accounts > header { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 12px; } +.personal-codex-accounts h2 { margin: 0; font-size: var(--text-heading); line-height: var(--leading-heading); font-weight: 600; } +.personal-codex-accounts p { margin: 0; line-height: var(--leading-prose); } +.personal-codex-accounts header > span, .codex-account-effect, .personal-codex-accounts details, .codex-account-actions > span { color: var(--pw-muted); font-size: var(--text-caption); line-height: var(--leading-caption); } +.codex-account-enable { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 12px 0; border-top: 1px solid var(--pw-line); border-bottom: 1px solid var(--pw-line); } +.codex-account-enable input { accent-color: var(--pw-text); width: 18px; height: 18px; } +.codex-account-state { display: flex; gap: 8px; align-items: center; font-size: var(--text-body); } +.codex-account-list { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; } +.codex-account-list article { display: flex; flex-direction: column; align-items: flex-start; gap: 16px; padding-top: 16px; border-top: 2px solid var(--pw-line); min-width: 0; } +.codex-account-list article.is-current { border-color: var(--pw-text); } +.codex-account-name { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px; } +.codex-account-name > span, .codex-account-list article > span { font-size: var(--text-caption); color: var(--pw-muted); } +.codex-account-list dl { display: grid; gap: 12px; margin: 0; } +.codex-account-list dt { color: var(--pw-muted); font-size: var(--text-caption); } +.codex-account-list dd { margin: 4px 0 0; font-size: var(--text-heading); font-variant-numeric: tabular-nums; } +.personal-codex-accounts button { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 44px; padding: 8px 12px; border: 1px solid var(--pw-line-strong); border-radius: 6px; background: var(--pw-card); color: var(--pw-text); font-size: var(--text-body); cursor: pointer; } +.personal-codex-accounts button:disabled { opacity: .5; cursor: default; } +.personal-codex-accounts button:focus-visible, .personal-codex-accounts input:focus-visible, .personal-codex-accounts summary:focus-visible { outline: 2px solid var(--pw-blue); outline-offset: 3px; } +.codex-account-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; } +.personal-codex-accounts details { border-top: 1px solid var(--pw-line); padding-top: 16px; } +.personal-codex-accounts summary { cursor: pointer; padding: 4px 0; } +.personal-codex-accounts details p { margin: 12px 0; } +.personal-codex-accounts [role="alert"] { display: flex; gap: 8px; align-items: flex-start; color: var(--pw-red); } +@media (max-width: 640px) { + .codex-account-list { grid-template-columns: 1fr; gap: 20px; } + .codex-account-list dl { grid-template-columns: 1fr 1fr; width: 100%; } + .codex-account-list article > button { width: 100%; } +} diff --git a/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx b/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx new file mode 100644 index 0000000000..f10d8af855 --- /dev/null +++ b/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx @@ -0,0 +1,143 @@ +import { useCallback, useEffect, useState } from "react"; +import { RefreshCw, CheckCircle2, Circle, AlertCircle } from "lucide-react"; +import { requestJson } from "../../data/chat"; +import { useWorkspaceI18n } from "./i18n"; +import "./codex-account-settings.css"; + +type AccountStatus = { + ok: boolean; available: boolean; code?: string | null; revision?: number; + active_slot?: string | null; selection_revision?: string; action?: string; + target?: string | null; recovery_required?: boolean; launch_failed?: boolean; + policy?: { enabled: boolean; slots: string[]; cooldown_seconds: number }; + slots?: string[]; last_checked_at?: number | null; last_switch_at?: number | null; + accounts?: Array<{ slot: string; availability: string; observed_at: number; + primary_used: number | null; secondary_used: number | null; reset_at: number | null; + credits_available: boolean | null }>; +}; + +const copy = { + "zh-CN": { + title: "Codex 原生账号", enabled: "自动接续已启用", disabled: "自动接续已关闭", + enable: "额度耗尽后自动切换", refresh: "检查额度", retry: "重新连接", + effect: "仅使用下方已登记账号。额度耗尽后等待 Codex 客户端关闭,保存登录态并切换,再打开原来的 GPT 界面。", + current: "当前", next: "下一账号", slot: "账号", primary: "短周期剩余", secondary: "长周期剩余", unread: "未读取", + select: "切换到此账号", checking: "正在检查额度", ready: "当前账号可用", selected: "账号已切换", + waiting_for_idle: "已选好候选账号,等待 Codex 客户端关闭", selection_changed: "账号选择已变化,已暂停本次切换", + auth_required: "登录需要更新,请在原生 Codex 完成登录", quota_unknown: "暂时无法确认额度,将稍后重试", + cooldown: "切换后冷却中", all_unavailable: "暂时没有可用账号,等待额度恢复", target_unavailable: "所选账号当前不可用", + recovery_required: "上次切换未完成,需要恢复", unavailable: "原生账号暂不可用", adapter_changed: "槽位管理器已更新,请重新连接", + recover: "恢复未完成的切换", rollback: "撤销最近一次切换", available: "可用", exhausted: "额度已用完", + unknown: "额度未知", credits: "另有可用额度", help: "运行与恢复说明", last: "上次检查", + detail: "检测不会调用模型、购买额度或使用重置券。401 登录失效先由原生客户端刷新;其他账号可通过官方 CLI 单独刷新。查询失败不会被判为额度耗尽。切换保留模型设置和会话历史,不重放已提交工作。自动观察随 LoopX 服务运行;原生客户端占用时不会强退。", + extension_uninstalled: "尚未安装 Codex 账号扩展。安装 loopx-codex-provider-routing 后重新启动 LoopX 服务。", + adapter_unavailable: "未发现已安装的 Personal Apps 槽位管理器和 Codex CLI。", + native_unavailable: "无法连接原生槽位管理器,请检查本机安装后重试。", + launchFailed: "账号已切换,但界面未能重新打开。可以从原来的 GPT 入口打开;请勿重复切换。", + failure: "操作未完成。刷新状态后可以重试。", recoveryHint: "恢复会还原未完成事务;撤销会还原最近一次切换。两者都需要客户端关闭,且不会覆盖后续登录修改。", + }, + en: { + title: "Native Codex accounts", enabled: "Automatic handoff enabled", disabled: "Automatic handoff off", + enable: "Switch automatically when quota runs out", refresh: "Check quota", retry: "Reconnect", + effect: "Use only the registered accounts below. After exhaustion, wait for Codex clients to close, save the login, switch accounts, then reopen the same GPT interface.", + current: "Current", next: "Next account", slot: "Account", primary: "Short window left", secondary: "Long window left", unread: "Not read", + select: "Switch to this account", checking: "Checking quota", ready: "Current account is available", selected: "Account switched", + waiting_for_idle: "Candidate selected; waiting for Codex clients to close", selection_changed: "Account selection changed; this switch was paused", + auth_required: "Sign in again in native Codex", quota_unknown: "Quota could not be confirmed; retrying later", + cooldown: "Cooling down after switching", all_unavailable: "No account is available yet; waiting for quota to recover", target_unavailable: "Selected account is unavailable", + recovery_required: "An interrupted switch needs recovery", unavailable: "Native accounts unavailable", adapter_changed: "The slot manager changed; reconnect to it", + recover: "Recover interrupted switch", rollback: "Undo last switch", available: "Available", exhausted: "Quota exhausted", + unknown: "Quota unknown", credits: "Additional allowance available", help: "Operation and recovery", last: "Last checked", + detail: "Checks do not call a model, buy credits or use reset coupons. Native Codex refreshes an expired active login; other accounts can refresh separately through the official CLI. A failed check never means exhausted quota. Switching preserves model settings and history and never replays submitted work. Observation runs with the LoopX service and never force-quits an occupied client.", + extension_uninstalled: "Install the optional loopx-codex-provider-routing package, then restart the LoopX service.", + adapter_unavailable: "The installed Personal Apps slot manager and Codex CLI were not found.", + native_unavailable: "Cannot connect to the native slot manager. Check the local installation and retry.", + launchFailed: "The account switched, but the interface could not reopen. Open the original GPT entry; do not repeat the switch.", + failure: "The operation did not finish. Refresh its status before retrying.", recoveryHint: "Recovery restores an interrupted transaction; undo restores the last switch. Both require closed clients and refuse to overwrite later login changes.", + }, +}; + +export function CodexAccountSettings() { + const { locale } = useWorkspaceI18n(); + const c = copy[locale]; + const [status, setStatus] = useState(null); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(false); + const endpoint = "/api/chat/codex-accounts"; + const label = (key: string | null | undefined) => c[key as keyof typeof c] ?? c.unavailable; + const read = useCallback(async () => { + try { + const result = await requestJson(endpoint); + setStatus(result); + setError(false); + } catch { setError(true); } + }, []); + useEffect(() => { + void read(); + const timer = window.setInterval(() => { if (!document.hidden) void read(); }, 5000); + return () => window.clearInterval(timer); + }, [read]); + async function act(operation: string, parameters = {}) { + setBusy(true); + setError(false); + try { + const result = await requestJson(endpoint, { + method: "POST", body: JSON.stringify({ operation, parameters }), + }); + setStatus(result); + } catch { await read(); setError(true); } + finally { setBusy(false); } + } + const enabled = status?.policy?.enabled === true; + const problem = status?.code || (status?.ok === false ? "native_unavailable" : null); + return
+

{c.title}

{enabled ? c.enabled : c.disabled}
+ {!status ?

{c.checking}

: null} + {(problem && problem !== status?.action) || status?.available === false ?

{label(problem)}

: null} + {status?.available && status.slots?.length ? <> +

{c.effect}

+ +
+ {status.action === "ready" || status.action === "selected" ? + : } + {label(status.recovery_required ? "recovery_required" : status.action)} +
+
+ {status.slots.map(slot => { + const row = status.accounts?.find(a => a.slot === slot); + // Expired observations remain unknown in the UI, just as in policy. + const fresh = row && Date.now() / 1000 - row.observed_at <= 120; + const current = status.active_slot === slot; + const remaining = (used: number | null | undefined) => fresh && used != null ? `${100 - used}%` : "—"; + return
+
{c.slot} {slot.toUpperCase()} + {current ? c.current : status.target === slot ? c.next : label(row?.availability === "auth_required" ? "auth_required" : fresh ? row?.availability : "unknown")}
+
{c.primary}
{remaining(row?.primary_used)}
+
{c.secondary}
{remaining(row?.secondary_used)}
+ {fresh && row.credits_available ? {c.credits} : null} + {!fresh ? {c.unread} : null} + {!current ? : null} +
; + })} +
+ {status.launch_failed ?

{c.launchFailed}

: null} +
+ {status.last_checked_at ? {c.last} {new Date(status.last_checked_at * 1000).toLocaleTimeString(locale)} : null} +
+
{c.help}

{c.detail}

{c.recoveryHint}

+
+
+
+ : null} + {error ?

{c.failure}

: null} + {status?.code === "adapter_changed" || error ? : null} +
; +} diff --git a/apps/presentation/dashboard/src/features/personal-workspace/workspace-settings-page.tsx b/apps/presentation/dashboard/src/features/personal-workspace/workspace-settings-page.tsx index f18ae73b3d..b46a65ba8f 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/workspace-settings-page.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/workspace-settings-page.tsx @@ -15,6 +15,7 @@ import { AutomationCadenceSettings } from "./automation-cadence-settings"; import { MachineConfigurationSettings } from "./machine-configuration-settings"; import { ConfigurationBackupSettings } from "./configuration-backup-settings"; import { OperatorCredentialSettings } from "./operator-credential-settings"; +import { CodexAccountSettings } from "./codex-account-settings"; import type { PersonalWorkspaceCallbacks, WorkspaceGoal, WorkspaceGoalNotification } from "./personal-workspace-model"; import type { WorkspaceTheme } from "./workspace-theme"; import type { AttentionNotificationSupport } from "./attention-notifications"; @@ -227,6 +228,7 @@ export function WorkspaceSettingsPage({ {tab === "provider" ? (
+
) : null} diff --git a/loopx/chat_server.py b/loopx/chat_server.py index 421f7e20b6..ef0741b5ca 100644 --- a/loopx/chat_server.py +++ b/loopx/chat_server.py @@ -15,6 +15,7 @@ from urllib.parse import parse_qs, urlparse from .presentation import configuration_api as config_api +from .presentation.codex_accounts_api import CodexAccountService from .attached_session_api import AttachedSessionRequestMixin from .zcode_goal_mode.api import ZCodeGoalRequestMixin from .chat import ( @@ -442,6 +443,7 @@ class ChatHTTPServer(ThreadingHTTPServer): registry_path: Path runtime_root_override: str | None + codex_account_service: CodexAccountService scan_roots: list[Path] limit: int selected_goal_id: str | None @@ -469,6 +471,8 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.completed_todo_pages = CompletedTodoPages() def server_close(self) -> None: + if hasattr(self, "codex_account_service"): + self.codex_account_service.close() if hasattr(self, "lark_app_setup_manager"): self.lark_app_setup_manager.close() if hasattr(self, "manager_return_service"): @@ -1729,6 +1733,7 @@ def serve_chat( server = ChatHTTPServer((host, port), ChatRequestHandler) server.registry_path = resolved_registry_path server.runtime_root = runtime_root + server.codex_account_service = CodexAccountService(runtime_root) server.runtime_root_override = resolved_runtime_root_override server.scan_roots = resolved_scan_roots server.limit = limit diff --git a/loopx/presentation/codex_accounts_api.py b/loopx/presentation/codex_accounts_api.py new file mode 100644 index 0000000000..2d55f0eb89 --- /dev/null +++ b/loopx/presentation/codex_accounts_api.py @@ -0,0 +1,108 @@ +"""Owner-local transport to the optional native Codex accounts provider. + +No account implementation, credentials or selection rules live in Core. +Uninstalled/disabled providers start no observer and leave native Codex alone. +""" +from __future__ import annotations + +from pathlib import Path +import importlib +import threading +from typing import Any, Protocol, cast + +CODEX_ACCOUNTS_PATH = "/api/chat/codex-accounts" + + +class CodexAccountService: + def __init__(self, runtime_root: Path): + self.provider: Any = None + self.watcher: Any = None + self.mutex = threading.Lock() + self.error: str | None = "extension_uninstalled" + try: + provider_module = importlib.import_module("loopx_codex_provider_routing.native") + except ImportError: + return + self.provider = provider_module.NativeAccounts(runtime_root) + self.watcher = provider_module.Watcher(self.provider) + self.error = None + # Rehydrate an explicitly enabled observer after an App restart. The + # absent/default-off path neither creates state nor reads native auth. + try: + if self.provider.path.exists() and self.provider._load()["policy"]["enabled"]: + self.watcher.start() + except Exception: + self.error = "state_unavailable" + + def call(self, operation: str, parameters: dict[str, Any]) -> dict[str, Any]: + if self.provider is None: + return {"ok": True, "available": False, "code": self.error} + try: + if operation == "status": + value = self.provider.status() + elif operation == "configure": + with self.mutex: + if parameters.get("enabled") is False: + self.watcher.stop.set() + value = self.provider.configure(**parameters) + if value["policy"]["enabled"]: + if self.watcher.stop.is_set(): + module = importlib.import_module("loopx_codex_provider_routing.native") + self.watcher = module.Watcher(self.provider) + self.watcher.start() + else: + self.watcher.close() + elif operation == "refresh": + value = self.provider.tick(refresh=True) + elif operation == "switch": + if set(parameters) != {"manual_slot", "expected_selection", "operation_id"}: + raise ValueError("Invalid switch request") + value = self.provider.tick(refresh=True, **parameters) + elif operation in ("recover", "rollback"): + value = self.provider.recover(rollback=operation == "rollback", **parameters) + else: + raise ValueError("Unsupported operation") + return {"ok": True, **value} + except Exception as error: + # Optional provider diagnostics can include private native paths. + code = getattr(error, "code", "native_unavailable") + cached = {} + try: + cached = self.provider._projection(self.provider._load()) + except Exception: + pass + return {**cached, "ok": False, "available": True, "code": code, "error_code": code} + + def close(self) -> None: + if self.watcher: + self.watcher.close() + + +class _HTTP(Protocol): + def _send_json(self, payload: dict[str, Any], *, status: int = 200) -> None: ... + + def _read_json(self) -> dict[str, Any]: ... + + +class CodexAccountsRequestMixin: + server: Any + + def _codex_accounts_read(self) -> None: + cast(_HTTP, self)._send_json(self.server.codex_account_service.call("status", {})) + + def _codex_accounts_write(self) -> None: + http = cast(_HTTP, self) + try: + body = http._read_json() + if set(body) != {"operation", "parameters"} or not isinstance(body["parameters"], dict): + raise ValueError("Invalid account operation") + operation, parameters = body["operation"], body["parameters"] + fields = {"configure": {"expected_revision", "enabled", "slots", "reconnect"}, + "switch": {"manual_slot", "expected_selection", "operation_id"}, + "recover": {"expected_revision", "expected_selection"}, "rollback": {"expected_revision", "expected_selection"}, "refresh": set()} + if operation not in fields or set(parameters) - fields[operation]: + raise ValueError("Invalid account parameters") + result = self.server.codex_account_service.call(operation, parameters) + except (TypeError, ValueError, KeyError): + result = {"ok": False, "code": "invalid_request"} + http._send_json(result, status=200 if result["ok"] else 409) diff --git a/loopx/presentation/configuration_api.py b/loopx/presentation/configuration_api.py index 38fea2a0a4..88fac0b905 100644 --- a/loopx/presentation/configuration_api.py +++ b/loopx/presentation/configuration_api.py @@ -3,6 +3,7 @@ from collections.abc import Callable from . import codex_attached_api as attached_api +from . import codex_accounts_api as accounts_api from . import workspace_preferences_api as preferences_api from . import configuration_backup_api as backup_api from . import state_recovery_api as recovery_api @@ -20,6 +21,7 @@ class ChatConfigurationRequestMixin( + accounts_api.CodexAccountsRequestMixin, attached_api.CodexAttachedRequestMixin, request_api.RequestControlMixin, preferences_api.WorkspacePreferencesRequestMixin, @@ -40,6 +42,7 @@ class ChatConfigurationRequestMixin( def _configuration_get_routes(self) -> dict[str, Callable[[], None]]: return { + accounts_api.CODEX_ACCOUNTS_PATH: self._codex_accounts_read, attached_api.CODEX_ATTACHED_PATH: self._codex_attached_read, attached_api.CODEX_ATTACHED_LIVE_PATH: self._codex_attached_live, request_api.REQUEST_CONTROL_PATH: self._request_control_read, @@ -59,6 +62,7 @@ def _configuration_get_routes(self) -> dict[str, Callable[[], None]]: def _configuration_post_routes(self) -> dict[str, Callable[[], None]]: return { + accounts_api.CODEX_ACCOUNTS_PATH: self._codex_accounts_write, context_api.DECISION_CONTEXT_PATH: self._decision_context_request, attached_api.CODEX_ATTACHED_PATH: self._codex_attached_send, attached_api.CODEX_ATTACHED_OPEN_PATH: self._codex_attached_open, diff --git a/packages/README.md b/packages/README.md index 3229fab2fd..ba612e0714 100644 --- a/packages/README.md +++ b/packages/README.md @@ -27,8 +27,8 @@ Current co-located distributions, in directory order: LoopX-governed work unit on Ark Managed Agents (Python distribution, no `extension.toml`; selected with `turn run-once --host generic-cli`); - [`loopx-codex-provider-routing`](loopx-codex-provider-routing/README.md): - public-safe Codex App + CPA catalog compilation, qualification and upgrade - planning; + native Codex account slots, allowance observation and automatic handoff at + safe boundaries, with legacy CPA qualification and rollback compatibility; - [`loopx-community-discussion`](loopx-community-discussion/README.md): public-safe community discussion scanner producing compact `discussion_fact_v0` facts; diff --git a/packages/loopx-codex-provider-routing/NATIVE.md b/packages/loopx-codex-provider-routing/NATIVE.md new file mode 100644 index 0000000000..7f22d10da5 --- /dev/null +++ b/packages/loopx-codex-provider-routing/NATIVE.md @@ -0,0 +1,136 @@ +# Native Codex accounts + +The optional `loopx-codex-provider-routing` provider replaces the recommended CPA +path with native slots. It has no new Core capability id. Credentials and lifecycle +stay in this package; Core composes the App transport. Python adapts existing +private file/process owners; `native_policy.ts` owns availability and selection. + +## The user task + +Previously an exhausted account required finding another account, closing clients, +selecting it by hand and reopening the GPT interface. After one opt-in in +**Settings → Model provider → Native Codex accounts**, LoopX checks allowance and +selects/reopens when the native owner admits it. The page reads back accounts, +windows, waiting cause and recovery. Tokens and identity claims stay private. + +**An open native Codex client is an occupied owner, even between turns.** This +release waits for it to close. It does not implement hot login replacement, +force termination, job replay or resumption of an interrupted turn. If every +account is unavailable, it waits for the observed reset and checks again. + +## Prerequisites and activation + +Install in the same Python environment as LoopX, then restart its App/Chat service: + +```sh +python -m pip install ./packages/loopx-codex-provider-routing +loopx-codex-accounts status +``` + +The native adapter requires POSIX, the installed **Personal Apps** GPT slot owner +(`personal-apps` with adjacent `personal_apps.py` and `personal_accounts.py`), its +registered native GPT route, and the official `codex` CLI. Switching is macOS-only +in that owner. This package adapts that installation; it ships no second account +vault or launcher. Other hosts show unavailable. Node 22.18+ or 24+ runs the +TypeScript selector. Enrol accounts through the native owner's official login. + +Click **Switch automatically when quota runs out** to authorize the listed slots +as destinations. Installation alone grants no account effect. The App observer +runs with its serving LoopX process and rehydrates the saved opt-in on restart. +An operator-owned service independent of the App can run the same observer: + +```sh +loopx-codex-accounts watch +``` + +Do not run a busy shell loop. A private lock serializes hosts; observations carry +next-due times. This provider is independent of Goal compute quota, heartbeat +settlement and the model data plane. CLI mutations take JSON on stdin with +revisions from `status`: + +```sh +loopx-codex-accounts configure <<'JSON' +{"expected_revision":0,"enabled":true,"slots":["a","b"]} +JSON +loopx-codex-accounts refresh +``` + +Explicit `switch` accepts `manual_slot`, `expected_selection` and a unique +`operation_id`; retrying it does not repeat selection. `recover` and `rollback` +require `expected_revision` and `expected_selection`. App buttons use the same +fences. `--runtime-root` selects a custom private runtime; browser requests +cannot supply paths, executables or source files. +Explicit checking or selection can connect the registered slots with automatic +effects still off. A manual choice may select an exhausted/expired account for +native sign-in or inspection; this never qualifies it for automatic selection. + +## Availability and continuation + +Usage checks use verified HTTPS without model calls, bound response size and +refuse redirects. Schema drift/network failure means unknown, never exhausted. +The active native client owns its login refresh. A distinct inactive account +can refresh through an isolated official App Server; rotated bytes are saved +only to that slot under native locks after identity and selection checks. No +active-home copy is refreshed. + +A rejected inactive refresh is cached against that private login-cache revision; +background checks do not repeatedly retry the same rejected credential. A new +native login or an explicit check permits one new attempt. This refusal stays +visible as a sign-in requirement, rather than aging into usable allowance. + +The selector prefers App Server `rateLimitsByLimitId.codex` over the legacy +bucket. Review/other product buckets cannot establish Codex availability. +Missing/invalid/future-dated or older-than-two-minute samples stay unknown. A +past reset invalidates an old exhausted sample; it does not grant new allowance. +100% subscription use with positive credits stays available; absent credit facts +remain unknown. Login errors, generic 429, query failure and measured exhaustion +are distinct. The observer never buys credits or uses reset coupons. + +Only fresh active-account exhaustion starts automatic selection. Destinations +must be allowlisted and freshly available. Selection follows the configured +ring with a five-minute cooldown. An external native/manual choice wins and +starts a cooldown. Busy clients defer; other repeated failures stop after three +attempts until an explicit check/reconnect. Resets require new observations. +All-unavailable accounts are checked again at the next reset or within five +minutes; unknown observations retry within one minute. These are bounded usage +reads, not model probes. The managed extension's enable/disable controls its +permissionless qualification protocol; the native host has this separate +explicit opt-in and stop lifecycle. + +An intent is durable before the effect. The native owner checks idle and the +selection revision under its own locks and immediately before writes, saves +outgoing token rotations, commits and reads back. A lost reply reconciles +selection without replaying a switch. Interrupted native journals require +existing recovery, which refuses to overwrite later edits. Model settings and +history stay outside the transaction. Reopening failure is reported after +committed selection, without switching again. + +## Disable, upgrade and rollback + +Turn the switch off to stop automatic effects. CLI `configure` with +`enabled:false` also works offline. Stop a separate `watch` process through its +service manager. Stop/restart the serving process before uninstalling loaded +code. Uninstall leaves Core and native slots intact. + +Activation pins the two installed native source files. Updates produce +`adapter_changed`; **Reconnect** reads and pins the installation again. An old +observer never silently adopts new source. Private state contains paths, pins, +policy, content-free observations and an intent, never tokens. + +From CPA, first stop its separately owned service and restore a backed-up native +configuration using its existing operator workflow. Keep the selected model; +review removal of active custom provider/catalog/profile overrides. The native +adapter refuses a non-native default and never edits an App bundle or rewrites +a running home for migration. The [native template](templates/codex-app-config.toml) +illustrates the new route; the [legacy template](templates/legacy-cpa-config.toml) +and explicit CPA operator remain for deliberate rollback. No credential or +history conversion occurs. + +## Qualification boundary + +Tests challenge exhausted/unknown/credit-funded facts, allowlists, manual fences, +duplicates, concurrency, busy deferral, lost replies, stop-before-effect and +recovery with synthetic credentials. Browser evidence must use the packaged +page with the owning backend and a recovery case. Installed native file/process +qualification uses a disposable home. Read-only live status certifies neither +an actual account swap nor installed adoption or uninterrupted hot switching. diff --git a/packages/loopx-codex-provider-routing/OPERATOR.md b/packages/loopx-codex-provider-routing/OPERATOR.md index c63863e062..f5be0942a3 100644 --- a/packages/loopx-codex-provider-routing/OPERATOR.md +++ b/packages/loopx-codex-provider-routing/OPERATOR.md @@ -1,5 +1,8 @@ # Local CPA operator +Legacy opt-in compatibility. New native account installations use +[Native accounts](NATIVE.md); this operator is never selected automatically. + The package now includes `loopx-cpa-operator`, a separately invoked local CLI. The managed extension protocol remains read-only and permission-free. Installing or running that protocol does not enable the operator, discover credentials, diff --git a/packages/loopx-codex-provider-routing/README.md b/packages/loopx-codex-provider-routing/README.md index efc0b244ba..ac92369661 100644 --- a/packages/loopx-codex-provider-routing/README.md +++ b/packages/loopx-codex-provider-routing/README.md @@ -1,9 +1,17 @@ # LoopX Codex Provider Routing -This optional LoopX extension owns the public-safe integration contract for a -single Codex App using CPA as its multi-subscription and multi-provider data -plane. It packages configuration compilation, qualification readback and -upgrade planning without becoming a model proxy or credential authority. +This optional extension integrates **native Codex account slots** with LoopX. +It observes allowance, selects an authorized available account after exhaustion, +and asks the installed native slot owner to switch at an idle boundary. Codex +keeps its official OpenAI login, model settings and history. CPA is no longer +the recommended provider path. + +Install this package in the LoopX runtime, then open **Settings → Model provider +→ Native Codex accounts**. The page discovers slots, enables automatic handoff, +checks allowance, switches explicitly and reads back recovery. The same owner +is available through `loopx-codex-accounts`. See the [native guide](NATIVE.md) +for prerequisites, migration and the safe-boundary limitation. Installation +alone switches nothing. ## Placement @@ -11,16 +19,26 @@ This package is an **extension** that supplies a standalone integration provider. It is not a built-in capability: - Codex App owns task settings, turn snapshots and the session store; -- CPA owns credential selection, online routing, retry and stream adaptation; -- the operator owns OAuth/API credentials, process installation and private - build/rollback receipts; -- LoopX owns this versioned public contract, managed extension lifecycle, - public-safe qualification results and upgrade gates. - -The extension declares no permissions and performs no writes. It does not read +- the installed Personal Apps slot manager owns credential transactions, + idle admission, login-cache preservation and rollback; +- the optional provider owns allowance observation and its default-off policy; + its TypeScript selector is shared by CLI and App; +- LoopX Core supplies optional lifecycle and owner-local presentation transport, + without becoming a credential or model proxy. + +The **managed qualification protocol** declares no permissions and performs no writes. It does not read `HOME`, `CODEX_HOME`, auth files, process tables or network endpoints. Callers must convert local observations into the content-free snapshot schema before -qualification. +qualification. The separately invoked native host reads local credentials, +queries native usage and performs explicitly enabled account effects. It is +never invoked by the permissionless protocol or its doctor. + +## Legacy compatibility + +Existing CPA contracts, fixtures and `loopx-cpa-operator` remain for explicit +legacy use and rollback. They are not started, migrated or selected automatically. +The following operations describe that compatibility protocol; they do not +certify native-slot availability or authorize a native switch. ## Operations diff --git a/packages/loopx-codex-provider-routing/RUNBOOK.md b/packages/loopx-codex-provider-routing/RUNBOOK.md index 9aaae5c116..f480e59710 100644 --- a/packages/loopx-codex-provider-routing/RUNBOOK.md +++ b/packages/loopx-codex-provider-routing/RUNBOOK.md @@ -1,5 +1,9 @@ # Codex App 多订阅与多 Provider 切换 Runbook +> Legacy CPA maintenance only. The recommended native account provider and +> its activation, automatic handoff and recovery are in [Native accounts](NATIVE.md). +> This historical CPA procedure does not describe the current default route. + > 配套文档:需要长期保留两个独立 App / `CODEX_HOME` 时,参见 > [Codex 多 App 隔离与运维最佳实践(中文)](../../docs/guides/codex-multi-app-best-practices.zh-CN.md)。 diff --git a/packages/loopx-codex-provider-routing/extension.toml b/packages/loopx-codex-provider-routing/extension.toml index e4934583ac..21fac96db0 100644 --- a/packages/loopx-codex-provider-routing/extension.toml +++ b/packages/loopx-codex-provider-routing/extension.toml @@ -1,6 +1,6 @@ schema_version = "loopx_extension_manifest_v0" id = "loopx-codex-provider-routing" -version = "0.11.0" +version = "0.12.0" requires_loopx_api = ">=1,<2" permissions = [] diff --git a/packages/loopx-codex-provider-routing/pyproject.toml b/packages/loopx-codex-provider-routing/pyproject.toml index 21228addb2..45d756e0ae 100644 --- a/packages/loopx-codex-provider-routing/pyproject.toml +++ b/packages/loopx-codex-provider-routing/pyproject.toml @@ -4,14 +4,18 @@ build-backend = "setuptools.build_meta" [project] name = "loopx-codex-provider-routing" -version = "0.11.0" -description = "Public-safe Codex multi-provider routing integration for LoopX" +version = "0.12.0" +description = "Native Codex account slots and exhausted-account handoff for LoopX" readme = "README.md" requires-python = ">=3.11" [project.scripts] loopx-cpa-operator = "loopx_codex_provider_routing.operator:main" loopx-codex-provider-routing = "loopx_codex_provider_routing.cli:main" +loopx-codex-accounts = "loopx_codex_provider_routing.native:main" [tool.setuptools.packages.find] where = ["src"] + +[tool.setuptools.package-data] +loopx_codex_provider_routing = ["*.ts"] diff --git a/packages/loopx-codex-provider-routing/smoke/codex_provider_routing_smoke.py b/packages/loopx-codex-provider-routing/smoke/codex_provider_routing_smoke.py index 1c4c9da09a..b855d75803 100644 --- a/packages/loopx-codex-provider-routing/smoke/codex_provider_routing_smoke.py +++ b/packages/loopx-codex-provider-routing/smoke/codex_provider_routing_smoke.py @@ -29,7 +29,7 @@ def _assert_layered_retry_templates() -> None: - app = (PACKAGE_ROOT / "templates" / "codex-app-config.toml").read_text() + app = (PACKAGE_ROOT / "templates" / "legacy-cpa-config.toml").read_text() local_cpa = app.split("[model_providers.local-cpa]", maxsplit=1)[1] request_retries = re.search(r"(?m)^request_max_retries\s*=\s*(\d+)\s*$", local_cpa) stream_retries = re.search(r"(?m)^stream_max_retries\s*=\s*(\d+)\s*$", local_cpa) diff --git a/packages/loopx-codex-provider-routing/smoke/native-policy.test.mjs b/packages/loopx-codex-provider-routing/smoke/native-policy.test.mjs new file mode 100644 index 0000000000..f4488e73b4 --- /dev/null +++ b/packages/loopx-codex-provider-routing/smoke/native-policy.test.mjs @@ -0,0 +1,50 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { account, decide } from "../src/loopx_codex_provider_routing/native_policy.ts"; + +const now = 1000; +const sample = (slot, used = 10, extra = {}) => ({ slot, observed_at: now, status: "ok", usage: { + rate_limit: { primary_window: { used_percent: used, reset_at: 2000 }, + secondary_window: { used_percent: 20, reset_at: 9000 } }, credits: { has_credits: false, balance: "0" }, ...extra, +} }); +const input = overrides => ({ now, policy: { enabled: true, slots: ["a", "b", "c"], cooldown_seconds: 300 }, + active: "a", observations: [sample("a", 100), sample("b"), sample("c")], + last_switch_at: null, recovery_required: false, login_matches: true, ...overrides }); + +test("only measured exhaustion switches; default-off preserves the selected account", () => { + assert.equal(decide(input({})).target, "b"); + assert.equal(decide(input({ observations: [sample("a"), sample("b")] })).action, "ready"); + assert.equal(decide(input({ policy: { enabled: false, slots: ["b"], cooldown_seconds: 300 } })).action, "disabled"); + for (const status of ["unavailable", "auth_required"]) { + assert.equal(decide(input({ observations: [{ slot: "a", observed_at: now, status }, sample("b")] })).target, null); + } +}); + +test("credits, null and multi-bucket facts retain their meaning", () => { + assert.equal(account(sample("a", 100, { credits: { has_credits: true, balance: "12.0" } }), now).availability, "available"); + assert.equal(account({ ...sample("a"), usage: {} }, now).availability, "unknown"); + assert.equal(account(sample("a", 100, { credits: null }), now).availability, "unknown"); + assert.equal(account({ ...sample("a"), usage: { rateLimitsByLimitId: { review: { primary: { usedPercent: 0 } } }, + rateLimits: { primary: { usedPercent: 5 } } } }, now).availability, "unknown"); + const native = { ...sample("a"), usage: { rateLimitsByLimitId: { codex: { + primary: { usedPercent: 100, resetsAt: 2000 }, secondary: { usedPercent: 100, resetsAt: 9000 }, credits: { hasCredits: false }, + } } } }; + assert.equal(account(native, now).reset_at, 9000); + assert.equal(account({ ...sample("a", 100), observed_at: 1 }, now).availability, "unknown"); + assert.equal(account(sample("a", 100), 2500).availability, "unknown"); +}); + +test("allowlist, manual fence, cooldown and all-unavailable wait precede effects", () => { + assert.equal(decide(input({ policy: { enabled: true, slots: ["a", "c"], cooldown_seconds: 300 } })).target, "c"); + assert.equal(decide(input({ login_matches: false })).action, "selection_changed"); + assert.equal(decide(input({ recovery_required: true })).action, "recovery_required"); + assert.equal(decide(input({ last_switch_at: 900 })).action, "cooldown"); + assert.equal(decide(input({ manual_slot: "outside" })).action, "target_unavailable"); + assert.equal(decide(input({ manual_slot: "b", observations: [sample("a"), { + slot: "b", observed_at: now, status: "auth_required", + }] })).target, "b", "Explicit selection can open native sign-in; automatic selection cannot"); + const unavailable = decide(input({ observations: [sample("a", 100), sample("b", 100), sample("c", 100)] })); + assert.equal(unavailable.action, "all_unavailable"); + assert.equal(unavailable.retry_at, 1300); + assert.equal(decide(input({ observations: [sample("a", 100), { ...sample("b"), observed_at: 0 }] })).target, null); +}); diff --git a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native.py b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native.py new file mode 100644 index 0000000000..1a9dbd1041 --- /dev/null +++ b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native.py @@ -0,0 +1,326 @@ +"""Opt-in native Codex account host; one policy for CLI and the LoopX App. + +The managed permissionless qualification protocol never imports this module. +Python owns private file/process IO; native_policy.ts owns availability/order. +""" +from __future__ import annotations + +import argparse +from contextlib import contextmanager +import json +import os +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile +import threading +import time +import uuid + +from .native_host import HostError, discover + +SCHEMA = "codex_native_accounts_v1" + + +def private_read(path: Path) -> dict: + if any(p.is_symlink() for p in (path, *path.parents)): + raise HostError("state_untrusted") + if path.stat().st_mode & 0o077 or path.stat().st_uid != os.getuid(): + raise HostError("state_untrusted") + value = json.loads(path.read_text()) + if value.get("schema_version") != SCHEMA: + raise HostError("state_incompatible") + return value + + +def atomic(path: Path, value: dict) -> None: + if any(p.is_symlink() for p in (path, *path.parents)): + raise HostError("state_untrusted") + fd, temporary = tempfile.mkstemp(dir=path.parent) + try: + os.fchmod(fd, 0o600) + with os.fdopen(fd, "w") as stream: + json.dump(value, stream) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, path) + directory = os.open(path.parent, os.O_RDONLY) + try: + os.fsync(directory) + finally: + os.close(directory) + finally: + Path(temporary).unlink(missing_ok=True) + + +def policy(request: dict) -> dict: + node = shutil.which("node") + if not node: + raise HostError("node_unavailable") + result = subprocess.run([node, "--no-warnings", "--experimental-strip-types", + str(Path(__file__).with_name("native_policy_bridge.ts"))], + input=json.dumps(request), capture_output=True, text=True, timeout=10) + if result.returncode or len(result.stdout) > 131072: + raise HostError("policy_unavailable") + return json.loads(result.stdout) + + +def host(adapter: dict, operation: str, **parameters) -> dict: + result = subprocess.run([sys.executable, "-m", "loopx_codex_provider_routing.native_host"], + input=json.dumps({"adapter": adapter, "operation": operation, **parameters}), + capture_output=True, text=True, timeout=150) + if len(result.stdout) > 131072: + raise HostError("native_unavailable") + try: + packet = json.loads(result.stdout) + except ValueError: + raise HostError("native_unavailable") from None + if packet.get("ok") is not True: + raise HostError(packet.get("code", "native_unavailable")) + return packet["result"] + + +class NativeAccounts: + def __init__(self, runtime_root: Path, *, transport=host, clock=time.time): + self.root = Path(runtime_root) / "extensions" / "codex-native-accounts" + self.path = self.root / "state.json" + self.transport, self.clock = transport, clock + self.switch_allowed = lambda: True + + def _load(self) -> dict: + if self.path.exists(): + return private_read(self.path) + return {"schema_version": SCHEMA, "revision": 0, + "policy": {"enabled": False, "slots": [], "cooldown_seconds": 300}, + "observations": [], "last_switch_at": None, "action": "disabled"} + + @contextmanager + def _lock(self): + if os.name != "posix": + raise HostError("platform_unavailable") + import fcntl + + if any(p.is_symlink() for p in (self.root, *self.root.parents)): + raise HostError("state_untrusted") + self.root.mkdir(mode=0o700, parents=True, exist_ok=True) + if self.root.stat().st_uid != os.getuid() or self.root.stat().st_mode & 0o077: + raise HostError("state_untrusted") + path = self.root / "lock" + if path.is_symlink(): + raise HostError("state_untrusted") + with open(path, "a", opener=lambda p, flags: os.open(p, flags, 0o600)) as stream: + fcntl.flock(stream, fcntl.LOCK_EX | fcntl.LOCK_NB) + yield + + def _projection(self, state: dict, native: dict | None = None) -> dict: + native = native or state.get("native", {}) + return {"schema_version": SCHEMA, "available": True, "revision": state["revision"], + "policy": state["policy"], "slots": native.get("slots", []), + "active_slot": native.get("active_slot"), + "selection_revision": native.get("selection_revision"), + "login_matches": native.get("current_login_matches"), + "recovery_required": native.get("recovery_required", False), + "action": state.get("action", "disabled"), "target": state.get("target"), + "retry_at": state.get("retry_at"), "last_checked_at": state.get("last_checked_at"), + "last_switch_at": state.get("last_switch_at"), "accounts": state.get("accounts", []), + "code": state.get("code"), "launch_failed": state.get("launch_failed", False), + "automatic_hot_swap": False} + + def status(self) -> dict: + state = self._load() + adapter = state.get("adapter") or discover() + native = self.transport(adapter, "status") + return self._projection(state, native) + + def configure(self, *, expected_revision: int, enabled: bool, slots: list[str], reconnect: bool = False) -> dict: + if type(enabled) is not bool or not isinstance(slots, list) or len(slots) > 16 or len(slots) != len(set(slots)): + raise HostError("invalid_policy") + with self._lock(): + state = self._load() + if state["revision"] != expected_revision: + raise HostError("configuration_changed") + # Disabling works offline and never needs credentials or a client. + if enabled or reconnect: + adapter = discover() if reconnect or "adapter" not in state else state["adapter"] + native = self.transport(adapter, "status") + if reconnect and not slots and not enabled: + slots = native["slots"] + if not slots or not set(slots) <= set(native["slots"]): + raise HostError("invalid_slots") + state.update(adapter=adapter, native=native) + state.update(policy={"enabled": enabled, "slots": slots, "cooldown_seconds": 300}, + revision=state["revision"] + 1, retry_at=None, code=None, intent=None, + action="checking" if enabled else "disabled", failure_count=0) + atomic(self.path, state) + return self._projection(state) + + def tick(self, *, refresh: bool = False, manual_slot: str | None = None, + expected_selection: str | None = None, operation_id: str | None = None) -> dict: + if manual_slot is not None and (not expected_selection or not isinstance(operation_id, str) or not 1 <= len(operation_id) <= 128): + raise HostError("invalid_request") + with self._lock(): + state = self._load() + if operation_id and operation_id == state.get("last_operation_id"): + return self._projection(state) + now = self.clock() + if not state["policy"]["enabled"] and not refresh and not manual_slot: + return self._projection(state) + if not refresh and not manual_slot and now < (state.get("retry_at") or 0): + return self._projection(state) + if state.get("failure_count", 0) >= 3 and not refresh and not manual_slot: + return self._projection(state) + if "adapter" not in state: + # An explicit check/manual choice can connect existing slots + # without turning automatic effects on first. + state["adapter"] = discover() + native = self.transport(state["adapter"], "status") + state.update(native=native, policy={**state["policy"], "slots": native["slots"]}, + revision=state["revision"] + 1) + try: + native = self.transport(state["adapter"], "status") + if expected_selection is not None and expected_selection != native["selection_revision"]: + raise HostError("selection_changed") + previous = state.get("native", {}).get("selection_revision") + intent = state.get("intent") + if intent and native["active_slot"] == intent["target"] and not native["recovery_required"] and native["current_login_matches"] is True: + # An interrupted caller may have lost the successful reply. + # Read back selection; never replay a switch or a model turn. + state.update(native=native, intent=None, last_switch_at=now, action="selected", target=None, + retry_at=now + 300, code=None, failure_count=0) + atomic(self.path, state) + return self._projection(state) + state["native"] = native + if not manual_slot and previous and previous != native["selection_revision"]: + # A native/manual choice outside this host wins. Observe it + # after a cooldown instead of immediately undoing it. + state.update(intent=None, last_switch_at=now, action="selection_changed", target=None, + accounts=[], retry_at=now + 300, code=None, failure_count=0) + atomic(self.path, state) + return self._projection(state) + if native["recovery_required"]: + state.update(action="recovery_required", retry_at=None) + atomic(self.path, state) + return self._projection(state) + if native["current_login_matches"] is not True: + raise HostError("selection_changed") + # Inspect the active account even when it is not an authorized + # destination. Candidates stay strictly inside the allowlist. + slots = list(dict.fromkeys([native["active_slot"], *state["policy"]["slots"]])) + failures = {} if refresh or manual_slot else { + row["slot"]: {"revision": row["credential_revision"], "observed_at": row["observed_at"]} + for row in state.get("observations", []) + if row["status"] == "auth_required" and "credential_revision" in row + } + observed = self.transport(state["adapter"], "observe", slots=slots, + expected_revision=native["selection_revision"], auth_failures=failures) + public_observations = [{k: v for k, v in row.items() if k != "credential_revision"} + for row in observed["observations"]] + decision = policy({"now": self.clock(), "policy": state["policy"], "active": native["active_slot"], + "observations": public_observations, "last_switch_at": state["last_switch_at"], + "recovery_required": False, "login_matches": True, + **({"manual_slot": manual_slot} if manual_slot else {})}) + state.update(observations=observed["observations"], accounts=decision["accounts"], + last_checked_at=self.clock(), action=decision["action"], target=decision["target"], + retry_at=decision["retry_at"] or self.clock() + 60, code=None, failure_count=0) + if decision["action"] == "switch": + if not manual_slot and not self.switch_allowed(): + raise HostError("observer_stopped") + # Durable before the effect, with source selection and target. + # Native owner rechecks the same fence inside its transaction. + state["intent"] = {"id": operation_id or uuid.uuid4().hex, + "source_revision": native["selection_revision"], "target": decision["target"]} + atomic(self.path, state) + result = self.transport(state["adapter"], "switch", slot=decision["target"], + expected_revision=native["selection_revision"], reopen=True) + state.update(native=result, intent=None, last_switch_at=self.clock(), action="selected", + target=None, retry_at=self.clock() + 300, launch_failed=result["launch_failed"], failure_count=0) + if operation_id: + state["last_operation_id"] = operation_id + except (HostError, OSError, ValueError, subprocess.SubprocessError) as error: + code = error.code if isinstance(error, HostError) else "native_unavailable" + # Busy is a normal safe-boundary wait; no process is terminated. + # Other repeated failures stop automatic attempts until Refresh. + failures = state.get("failure_count", 0) + (code != "waiting_for_idle") + state.update(action=code if code in ("waiting_for_idle", "selection_changed", "adapter_changed") else "unavailable", + code=code, retry_at=self.clock() + min(300, 60 * 2 ** min(failures, 3)), failure_count=failures) + if manual_slot: + state["last_operation_id"] = operation_id + atomic(self.path, state) + return self._projection(state) + + def recover(self, *, rollback: bool, expected_revision: int, expected_selection: str) -> dict: + with self._lock(): + state = self._load() + if state["revision"] != expected_revision or "adapter" not in state: + raise HostError("configuration_changed") + native = self.transport(state["adapter"], "rollback" if rollback else "recover", expected_revision=expected_selection) + state.update(native=native, intent=None, action="disabled", retry_at=None, code=None, + policy={**state["policy"], "enabled": False}, revision=state["revision"] + 1, failure_count=0) + atomic(self.path, state) + return self._projection(state) + + +class Watcher: + """Owned by the serving App (or explicit CLI watch), never an import effect.""" + def __init__(self, provider: NativeAccounts): + self.provider = provider + self.stop = threading.Event() + self.thread: threading.Thread | None = None + self.provider.switch_allowed = lambda: not self.stop.is_set() + + def start(self): + if self.thread is None: + self.thread = threading.Thread(target=self.run, daemon=True, name="codex-account-observer") + self.thread.start() + return self + + def run(self): + while not self.stop.is_set(): + delay = 60.0 + try: + value = self.provider.tick() + due = value.get("retry_at") + delay = max(5, min(300, due - time.time())) if due else 60 + except (HostError, OSError, ValueError, subprocess.SubprocessError): + delay = 60 + self.stop.wait(delay) + + def close(self): + self.stop.set() + if self.thread: + self.thread.join(timeout=2) + + +def main() -> int: + parser = argparse.ArgumentParser(prog="loopx-codex-accounts") + parser.add_argument("operation", choices=("status", "configure", "refresh", "switch", "recover", "rollback", "watch")) + parser.add_argument("--runtime-root", type=Path, default=Path.home() / ".loopx") + args = parser.parse_args() + provider = NativeAccounts(args.runtime_root) + try: + if args.operation == "watch": + watcher = Watcher(provider) + try: + watcher.run() + except KeyboardInterrupt: + watcher.close() + return 0 + request = {} if args.operation in ("status", "refresh") else json.load(sys.stdin) + if args.operation == "status": + result = provider.status() + elif args.operation == "configure": + result = provider.configure(**request) + elif args.operation in ("refresh", "switch"): + result = provider.tick(refresh=True, **request) + else: + result = provider.recover(rollback=args.operation == "rollback", **request) + print(json.dumps({"ok": True, **result})) + return 0 + except Exception as error: + print(json.dumps({"ok": False, "code": error.code if isinstance(error, HostError) else "native_unavailable"})) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py new file mode 100644 index 0000000000..5cc32c516f --- /dev/null +++ b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py @@ -0,0 +1,319 @@ +"""IO adapter to the installed Personal Apps native account owner. + +No copied account writer: the installed owner's locks, idle check, transaction, +readback and recovery remain authoritative. Paths/pins and credentials stay here, +outside policy input and browser projections. Run only through the opt-in host. +""" +from __future__ import annotations + +import hashlib +import importlib +import json +import os +from pathlib import Path +import selectors +import shutil +import subprocess +import sys +import tempfile +import time +import urllib.error +import urllib.request + + +class HostError(Exception): + def __init__(self, code: str): + self.code = code + super().__init__(code) + + +def trusted_file(path: Path) -> Path: + path = path.resolve(strict=True) + info = path.stat() + if not path.is_file() or info.st_uid not in (0, os.getuid()) or info.st_mode & 0o022: + raise HostError("adapter_untrusted") + return path + + +def discover() -> dict: + command = shutil.which("personal-apps") + codex = shutil.which("codex") + if not command or not codex: + raise HostError("adapter_unavailable") + source = trusted_file(Path(command)).parent + pins = {name: hashlib.sha256(trusted_file(source / name).read_bytes()).hexdigest() + for name in ("personal_apps.py", "personal_accounts.py")} + return {"source": str(source), "pins": pins, "codex": str(trusted_file(Path(codex)))} + + +class NativeHost: + def __init__(self, adapter: dict, *, user_home: Path | None = None): + source = Path(adapter["source"]) + for name in ("personal_apps.py", "personal_accounts.py"): + if hashlib.sha256(trusted_file(source / name).read_bytes()).hexdigest() != adapter["pins"][name]: + raise HostError("adapter_changed") + self.codex = trusted_file(Path(adapter["codex"])) + # This adapter runs in its own process; module names cannot collide with + # an earlier owner version loaded by another request. + sys.path.insert(0, str(source)) + self.apps = importlib.import_module("personal_apps") + self.accounts = importlib.import_module("personal_accounts") + self.home = user_home or Path.home() + self.spec = self.apps.route(self.home, "gpt") + self.expected = None + + def idle(): + try: + self.apps.account_idle(self.home, self.spec) + except (ValueError, OSError, subprocess.SubprocessError): + raise HostError("waiting_for_idle") from None + if self.expected is not None and self.revision() != self.expected: + raise HostError("selection_changed") + + self.manager = self.accounts.Accounts( + self.home, self.spec, idle, lambda: str(self.codex), + lambda selected: self.apps.clean_env(selected, self.home), + ) + + def revision(self) -> str: + # last.json also changes for a manual re-selection of the same slot. + values = [self.accounts.read_private(path) if path.exists() else b"" + for path in (self.manager.active, self.manager.root / "last.json")] + return hashlib.sha256(b"\0".join(values)).hexdigest() + + def status(self) -> dict: + self.apps.check_provider(self.spec, "gpt") + value = self.manager.status() + return {key: value[key] for key in ( + "slots", "active_slot", "current_login_matches", "recovery_required" + )} | {"selection_revision": self.revision()} + + def switch(self, slot: str, expected: str, *, reopen: bool) -> dict: + if sys.platform != "darwin": + raise HostError("platform_unavailable") + self.expected = expected + self.status() + # idle() is rechecked by the native owner under launch/account locks, + # and immediately before its first mutation. This is the CAS fence, + # including against manual selections outside LoopX. + result = self.manager.switch(slot) + value = self.status() + if value["active_slot"] != slot or value["current_login_matches"] is not True: + raise HostError("readback_failed") + launch_failed = False + if reopen: + try: + self.apps.open_app(self.home, "gpt", []) + except (OSError, ValueError, subprocess.SubprocessError): + launch_failed = True + return value | {"history_untouched": result["history_untouched"], "launch_failed": launch_failed} + + def recover(self, rollback: bool, expected: str) -> dict: + if sys.platform != "darwin": + raise HostError("platform_unavailable") + self.expected = expected + self.manager.recover(rollback) + return self.status() + + def observe(self, slots: list[str], expected: str, auth_failures: dict | None = None) -> dict: + before = self.status() + if before["selection_revision"] != expected or before["recovery_required"]: + raise HostError("selection_changed") + if not set(slots) <= set(before["slots"]) or len(slots) > 16: + raise HostError("invalid_slots") + rows = [] + for slot in slots: + path = self.manager.auth if slot == before["active_slot"] else self.manager.slot(slot) + try: + raw = self.accounts.read_private(path) + revision = hashlib.sha256(raw).hexdigest() + failed = (auth_failures or {}).get(slot, {}) + if slot != before["active_slot"] and failed.get("revision") == revision: + rows.append({"slot": slot, "observed_at": failed["observed_at"], + "status": "auth_required", "credential_revision": revision}) + continue + usage = read_usage(raw) + except HostError as error: + if error.code == "auth_required" and slot != before["active_slot"]: + try: + usage = self.refresh_inactive(slot, expected) + except (HostError, ValueError, OSError, subprocess.SubprocessError) as refresh_error: + auth_required = not isinstance(refresh_error, HostError) or refresh_error.code == "auth_required" + rows.append({"slot": slot, "observed_at": time.time(), + "status": "auth_required" if auth_required else "unavailable", + **({"credential_revision": revision} if auth_required else {})}) + continue + else: + rows.append({"slot": slot, "observed_at": time.time(), + "status": "auth_required" if error.code == "auth_required" else "unavailable"}) + continue + rows.append({"slot": slot, "observed_at": time.time(), "status": "ok", "usage": usage}) + after = self.status() + if after["selection_revision"] != expected: + raise HostError("selection_changed") + return {"observations": rows, "native": after} + + def refresh_inactive(self, slot: str, expected: str) -> dict: + # Never refresh a copy of the active account: its running native client + # owns refresh-token rotation. Distinct inactive accounts can refresh in + # isolation, serialized with the native launch/enrol/switch owner. + with self.manager.lock(): + status = self.status() + if status["selection_revision"] != expected or slot == status["active_slot"]: + raise HostError("selection_changed") + target = self.manager.slot(slot) + original = self.accounts.read_private(target) + active = self.accounts.read_private(self.manager.auth) + if self.accounts.identity(original) == self.accounts.identity(active): + raise HostError("duplicate_account") + self.accounts.private_dir(self.manager.root / "quota-probes") + with tempfile.TemporaryDirectory(dir=self.manager.root / "quota-probes") as temp: + home = Path(temp) + self.accounts.atomic(home / "auth.json", original) + self.accounts.atomic(home / "config.toml", b'cli_auth_credentials_store="file"\nforced_login_method="chatgpt"\n') + usage = app_server_usage(str(self.codex), self.apps.clean_env(dict(self.spec, home=home), self.home)) + refreshed = self.accounts.read_private(home / "auth.json") + if self.accounts.identity(original) != self.accounts.identity(refreshed): + raise HostError("auth_identity_changed") + if self.accounts.read_private(target) != original or self.revision() != expected: + raise HostError("selection_changed") + if refreshed != original: + self.accounts.atomic(target, refreshed) + if self.accounts.read_private(target) != refreshed: + raise HostError("readback_failed") + return usage + + +class NoRedirect(urllib.request.HTTPRedirectHandler): + def redirect_request(self, *_args, **_kwargs): + raise HostError("quota_unavailable") + + +def quota_fields(value: dict) -> dict: + """Allowlist transport fields before private persistence/TS invocation.""" + def limits(raw): + if not isinstance(raw, dict): + return None + result = {k: raw[k] for k in ("allowed", "limit_reached") if k in raw} + for key in ("primary", "secondary", "primary_window", "secondary_window"): + item = raw.get(key) + if isinstance(item, dict): + result[key] = {k: item[k] for k in ("usedPercent", "resetsAt", "used_percent", "reset_at") if k in item} + if isinstance(raw.get("credits"), dict): + result["credits"] = {k: raw["credits"][k] for k in + ("hasCredits", "has_credits", "balance", "unlimited") if k in raw["credits"]} + return result + + result = {k: limits(value[k]) for k in ("rateLimits", "rate_limit") if k in value} + if isinstance(value.get("rateLimitsByLimitId"), dict): + result["rateLimitsByLimitId"] = {"codex": limits(value["rateLimitsByLimitId"].get("codex"))} + if isinstance(value.get("credits"), dict): + result["credits"] = limits({"credits": value["credits"]})["credits"] + return result + + +def read_usage(raw: bytes) -> dict: + """Native Codex usage observation only. Never send prompts or model calls.""" + try: + data = json.loads(raw) + tokens = data["tokens"] + if data.get("auth_mode") not in (None, "chatgpt") or data.get("OPENAI_API_KEY"): + raise HostError("auth_required") + token, account_id = tokens["access_token"], tokens["account_id"] + if not isinstance(token, str) or not isinstance(account_id, str) or not token or not account_id: + raise HostError("auth_required") + request = urllib.request.Request("https://chatgpt.com/backend-api/wham/usage", headers={ + "Authorization": "Bearer " + token, "chatgpt-account-id": account_id, + "User-Agent": "codex-cli", "Accept": "application/json", + }) + with urllib.request.build_opener(NoRedirect()).open(request, timeout=10) as response: + encoded = response.read(131073) + if len(encoded) > 131072: + raise HostError("quota_unavailable") + value = json.loads(encoded) + if not isinstance(value, dict): + raise HostError("quota_unavailable") + # Discard account identity and unrelated product/organization metadata. + return quota_fields(value) + except urllib.error.HTTPError as error: + raise HostError("auth_required" if error.code in (401, 403) else "quota_unavailable") from None + except (KeyError, TypeError, ValueError, OSError): + raise HostError("quota_unavailable") from None + + +def app_server_usage(binary: str, env: dict) -> dict: + process = subprocess.Popen([binary, "app-server"], env=env, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) + selector = selectors.DefaultSelector() + assert process.stdout and process.stdin + selector.register(process.stdout, selectors.EVENT_READ) + pending = b"" + deadline = time.monotonic() + 25 + total = 0 + + def call(index, method, params): + nonlocal pending, total + process.stdin.write(json.dumps({"id": index, "method": method, "params": params}).encode() + b"\n") + process.stdin.flush() + while time.monotonic() < deadline: + if not selector.select(max(0, deadline - time.monotonic())): + break + chunk = os.read(process.stdout.fileno(), 65536) + total += len(chunk) + if not chunk or total > 1048576: + break + pending += chunk + while b"\n" in pending: + line, pending = pending.split(b"\n", 1) + packet = json.loads(line) + if packet.get("id") == index: + if "error" in packet: + raise HostError("auth_required") + return packet["result"] + raise HostError("quota_unavailable") + + try: + call(1, "initialize", {"clientInfo": {"name": "loopx_native_accounts", "version": "1"}}) + process.stdin.write(b'{"method":"initialized"}\n') + process.stdin.flush() + call(2, "account/read", {"refreshToken": True}) + return quota_fields(call(3, "account/rateLimits/read", {})) + finally: + selector.close() + process.stdin.close() + try: + process.wait(timeout=2) + except subprocess.TimeoutExpired: + process.terminate() # Only this disposable observer process. + try: + process.wait(timeout=2) + except subprocess.TimeoutExpired: + process.kill() + process.wait() + process.stdout.close() + + +def main() -> int: + try: + request = json.load(sys.stdin) + host = NativeHost(request["adapter"]) + operation = request["operation"] + if operation == "status": + value = host.status() + elif operation == "observe": + value = host.observe(request["slots"], request["expected_revision"], request.get("auth_failures")) + elif operation == "switch": + value = host.switch(request["slot"], request["expected_revision"], reopen=request["reopen"]) + elif operation in ("recover", "rollback"): + value = host.recover(operation == "rollback", request["expected_revision"]) + else: + raise HostError("unsupported_operation") + print(json.dumps({"ok": True, "result": value})) + return 0 + except Exception as error: # Native diagnostics can contain paths/identities. + print(json.dumps({"ok": False, "code": error.code if isinstance(error, HostError) else "native_unavailable"})) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy.ts b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy.ts new file mode 100644 index 0000000000..6c334bac9e --- /dev/null +++ b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy.ts @@ -0,0 +1,97 @@ +/** Native account availability and handoff policy. No credentials or effects here. + * These states belong to this optional provider, not the LoopX quota ledger. + */ +export type Availability = "available" | "exhausted" | "unknown" | "auth_required"; +export type Observation = { + slot: string; + observed_at: number; + status: "ok" | "auth_required" | "unavailable"; + usage?: Record; +}; +export type Account = { + slot: string; + availability: Availability; + observed_at: number; + reset_at: number | null; + primary_used: number | null; + secondary_used: number | null; + credits_available: boolean | null; +}; +export type Policy = { enabled: boolean; slots: string[]; cooldown_seconds: number }; + +const number = (v: unknown): v is number => typeof v === "number" && Number.isFinite(v); +const percent = (v: unknown): number | null => number(v) && v >= 0 && v <= 100 ? v : null; +const epoch = (v: unknown): number | null => number(v) && v > 0 ? v : null; + +export function account(observation: Observation, now: number): Account { + const result: Account = { slot: observation.slot, availability: "unknown", + observed_at: observation.observed_at, reset_at: null, primary_used: null, + secondary_used: null, credits_available: null }; + if (observation.status === "auth_required") return { ...result, availability: "auth_required" }; + if (!number(observation.observed_at) || now < observation.observed_at || now - observation.observed_at > 120) return result; + if (observation.status !== "ok" || !observation.usage) return result; + const usage = observation.usage; + // App Server's multi-bucket view wins. Review/other product buckets do not + // establish Codex availability. WHAM is the native read-only HTTP fallback. + const limits = usage.rateLimitsByLimitId != null ? usage.rateLimitsByLimitId.codex + : usage.rateLimits ?? usage.rate_limit; + if (!limits || typeof limits !== "object") return result; + const primary = limits.primary ?? limits.primary_window; + const secondary = limits.secondary ?? limits.secondary_window; + const windows = [primary, secondary].filter(v => v != null); + const values = windows.map(v => ({ used: percent(v.usedPercent ?? v.used_percent), + reset: epoch(v.resetsAt ?? v.reset_at) })); + result.primary_used = primary ? percent(primary.usedPercent ?? primary.used_percent) : null; + result.secondary_used = secondary ? percent(secondary.usedPercent ?? secondary.used_percent) : null; + const credits = limits.credits ?? usage.credits; + const balance = typeof credits?.balance === "string" && credits.balance.trim() !== "" + ? Number(credits.balance) : credits?.balance; + result.credits_available = credits?.unlimited === true || credits?.hasCredits === true + || credits?.has_credits === true || (number(balance) && balance > 0) ? true + : credits && (credits.hasCredits === false || credits.has_credits === false || balance === 0) ? false : null; + // A reset passing makes an old 100% sample unknown, never a new allowance. + if (values.some(v => v.used === null || (v.used === 100 && (v.reset === null || v.reset <= now)))) return result; + const blocked = values.filter(v => v.used === 100); + if (blocked.length) { + result.reset_at = Math.max(...blocked.map(v => v.reset!)); + // Subscription exhaustion alone does not prove a credit-funded account is + // unusable. This observer never buys credits or invokes a paid reset. + result.availability = result.credits_available === true ? "available" + : result.credits_available === false ? "exhausted" : "unknown"; + } else if (values.length && limits.allowed !== false && limits.limit_reached !== true) { + result.availability = "available"; + } + return result; +} + +export function decide(input: { + now: number; policy: Policy; active: string | null; observations: Observation[]; + last_switch_at: number | null; recovery_required: boolean; login_matches: boolean; + manual_slot?: string; +}) { + const accounts = input.observations.map(o => account(o, input.now)); + const output = (action: string, target: string | null = null, retry_at: number | null = null) => + ({ action, target, retry_at, accounts }); + if (input.recovery_required) return output("recovery_required"); + if (!input.login_matches || !input.active) return output("selection_changed"); + if (!input.manual_slot && !input.policy.enabled) return output("disabled"); + const current = accounts.find(a => a.slot === input.active); + if (!input.manual_slot && current?.availability !== "exhausted") { + return output(current?.availability === "available" ? "ready" + : current?.availability === "auth_required" ? "auth_required" : "quota_unknown", null, input.now + 60); + } + const cooldown = input.last_switch_at == null ? 0 : input.last_switch_at + input.policy.cooldown_seconds; + if (!input.manual_slot && cooldown > input.now) return output("cooldown", null, cooldown); + const allowed = input.policy.slots; + const index = allowed.indexOf(input.active); + const order = [...allowed.slice(index + 1), ...allowed.slice(0, index + 1)]; + const target = (input.manual_slot ? [input.manual_slot] : order).find(slot => + slot !== input.active && allowed.includes(slot) && (input.manual_slot + || accounts.some(a => a.slot === slot && a.availability === "available"))); + if (target) return output("switch", target); + const resets = accounts.filter(a => allowed.includes(a.slot) && a.availability === "exhausted") + .flatMap(a => a.reset_at && a.reset_at > input.now ? [a.reset_at] : []); + const uncertain = accounts.some(a => allowed.includes(a.slot) && a.availability === "unknown"); + return output(input.manual_slot ? "target_unavailable" : "all_unavailable", null, + Math.min(input.now + (uncertain ? 60 : 300), ...(resets.length ? resets : [Infinity]))); +} diff --git a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy_bridge.ts b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy_bridge.ts new file mode 100644 index 0000000000..6c5bdea9f1 --- /dev/null +++ b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy_bridge.ts @@ -0,0 +1,7 @@ +import { decide } from "./native_policy.ts"; +let raw = ""; +for await (const chunk of process.stdin) { + raw += chunk; + if (raw.length > 131072) throw Error("Policy request exceeds limit"); +} +process.stdout.write(JSON.stringify(decide(JSON.parse(raw)))); diff --git a/packages/loopx-codex-provider-routing/templates/codex-app-config.toml b/packages/loopx-codex-provider-routing/templates/codex-app-config.toml index a30ea10d97..467056d817 100644 --- a/packages/loopx-codex-provider-routing/templates/codex-app-config.toml +++ b/packages/loopx-codex-provider-routing/templates/codex-app-config.toml @@ -1,22 +1,6 @@ -# Public-safe field shape only. Replace placeholders in an operator-owned -# private config; this extension never writes a Codex home. -model = "gpt-5.6-sol" -model_provider = "local-cpa" -model_catalog_json = "" -service_tier = "default" - -[features] -# Keep the native feature available for hosts that can render it. The explicit -# fast/ catalog rows do not depend on the desktop Fast button. -fast_mode = true - -[model_providers.local-cpa] -name = "CPA · Codex A → B → text fallback" -base_url = "http://127.0.0.1:/v1" -wire_api = "responses" -requires_openai_auth = false -supports_websockets = false -request_max_retries = 30 -stream_max_retries = 30 -# The catalog compiler keeps ordinary rows on `default`; only generated Fast -# sibling rows carry `default_service_tier = "fast"`. +# Native OpenAI login. Retain the user's chosen model and unrelated settings. +# Account effects are separately enabled in LoopX; this template enables none. +model_provider = "openai" +cli_auth_credentials_store = "file" +forced_login_method = "chatgpt" +# No custom model catalog, proxy endpoint, profile override or model fallback. diff --git a/packages/loopx-codex-provider-routing/templates/legacy-cpa-config.toml b/packages/loopx-codex-provider-routing/templates/legacy-cpa-config.toml new file mode 100644 index 0000000000..05f5f3444a --- /dev/null +++ b/packages/loopx-codex-provider-routing/templates/legacy-cpa-config.toml @@ -0,0 +1,22 @@ +# Legacy CPA field shape only. Replace placeholders in an operator-owned +# private config; this extension never writes a Codex home. +model = "gpt-5.6-sol" +model_provider = "local-cpa" +model_catalog_json = "" +service_tier = "default" + +[features] +# Keep the native feature available for hosts that can render it. The explicit +# fast/ catalog rows do not depend on the desktop Fast button. +fast_mode = true + +[model_providers.local-cpa] +name = "CPA · Codex A → B → text fallback" +base_url = "http://127.0.0.1:/v1" +wire_api = "responses" +requires_openai_auth = false +supports_websockets = false +request_max_retries = 30 +stream_max_retries = 30 +# The catalog compiler keeps ordinary rows on `default`; only generated Fast +# sibling rows carry `default_service_tier = "fast"`. diff --git a/tests/presentation/test_codex_accounts.py b/tests/presentation/test_codex_accounts.py new file mode 100644 index 0000000000..8397b3ad8f --- /dev/null +++ b/tests/presentation/test_codex_accounts.py @@ -0,0 +1,277 @@ +"""Account handoff outcomes, using the shipped TS decision and private IO store. + +Synthetic native transport isolates model/network/auth effects. Installed native +transaction qualification is a separate opt-in drill, never a live-account test. +""" +import importlib +import json +import os +from pathlib import Path +import threading +from types import SimpleNamespace + +import pytest + +pytestmark = pytest.mark.skipif(os.name != "posix", reason="Native slot effects use the POSIX account owner") + + +@pytest.fixture +def native(monkeypatch): + monkeypatch.syspath_prepend(str(Path(__file__).resolve().parents[2] / "packages" / + "loopx-codex-provider-routing" / "src")) + module = importlib.import_module("loopx_codex_provider_routing.native") + monkeypatch.setattr(module, "discover", lambda: {"synthetic": True}) + return module + + +class Clock: + now = 1000 + + def __call__(self): + return self.now + + +class NativeTransport: + def __init__(self, clock): + self.clock = clock + self.active = "a" + self.revision = "initial" + self.calls = [] + self.busy = False + self.pending = False + self.bad_quota = False + self.committed_without_reply = False + self.entered = self.release = None + + def __call__(self, adapter, operation, **parameters): + from loopx_codex_provider_routing.native_host import HostError + + self.calls.append((operation, parameters)) + if operation == "status": + return {"slots": ["a", "b"], "active_slot": self.active, "selection_revision": self.revision, + "current_login_matches": True, "recovery_required": self.pending} + if operation == "observe": + if self.entered: + self.entered.set() + assert self.release.wait(10) + assert parameters["expected_revision"] == self.revision + return {"observations": [{"slot": slot, "status": "unavailable" if self.bad_quota else "ok", + "observed_at": self.clock(), "usage": { + "rate_limit": {"primary_window": {"used_percent": 100 if slot == "a" else 12, + "reset_at": 8000}}, + "credits": {"has_credits": False}, + }} for slot in parameters["slots"]]} + if operation == "switch": + if parameters["expected_revision"] != self.revision: + raise HostError("selection_changed") + if self.busy: + raise HostError("waiting_for_idle") + self.active, self.revision = parameters["slot"], "selected" + if self.committed_without_reply: + raise HostError("native_unavailable") + return self(adapter, "status") | {"launch_failed": False, "history_untouched": True} + if operation in ("recover", "rollback"): + assert parameters["expected_revision"] == self.revision + self.pending = False + return self(adapter, "status") + raise AssertionError(operation) + + +def configured(native, tmp_path): + clock = Clock() + transport = NativeTransport(clock) + provider = native.NativeAccounts(tmp_path, transport=transport, clock=clock) + provider.configure(expected_revision=0, enabled=True, slots=["a", "b"]) + return provider, transport, clock + + +def test_default_off_has_no_native_effect_or_startup_observer(native, tmp_path): + from loopx.presentation.codex_accounts_api import CodexAccountService + + assert not native.NativeAccounts(tmp_path).path.exists() + service = CodexAccountService(tmp_path) + assert service.watcher.thread is None + assert not native.NativeAccounts(tmp_path).root.exists() + service.close() + + +def test_exhaustion_selects_once_and_manual_retry_is_idempotent(native, tmp_path): + provider, transport, clock = configured(native, tmp_path) + result = provider.tick(manual_slot="b", expected_selection="initial", operation_id="once") + assert result["active_slot"] == "b" + assert result["action"] == "selected" + assert provider.tick(manual_slot="b", expected_selection="initial", operation_id="once")["active_slot"] == "b" + assert len([call for call in transport.calls if call[0] == "switch"]) == 1 + assert provider.path.stat().st_mode & 0o077 == 0 + assert "access_token" not in json.dumps(result) + clock.now += 301 + assert provider.tick()["action"] == "ready" + + +def test_unknown_quota_is_not_exhaustion(native, tmp_path): + provider, transport, _ = configured(native, tmp_path) + transport.bad_quota = True + assert provider.tick()["action"] == "quota_unknown" + assert not [call for call in transport.calls if call[0] == "switch"] + + +def test_busy_waits_then_switches_at_safe_boundary(native, tmp_path): + provider, transport, clock = configured(native, tmp_path) + transport.busy = True + result = provider.tick() + assert result["action"] == "waiting_for_idle" and result["active_slot"] == "a" + assert json.loads(provider.path.read_text())["intent"]["target"] == "b" + transport.busy = False + clock.now += 61 + result = provider.tick() + assert result["active_slot"] == "b" and result["action"] == "selected" + assert all(call[0] not in ("kill", "terminate") for call in transport.calls) + + +def test_manual_native_selection_wins_over_queued_automatic_choice(native, tmp_path): + provider, transport, clock = configured(native, tmp_path) + transport.busy = True + provider.tick() + transport.revision = "external-choice" + clock.now += 61 + before = len(transport.calls) + assert provider.tick()["action"] == "selection_changed" + assert all(call[0] != "switch" for call in transport.calls[before:]) + result = provider.tick(manual_slot="b", expected_selection="initial", operation_id="stale") + assert result["action"] == "selection_changed" + assert transport.active == "a" + + +def test_lost_reply_recovers_readback_without_replaying_switch(native, tmp_path): + provider, transport, clock = configured(native, tmp_path) + transport.committed_without_reply = True + assert provider.tick()["action"] == "unavailable" + restarted = native.NativeAccounts(tmp_path, transport=transport, clock=clock) + result = restarted.tick(refresh=True) + assert result["active_slot"] == "b" and result["action"] == "selected" + assert len([call for call in transport.calls if call[0] == "switch"]) == 1 + + +def test_recovery_stops_auto_and_preserves_revision_fence(native, tmp_path): + provider, transport, _ = configured(native, tmp_path) + transport.pending = True + assert provider.tick()["action"] == "recovery_required" + result = provider.recover(rollback=False, expected_revision=1, expected_selection="initial") + assert result["policy"]["enabled"] is False + assert not result["recovery_required"] + with pytest.raises(Exception, match="configuration_changed"): + provider.configure(expected_revision=1, enabled=True, slots=["a", "b"]) + + +def test_two_hosts_cannot_switch_concurrently(native, tmp_path): + provider, transport, clock = configured(native, tmp_path) + transport.entered, transport.release = threading.Event(), threading.Event() + outcome = [] + thread = threading.Thread(target=lambda: outcome.append(provider.tick())) + thread.start() + assert transport.entered.wait(5) + contender = native.NativeAccounts(tmp_path, transport=transport, clock=clock) + try: + with pytest.raises(BlockingIOError): + contender.tick() + finally: + transport.release.set() + thread.join(10) + assert outcome[0]["active_slot"] == "b" + assert len([call for call in transport.calls if call[0] == "switch"]) == 1 + + +def test_disable_and_stop_before_effect_preserve_login(native, tmp_path): + provider, transport, _ = configured(native, tmp_path) + provider.switch_allowed = lambda: False + provider.tick() + assert transport.active == "a" + provider.configure(expected_revision=1, enabled=False, slots=["a", "b"]) + before = len(transport.calls) + assert provider.tick()["action"] == "disabled" + assert len(transport.calls) == before + # Turning automatic effects off does not revoke an explicit manual choice. + result = provider.tick(manual_slot="b", expected_selection="initial", operation_id="manual-after-disable") + assert result["active_slot"] == "b" and result["policy"]["enabled"] is False + + +def test_first_explicit_check_does_not_enable_automatic_switches(native, tmp_path): + clock = Clock() + transport = NativeTransport(clock) + provider = native.NativeAccounts(tmp_path, transport=transport, clock=clock) + result = provider.tick(refresh=True) + assert result["policy"]["enabled"] is False and result["accounts"] + assert not [call for call in transport.calls if call[0] == "switch"] + + +def test_unknown_upstream_fields_do_not_reach_policy_or_persistence(native): + from loopx_codex_provider_routing.native_host import quota_fields + + result = quota_fields({"access_token": "synthetic-only", "email": "person@example.invalid", + "rate_limit": {"primary_window": {"used_percent": 10, "secret": "synthetic-only"}}, + "credits": {"has_credits": False, "refresh_token": "synthetic-only"}}) + assert "synthetic-only" not in json.dumps(result) + assert result["rate_limit"]["primary_window"]["used_percent"] == 10 + + +def test_rejected_inactive_login_is_not_repeatedly_refreshed(native, tmp_path, monkeypatch): + from loopx_codex_provider_routing import native_host as module + + active, inactive = tmp_path / "active", tmp_path / "inactive" + active.write_bytes(b"synthetic-active") + inactive.write_bytes(b"synthetic-expired") + adapter = module.NativeHost.__new__(module.NativeHost) + adapter.manager = SimpleNamespace(auth=active, slot=lambda _: inactive) + adapter.accounts = SimpleNamespace(read_private=lambda path: path.read_bytes()) + adapter.status = lambda: {"slots": ["a", "b"], "active_slot": "a", + "selection_revision": "stable", "recovery_required": False} + calls = [] + + def usage(raw): + if raw == b"synthetic-active": + return {} + raise module.HostError("auth_required") + + def refresh(*args): + calls.append(args) + raise module.HostError("auth_required") + + monkeypatch.setattr(module, "read_usage", usage) + adapter.refresh_inactive = refresh + result = adapter.observe(["a", "b"], "stable") + failed = result["observations"][1] + cached = {"b": {"revision": failed["credential_revision"], "observed_at": failed["observed_at"]}} + assert adapter.observe(["a", "b"], "stable", cached)["observations"][1] == failed + assert len(calls) == 1 + inactive.write_bytes(b"synthetic-replaced-login") + adapter.observe(["a", "b"], "stable", cached) + assert len(calls) == 2 + + +def test_source_pins_and_symlink_state_are_not_silently_adopted(native, tmp_path): + from loopx_codex_provider_routing.native_host import NativeHost, HostError + + (tmp_path / "personal_apps.py").write_text("# synthetic owner\n") + with pytest.raises(HostError, match="adapter_changed"): + NativeHost({"source": str(tmp_path), "pins": {"personal_apps.py": "bad"}, "codex": "unused"}) + provider = native.NativeAccounts(tmp_path) + provider.root.mkdir(parents=True) + provider.path.symlink_to(tmp_path / "personal_apps.py") + with pytest.raises(HostError, match="state_untrusted"): + provider._load() + + +def test_http_adapter_rejects_secret_and_arbitrary_command_fields(native, tmp_path): + from loopx.presentation.codex_accounts_api import CodexAccountsRequestMixin + + class Handler(CodexAccountsRequestMixin): + def _read_json(self): + return {"operation": "configure", "parameters": {"access_token": "synthetic-only"}} + + def _send_json(self, payload, *, status=200): + self.sent, self.code = payload, status + + handler = Handler() + handler._codex_accounts_write() + assert handler.code == 409 and handler.sent["code"] == "invalid_request" + assert "synthetic-only" not in json.dumps(handler.sent) From 5e3de537e7d5ad4dfe255c53253c829793b4e625 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 18 Oct 2026 14:01:47 +0800 Subject: [PATCH 2/7] fix(accounts): keep active account visible on narrow screens Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../src/features/personal-workspace/codex-account-settings.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx b/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx index f10d8af855..d780b74631 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx @@ -90,7 +90,7 @@ export function CodexAccountSettings() { const enabled = status?.policy?.enabled === true; const problem = status?.code || (status?.ok === false ? "native_unavailable" : null); return
-

{c.title}

{enabled ? c.enabled : c.disabled}
+

{c.title}

{status?.active_slot ? `${c.current} ${status.active_slot.toUpperCase()} · ` : ""}{enabled ? c.enabled : c.disabled}
{!status ?

{c.checking}

: null} {(problem && problem !== status?.action) || status?.available === false ?

{label(problem)}

: null} {status?.available && status.slots?.length ? <> From 4f82279e6cd2bb419e520bf71acb4401e85c9797 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 18 Oct 2026 14:06:55 +0800 Subject: [PATCH 3/7] docs(provider-routing): add packaged native account evidence Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../loopx-codex-provider-routing/NATIVE.md | 12 ++++++++++++ .../docs/assets/native-accounts-desktop.png | Bin 0 -> 116947 bytes .../docs/assets/native-accounts-phone.png | Bin 0 -> 46246 bytes 3 files changed, 12 insertions(+) create mode 100644 packages/loopx-codex-provider-routing/docs/assets/native-accounts-desktop.png create mode 100644 packages/loopx-codex-provider-routing/docs/assets/native-accounts-phone.png diff --git a/packages/loopx-codex-provider-routing/NATIVE.md b/packages/loopx-codex-provider-routing/NATIVE.md index 7f22d10da5..10ed70d246 100644 --- a/packages/loopx-codex-provider-routing/NATIVE.md +++ b/packages/loopx-codex-provider-routing/NATIVE.md @@ -134,3 +134,15 @@ recovery with synthetic credentials. Browser evidence must use the packaged page with the owning backend and a recovery case. Installed native file/process qualification uses a disposable home. Read-only live status certifies neither an actual account swap nor installed adoption or uninterrupted hot switching. + +## Packaged example + +The packaged settings page below uses synthetic account aliases and allowance, +with the actual native file/transaction owner in a disposable home. Usage/OAuth +responses are simulated; App reopening and a real-account cutover are not +qualified by these images. Desktop and narrow views keep the selected account +visible even when the account list continues below the viewport. + +![Packaged desktop account settings](docs/assets/native-accounts-desktop.png) + +[Narrow account settings](docs/assets/native-accounts-phone.png) diff --git a/packages/loopx-codex-provider-routing/docs/assets/native-accounts-desktop.png b/packages/loopx-codex-provider-routing/docs/assets/native-accounts-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..88a2415b9d49ba091f84fbdcaa58d0d3361c68a4 GIT binary patch literal 116947 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 n4`C806iNQdSojMqvKJhrx<#pU^7~Z4X literal 0 HcmV?d00001 diff --git a/packages/loopx-codex-provider-routing/docs/assets/native-accounts-phone.png b/packages/loopx-codex-provider-routing/docs/assets/native-accounts-phone.png new file mode 100644 index 0000000000000000000000000000000000000000..dfae218eae6e8916fe84016940a47d5fe546ba03 GIT binary patch literal 46246 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 Date: Sun, 18 Oct 2026 14:46:54 +0800 Subject: [PATCH 4/7] feat(accounts): restart native clients during quota handoff Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../codex-account-settings.tsx | 32 ++- loopx/presentation/codex_accounts_api.py | 7 +- .../loopx-codex-provider-routing/NATIVE.md | 54 +++- .../docs/assets/native-accounts-desktop.png | Bin 116947 -> 107637 bytes .../docs/assets/native-accounts-phone.png | Bin 46246 -> 48564 bytes .../smoke/native-policy.test.mjs | 11 + .../loopx_codex_provider_routing/native.py | 150 +++++++++-- .../native_host.py | 118 ++++++++- .../native_policy.ts | 8 +- tests/presentation/test_codex_accounts.py | 241 ++++++++++++++++++ 10 files changed, 567 insertions(+), 54 deletions(-) diff --git a/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx b/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx index d780b74631..743b781f6a 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/codex-account-settings.tsx @@ -8,7 +8,7 @@ type AccountStatus = { ok: boolean; available: boolean; code?: string | null; revision?: number; active_slot?: string | null; selection_revision?: string; action?: string; target?: string | null; recovery_required?: boolean; launch_failed?: boolean; - policy?: { enabled: boolean; slots: string[]; cooldown_seconds: number }; + policy?: { enabled: boolean; slots: string[]; cooldown_seconds: number; restart_clients?: boolean }; slots?: string[]; last_checked_at?: number | null; last_switch_at?: number | null; accounts?: Array<{ slot: string; availability: string; observed_at: number; primary_used: number | null; secondary_used: number | null; reset_at: number | null; @@ -19,7 +19,13 @@ const copy = { "zh-CN": { title: "Codex 原生账号", enabled: "自动接续已启用", disabled: "自动接续已关闭", enable: "额度耗尽后自动切换", refresh: "检查额度", retry: "重新连接", - effect: "仅使用下方已登记账号。额度耗尽后等待 Codex 客户端关闭,保存登录态并切换,再打开原来的 GPT 界面。", + effect: "仅使用下方已登记账号。额度耗尽后正常退出 GPT 专用客户端,保存登录态并切换,再重新打开原来的界面。", + effectWait: "仅使用下方已登记账号。额度耗尽后等待客户端关闭,再保存登录态、切换账号并重新打开。", + restart: "允许自动退出并重开 GPT 客户端", restarting: "正在退出 GPT、切换账号并重新打开", + reopen: "重新打开 GPT", other_clients_busy: "还有其他进程占用 GPT 登录;关闭占用后检查额度重试", + client_quit_refused: "GPT 未接受正常退出;本次未换号,自动尝试已暂停", client_quit_timeout: "GPT 尚未退出;本次未换号,自动尝试已暂停", + client_changed: "GPT 进程已变化;已暂停本次切换", handoff_pending: "独立切换进程正在完成接续,请稍候", + handoff_interrupted: "接续进程中断;请检查并恢复本次切换", quota_stale: "额度记录已过期,正在重新检查", current: "当前", next: "下一账号", slot: "账号", primary: "短周期剩余", secondary: "长周期剩余", unread: "未读取", select: "切换到此账号", checking: "正在检查额度", ready: "当前账号可用", selected: "账号已切换", waiting_for_idle: "已选好候选账号,等待 Codex 客户端关闭", selection_changed: "账号选择已变化,已暂停本次切换", @@ -28,7 +34,7 @@ const copy = { recovery_required: "上次切换未完成,需要恢复", unavailable: "原生账号暂不可用", adapter_changed: "槽位管理器已更新,请重新连接", recover: "恢复未完成的切换", rollback: "撤销最近一次切换", available: "可用", exhausted: "额度已用完", unknown: "额度未知", credits: "另有可用额度", help: "运行与恢复说明", last: "上次检查", - detail: "检测不会调用模型、购买额度或使用重置券。401 登录失效先由原生客户端刷新;其他账号可通过官方 CLI 单独刷新。查询失败不会被判为额度耗尽。切换保留模型设置和会话历史,不重放已提交工作。自动观察随 LoopX 服务运行;原生客户端占用时不会强退。", + detail: "检测不会调用模型、购买额度或使用重置券。401 登录失效先由原生客户端刷新;其他账号可通过官方 CLI 单独刷新。查询失败不会被判为额度耗尽。自动退出仅针对 GPT 专用实例,拒绝退出或其他 CLI/文件占用会暂停尝试,不强杀进程。独立进程完成切换和重开,即使发起切换的 Codex 已退出。切换保留模型设置和会话历史,不重放已提交工作。自动观察随 LoopX 服务运行。", extension_uninstalled: "尚未安装 Codex 账号扩展。安装 loopx-codex-provider-routing 后重新启动 LoopX 服务。", adapter_unavailable: "未发现已安装的 Personal Apps 槽位管理器和 Codex CLI。", native_unavailable: "无法连接原生槽位管理器,请检查本机安装后重试。", @@ -38,7 +44,13 @@ const copy = { en: { title: "Native Codex accounts", enabled: "Automatic handoff enabled", disabled: "Automatic handoff off", enable: "Switch automatically when quota runs out", refresh: "Check quota", retry: "Reconnect", - effect: "Use only the registered accounts below. After exhaustion, wait for Codex clients to close, save the login, switch accounts, then reopen the same GPT interface.", + effect: "Use only the registered accounts below. After exhaustion, quit the dedicated GPT client normally, save the login, switch accounts, then reopen the same interface.", + effectWait: "Use only the registered accounts below. After exhaustion, wait for clients to close, save the login, switch accounts, then reopen the same interface.", + restart: "Allow automatic GPT client quit and restart", restarting: "Quitting GPT, switching accounts and reopening", + reopen: "Reopen GPT", other_clients_busy: "Another process still owns the GPT login; close it and check quota to retry", + client_quit_refused: "GPT refused normal quit; no account changed and automatic retries are paused", client_quit_timeout: "GPT has not exited; no account changed and automatic retries are paused", + client_changed: "The GPT process changed; this switch was paused", handoff_pending: "The independent handoff is still finishing; please wait", + handoff_interrupted: "The handoff process stopped; inspect and recover this switch", quota_stale: "Quota observations expired; checking again", current: "Current", next: "Next account", slot: "Account", primary: "Short window left", secondary: "Long window left", unread: "Not read", select: "Switch to this account", checking: "Checking quota", ready: "Current account is available", selected: "Account switched", waiting_for_idle: "Candidate selected; waiting for Codex clients to close", selection_changed: "Account selection changed; this switch was paused", @@ -47,7 +59,7 @@ const copy = { recovery_required: "An interrupted switch needs recovery", unavailable: "Native accounts unavailable", adapter_changed: "The slot manager changed; reconnect to it", recover: "Recover interrupted switch", rollback: "Undo last switch", available: "Available", exhausted: "Quota exhausted", unknown: "Quota unknown", credits: "Additional allowance available", help: "Operation and recovery", last: "Last checked", - detail: "Checks do not call a model, buy credits or use reset coupons. Native Codex refreshes an expired active login; other accounts can refresh separately through the official CLI. A failed check never means exhausted quota. Switching preserves model settings and history and never replays submitted work. Observation runs with the LoopX service and never force-quits an occupied client.", + detail: "Checks do not call a model, buy credits or use reset coupons. Native Codex refreshes an expired active login; other accounts can refresh separately through the official CLI. A failed check never means exhausted quota. Normal quit targets only the dedicated GPT instance. A refused quit or another CLI/file owner pauses attempts; processes are never force-killed. An independent process completes switching and reopening even when the calling Codex exits. Model settings and history stay intact; submitted work is never replayed. Observation runs with the LoopX service.", extension_uninstalled: "Install the optional loopx-codex-provider-routing package, then restart the LoopX service.", adapter_unavailable: "The installed Personal Apps slot manager and Codex CLI were not found.", native_unavailable: "Cannot connect to the native slot manager. Check the local installation and retry.", @@ -88,16 +100,20 @@ export function CodexAccountSettings() { finally { setBusy(false); } } const enabled = status?.policy?.enabled === true; + const restartClients = status?.policy?.restart_clients === true; const problem = status?.code || (status?.ok === false ? "native_unavailable" : null); return

{c.title}

{status?.active_slot ? `${c.current} ${status.active_slot.toUpperCase()} · ` : ""}{enabled ? c.enabled : c.disabled}
{!status ?

{c.checking}

: null} {(problem && problem !== status?.action) || status?.available === false ?

{label(problem)}

: null} {status?.available && status.slots?.length ? <> -

{c.effect}

+

{restartClients ? c.effect : c.effectWait}

+
{status.action === "ready" || status.action === "selected" ? : } @@ -123,7 +139,8 @@ export function CodexAccountSettings() { ; })}
- {status.launch_failed ?

{c.launchFailed}

: null} + {status.launch_failed ? <>

{c.launchFailed}

: null}
{status.last_checked_at ? {c.last} {new Date(status.last_checked_at * 1000).toLocaleTimeString(locale)} : null} @@ -138,6 +155,7 @@ export function CodexAccountSettings() { {error ?

{c.failure}

: null} {status?.code === "adapter_changed" || error ? : null}
; } diff --git a/loopx/presentation/codex_accounts_api.py b/loopx/presentation/codex_accounts_api.py index 2d55f0eb89..3d1a5f12bc 100644 --- a/loopx/presentation/codex_accounts_api.py +++ b/loopx/presentation/codex_accounts_api.py @@ -60,6 +60,8 @@ def call(self, operation: str, parameters: dict[str, Any]) -> dict[str, Any]: value = self.provider.tick(refresh=True, **parameters) elif operation in ("recover", "rollback"): value = self.provider.recover(rollback=operation == "rollback", **parameters) + elif operation == "reopen": + value = self.provider.reopen(**parameters) else: raise ValueError("Unsupported operation") return {"ok": True, **value} @@ -97,9 +99,10 @@ def _codex_accounts_write(self) -> None: if set(body) != {"operation", "parameters"} or not isinstance(body["parameters"], dict): raise ValueError("Invalid account operation") operation, parameters = body["operation"], body["parameters"] - fields = {"configure": {"expected_revision", "enabled", "slots", "reconnect"}, + fields = {"configure": {"expected_revision", "enabled", "slots", "reconnect", "restart_clients"}, "switch": {"manual_slot", "expected_selection", "operation_id"}, - "recover": {"expected_revision", "expected_selection"}, "rollback": {"expected_revision", "expected_selection"}, "refresh": set()} + "recover": {"expected_revision", "expected_selection"}, "rollback": {"expected_revision", "expected_selection"}, + "reopen": {"expected_selection"}, "refresh": set()} if operation not in fields or set(parameters) - fields[operation]: raise ValueError("Invalid account parameters") result = self.server.codex_account_service.call(operation, parameters) diff --git a/packages/loopx-codex-provider-routing/NATIVE.md b/packages/loopx-codex-provider-routing/NATIVE.md index 10ed70d246..62c530dcfd 100644 --- a/packages/loopx-codex-provider-routing/NATIVE.md +++ b/packages/loopx-codex-provider-routing/NATIVE.md @@ -8,14 +8,22 @@ private file/process owners; `native_policy.ts` owns availability and selection. ## The user task Previously an exhausted account required finding another account, closing clients, -selecting it by hand and reopening the GPT interface. After one opt-in in +selecting it by hand and reopening the GPT interface. In **Settings → Model provider → Native Codex accounts**, LoopX checks allowance and -selects/reopens when the native owner admits it. The page reads back accounts, +selects/reopens when the native owner admits it. Enable automatic handoff and +**Allow automatic GPT client quit and restart** for the complete automatic path. +The page reads back accounts, windows, waiting cause and recovery. Tokens and identity claims stay private. -**An open native Codex client is an occupied owner, even between turns.** This -release waits for it to close. It does not implement hot login replacement, -force termination, job replay or resumption of an interrupted turn. If every +**An open native Codex client is an occupied owner, even between turns.** With +restart permission, the provider requests a normal AppKit quit of only the +inspected GPT instance, waits for exit and native idle, saves/switches the login, +then reopens that same route. It never addresses a shared bundle id or quits a +different route. A refused quit, timeout, new process owner or remaining CLI/file +owner leaves credentials unchanged and pauses automatic retries until a check. +Without this additional permission it continues to wait for closed clients. +It does not implement hot login replacement, force termination, job replay or +resumption of an interrupted turn. If every account is unavailable, it waits for the observed reset and checks again. ## Prerequisites and activation @@ -37,6 +45,9 @@ TypeScript selector. Enrol accounts through the native owner's official login. Click **Switch automatically when quota runs out** to authorize the listed slots as destinations. Installation alone grants no account effect. The App observer runs with its serving LoopX process and rehydrates the saved opt-in on restart. +Client restart is a separate permission, off by default and absent from older +policies. Enabling it also permits a subsequent explicit manual switch to quit +and reopen the GPT instance. Neither permission is enabled by installation. An operator-owned service independent of the App can run the same observer: ```sh @@ -50,7 +61,7 @@ revisions from `status`: ```sh loopx-codex-accounts configure <<'JSON' -{"expected_revision":0,"enabled":true,"slots":["a","b"]} +{"expected_revision":0,"enabled":true,"restart_clients":true,"slots":["a","b"]} JSON loopx-codex-accounts refresh ``` @@ -60,6 +71,8 @@ Explicit `switch` accepts `manual_slot`, `expected_selection` and a unique require `expected_revision` and `expected_selection`. App buttons use the same fences. `--runtime-root` selects a custom private runtime; browser requests cannot supply paths, executables or source files. +`reopen` accepts `expected_selection` and retries only opening a committed +selection. It never repeats the credential switch. Explicit checking or selection can connect the registered slots with automatic effects still off. A manual choice may select an exhausted/expired account for native sign-in or inspection; this never qualifies it for automatic selection. @@ -89,7 +102,8 @@ are distinct. The observer never buys credits or uses reset coupons. Only fresh active-account exhaustion starts automatic selection. Destinations must be allowlisted and freshly available. Selection follows the configured ring with a five-minute cooldown. An external native/manual choice wins and -starts a cooldown. Busy clients defer; other repeated failures stop after three +starts a cooldown. Busy clients defer; refused/changed clients and remaining +file owners pause further shutdowns. Other repeated failures stop after three attempts until an explicit check/reconnect. Resets require new observations. All-unavailable accounts are checked again at the next reset or within five minutes; unknown observations retry within one minute. These are bounded usage @@ -97,13 +111,24 @@ reads, not model probes. The managed extension's enable/disable controls its permissionless qualification protocol; the native host has this separate explicit opt-in and stop lifecycle. -An intent is durable before the effect. The native owner checks idle and the +An intent is durable before the effect. A restart-authorized switch runs in a +separate POSIX session and writes a private completion receipt, so quitting the +calling Codex App does not kill the switch/restart or its result channel. A +restarted observer waits for that receipt instead of dispatching another switch. +An interrupted worker remains visible and recoverable; an unresolved live +worker cannot be overwritten by reconfiguration or recovery. If shutdown succeeds +but switching fails, the unchanged source App is reopened when native preflight +allows it. An incomplete native journal stays closed for recovery. + +The native owner checks idle and the selection revision under its own locks and immediately before writes, saves outgoing token rotations, commits and reads back. A lost reply reconciles selection without replaying a switch. Interrupted native journals require existing recovery, which refuses to overwrite later edits. Model settings and history stay outside the transaction. Reopening failure is reported after committed selection, without switching again. +The same checks reject expired automatic quota evidence before shutting down or +writing credentials. A manual/native choice during exit or launch wins. ## Disable, upgrade and rollback @@ -111,6 +136,8 @@ Turn the switch off to stop automatic effects. CLI `configure` with `enabled:false` also works offline. Stop a separate `watch` process through its service manager. Stop/restart the serving process before uninstalling loaded code. Uninstall leaves Core and native slots intact. +An already dispatched credential transaction finishes and reopens safely even +when the observer is stopped; disabling never discards that pending intent. Activation pins the two installed native source files. Updates produce `adapter_changed`; **Reconnect** reads and pins the installation again. An old @@ -132,15 +159,18 @@ Tests challenge exhausted/unknown/credit-funded facts, allowlists, manual fences duplicates, concurrency, busy deferral, lost replies, stop-before-effect and recovery with synthetic credentials. Browser evidence must use the packaged page with the owning backend and a recovery case. Installed native file/process -qualification uses a disposable home. Read-only live status certifies neither +qualification uses a disposable home and a signed disposable Cocoa App: actual +AppKit normal quit, refusal, native idle/save/switch, source reopen on failure, +restart failure recovery and a detached worker surviving its owned caller exit. +Quota and authentication transport remain synthetic. Read-only live status certifies neither an actual account swap nor installed adoption or uninterrupted hot switching. ## Packaged example The packaged settings page below uses synthetic account aliases and allowance, -with the actual native file/transaction owner in a disposable home. Usage/OAuth -responses are simulated; App reopening and a real-account cutover are not -qualified by these images. Desktop and narrow views keep the selected account +with the actual native file/transaction owner and a disposable Cocoa App. +Usage/OAuth responses are simulated; a real-account cutover is not qualified by +these images. Desktop and narrow views keep the selected account visible even when the account list continues below the viewport. ![Packaged desktop account settings](docs/assets/native-accounts-desktop.png) diff --git a/packages/loopx-codex-provider-routing/docs/assets/native-accounts-desktop.png b/packages/loopx-codex-provider-routing/docs/assets/native-accounts-desktop.png index 88a2415b9d49ba091f84fbdcaa58d0d3361c68a4..73f9d4dff13e16d7418341481ebc66b72046ac48 100644 GIT binary patch literal 107637 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 n4`C806iNQdSojMqvKJhrx<#pU^7~Z4X diff --git a/packages/loopx-codex-provider-routing/docs/assets/native-accounts-phone.png b/packages/loopx-codex-provider-routing/docs/assets/native-accounts-phone.png index dfae218eae6e8916fe84016940a47d5fe546ba03..195cc44ae591a27a1d34c299a5dceb30d407ddb1 100644 GIT binary patch literal 48564 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 literal 46246 zcmc$FWl+>%xUV8eN_Q_TA>AF)ENK$bjYuus2vRG(bW4aLl7e)1ODNslDINFa%$!g6 z&bc!;zc{$S^4~X}=T{HnxrWjcEJ~~g4<0;$Da*fn@Ze#{g9ne)Fi^lN zIl1RX4<2}=C&WmqK9a!?p_6+yCXka8+>!8Z3~DO%9GghcI)zofu5T5?lrXvvar*9t z;ICU?Bu0VV4^(ynDsP$6$o*LovKZnN6SquX_la4GFiuGL*Uz(uGb%OKV;UNfJ(|ob z0V!JJCKUx+XPiHL4NQE}Y$gm;FZ32`y!5q&+K&ffN_>k$eU^_C);*T=vSxEtVAu2- zLZQ`C?TO2m|Mr)P+_pzP-Kw|lQEMl>|76jt-`mPLv$&pd{&`-H z^3#|QmG;k2W4W zz<&UfmwD}xzSH1ZPx9yNPTEB{(B-2t2CG4!3nSsDPZMD|A2z1#J03j3SCB^|&XbdW z`}VDhY;B#m|IpBneQ&>Gsr9)&Nyk_M!y)NGv%ySBZ=2n5!}q(Q&V+{b9>WB(VaE9L z;NNC?7@;gG1`LVM@JtyQg#S<$2@S%)M?xX;A7Y@G5R@P&41<6k3X=_c0Qo=tqbO`J zrD$47&m(h>i(qUrx812q^B&|!bUZQblmvF|z1g~?;HJA<@1vETubNqILHOD!L4$8X zZuLJud&nZ&c(FzWUD*7ZrIEn)C(Hj<)OG7M@m4#6s4I#_-2c|6H3+j%t7xj?-76bh z8ZqM7PuT@&4vjUQ$7>w6bM>CXISRaE94~U@!Pj;v4QKoF((nKN7?Qf$IX_%>-=8yR z@cMV4t{6eiYt|V-KEON|1nZW%;k3Lu7eI)9q#7u|0U4pylPFoXK!9?vYe& zB)^r0Cem^s)%E%u9^^2Zul|0#*dp5Z>hxdL%x9TLsMx-0nG&90b=us0x5f(cU~!kz zWU~6mLRQ!Y0oRDd1_8ZfhM23Y%*%YW9&J>Np^ehMkSA2EJ;}U`8j)`lRSuGMT=!-~ zOM+1`3G>v`NK3HLyHxC*57|z3CgU!LB+vBE=kTaSc;HLzdiFJ6JPwz-8M;2~IdYM( zy*}82s>FAbBAHaR%1k@JV$fU7K?X9!-FGI+Hr^$2=u$)Ef7HB1u51ol$lJABZ;zL_ z&&=&r^S(wQD?y2Uox*2Pf9r6v_2)g5|@wr37S{EMYW@OpE13 zx<4P^lt1UCULkz4J6Hza<95yG(gU3ny7gCOSh?N(ulZ4Ed!)zatk z2qG56?>1xKWcr{9Y}&=tjf)xXbGlzOXh{98cB|eLYKbPHd9p9HgB|@zb|kOxiTJ5O ztpGA;`{Z=mL63$y=W4%czKH}fr!G7j#740CMKuZ6;QgQP35-EuF(QdjeT4g*r`6r< zjpxxy$}Zu{0E~^jy8X_guxx_#aBV}+;BR(g-(L7gI;|*!eL35m7JfGZZ4WF7#v*CO z#G1#SEPob_w(exIubwIZar`OAsr4f{VL9KTH@+tk6SGYinx&9;3Qn;7Of^C95gRtd zRCC4~c24HQ3`0VDD^cYKztF3HHA%;ww4=4Qk`j%BR-23?4HVEaHdTO_p~g!kh^5 zFUHH2j+Bnqht}iaiLEbm(@))VgS1S=a+vOI0$>(M^py=zXgTgBtMn%-X{eQ2v z{}&xY`>ceiBeG}mr`1rp=1 zj$Q`kN@-)lA*WfrooRhABaRjmFCqZKmZJ`ZF$^{@OZi?_Fb3hhMm&=`{l^4e5`ixT zG0KxeNzIIOH|+?lSh=6(KpEO%pa>DLi1%MUUtsqop%_Pj#nEj0O_|bm$eWEnLJK>Wzr=RT8iUz}j=)jxV-_ zR@qLL8@Hfb=YtNcht@t=qsW>BE%qPzswr*RpNvDnN6hxx8niHe%l`AVG>6{!r*fv& z7e}icJ~#iy<5)EFnFB|1mGH_nTs%lO3PDq=3Rd0w;=278?Ar{$5imzGZo_&2J5prp z$x#@H4?4(1jHq&=rmyO@x z1M7;GS;aA{AHe54*J+x_%OVELF$=}q_iPJzv7X+SLF;T#-BG_9`lh!BJVIYG%+3z_ zQscZ%E3m=BLf)-PD2&>Tf5AxF8A;W}QlnRrCEiG9VgX>pM5)Q2?{DPzHdd-dQBCD} zF<#wXUu-s%O(uQ$b`KHw2S>s^EaEUHGO%cG zYn+%CvsV+ogSJ;xyPBwXphd0y-Z~pBYqhA)?nD`5g4IB3u=w$$Rn{Uk1jafAfCv85 z93g1W`;{&_f2f~4E9@N{nwO=SdEIp8SE@A1SkKlK`A_Qlplu$Y2hiu&*uTr$OMy?h zh#uiIjDgMkHz;8GmmOn)`O=#oI=t&|0d^jj_FxFo@W4MuGuM1hU3pNA+0>oE!&-p8=+J@TSC& z2J;yLqu@Df#p774ck}wRuf%W(>9A%^QYJ>>X1u0yq`0&a8`Vx`$k(8Avi|F~a}-SN zt|58{;KBq}ioZ+oQzR6ABRA&OMdSXPAAr~!04@l>$L!{(d$2jL_2WsM)Ay;x=~^@* zJz+8Q5Bu`clP9)DzF-S(Hh2iX8_j1rCR{aC#v!0v^j{<**t^j7-1nCByB5hJ9Tl}t zoxIprH8}8{^S|>w!Eoqn45^4di{~+s-GBFh`%{GwCdqE4yujcu`OlC#+^?R;q!^?s z12s)Ir+OMZpz^-Qc}K9`#H9%8XO`z01xqnRIOv3DbicX=D$B#Jlm;5~y5yyD{l}`n z?Epg0X>i0+)Z&7L9%C|>%PxA${M%U6h~W7WTqp>@{a}0vhYlpG0&#tFxm}`moy4Kb zH&Y2=SSALD^kuQWC~6q}a4%;GrP+LKi-1H(Q(VqMM2nFw5Sz1jiQ}gA;7B{H!Id zugYjCopNRz$VnwtO73!4|{*A2JJyEr)LtsT)+wRtn$LnJP;_E;kMqX}+} z0Zr+fcqY}vPbBQ+Y_Iaw07C6t;i+e(`@nFyOdNygqV>iZhAi)8&=7`{#b&i)T%GQQ zbMm%%^nBbLD~J<)6%;2IdOP$(T07*O(i%kx5p1d43;DXaqbAjH5#M#6eUQJ`v`@`P zBbleAu0?+NB*2TS--zdgAi#`T?Z(t|11+%&wWy&X9TNXAZulP(DgP=Ik8Vw%CcJ{* z`_$IEH29(CP^M%BBAaJg<)}4F(N+Izs;JqTZt3e8S85NhT<11pFJgvgTHWpSh}Zgy z4Y8SX-lOWmvAiaZ49^+jT3KjHKwFu4ACd^V1Ap|Mow78`;R-i=2D46Qurc_1Q_r{Cg`WW~xwI?=O8cPw;8+}7r?wt)&hN_3tMQD4 z%G9(YF{RbGdSmkE*D5yv)cU<*>ho~10$GjYSrq^?t4SjNvi^(S%Hw?Ed3-JdL*OHe zK9444!cELUGBbsR>VkN)-aOh;11Efa)YHJrg~}IkkW_>5BE2MAl*cDoch~3_S5>M= zX&5!t#_L<JAtBI#&R8pcZE&fouM>H&$;+2XBv+0DdV=car zI-7B}7T_Xe2xhw&@5Hoza#rPYaRhphWY*loM+c{I1NX)0C3d*dPRo~Mnc;MH#!~|U zR5eMlVT8$>^Erx|nkhAzql6lN3Ex&lS*-0}%6~{~_AH2!knIia=-Fo8OhK!L?c3Ga zF_JuM?KCd7>2Ih><t7YTA>3irZq7}NTiNm?l|;T^kW1YNHFpgXQr%b{z9 zH%zUl#`Dw#eEi5bkTOE=?gD7u&MZm=04P6|9?KD9;aOjwA6CF3dQip#I(0ETZ&y28 z%BN7RPZQvQ979Z_ZQ8Pc49b#9RQn2P4jmAswI4Lm5Tg&xUa9=>0#HK4{_R$(760-} zq+@-dR>26=tI2(=JJv%D&JJ@q2TDS=O0}{46pqn3jZkxlM6rqndMFwlma8%QkdlHF zfM;^7R)!VA-k*GazYcSv0L`*I#Z0HthGg->vX@?z_?t!l(cq*N({l#i3(%<-+$2wa z%T>Qdb%~a`WUXN_ZL4;QzEcSDc&1OfpHwJ>M^eRwJg>qZmt1UOduA0y)<}J-?4AB$ zmoGuw6@pYZ_aJtKh+9Xed&)8GaUp}=FI!MN2?=MF6O!<`)AmNg z+Z*{T^HDj2@79B{Y5DQ)+|hp1oyOw;jNv9xSy;8zv9EO;s1BI98!k#-E^UNX$O_Yr zPd~Y$#J^5_)udxi-WWk$7qWxdcDxPrwCVIrp2|_cPR{_!!;F_vc%$_ofDvxpCv>$|-9+0g__IJOKRu<=Pft9GBp$J`~v1w z{q3iJaq>UcNN=@eT7)o5nRVhY<8~+f^1pnCbnEw2(9J@P`RD(-&D)OT?YkxnC8V-M zsDnZxB}~@6JLE0q9_{G$DfMoSLU^*qFQ;@F%0t?VFGLJ2fDjzg;qlT;?cRMMu~AO! zttrMFW^}N8BGCkUF&(Lvj%H86XMT{W$iA^ubR@o*=e?vA{hVQmJMd|K4BRcO)s}Y5 z8$+DB9N8Q*?#jc;`v?j9bLK!b4bCP!)Su8&0T&j-XD=< z;}rJ!2bP2B7u}4}$&X!kCWfcchL?Z_BAG3qEDB*qeZG=*P&6^)y(>y&#cWlvP^H19 z!>Zz98BK7WW%JK1G&C7dPWW;sZ_9kG>wD@i1dNIcCA^R@mSEZJDNqQHgs1_bL$LTG zmK8tqUTYl9M=>G#A$*eMC4+xLKH}u|II=u^3ENe9c>LZ0gD29GtvX<-sX2 z>HlVPu0h;haQW}Jk^g|Ur9rLhc4tvbhnqZ4*fL%G_08G*>4{Z5{{FSuP`1gTh(#F6 zma(Q8)$LazAVLPqdO~Pl1$fBK4ar}pO$==~1|GP#HjpbCpLP^11|Dvnp&pj%=+%3` zXXw0zjr%`a-x+d0U89S4RN5hf{<_v&E3Nt1m&AQ`*Emn>dxXt!B;UwA_s3I1q5byV zKM&y}JWBZ)r=Iz0-BQaw_$|>d@`YyE8Q#aq=Ulh4E?edP>kv~#B((Tp?Cs7e-D7Qc zK*yuD1sV=JsZbZ@N<4d$xcwVC`yR^N|IEXryfU*c|MNP6_of3|UcW2YtB+7 z9FLh$ed(iw0YUlr-)rq*{3qoQ0ww~A5Gbsj0tvnUvh&};$tgfWGz8+`wTia%1qoR+ zeuQQ#h!8ZezA;3G@s~>6^n_wS00X-fRyV3`WR#zY6?pfu0C~_%4s=}7Vdl%pqA*o* zLcnwVPIo2&AJ=z*w?`^TkfrDLojYLPe3l2IKXLW{vi=|IIN#_Sg)fWx(F0IGco6>5 z6tDA|nuBgY+W!xu;lB{0{=?}|-q0rnC{)t-(&YxYLDkE+C5{06HC-R6=BuR``dwHw z0@nnbv?z`Wz>Xe&7_fkT_j%uSUyBF|Vf%C<2obYdGaEI;w8cUNnI$~$ z;|x>{j?eTy_LJqSK;}Nv_SpQA)V~B2H3`RsXQZclv#OQkQxdLQ#97w(tu8>Pzy-j$ zhSip7B3cDD_#gf$z`*ugXK8{yGPcq}vrfTaS8#2>c`-zzuLqt(9kYIk$Mp`*k_ zL}lBfL^dAi@XroidEH)n-f0&alV*uJTe5qu#42t5EmDma_Ph3w_zWbYnAW)l?-HG| z9P8m6V1v}*JT1^JnVYJ7FNXz`x(slB0VtKeIT;1wnd7Yt5O_@B+niN1eD6l`$ZZ;r zdf7ideq#D?AL;DAlnS&8s^PNJVX2@@2x`(PSXeG#9o%dGen7vG{Y5F^aR8n)*R~XN z@HH{t%gwJqRkA`YU(S;D_xou%K#u8mcjMkzE-KtXz(B|lmj}MRKT*~OckO~7i-V3? zvt3-*e*{PrqvB_A^VIWCLxCry2kk_f$(vtQ5_+e~935_IU6l!oWdMdb7XyMH6tOto z*ompUh?SHL_}aSko#*voR|ZwI_g+mGsiF6-Ahf`wEd=O}vdC)evpMgQqF(Sc-C96W z3D-c9a_D?WFEf@R;H~s!N_5xH>TXOO=a83|XNIv30*_#y-otwmwCz^pGbfRIU}j+7fa?`{4}f& zlpNjCgHoU@0y)ge1n9Lu0Bwit{?3-;NMpe0I9wSl*8SP3a=ul~uv#7P)%S@mm2@Ms zn}RJOtskw17Af_s9^4+#kgvwww*N*BS!H?x(Tyg$BS5pQ=iV{7RV|g zoE&&27G*%frO4P(}OU%`F-vhrb zojt@}jbZbTwvipMjFty6M=B2}m3xjW0fa~&v;uFxp5@Pg|5tnS4m9xrAoVK` z-J5ErnwJOYbUw`}QORGnZX^IGKd0ev*&GSZ1V>T{6aE4Ea{`x& zeIZaZ_1jpZ)0e3?jzE8LMpSp3`-nu?{Q0hnhT6K63-0IH)}QTZho%f6J4)^SP&&WT z8E1?z%G)X626k7*xqtPwY|$##-)zUtXT0~zoHI%ca`gXz3dY@d-b%3a5*!$WfwHO| z#xwL|aRL$gznF5*egTVS-Ir##>NYCM4ghM_~An&t+795VCt% zvi_|PK-~`Qv8@(#y7u>GqTnw0@MQ%3h{^x=%OVa`j9mE*Vgl9|5Gy+(opYn^NbR_l zTFFV{BVPAC{poNt?x?~JU`Pqg|AuGCKO?ShJO23k-~RmkRqyL@AP>BYQ=a5=_t5++ zh2D1kp<_^M6oD0}C2RX~Q<;r`DOK5NHvpa1(G*=Osz!DZzi1jZ>$P3fZvWzMPXc=q zqdZ4-dh-*!R#NgdiuE*sccw<0IrrA5hi`4p9Xo&fiLh6c`e^BeDtALW$|Div>r!Kx zA^5>r4||L1X!-l5kR`2{QkKyG)`j=@A0&W3m9Hcsqeg4dp9~*N7ZnjyK8VwlLOcrG z`CDw@4Q#r_)N6>ldwCSSt#lmi zzUogG9i;@Oaf7sQ*D5eTvz9fim(U?$8Ui|(qSq55N^k<_|I`BN4#-EDHzf}0cTf)p zIoeOjrF=wiEdx<8$zx<`O^uBf5zY`(dQ(`dl1{Z__F2LqDM6V7{U^8l*eDv@CEOO$>ZO<@=qdN^q*2rAq+A|x@ClR#6H#@pire8q6N%B|$ z_g^jN)x&}#XixiCY3NUSXo6+TgI@)3`tEXDvdCO1`Ka5}?nLcYj=T$I4`8rsPV=#Yif`BmFOQe{av1qj8#`UdcPTL8t>v z#{=J>nDkvV>$@)`AFT)W$2KvWDs?YE*)jiX7cen!(oJvCXA&bL7X^nY7c4|ODxSOa z`xD)W?or1{k|VNS-Z$&qa{4}an;!R-eI!u9&-|1|#BsPvq_tYb`w}^+vbhLyBvrO# zY<7@dE7jRdHsR~RX3F9bSP&A>uc-KhZ4PbY!DV6w-G8`fHLqGf3ZH;51sXeOZ26?h z8Wa+6B);%nJQXvc5P@4K z+z-Dy_dUEQ1YEuX8}PO_v9*oP1ZCJ+gGN|$MgLQS_ZcDOv>63;+sGGHf6(A!#Pkg< z2ht}3;#5hW)>gWGla*INMFx$wjFDhNzwV+l$Uj{1{Y}qgKxg$wOwobKMeJ=2D-@D0y804&>mx8(k+7dvMrAcg2{i6ZnCTy$S4H z*T7)VkAEs0uT5+U92Z-y(E}FmMP8Jtw$O9&HG$w|g}}v3h31qSfy$iiUyj1; zkJuki1hMxF$ogQ~#%kEFCMXkT>*C;f5-`R^yMrtN1{6~>z}BJ%$#j!F3L0QrR@6`W z;ESjG7qE}^7pqA|V#RH%{#Y~7tM!MJIoEb#v1l}ZYQ*B%-tLs-wzMdUA&(CNC$2eGm8$WD#o!dl zCCXbVM(FZ$Q_9ls)O=4f_<^ro27)Q+7?8A%uk8q4Wu$PQhV=SaeTe`q^7`nt!^y@l z=!z;yTp7L!8!7Ipu?%Pg8vqOvr5W#HnMA8$EEO}PE|#!b|Ni_CV&yW;r@fJ-htH4* zn$BrBzI3(5sVdi_yVg4?8ZkV!HP1JoaaW=#YNzF4hxRx<)*<9N4GhPZJsO3pwuL-N zQTciW$q&P(#d_suegZsAJCdEGo5xDZ3=t8HH@K5<7E-h1ECy4y=bs3A4VSclR-ZnN3b)BXEnQea;U66~Oo_YZ*>Z z08Wi)@8ce(;X|9hKi<{k`4e6f_>j)fg}Aq}@7LoDvaV2|mvM6$nYqKJqGYHCRRuO3r#X$W_EIo+kw z*-J7BL8Y*2W_v$3afdmH{0UCyAT<8WxQ#F9Qb*m4=jyIoW03uW-*R{<@LUlQ>|sF* zXSX`H-SY9NkhTN8T9p1lAk%BBpwGMV!PDan+PtX! zK-$F|uOTMhG?Sm-ZVM!(XI3}L_YXF5qYaO&qGf}K_Kz|@<#Y3PB6BR)8ZG(~=j7n1 z+$Un(Hv#H#Ps$u0<$fJK-5CC8PkL0XE+50F^f03k=XMrgvoQUzj3<4jJ@zVhbv1y!;Lp@B7WKVLoj6-3}x94H3HEP_O_iiL+q-Id|^3Rxukr%%EsHWCL?+m(p z^uI{uE!gFJ&_GbOu2aQm2 z#M~-#PWwKSK|V@@qITaw zB3({4UMPk6vm`OX3bjl8K>HqM^j`#Y_Xq?Tw0`Ie*YK?kWzGMx(<6QSgz}!wfK*gy z(|V@&HPbyw4kKWs1gVdF^|Y8?zg?X&Q#7ykR*Up~z;kYabn1a_d`X3}d!HELxc}u| zMPP>u>wiCRdfQ3n9CSWTSO(n%X$}zWng>AQ&MuwD1cb~0>Q#*o(0C!`bM839v~DB| z;#a+ioZ^6}fkfw9#HKA+y=#?NAdr8*5C*>!$SGhm)=kQ#U){W(4045$RO=;(m?ER5 zIU^*%4WRlH2rZ!k7oGL`n^w`=e+O-NS)kfxhtkSYgH443#wHsAG>Tj$kalBqy%*j< zcHsCv{cx}407e07oaInvc-y$RHh%sOe1@{BPv93m7768;oQr1QW>Vpn&iyY~m%W1`G7}mNx-RlG-F@{;4vM^dcm2tG- z)z{WwZ1J+sAQzIZtPFYC0ShK(Fahx#l|&ATLO%2EgS%q2CciKzAY*~8ezlJE3~M+S z&|18X=#fx94qIYvyct6W5tHN^%3Rx>G>dP`MAFSh8`82OK>Jc2Dt~gLH|gQYwC=Rl zPvPeE#y6@v^|m8YWg`-N1Wa8EGe2;28)n$poPktAEA2PaXg^W92xu;I#pZNX$@nCG zJdkUCC#J}=C=g0@$v>u%4z4s5q=YQX&4qeDy8*2HcjO_ZtyFmOHb6a6Ao>d+gK2@% zv-%Wi|JxW@dy_CI=i7>~8X?k5k0k^kecr2Xapx;bBHGPLbiVDhAdW#{5G;LnJ&Ggn zc*#6-u@-e2T&mE2=JI!diM!7Dg%@2C;ew!$sn=r7dgijq$nm|7x2Jp_=E?-#&kE$S zR?OS9V__#gcD5WKR1|M~YM9tuy1c%?x!df6?Hka`G5vLU5Ie3!Es2Y!O~@COEZ`C( zPmD=!A7+hy)%^NZ-ZQB3{WvaxOqcpUT5-3COp=$408-t%mc4FAK$5{*Y){32ZUUPy zoe(?yWwqK;J;;^d&1s`<0E+r7x_cb|0}p#wyc;N0n-0Lzx?KwA{`T?Ad=&P>7bG-6 zOle4+Qq1LBlWs+pTQ%JeCSH9|qn^IXzmF&Br`{_kK!-`^nQlB^3ePKZdkQDkifqeKvgJlu6A zn-yrg)fb@BMO-}Kp-uf#I4X!=2U6R5qWKnB8`VVlQ1l-&;@umc`G_ciOxKHK!fyQ} zV4Pl!vV&rjsd>^3_eG-=7XDqP`v%&oGnYo!O zk{R~0%Qq;v#-sQ?;k#LF_Q1xY5{j6%gv|hd)u5a&Dq`Rb(b`1CYmgztxa?*EvGU7? zv$^G3`j>y{U2UC;)Kd7;A2}^oetgx8--3d20uV^~^9t)1YC+F1lRg>zHo$cL{nQ?( zRbJ!*H00;IfXmBt3?Vu14>6u_Htfhs(UbMaL|x38xql z>^)uO;D0)4CHL1UHJ!2CmBN$ZGJ(;D=VbAJhF4jLI0>^Vd%B_CB|t4_Xi&)&t1nOv*{*(>72HH zLW7J8>zU`lg?Im{1u*m@El_Zy(&H#aouGX3Q$c7^T|#*ppz+=3pQ3acgWb*r20HZG zi+SFiQqj_#M2w;sL&3*FfM!G^f6e=xR*!6N|jnjm(kTjt(QjTjSW{`LPe^R~=Vv z!JYC4h?sFkr6>XWnTaLrZHb7vIcr77(6|UrA-kzD1VR5G!Ci3Q;B0>!3*K1q z6ud;*kS!!MWjL6emIM0r5kCsNnj?R@?gH?TBn)0tWV+NPfdB18kyyemCK?_(ceKa$(xS>AK_JJpihicWd}MVPfU zd8{UAQ@fipCatuG!3bM2v;+T&ls&j&l zwW^3n$BB&?nq<~hYuJ)Lme;#(XNZMgwz!w5Am7K>AU{Va+CvB{ljv9uW^O-*)G!FfcJDZHS39gQ_wN1;R` zoN3{F_2!Y47+@wWgkW8^Bdeu%LJTe$Uv@=ub2N;UnJKN+Y#8Y4=ji&=a4Xp5;wOa! zgvs93KWLb3Lj0+)!u_2ZBX@L7srVpW$AN+@750q9>)McTbhmwRj*Sl+M_0t2R6^YT z8+p0trrf?h&WIj01hbpm@A;C6rt1aTFrH};G&VVWWO%yV0^9dPFtd89{J2!8jLT-& z9UA*54ZiEy$JhdTOF{-C1MS?Uw-E!stA!uE=kZrjQh0S8{7vn=fw9K|djtC)OdS6+ zuS*KS(vgQQ#&O1`$T#wy$*-ASpH>KHu^KV44QcYQ{9~Yx6Z;Vha=c3I#j((rRks&J zZtHj!ID;K&gUe&qqCRt*Yy^`LRBT~TUS^(UOCn8LeVVR@?NbSX!EDbo92&z2Ii2^| z_le3ZwNQe(Z2fA3xiNBrx+Yy!u^ioV;{2AVE42r1&k*i-b6(q=0w@Cv&s%F&qqGWM zqCJc};;}mOn}6GCcL15%w|08FSKs2cw-rX>xr^F_d+T)j*`F z?GSgLP=AO#pP=k@@z-^K1b(#$^9IBN9=EL6Yx!<8H%0bHE@X^w?px=#7r9}mHwHVHX{Z_RB|j}!431g4@frP9-im3 z2ZPJtGuK1K1$R5E~SMxw@d6$7bN2Qv|A53L8APM~<#UpZ4 zR4Y3K)l|g3g2Im!TJ+-0Wl@d6PR4M=F@x@cr(zTp313qu%HLEGB`sRp{bxS%Xa)VbhXc$3$gn(9C>pV48dVfp&UA-n5 zO5nDjqiZ@xOI-SpRtcitZOY6CV_;yCZP}JH@^e~5fg^t?=!zoN5DOC#L}J{8X#Ir z6)EtEKrc0f{sUV(hnWF;dU z-0dQ1MR)+;QZ`4+oc2wtDg%y?0b{!7Ud?*7-RWn1*-krVou5I(+L5xBZ$vfXr^lwE zB}Y39C-8?`FdXap@mf)?f1dy77~~-%To?MqlWo~(h>=*@?#}cJ&qx)L+9%ow$Z9%= zO7A-c=P@PCLxvPtH~qWxHseVy>~W$YYPy(94FTia89#Bj8hWtnOw@W9PxbI^4~O(^ z)`QFarClRWZMZsOculE+y7ChfdJGKJF6d^g7BX1bXS7&?J} zXaTvs04+ta0HEBd+pRGXk=dp=9`cyU_)kWbc{ZUir;JU^Q`^5c=_-7*TrUr%7oU61XhO+>xqX=wz{{OS&l zhoqM;`Cjz|sp^rf^rZE!OoZUl*kBHBEPO~Y$|cA-yQBK%P!nt*e=$c$@Mvy^R5B$X zqdO_K2Rjy@BLr*IcfI$sZ#-12XumcbffPDK8aB{KXSLNog z(+zG45l3S%Z2@v9L@%8$Pc~UJGb74l!Ci6Y;h>iAaO_X!)$#zLY!f;68F&}aEr5`4 zKjXu0RPS*Jk{4hivSaFSx$9~g7^&lSRkNMX-Kn4X>okq+h%&y=Sn9kVR0TLAmJlG89p!Myf-b#R4z85H{kO4+uOL;7M ziT|3KX$}5ao3O80P24DctPK(zW(6<5I2B8!qp(=?&BzZ{06%_i3UGK9FaT?mt$#OT3ENIIqy2+o*2rjqO?3vUV58|0I6jrC zuW}WicrhC=y+cA>xBj}$jJ9R&)gNmlZepq?aal|Q3&F{~Ap@*2a!)2(8_A&X3GlAc zq9*f=-`UCtZP_evA{Z&jR-gZE^7o&r$en8Nb_Y5QelEzMWV`721J&Y%a1^TUVqD`V z_0JtA{XmZg6l&K{d?pR>!ZhgaeA6A6PhA`wzPJ(35OrpjoOwm<7HWR3?%5KEMl4nq z@>k>*h%rC=d4KNy9Fpp57PJ{-Jq`Q|RXg{0Pn7!Dz(5hk$FxI0lFMJ(PqU&{1{uVd zT*5USQ06%cBnX}!E;W%GY87GZzn^fy6^#IDVYWCk%(gq0hYboQHF4WIR#JIzJq-dC z!L)2^$BGbq^#wlF^u3gc)gaYr;uv$EC21r4_jK`lF$ijbG|NnIjM+lGKOj@!euX#u zra$`vzM;W!4mNwQ>CUgVmIyK-l!RNi)E>vA>UKOJ?41)`AOX_)nRN;1A; z0u)9VAFQc$14N>T&t*x_x2*crJV`F&d$XWlWx4YJiH{F<2_)CezNq)d>F4)zM)T=u z8`9P)tFQi33)txc7_U_Y2(L%YkMKl_^NMaH0cq*=3$(rA^MHH{n_I0g;bfqEYV*PPvT2pz!^gq|7Xf-vb9SwiI>pPwgB2Y5Ako@t&~vx6Y?7 z(hZdI;PQc4W@?@Wg029~&SEgO7$r1NnN2eo_{QhoVCzMR`@x+Co1f42@f?C)tsB+t z7}!o1XHhScdnms>3mYZlckveEr%BLIrZaZA0nwyG_Feo2!#Jlxl%F3+|Werv4c$>|G;_w+CT}X`k9T=2MZn@8SdYAmoQiJ@GLs9yfheW{l>W71?1y3~>?lAH#4Z@#20kCrC6DJSPlG+_^RpjK#=RJqK$&oS8>mhdi{tQI60r|GEaT()ulDd=tMjAY zU*Z(u)SpOtVJ9W{-4EMMtcg_M5ODCAmL>$ho7r^SVX|dCBvE6=dKGsQi!>`FBCXx%X3PM0_*&j`O`s#7) zk#=s9Q+B$JTvxNe=0Q3o{7I(7GBf~BgSBp%)Z+p>Z~%y&OKoEInvOH9e+a1~DD;Kx z86q7$##ZV}g;JN|ct1#ipd)jg&xOPC5Aslj>JIIuhwCPis~#w>S5Ez(RpXnVd`K>gBEiX-0C&cR`|%(S|QhbgO+rCgHC%{z&-@FwQ97H~@sK{QVX!6cXIy(h}T zCh~qS%q}d3H#G!jD9OBkV>lf{Da^$2&Go#bI>QBFjoPQS-a-ZF-L&Mp7& z&Dr~ahi2TGd@*-M{46>abskwnZgx{xD!msf-6R(bj7Kk{LzE2<$P=%Zt;z~?ovCv5 zJPQklnYK9V)Q9dr3Z0jzzq*qrvSL0A4cF+PVR}#zu6UL&{kcQqbDrS!kTql}+XC(nP_@R*@bC!l_k*E@r*k^bmcSrz(1$WzCqwBFFsj|)Ur9U!0yqKy{^5{xoN@jh@SXqXx-JeUGDqj#S8EN!p*)at! za3y!yd}i*B*^G7n$05c{xvCLMDid|cE#|hPY{i&t%40oSD=21d!ngjX#7Mdr&n7VX z!*2;7i=V^6z$GVEa2fmoWR5}`=b_Dfqa>%}n-{_o&wni`U;n8-x^2%fVY6KbI_fe0 z;57V`dYonHd+PF#$AZFx$L<4J)ff+5g}m2%L@iSr%;#qD8qCfzCD#~7vF~SGNkL9q zl`mQd>KzmN`4zsXm!b4k&Q&|C+ftq$CNh*<$pX{iVS84>NU{0PpNr`u7jlM}7QP`9!AW5jYdY zvm}qsK8fLAq@z3@__jfJ7E_x1bGW)LnMOFmd41wH_uB=-)TWU7oblVd4>DOUrVlT> z&k?oo{B#2svP693_FDB>FxLQuXfc0*iOGSak2el93L~Mhm|(A>pFUX{Lycl^+wi zIf$iG-2fv8%mW!;_{ux}>6e>h&O$&WUt~%v@{LdtK_Ck|>r=*u!ckQ68j08%4yN70 z$2=Jp7$=sN)x=?fIh%sPFz-g`?_1R{Jw+p|!w2cg&084l%C8)+6r*YFf?e$Pk}?Ra zlq?f7HLg$*b0PYu<;8g`qV6nFVb74{=(1{AW%1%&9~PL9p5S$rA9gDdFQ)`|hxD>n(wkb{pGjO}RNr4)JQ!d^cwO7$Guf$Fj7f zDb1KvLS)~Ub`^~p+1oI_%4}YZ-?+`Nf!FxbcXO4{>v`1aw?(pA2wFzROBRI-GAv)!Ta}dRkQNSf8oa&->lHG%1@^ z!d*y}0|AF?(x1ezy3_L9+$hIre5GN-DKTlUKGl>3VrTgV-WuK8J#S2!!}b3@eO;z+ z@yya7^z@d-mzU<+n}&9Om+SFn>hpWLnPaR{&Zzg|+}YgcLQ%gh=!hJ$aU`d{70EVh zgqMilA?8ADnY^}doi!`ogJbS;8<<7qAD*J^eIB@){LHd~L~o#1PoJ4@k`q}sz`$m> z+^BisjUN?f@|Ap-6`O_)H_v##XeJ&#_ED?*+TMoVk5r1i$w~3rJ}S&C)HmIlyN8mx zOb(Dei@#;>O!`8+#O|f8Dstp=pV(AVL{@6Pfr=XO7s*)TGVP~(NB@i~?wYfAIG(gS z!d3UE#iOr@_qvI{S`8FfJv?Vl5K2Ub-C7$qDsGP3NWJ-J{!ECJo(M@UL87j3fvGi$ zyR;~JOMTX4iXKCz{_q}KGgU*b>)x9?6*zeX5~JeY*wRD?SPAeHHamW@jk{$bM*U9r z2I=%9gO!8vP%V+8(`(P@sRw$t-bad+5J=4Rzb%KEW~0X*0nvxYEa_^qul4dq->O0osr;#TjzEcHg(g>mqH;#6-{rt|yYLk%>2#{*0ynKyZ@^if@R;i*tN`8i80U)?eNR)0}u;NdNGTtjgteZ7cbU)eP4fIiILUeEcQeDgvlU9@h3pvmd1>zoY05c9*4UD!$7N;dPseVhL^%9q zER{;$EAQ%;+Iwj&Xpmj*#KD#x*^piP(t0*OdHqIjD~+Xo-1K(|!|O67J<>Ny%b2EI zP3ZLYy7wxaVB1hYZ+4OCk)m0B=Ju@J>=$RWeK@u@L~hJyOjg_A9~#M{^PtwxlfhH7 z{DG8n40FVAT&QSVx zoo8P_=IMLSv|I~1s_PR(V%e74f7>{xb;P^o>JV6j)MI|pZpgXUwYaT6DATuC%O)ts z>eSo#ySn=%M0SU<*t<@M88aVgXZNa-e&J}Tag?SVQoqDree+@ohZj7BH3{_>5+*rTg2ffNgUY$Unmn%}qr!zB8~r41YkUb=iXx_a+fB4j>UQMI^%2?ft)GKuNYobAE3^{QaM56w4%LcV zc`dhf(0lSIxr?{Pn&hwrZV3D_cGt zyz9B$g~VSMP6zefubFlORwY}xHZA5t0reuHYbbdr%STW8 zV!X+9-qtv~)~L$1@p}hZ^oP4`%}2^rFH4R4cyc++4e(rwMNW(C)(AqTj%JRSm=1e$ zth8&K-jIPJgOfa3xb|ei^q|A)?$mdV#7v1Djl&WiNe@i34m=7KFKR0#dF^W+Fx~ar{oq;ePZcIL z{pZqJ&Y1CDtW9+3WBhgJ#%}&Y;%^3a?s5KF&=fm0uf~6Y`Omb|k!d>DJ_e8ag7&^o z@u%NWsdSZD@k;J$)LIOBIcTb9-w{uq?q}Jpe3Em4 zb3o&jRcBHX>{_xTDbD;zX^|@RYIXV-7jW!he8pjDYX5^hkaf9lD-^O8K<1Wrhvs;Y zRvFkP6t-tSprNg+EPFURR8wPhFkFDrV>qz{X|xlB$~Kh&kee{AYkFSjae3zOu(O2d z;O|cHH-aUTw5cp#HTq&R4#nA7wE3UZe&up;Y)$Qw8Ky8|O9n?EK+wDWy-2`w$%bWg z2B|Rcs=vGa_dy#a!D40D!tn=GJ8R(&WaGB*D2J8{H5ef+4>CKx#VyQG8OLOW!TKbg zP5b8cZyiT6dwTcS(YAFJt_HYUey;yT*iLGd9&HbdSHYVZp_cKuvf<*KwVR!G-z^o7 z+ZEnkxC)@H+ww;&nTv3q4=pfcbgj97xD9A3U)NEe|>+Ua`RvdLT{*$>`TP~rX1Xm)u z2@s5JtFX+sH-N=ZLuW+m@5S(80R=}=#i{klwB1TB9}3o;Q`Il$RwQT6mix|SyWfyJ zZa=j!X0t7pVh)7*SY#RQ;rBC>=W>aS{pUy=5 z!ki}ZdhF$&=Z?*+>;5 z5Kb02j+OT?D(VJSHi;<)GYC8KK3HvJ7Y|ncBuh)Yq&oBTWTB8Jv{#p{WFzKAB|pXa zmntBlO1D0xOamDnONG2VwBJhphK)~5E%cpCnh)c&-m9V(1-WlzuUo%V<@427H=^RS zghqE+S^R!$BHLw_XIQvYvJaO71q<4_4|AGV&Lg>+Yj2DstT;A$cnKJo%dOP zAId(&))hrE^crt>)ApMW{C58KG3ykHkLGy-S*72{A%*c;Gj_ly<&g>l`RcLx1)0;Y zRM(gLCqPT~@V;1)fr9l#bz7;u*=>!8rjHK~*GXkLggd_5Ia9Ud2BT=8N33vu%j+{E z)zc?6I=1@GmKhnrJwIgMEf9DA@ZEh2+tg@oBsgf;U)Wx{Sf%oIjYoK8>F4UYnW8m$ zc+E~9e07g3&GdvroSJ)6TvUv*-L|#UB%W|O5eenIHrYdW_Tp+S_oAlaaB$prm6A}k z|8ucNoZ}t+&`mwO{96bcPV_uIxtjq>JnzZWu6{PL;5!r6EX`)$Y#|N2y{N?&wAX1p zZ{WDti$No<1p)s_`30kiYoWgul$N`9JGgR|}_U(?xERUYCz(=Cca%e3816U{Zc~%I|tk-On34)@*tW z7ta#wYyI_)8QyQFk?b-j&Rr_ZyQ^KWD|gE|ULMhs_%)UBD4s}syyUz#@m1Hn z$%}m@(V?4%AFp=rho9hEgQJR3V)40m4gEv={LgSwmitg4Zu2 zXEopHOWjwU*HdgsF5R(Ub0s!?6(U8G1LZkyZb*gu7#Ho`wvJQOm0Py%Z)t_}%FAx+ z;lvkPS?g-bp}>v((Zn1)s7DA|2qaGZ6yweiTz1;ySXQR`QmK z&eO)!niEScB8Bl>wf#6@3?8L6y{Jf(-hYKtg`LId$fQmBLHhe~hd);xl2dSq6-jS> zw)dG)*xMba>Q3|&t9aR$EQI@xoRRj|?Y{SX+giW1UA^n5GdJC0`$wl>FQJGywb3&a(-!#iM z9?-Cy&@XoKPB$L$Q9Te;(6?rGb8d90Vu87%v)NJGghn=HA0JB`g$v)i z%=k%|Po=f~Igi(DDhercCz@07nQiPz`{)qks-rZr;Rn*~GS-6*ap$tIAK^%q*t+=~ zU&}WpF1f3Hv>Q+JbM8m_Yayk@_B6;yruk1^acw0;C9LEVi)VjG>k>+%_QadmbDtBw z*Jk#uqP6~Ld$&a;S9J2sm{BpC_#XGk^+2}H3 zS!coG_~nIDy5b)NH8Tb_ZPTb0oyFN~&R8e7RdgAOYxSVngq{7;`{DYxAX7j=z;?1Q z``bb8(<*L#Mk}L1DLXYYR(VAN2=KaMw=#XH3hPArcp*uVEE1Qn$6i z-{qbmZjp*A|HZlw)j`~dN3>3DEBVAzaH}Pl@a7mRZD;1U@k^dj%}2th+kM&=_HOUD zH#+M0^^otBFBS0%+swOO`6}g1Px=Gg2;(>>?Ejs*(EU<}=FZpXiP&dt9E&v&Qgl7D z?LEa*dx7IG#}1vw!ZZgBDnFy7Aj=V*R)g=MzC`LUy;=9?{*(s<+ z)kaR4xt&{o?mIYVCW+&WCTc15c7j0xe&&KJGZXRQuV)@lGwjleVQmlNH&P#&R8^Yd zyKf~wyMKYid_GJ|f&Y$Sf3BK_!Ub2O&;6|9Mn6?#2xYcDbexCoD|OXCWurhF>ACwH zb64h@<@_!ATVyKN^SGIq8tU5>u1D`QI?l@3cz}*8hPcw*eX&pCeD+XBul>2k+>-;3wUwI;-8FHuoeVCO zG_g#9)K^k}=m`&=l#@{!-Ffqy;N9TW;-u_d;AE+rx8g(t!Q+6_vo<%vqbBYMOL4!4ts8!=r_&Z0sH*D7 zYUHrp{4sL;`AH*2uPrTQ%a;2#Km4YBa@~L6XWZ>Nf%0jGpd_vqC&r%wIzoTFAGcHs zJm4|fW!_O`1B=M=pu5-0Rgc2PmXC2JxeoJ}H^54hRkaDh7VQ6LBC~~-ihGeKsIE)L zq6RrY#F;kSXbUk6g!<8}>I471q;CD`!d^gGiXBl4VI9&x#LY4&)quyRf_uWD%=yCB zlcHiM3-a?^@9c-;^KvM&kl#P59Yf|4gU5ym?q0}hfh}SUCIvGQUbODfXzO~W3I7?C zgV}xE!0H*QXJB-5a1@&mfaVS+O$r9&VAS=-bTq!B0r1qLg@AW=1j7hf+TKx@SMSk?b zk&@VLe_x*{Is6{&Zk{mYPM@YUFm4~r5rHwQ-)=zXkoL;-il5^hqS&3l@|_&{Bsjx_ z?9B!tui28K7NB^co}$^Gi)WC9(E|C~s>Jqo;^-_2ydlX?HOP@qYeUlP5uBYl$rTXK z@GTuR;*lX-oTi32q?uj@+XXB8*v?ZgCQy4r5u>5_1L;i$w~B7>XhX7r9EhZPCCu z(N|hH>VD~0pE0@VO$-*UuoEZ(Vb?*apMrK5D8~uK{Z_)X<{)@10RMGZAZQQ~PJKx4 zI%vZ*bQeOZPNNGC9DYUXMDFNfdQ@!}zpLPk*|iO9wBhfHEm*_1+8L;qcd|Ykbe_53 zS9(XbsknPbtRo8Y$?BCdWx8V$j+UQA?!ClahamXyNe;$X=9*yz(Fm@#sCM1?o!Rki zg3;#@y!MTdy={ekPXN;mB6GQ^@-0eytaA6&K$rGl9dkqS#JzfZX9k_f*Za4Zr17&b zpLC)bx&wv6;ozygefsVs-L3R_yU^ig&Wo97jo4fwncOoQGN**ZJxi>h73?SNpZ%KW z3LL4QS@UHZO)0jmHjlCnclDC1<1KFxy46c*dp1 z4ryvm`7?vTj9%M^BpHZprPG(K*6AzX>ORr|Tp09~e3Eq&Z9O$I_TW`|pWZ$}_ za}?qm$s;**ji$fSTvfEXkeQICUzo_St#LZb$j6&O)hZ+9^507gRzkA}ChvKTz9Geq zcB9s7O$y78}Svnm;dc2fo&iqn@OR73ERKI|oX3lh}7(_JJ4d-hs2U>m-TYLFpnVnI-yY z6;xFZIB##?@%M&??<@sma*(|3yaSLvK7D(_t~QolHb~uhf72tDlCY5nyee_OwwbAk zjBMksExdbRE6)vrN=GiAxieYp!1v?(G!3CQGcnLGx*u)D@#%u4fsjDW%OCWUH_yZ- zbMM)%>M}Mpy^p9{x6PPz)iX`I%;3g~+FhwGVbXYTeYAIt&7Js1x#G8df@2X;Z1-3E zvE7aJrQvPlm$6UiRFBU0!h4+{L+F5s&BlL6jUwBhNs9R_nUcc_wlSWS!FM~oVF){G zKG)9yUcz}*t$D|yi+#RQTFnP3HAJX~W5CjzV|=;cY%a_t>2-9*6Y;+Wtx~Zy@)nb<=joxdiJ)CadXE zlUug+Y1n+5J@R>wxvJ;j=}G!wXfG3<)?D6u6`NS=727qMC!|`9!?tX^4F0Os{DU)s zwSPN;)CsZIuCzKh>GaCRvRqry% zM>`H$?qyqAxyr5CyKY^&SPZ2m~$>60amr=s3F; z2*ek{(`+Hq!VR_Om+WJW7ZW^b5G2nVcyp(;UwvA(O@Qb@L)WGZ2N>UY2~-UnqvS)P zA`)gW*Ns(qdR-0Hz(T5YQ1x;b=DNyLX&L#~$9mven_MgE(<3MC$k zO&JMWLfpJjQgvUhVGPLTN4njU*Ulx;$v(wVRkYn>b7Q1gOFb`vP$m|0fUw5sLN7k^ zMZ-L5^}2?4{k5>k*oxHJ>+F6l6Vh4gNuVZiSfJy z?5}8T`A8KqBJj!hSbpO>>nI<9mNy!8|%+f?aY{_-F%n& z8R4=+7Q^Wz!mWDc_9*jf(n|8|CpmZ-wl}>N)a;*X*O<04(v|o1@O9ZE8G8`i^Xf&) zkd;gEyT_vKQ@w<^qbEW`&-HspsCsSe4^Tx zcsR!i(FQpcU7hhh?}&T?jx8=}16wb@HBn3W-FT($o>1KN;f7swL6HoyWS`FUy1j&4 zjy08y6Qd%!B$w7Rl^LPzc|i@U5zMdQ`EOJWEakPk zR*pO3yYbY1{lmdW;dFR7bV)6G|9^+-=~J&CVy&h46@dp~Ul&0B5LAH(3@d{KkAZ#X z03GTPFE#78kVr#jY!0TDqFIKg8p#DiiD&ljbb97}@+s7nz!dG;uOaF}EFDk!P1vO| zcjx8ejZw&rF|*{!-g;|R%~D`^=T2ahKEUer$H3r0i0{H*QkoXC;~fIt>QDyvR$eLF z1*xtx=mjWp8^PmHQvI9TZ>iI6+wngCsQ8nsty!0kF`gR%OoAlYfbHiGaCfEX2TUwj z6gW0x$@timUHoy~@-l*<5b}KqI#|LDw)(iKpI4BoS6uQu04Mc-fb})!!Xx+gQ-&&p zG86Ud$@9o%720ywFb)|bPEC^RkD-2}1g>8M^Udk44l_C|nvO8RTkLaRdD2-He!83- zB?Ij={W(-0LP`EMz;LH1!S0vCk6{Rl;+x~ZFQzvnIT-Qmq)vr+QN)NfNM9O;R2mh) zStwiKj;F*DqKk29X?if0S?CwZlK2zf)0NKWX5BPa+xgI2;I=KYC=@X{E2!JFmC zJpnVXIS=nA3uu%e_-nUf1E!Y2yXF~AUqVJ|y zh7>krc4BhUA7Ielc!C}>nwAk3k7Y&C>eU)nX9;@I+x&)rc<4l@Hbq%&?)MF0c8`LZ zqsg={fe@Y#_NKqu?X}67Pr%-=6ZLv45Q%u~eygJ5FnSMv`BiP5U zmw2F%V81D2(WDGDyre#N|3Q&eK`qOC=_Qy1YiAi#E{LT$fc~qiwBA6FG@Ls)D;dPV+65Y z>YHSZ<+nVZYn4_ftdS#!vbu?x(V8h8l66CV-+Iimk!R76G#=NFUO7n5`e?8_blLEI z*4fs>mXMl5BOi~-bv!6U$NBw3O0}c=eK%)=zV*WT=Jhjh7MMLHc-M>E+%@(2Wz-|R z7uR!?Vpdk>I*=z)bR1rU;s)rkwL*06ggw5_HBCVZs z+;urT@1{qJY+&0?P5%qvF!2_t{UU9x^BF-L{S5xTs7??&@tp&m9N}^nUfy)!C{f2K zg|n>_C4Txjn8&1f=>R{&aqPDHDs9C8krP%Ltkc->frtZu4*Mg{hJ^7VnlNUfuA}x& zJL@VGCG*Dj`?H_!Rdadd-7LN#wO=qv$ScrXo7Eg+>^{gkc@L5S~MQ$CENP3;e z2gb;*!41QQoU*A>BC9*!zRk&xpjO*3{}5US$4<>HuMKJqT{`bv>wcOd+nA|)T~&QP z%8E7H_%q`<%5u`L|K>Jw7YA>>YU@WsC}Ph3(u|1Ms;f*sMA{nJiFqmIH*nr3Ub8p5 zCDM+KzkjdcybA1~LwDod#@o`v!wrlPkx1(sh34GB z!0+Z2?c3vJfelGH#&>zw6Y`U<{?cCmvn}mn>?NG;6O-tvc6_sB!~ry-8u1y%iA1Cz zs_BxX#H^b(b>?6DBPPT-5@LNiTc3U<7V#rP(w*0cG8DV)l%Z2sjTJ{_H0RDP!SwiK z`}UT=-i??i_B(ksLjw$jO6Ft*Od95@AHs%1US*wF_>F7J=g93=`5Vd@JYgkCHk?cl z7TLW0Z7pt=1l@JEbX^k3wtO*J){x9pk%8n~@%k7__)f+^ib%!rBmX^8?!P*ePbj!5 zStDTSIS9K1%t^Uv@i8gIN9KpnzqkO(bUzj!c9yLi>S z>erPJfrGeVE!4D>BSH!$pUC5fixScHM9RP(UAmbn$Z@gbWRK*KsvI$128srXPQmys z!eL;UnQz_Q0kK0I#Y}W%C_+5j^*dArx#oGd*)C(2oH8c)zyOcEKxslS0n2itY#Yal(+0fCINR)P8Z0FTnm#$lI?~ z$^XEW99jvKQx_YlJi~ww;qu|t?vQwx(31?;lc zeGv(`SrXm~d4x?}j|V(x)!&ju;V*zMSlAnX+avJN&?@47>P}apo%f|i^Lb}HYv4`# za{|V{gGQ-$P29a=rlGN+UbrquQG#hB{oMQgbcn|`Aq)5|{rXbY?5lGAJt+^_z$0ud zCxJkL0PK67!+#I}gG>Sbx8_y*1cdTebmeiR8Ia>2nCw3SwZrn_R2=O*geHS)g4`I# z;@npve@nn%ZY_)R(J8<_JAxqY`Jh0 z-nW~pSb4f{BGz!8-_W|^XGq7QX)apCb3Z$?Y}B3Tbl92ZXdfq0T88RyRLJoT5y{tgBc%B-FLAiuR&7o}?t zUpU`evj9%~Zo(`ktdeyPHjA0Q7!*z5IGY?(z2$581%-|5gGX?AJ=_}{VOEJmXD-Lr z9ndax$x=ya%&2SN-%JyfsyrWe}ny5&nP*vbT<mhh6G9x0N;QR%`W{w~ zmVd_)=fd;W2pHM4aD`cAuvFFEuStqm-d>-HtUrM$shv609h)^N9x3B|b$6jO>1|p` z$Mwj}Pl28pwVPu5s^94x1pn=BV=R7hNMcXCgUAxDD0}WIrY|qfXy@buI5##~57xA0 zY71z$6qs4bP~I2JIYipTlkh|7n|R!Ar?fh(}p7lOPi-( z>wBGe_Vv4tqHIoB3_EBVhHmZkxIJ*1q(KyH~wAmmrLp5#?(ZkO)-ML(##x3 zNTE1X>STkuuEi(#2t5f?ztpm;IR3j=-!XQrFZdPDU(|3D@+^Ee@{qJQp%ncUp7E$v z1df}qTtjFkNO<9WcgOE)ZFlr_K_Hk}h7$1ckrwMgIIXw8r8A?x!ehWF;iMIa&0QiV za$WPDFt;fqx+{&0QM2)>3)yBkzKrPyD+lk-aHLRoKSH^$D#2Sg_ceg|)0ymY@DbOH z^Wn!L${>8ZB}1*yTf!*jQz7F>k@rZGUB|6NcEh`O{b_EMYDk7^9N#MpZe0QbF`RJM zn^<#O-4eWTO!s3LNa}3yK-f8H^8S%Rmb)mu($)kjvovY1{)*;Ni4DWk2|t#qb!Crc za`NhJPV4K#VyX68k8x{wF(n(>7i69Zjp#t*g>X|<8Wc$VgTlJK2fNw;s>zS!CH-Rr zWtv3!KmAz`vyI6qk?6*^YpY|}*fuMmJR{f`-Ro>)Tx>}dt0(jeP^OFRTFMK|hZ7^G zE;Kk1qTb&>!1GtKlAgfyjh}Vj{5lphlE`jPNI3Rlisd)ZRgKT8^>pGe!h!e5HAm&H z6Gntp?Q%KZ^cF)p&jQj~lN*cWV2&U)-Of2b#D*IvnSM4pN1?TrWU*vxyM^xyzbFSE zDnX!GK@qZg@UU9$op{?<;Cq@a6XI(>6nL>Nl$?rP_Ss`z9UxF7dh1~N1PkHz2gfWl zu@87yo~pkodonCio9nB>3;4jqZJ9nOFL+B81(KIm)SQWm)On<%*Co zGzUsxNwT;ND=-*qb%29<&Cw_jG}mXwT5PGW%YlRSLxi?sJD{!)rB@sE1QANi2^t`!Q~ZQe+s~ zB%@6Ubu2nVl+h4i_Rw*hl-jP~@=>}_Xjw9Zg+IagEw0pqxAy!78D5y7;$gi^dp-^U ze{&IL7{~J%Y=Jb23m151akY6{30E`c%WX%OGaW-JQ5Xqm2d?1PMarL)QvRvO7k_^K zKnyPd3Mq_2qqp!l%vpSkRnIYX%evV8bZkwpM7p;Iy04T>SKh_U%KTx_+3zZasTvUH zdN>oOL$7->A%rDRC_V?w0OGWBkrszep))WQLI@H2H}(u4*agVLHSKucEPx9Cr5fs! z=^(=_(*db*^CBcI3-tvo+to!oiG5XX7fz{T#->srYDP*akL@}NC8T{NAj|VTJt_?< zhyp`9rXTr<3oTsRnxJqhc z>1dX;C`f`ucpG=L9BT1je*YZ3a9x?@?HtFP!sTugHXo)PilmJUjMdjY%Oz@57R(>o zR8`)iffDSEIr$J;R(6Bnb1z!O2w$m|ER^J(!Y$tCJAP|z`~FwYr$-VG&PEu!^_Aqq zGF_w$LM683{y@8Dw?*{~G%ubdTtvOLuS7?=Aqwp6yIAfrd7b&zX5B@6Zj0m@tSD=x z7f#Mhm)yrF$!lT;hhOo0SNAdeO!NEUHkCE&JJITffeFP2|jF0-q;*|HNf((oJQz z^MzbY?!Y_G&+p{isMer@TV(Dw>Ca3yBN#o87`F$dMK zfhy5P|8HLc*szOJ{kLjbGfk3f z=(H2sN@@@uR+@k=h2W$5haa-^Xn&33EZ1G=dfV$*6VdU=8zR!(Cr#+jI_8$>7$F`o zAeyW%d?P{m{&%^LXhNpE1kvkl^^QRQM(`u_E~eXi{m{;zY5%+M^M^JUPbm7p=5H;W zh1`;5PWu7gk4Wd68B#Oxin?>Za{_Ar&2UDp_Ml_jeub24msgPnlGv){H9|Mcl_;E) zXH_~|)azcjhv}$Km$cl?HX_04n@8xKRpd`TK9oiEXa?;BZ8%3$x3c9opSHNv_svqM z9xr<^aJP1_!Ko8eW%&&JJt}9vZy}0E%awtzYtWvO3f{DM>yZjmgH!^Z0k(jS4-oo~ z4^JB1Dxvl(O~LpKLb_3`9L9>r{-7V`7(To^1Wd z7ngq4DEGa9L?EWk_@M3HREdQHEv;+z!DG#vh#NWLjkNfP2MF>P=9^gRNrzhaUyofX z_V~)5SiQ^MHW81AxcLgT^&b6CH(Gd@|N`0AF}jg~cnp11Wh+!(lRo7sJ0 z=9Iudubq~oQD6y?;;*z}q0Ux}NbP=O>u&KMvYmfVhW|f9M)d1t#pTfsj03}6NMST_ zE`~qV^qZf+x@Chz0RVqFZi6-@9S^GVwe3UKb!mj{jqAx5fM`*%A{wJbO2Rz150?*` zYv*n9%W(+d+**e|2BTwEkvxuD{l{^BtpFe7BZAHqVl2~%uOX30s-DY89gw3mN#`%0 z`}{&;(*Tk{2afxonY7!ni4r)9T0#C-1?F4!KL$-yiLo*Wnn+!JY}rTGWQ*A!W1?-h z)QdsvSbPAV=dN9q3kqq)`mBD`zqo*<8LXNz0Qh6MR)4T`(DeKX)P#=ENlV~;Xn{Tz zRrt)8V_ZtL_&+Ie! zh{bp#XK#X#0WYx*H$?(YD)~!xJI8Fp_YQ(fck}eeE(cTa6>J`bZBnX!3?`^~8cIgN>XZ*>w}1i{ ziv*5Nj-7{W@m3(Cn&$+|o?07UWpW))(f&BJr`J{+XF#t0)b_jskxh==&noiki_uK` z^!GcG-(%u4E(d$Xewz?-j-#UqS%m({iqbX#t=9L(U|e_O-&gQQlsSOJ2qH<?nPtGNJP#VP1VyGRoXoxg}5Uitxa;SRwV zmpvRI<+WJ5{Ff_$WWeau6VObK<0EduvS1;m1?}>k9;g94C^&>5#;NWN`GXT(ckzR6 z&<5TG1j^T6za#|=>-Qw*f7{e4tM)4UTdKrbYwhoJ1pQ-}kA#^`#{k7H3yBnPexZO; zv=r!ZUfkI8a`7N5+IO{x@kRCug|$Zj!@l|OJHU|W;tVy$O|A3LgS3hT@?$%O$s+O# z>H6^|y3=$YK{t~uf~}a3W$n-ZDnexpF}@An10SW!DB^3R*;pA!Ezd7Qp2fc-?Nt=I z$?#5(qE`I(XuAIhJ$lu@gms5D2c;D^)_U^g`5S1(fm%{y@xp$$3H&3PGmR4hks8IL z2zmjo{Xzb@g6as%z`K4+$7s2%F*RjmcnN?ra(pc)w87!Kx*x?LtokE!+SM0w(y-GO zm4IQ0eMtw}!AG5Y34R2ln{4f{peXc`kuXRq0Xf@hgo1dFzIlmkU8wUYp*J>zpaD>V z&LN+**$e$5=V!Rc*BHRp_y4Q^m)nBX57=zd43Smf-x1su4EczQkzsrkt8n(!t48c43f}_#8MJGxY7_4sY&(DE38Gw= zQ3nVLpbo}PVSaN1lj;3=^a1Rj%!0NSv zO3X+Y?R>`@!nv{{#@#&g{UDwQddM_>g!2PUBKlE`Pq;!cP-ytF3PkRK6N*A1ZO2B$ z0QAR)vyj$}!ybEq|K@L`R={#KgWMt`8mc4!cYIu&MCnUMCz`OwJp;1)loAGj8@~dU zPJBd%bs4-lE(A>*Nb`=DU2B813LQr+-_4o|0z%d zEL1AGMX1%fu~IO&65Y7>I0?NPMp0(n8KVeA(Fw$x-LtZxN1`TW*IgyjF#g?}Sqk?T z&6S`^wBMnqsWAOn_mtqRd9a@lGQ77*l{vkKw|M%?;U-B#D;pznuE6vKIM<}CQbE6w zO=jOjkeen|bEyY@hq@Zv(I@n>KHY*2H7HB`M6G^i#@J=Dw8kTJE|J0{4}l)IQla|0 zGq`H&1LSggh?S-chvi=sz(dh>TukZ$h`D1^_~DoOQc`BqG<>~cGu#|{7-?Ib@P+6a z50QRQ8NdCl=bjR;D3{B?E$}11H8{+OHTF1GGX<6{N5(Eya5c6$4r{9Ah97@<{`lKw zX=o+Y0QTesnCM+iJn&Lh)0}Qc=)_&UGx@Xl>)9+&eAbi@az69+C8#P@-OW+6-R;X5 zI7YtkMbP+FJ1kT5T`>nt2BTALS&Uf(5=wCKFnQT-WDkDnzv!+=`bUElCO1qWU2fZ!b9Ra9hDS&|VgAUKJ z0e5+`=sW-BgNgL^V{176i;jnCZ}+vY<30x>e0ADV5XsxYdpl4feaB7C`N1$xGJ1wG zs)?C98N~U3kT07BrQD^B@Y3Vm87y|TemdmP7BAD3mAmPweD^5f{!{&5=0c*8-(*p^ ziH1qg?HB+cdFHnL4y3RY zr4~R5^lA=)Oyq}bt1k^(U;hp*&-t;%TW|W%wEn(WWKhuT+AG$%^?s}A0lJA-7rxaV zI|aT9D&=c$24-Kl^?p1>>AF+&#z3?INHeP^f>IEpO#;y&nK(1}PWKu3aM@EYoWV&U zK91JL_|z_o=XX#EJtVwyx*exiumU_F$UJP+a}F04j1@t6R(I9k=dfr9YTU&w634w; z44e%wlfM9jP3Ob1!!o`gOHrqMpOV77Y4tZ*?_6!@-Yv(-ZX~uE+Q#s}A7STICF&1Z z)1H-#36Mj#0wXZA3uf;0$hUvJaxgHex&SxcgaXYVrT1o@LJ~196(Q(f zjR!IIpWArvchpM#6Tu9nU^ zn0-oNEprM71-K9_&8O)59oAW+8>eVfNe`-+ICQCLHK_&vKV$O#-vvxi1@U4)%T`P> z6>vt`E8;U9P*F<{?Eb{{|nFf|Nc)|YQAo)hC+LVa=9rX1q^N9BIhol z@>#$w3yw4DSf3_06(8XNt(#DjFJNvra_^Q*aArW$T!JoOnn(=y?z5oNJ2d7@k$kvB zxv-#R6nb-?QeELbP+OO#^c6Sl#u=3&XXh9x9a{2PzfYWU_l2HAX)3+c(hUfF&xA9y z;ps{f@o9E?dnt=eqrTLjfmpXzZDuIgx@^@W`{wv6+2LgV7 zFb89O4l$4jKN^nziy`b5aHcN)MrG0UGGM5lo~jO8+3`)%H-+8Mvh$GI)#T=vC)B-xCCoR4r8-xmXHTx7toR6W9zY?pON>|aiM;!ML+ z#$b0YV-ytl5tO+?xQczk^pk+>pnBA7!R&?VaNRi9|f7ACTDCY~*dpHCT^-@ud6AUQ&_1q|tSsuUpuhPTG5hp1C|&*L`*GBybi=QJh_ zcp8uuU3=vG)EU=uT5-1$@0xN>AMn(pdz9TudmK|!$`Mrax2QU)4{j1n9#$9s$b8JN z#d*v3Vc)%5b|_Z=(S45YYI`?;t~u%jyv%5lXtR)@)i$j(=QIUtBP4@rjvenLb z8RukRrn(u;P3ep1J7-MT{gSqFp_5#-ya7fihn3c0<_@z^Di};^n?G~ojpFv#`8`Ny z=58=i<$^u5CX%rqk<-WUPEfBPs!8J40B`o5J-lss}H5|)SW{%f*4tJn^ueCG~f_g$;a~;>K z!k6pXx<|f&>(kqTNx!2wCE%)1a?~s5vXU&njjLcr3HM9a&)VC`B8$hs{{t>`7JTJo z97kd2*jd-2$A5L`A&J)5C-2nDH^jM_ok{D5X$bnvxCJ`zbX)sxkr(m~ozvyNnRfAr z36^ditQu;98TZj+lK;&wV@#RJ11W>qgkk>s`9iNtiD$$6Oj$IX&%wWV)7txL{Qr^o&<7B$OAbzSVbYq+aNq$9>7OzvBEl`eH;6XsA8 zawYw2$p72QX3EvNQI||nqx?_C?VlMLxiKQAFGO5mGwgfVWb4i=w7lsT7BIvR0>BLd zEvPireWvdO{lwsm1d!c07%6F`Z`vr@QEa^J7}}Z&Ll`b#X@Gm2v3Q95s3q6c?}XAr zQPM`G{uyOp8l-%;_k{V18k2KC#yvgr0n^e~5!v(k>%JY7MWb|{oe@Ld3)TxcYACLf zf3N$~k3Q+2Zm0$Oi0gm$fC|9rX6K6o5sunjC!VGb@7Q>q6qYZCC520yg8NaRfjKQj zBk)ngha=BW^2Msxk9K5cp61mGNPTvy$ko^mw-H1h|EC&2Sri9~wabHpnMDl;GgK*p zQ*4WTD;%n=i{LU(&@MMD;n+R;+_naexZbs*l+8@PKz%(>_!#|6U5IPowOkGk#Zg$0 zA_dli6lfH<2GP4Fc5}bsA{~LA2mNlrgFdyO4(&c*IpR7zRe1J5-t03OiY6A7DyS)m zny(AR06o-`n>N+*jQ_wH4yDCl$)(|vejk)#4Y7PJ4}5=Hm>ONO#cdUxhDk(n3o4kd z9DB{JjpzcKPEiX#uEQ6V8HMrAt zofN!aQ+PJ!3^(fOAIBZIZw;CGZ!Nrb`frtjX^en2|3!xprmyBe=@?Sd`QV^HUg)t= z+{L<&@!*9PaR^*E(Fd&53;vxxTH6hY2S)0 z^y8N}-)>a-a)GTl^V&nu$;weR1If7Yo?Q20iFXKqlv#NyB2_^4)!u7VYae?)^2~E_ z<;UTp)f2rp29Sq&6&&f5V>Ztz0n(V>Ol|xXp7mCND%Rywb$RraEtmW1wV8_JETT7y zRgvaPg@H&ggiSppO*=)J(w}KwCCh^>VK9#{c0Zgr}?D)tynrP)%|@6_dB5L{Lb;lHZ-$||AwQ?rm4R; zVZ_s}fVOCm7c<;xgP{b7x;}f6>;821Nn6GAVcqt(U+Hv~^|omq%hKI^WEgi~AcSag zd}8*AWzQ!|-WBVUpi!z@JsU_J_2Mb@B?k_T=N_%^d4@1);}S+d#{^*j6zwndqaIw* z=0g8y(TW65V;zGaiR%pj@bQ+7VwccWPT;jet;pBS)*#hz_biPH+@+@0J$l7Ca>RiO z(~bGJHP6=eG{OE*2xZLN+efY+nxX@7I!2!ccodIo4{ZXRJ68()#N^&@$}m^y+6&of z;}-t5rPNOnun(+5e@l%sw|;ms~6N|*v7XJxHw8RN_c z({*Vq6gFEA2OLNgiwWY4zGhlK5E(vYPJM0X0im&%3aLEFB`G41JG#z$vHlkexusEx zQ#4}snuk9jwkq^|)M?-Yb3jR8m%rTr^hw8&B?QVhX*KR@CRW6KvsIM7y5k$qD#1YITDY$om zp&I+WYPyyYm>wyG$0_o2irU}i3^Wzsn^7roeFE!3DaON}`oT|8!D#}tz5qFVdy>RE z*lG1vfjbe7VT(2^&fj4v4h(K-3dF0l)RI?keG;_3R`e4K&E@?=A}C8rdQ|L^iZ@hF zU7Bfh6$-?tNfKCpUmL zKu)LL1+?c>kAfbvYrRlk#XBOlUmY=PY{v@(7Ads_hScJaUbPgVIhvEho5J{n_k zP2VBP9NNE!r))&C9kKgVkD{NmXzpOKjMw4%Cu!L!$NIh?4pyHf)sdy|*cj>BL0V?X zYvWUXXV5aEjClVa?VWivm3_O%cSVK>+nBbUVUtKgW+iO0%^3<6ks(o$5;D*8tWBnf zC{d;&q|G)fp%8jAXPy(G{a*KT&U@DLKI@!!o%ft|-ha-smOm^Od++#eXj5K zx&W`n>e~pe>*s-gB)!fY!cb7R5ms8_Nkf+}!gxVE`AHL-b5(oN5!QrPO{X@Tx^fzU z5yS0d+P-$tWv+AI?C~S61IuqED&Q$c(^*@9(gP^FC}G#W1@iZ1SgS7AmP*5CYgO51 z0Q~ZeVKP}{>~6Xe;r$~ofUe(PgJYZ4*u4ey_RoC~I9*n=!ANkH(w$3z*%MIx@uUYtPMTJ=|n)9U=+b(*ym^Z)upY zb0^LC1FKZRI<&Pi6r|7gv+666I>M4KTS2bUbZ`-{{EhgrUs94;&udm9cJhUX?GicN zfhTS!7&kWFCs-h}W1k(Kly)9It#q`Trs7(!*Uwb@wMFwjMv%ntcK?|C-e9#d{!aEQ z{_aun8cF$Qk8I zZB^H-4>&@USU;~?2a%eC@AIR@d$?*hKuUfq$?*s>6fTvEB>xlQN^AFrguSlbNCT6R zIL;QL_}2(_(Ye|MTr%_pnC%m2-boX)b8bD8qsvDrRM)u+1s4!l$SrswIr0Ih1Wva> z%pYUbL&3T)i%)>67)KMdh?y{dtcCSnJG-!fR2rZa8}mLo736h3-yB-X1E)Xh%3&{e z0tCLcy$!z>cM%joUIYH1?K_&LlDp0Wz-D%AaHxOE#XjG9bD)IM>JO1~Tzxskh=bxb zM-&WN8YxT(5ztXP1H(jb!#Zzzc1AK~HnRms7kU+_RL9+oeW_$YU*t^OYAcwijBOY> z;c*8MF@wY~RB16*OwzTl(q#<(+?1}$S?S0HAyW9A(KyA?ublv2Hp}gK)ZV6p?=N4Y zg~L?*lR~j6C`o2s0F@C9vrO8~qkfw>6JhiFwM^oIE;(2~}#4niyZO3fA z9f#PdzE5)4qaAtCu%1CkEpcAJ3Q~72xPVdX1(GFh9unizxq{_f9;m)6ZV6&UJsyl8 zuA@*2pb;z>iA$rpkK`7VBpP_7s&mtwTM+wEN){U@g##{*S{(aCQQd#ij8M7%jpg51z~5(mEZf8`*msahBZfjzYKp2sXy^w@C4xhL`~Ht8 z?w_hT{^NIwr}CviLHM)mtD7wH36LohR;eFu+fo|{Cag`8<`Jhh*ji$kRgs9c8*GCR zL5+&1f=UpcIRFkY#S&;X;L?+;9a2zY8=HlSM;6Q$6;AsJ;UQ>mI2+zTi-A;FY><(G zJM3V1OAXE)OlK@YxIk*(O&~!KatC}!!FoJA1!c;mH%Kv3AtL}%Peh~-CoF7{`T!I~ zjSH6ED=vZx|7&`*z$T}8Suw;5cIrd*)&gX8gEdy0oG>2R(e?MT{4!7&!eft>w9#ZZxIXhKvJK3x z*iA%mh|Q1#po9qFM@%r#EBV(7KqN~Y-aud5)jXm_X+5aZx&hRMgbC6my9^D7=?e`k zC4jJ`={Hozgk@}9ge@IjIEo&Z0wT0(L@S@5q5(5=p9E4yX<-ueztgx@hLc(2u{U2& z3t8tupG%tWpG&TUsykzKLgOc@AhS{9cKGx(+2KA-_%~2h!kyx1EyIdPHz%a z^d3B%{vDKyivlQzwhw+~34?+r8v#fzsGGQ(!qbB|R9ufB(^9$#FCmJVh^v@Oa*%GX zXaE@!Y^XFhIl*jt{5MSZC6fyouUfz)wT26?sX%lAU#cO_`aP+Olj65xvu*kbF0M|b zwj%&rE%Xoh2x|fObR6jaeFM8x42NzJ&IX7k32JjJdboHA-jr{{5t&ELS~61ZI^61GriyX?Go;T zxGtq7c7jQ3`+;f{cm|YD$-h9(z!3oZ^5zta4MaBqbHh793bNsSl8;;=Xo2rMCJw18 zB0QXcHQt>?6t|2)dBiZRu;m%4X?Oq)_JYB`*ssl*e6O{JE92+wIKlW|ie}S_#nUf8 z=gsud;|rqQul4A^({lEY{cgg%DRxFBN!%|_yT;Zga4)IPDuNHhoc9S ztsiMbTW3QTOxUfR@o^iV1XjE=GrrSv_#Y~_|AXD7>)(b66yRXl7JI zMC$p4y|0F7s73IyxnxqaQ>mO)aXv@(z_O^|nMr2p2F3<193N?DjE%|DTduMg8H>b4 z@(<^QonLjK4JWte?kzOzl=TicW|R^8>6_in_4PYjT3Wihy8$5;6%{oO{zb&m(J{pt zigCca!cXm%3=9n9;NWoLvFe_ihrE0HAW$qGk3s@{h_J6!!sGmW9t=iENa$lcfWL2( zlWki;db+xsTU)PQzI-ZRU}0+7AA3ld?BMH5fo^~toSfO_qN0V{+uI;UFGy@}Z?CPb z)z;D~IG$+d=m;s!`7=6xyU-U-ez;sPHQiX7PQ02) z?R5QmHriD1BKpE^J6l^7i_R?N^Jx^MpE?|cFKkUrObocv?JX^{Vq-fYmm>2-L`F7t z?Cf}pi$8~}MY0zmll`k)TwSHGXEp)_o+Y?fWd-m_4s;J%GZ8$9hD&SHMwo077ZGlK zPfyP_*B8&K-Iw`q?TX00N0pRoM}JgIOjcI5al!1sfdf1|JS8P1bF22nZ|~&g<&k1| zh0p?Q4Dnrd33%=9hzNQQgY*byy3@|{^YhNPS1@u4NxL_V`|EEtTJh_*{qFx3M!i|8BXJKr-wmf#G3%BoBabY21 z&NT>6x#Dp87l+90g@pyvuTQ)yyu7`4wzuPW{Z>LkLyZg#x?gg3;?CdZ19dvj}(< zQ!Nzprb+;4|okgIFMA2?1&7AvPz-&&ob1@t%*>pQE}fQ^z`%?85wPC+1{gqL9LP87&KK1Z_ZUV6(7p4 zXf8z&5qgKmd!oztGh?xD%FB%n4Rg3=NCjUTo0~;LgjiEkQ=QXRPA!q~)ARG{`-O#t zr#=+2F`Vr(aAD;u89-}mFhtN5JiY8fW5&k8F)%oINKBmSoB?}H&Qze1l$5~FaTF~0 z+~exXw$?LYvf3ZH!x)g~KP4AdkeVSQBjd^-4wcVUc z>J}{>JZx8#6_h-x{czGYb^W(z*5|)%SG!^FMe*LPv9OGR$Gc(iHrj?{U zZf`g&GIG4Orsf42e;UifQ^Z_`^3d3~r->-c#lK1{671{k4G9TZ8UgxpO}m>yKjd}q zUK)$sCeh&dBvthnwCZiDyUDnqDcT3nHY?^Kf&YK { + const allowed = { enabled: true, slots: ["a", "b"], cooldown_seconds: 300, restart_clients: true }; + const result = decide(input({ policy: allowed, observations: [sample("a", 100), { ...sample("b"), observed_at: 950 }] })); + assert.equal(result.restart_clients, true); + assert.equal(result.valid_until, 1070); + assert.equal(decide(input({})).restart_clients, false, "Existing policies do not gain client shutdown authority"); + assert.equal(decide(input({ policy: allowed, observations: [sample("a"), sample("b")] })).restart_clients, false); + assert.equal(decide(input({ policy: allowed, manual_slot: "b" })).valid_until, null, + "An explicit sign-in choice is not an automatic quota decision"); +}); diff --git a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native.py b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native.py index 1a9dbd1041..1542c9b978 100644 --- a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native.py +++ b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native.py @@ -67,9 +67,27 @@ def policy(request: dict) -> dict: def host(adapter: dict, operation: str, **parameters) -> dict: - result = subprocess.run([sys.executable, "-m", "loopx_codex_provider_routing.native_host"], - input=json.dumps({"adapter": adapter, "operation": operation, **parameters}), - capture_output=True, text=True, timeout=150) + receipt = parameters.pop("handoff_receipt", None) + command = [sys.executable, "-m", "loopx_codex_provider_routing.native_host"] + request = json.dumps({"adapter": adapter, "operation": operation, **parameters}) + if receipt: + # Closing the calling native App must not close this continuation or + # its result channel. All native sub-operations have bounded waits. + process = subprocess.Popen([*command, "--result-file", receipt], stdin=subprocess.PIPE, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + text=True, start_new_session=True) + try: + process.communicate(request, timeout=150) + except subprocess.TimeoutExpired: + # Do not kill a credential transaction. A separate reaper owns only + # this child; the receipt fences retries even if its caller exits. + threading.Thread(target=process.communicate, daemon=True).start() + raise HostError("handoff_pending") from None + packet = private_read(Path(receipt)) + if packet.get("ok") is not True: + raise HostError(packet.get("code", "native_unavailable")) + return packet["result"] + result = subprocess.run(command, input=request, capture_output=True, text=True, timeout=150) if len(result.stdout) > 131072: raise HostError("native_unavailable") try: @@ -92,11 +110,11 @@ def _load(self) -> dict: if self.path.exists(): return private_read(self.path) return {"schema_version": SCHEMA, "revision": 0, - "policy": {"enabled": False, "slots": [], "cooldown_seconds": 300}, + "policy": {"enabled": False, "slots": [], "cooldown_seconds": 300, "restart_clients": False}, "observations": [], "last_switch_at": None, "action": "disabled"} @contextmanager - def _lock(self): + def _lock(self, *, wait_seconds: float = 0): if os.name != "posix": raise HostError("platform_unavailable") import fcntl @@ -110,7 +128,15 @@ def _lock(self): if path.is_symlink(): raise HostError("state_untrusted") with open(path, "a", opener=lambda p, flags: os.open(p, flags, 0o600)) as stream: - fcntl.flock(stream, fcntl.LOCK_EX | fcntl.LOCK_NB) + deadline = time.monotonic() + wait_seconds + while True: + try: + fcntl.flock(stream, fcntl.LOCK_EX | fcntl.LOCK_NB) + break + except BlockingIOError: + if time.monotonic() >= deadline: + raise + time.sleep(0.05) yield def _projection(self, state: dict, native: dict | None = None) -> dict: @@ -120,11 +146,13 @@ def _projection(self, state: dict, native: dict | None = None) -> dict: "active_slot": native.get("active_slot"), "selection_revision": native.get("selection_revision"), "login_matches": native.get("current_login_matches"), - "recovery_required": native.get("recovery_required", False), + "recovery_required": native.get("recovery_required", False) or state.get("action") == "handoff_interrupted", "action": state.get("action", "disabled"), "target": state.get("target"), "retry_at": state.get("retry_at"), "last_checked_at": state.get("last_checked_at"), "last_switch_at": state.get("last_switch_at"), "accounts": state.get("accounts", []), - "code": state.get("code"), "launch_failed": state.get("launch_failed", False), + "code": state.get("code"), + "launch_failed": state.get("launch_failed", False) and native.get("client_running") is not True, + "client_running": native.get("client_running"), "automatic_hot_swap": False} def status(self) -> dict: @@ -133,13 +161,22 @@ def status(self) -> dict: native = self.transport(adapter, "status") return self._projection(state, native) - def configure(self, *, expected_revision: int, enabled: bool, slots: list[str], reconnect: bool = False) -> dict: + def configure(self, *, expected_revision: int, enabled: bool, slots: list[str], reconnect: bool = False, + restart_clients: bool | None = None) -> dict: if type(enabled) is not bool or not isinstance(slots, list) or len(slots) > 16 or len(slots) != len(set(slots)): raise HostError("invalid_policy") - with self._lock(): + if restart_clients is not None and type(restart_clients) is not bool: + raise HostError("invalid_policy") + # Stop requests fence new effects at the Watcher first, then persist + # after an already dispatched atomic switch finishes. Other mutations + # retain their immediate conflict behavior. + with self._lock(wait_seconds=155 if not enabled else 0): state = self._load() if state["revision"] != expected_revision: raise HostError("configuration_changed") + pending = state.get("intent") or {} + if pending.get("handoff_receipt") and enabled: + raise HostError("handoff_pending") # Disabling works offline and never needs credentials or a client. if enabled or reconnect: adapter = discover() if reconnect or "adapter" not in state else state["adapter"] @@ -149,8 +186,11 @@ def configure(self, *, expected_revision: int, enabled: bool, slots: list[str], if not slots or not set(slots) <= set(native["slots"]): raise HostError("invalid_slots") state.update(adapter=adapter, native=native) - state.update(policy={"enabled": enabled, "slots": slots, "cooldown_seconds": 300}, - revision=state["revision"] + 1, retry_at=None, code=None, intent=None, + state.update(policy={"enabled": enabled, "slots": slots, "cooldown_seconds": 300, + "restart_clients": restart_clients if restart_clients is not None + else state["policy"].get("restart_clients", False)}, + revision=state["revision"] + 1, retry_at=None, code=None, + intent=pending if pending.get("handoff_receipt") else None, action="checking" if enabled else "disabled", failure_count=0) atomic(self.path, state) return self._projection(state) @@ -164,7 +204,7 @@ def tick(self, *, refresh: bool = False, manual_slot: str | None = None, if operation_id and operation_id == state.get("last_operation_id"): return self._projection(state) now = self.clock() - if not state["policy"]["enabled"] and not refresh and not manual_slot: + if not state["policy"]["enabled"] and not refresh and not manual_slot and not state.get("intent"): return self._projection(state) if not refresh and not manual_slot and now < (state.get("retry_at") or 0): return self._projection(state) @@ -183,11 +223,29 @@ def tick(self, *, refresh: bool = False, manual_slot: str | None = None, raise HostError("selection_changed") previous = state.get("native", {}).get("selection_revision") intent = state.get("intent") + receipt = None + if intent and intent.get("handoff_receipt"): + path = Path(intent["handoff_receipt"]) + if path.exists(): + receipt = private_read(path) + else: + # A detached switch may still be exiting/reopening the + # native client. Never launch a second switch on retry. + interrupted = self.clock() - intent["started_at"] > 180 + state.update(native=native, action="handoff_interrupted" if interrupted else "restarting", + retry_at=self.clock() + 5, code="handoff_interrupted" if interrupted else None) + atomic(self.path, state) + return self._projection(state) + if receipt.get("ok") is not True: + state["intent"] = None + raise HostError(receipt.get("code", "native_unavailable")) if intent and native["active_slot"] == intent["target"] and not native["recovery_required"] and native["current_login_matches"] is True: # An interrupted caller may have lost the successful reply. # Read back selection; never replay a switch or a model turn. state.update(native=native, intent=None, last_switch_at=now, action="selected", target=None, - retry_at=now + 300, code=None, failure_count=0) + retry_at=now + 300, code=None, failure_count=0, + launch_failed=receipt["result"].get("launch_failed", False) if receipt + else native.get("client_running") is False) atomic(self.path, state) return self._projection(state) state["native"] = native @@ -230,20 +288,39 @@ def tick(self, *, refresh: bool = False, manual_slot: str | None = None, # Native owner rechecks the same fence inside its transaction. state["intent"] = {"id": operation_id or uuid.uuid4().hex, "source_revision": native["selection_revision"], "target": decision["target"]} + effects = {"restart_clients": decision["restart_clients"], "not_after": decision["valid_until"]} + if decision["restart_clients"]: + directory = self.root / "handoffs" + if directory.is_symlink(): + raise HostError("state_untrusted") + directory.mkdir(mode=0o700, exist_ok=True) + receipt_path = directory / (uuid.uuid4().hex + ".json") + state["intent"].update(handoff_receipt=str(receipt_path), started_at=self.clock()) + state["action"] = "restarting" + effects["handoff_receipt"] = str(receipt_path) atomic(self.path, state) - result = self.transport(state["adapter"], "switch", slot=decision["target"], - expected_revision=native["selection_revision"], reopen=True) + try: + result = self.transport(state["adapter"], "switch", slot=decision["target"], + expected_revision=native["selection_revision"], reopen=True, **effects) + except Exception as error: + if getattr(error, "code", None) != "handoff_pending": + # A returned failure means this worker has stopped. + # A lost caller instead leaves its durable receipt. + state["intent"] = None if decision["restart_clients"] else state["intent"] + raise state.update(native=result, intent=None, last_switch_at=self.clock(), action="selected", target=None, retry_at=self.clock() + 300, launch_failed=result["launch_failed"], failure_count=0) if operation_id: state["last_operation_id"] = operation_id except (HostError, OSError, ValueError, subprocess.SubprocessError) as error: code = error.code if isinstance(error, HostError) else "native_unavailable" - # Busy is a normal safe-boundary wait; no process is terminated. + # Unrelated/remaining owners still require a safe-boundary wait. # Other repeated failures stop automatic attempts until Refresh. - failures = state.get("failure_count", 0) + (code != "waiting_for_idle") - state.update(action=code if code in ("waiting_for_idle", "selection_changed", "adapter_changed") else "unavailable", - code=code, retry_at=self.clock() + min(300, 60 * 2 ** min(failures, 3)), failure_count=failures) + failures = state.get("failure_count", 0) + (code not in ("waiting_for_idle", "handoff_pending")) + if code in ("other_clients_busy", "client_quit_refused", "client_quit_timeout", "client_changed"): + failures = 3 # Do not repeatedly close/reopen a refused client. + state.update(action=code if code in ("waiting_for_idle", "selection_changed", "adapter_changed", "client_quit_refused", "client_quit_timeout", "client_changed", "handoff_pending") else "unavailable", + code=code, retry_at=self.clock() + (5 if code == "handoff_pending" else min(300, 60 * 2 ** min(failures, 3))), failure_count=failures) if manual_slot: state["last_operation_id"] = operation_id atomic(self.path, state) @@ -254,12 +331,39 @@ def recover(self, *, rollback: bool, expected_revision: int, expected_selection: state = self._load() if state["revision"] != expected_revision or "adapter" not in state: raise HostError("configuration_changed") - native = self.transport(state["adapter"], "rollback" if rollback else "recover", expected_revision=expected_selection) + native = self.transport(state["adapter"], "status") + intent = state.get("intent") or {} + if intent.get("handoff_receipt") and not native["recovery_required"] and not rollback: + if native["selection_revision"] != expected_selection: + raise HostError("selection_changed") + path = Path(intent["handoff_receipt"]) + if not path.exists(): + marker = path.with_suffix(".pid.json") + if not marker.exists(): + raise HostError("handoff_pending") + try: + os.kill(private_read(marker)["pid"], 0) + except ProcessLookupError: + pass + else: + raise HostError("handoff_pending") + else: + native = self.transport(state["adapter"], "rollback" if rollback else "recover", expected_revision=expected_selection) state.update(native=native, intent=None, action="disabled", retry_at=None, code=None, policy={**state["policy"], "enabled": False}, revision=state["revision"] + 1, failure_count=0) atomic(self.path, state) return self._projection(state) + def reopen(self, *, expected_selection: str) -> dict: + with self._lock(): + state = self._load() + if "adapter" not in state or state.get("intent"): + raise HostError("handoff_pending") + native = self.transport(state["adapter"], "reopen", expected_revision=expected_selection) + state.update(native=native, launch_failed=False, code=None) + atomic(self.path, state) + return self._projection(state) + class Watcher: """Owned by the serving App (or explicit CLI watch), never an import effect.""" @@ -294,7 +398,7 @@ def close(self): def main() -> int: parser = argparse.ArgumentParser(prog="loopx-codex-accounts") - parser.add_argument("operation", choices=("status", "configure", "refresh", "switch", "recover", "rollback", "watch")) + parser.add_argument("operation", choices=("status", "configure", "refresh", "switch", "recover", "rollback", "reopen", "watch")) parser.add_argument("--runtime-root", type=Path, default=Path.home() / ".loopx") args = parser.parse_args() provider = NativeAccounts(args.runtime_root) @@ -313,6 +417,8 @@ def main() -> int: result = provider.configure(**request) elif args.operation in ("refresh", "switch"): result = provider.tick(refresh=True, **request) + elif args.operation == "reopen": + result = provider.reopen(**request) else: result = provider.recover(rollback=args.operation == "rollback", **request) print(json.dumps({"ok": True, **result})) diff --git a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py index 5cc32c516f..ef9e89f43d 100644 --- a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py +++ b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py @@ -27,6 +27,17 @@ def __init__(self, code: str): super().__init__(code) +# Address one inspected process, not an App bundle id shared by other routes. +# terminate() requests the normal AppKit quit lifecycle and can be refused. +QUIT = '''ObjC.import("AppKit"); +function run(argv) { + var app = $.NSRunningApplication.runningApplicationWithProcessIdentifier(Number(argv[0])); + if (!app || app.isTerminated) return; + if (ObjC.unwrap(app.executableURL.path) !== argv[1]) throw Error("Client executable changed"); + if (!app.terminate) throw Error("Client refused normal quit"); +}''' + + def trusted_file(path: Path) -> Path: path = path.resolve(strict=True) info = path.stat() @@ -61,8 +72,11 @@ def __init__(self, adapter: dict, *, user_home: Path | None = None): self.home = user_home or Path.home() self.spec = self.apps.route(self.home, "gpt") self.expected = None + self.not_after = None def idle(): + if self.not_after is not None and time.time() >= self.not_after: + raise HostError("quota_stale") try: self.apps.account_idle(self.home, self.spec) except (ValueError, OSError, subprocess.SubprocessError): @@ -84,19 +98,88 @@ def revision(self) -> str: def status(self) -> dict: self.apps.check_provider(self.spec, "gpt") value = self.manager.status() - return {key: value[key] for key in ( + result = {key: value[key] for key in ( "slots", "active_slot", "current_login_matches", "recovery_required" )} | {"selection_revision": self.revision()} + if sys.platform == "darwin": + exe = self.apps.executable(self.apps.app_bundle(self.spec, "gpt", self.home)) + result["client_running"] = self.apps.running(exe, self.spec) is not None + return result + + def close_client(self, expected: str, *, timeout: float = 25) -> bool: + exe = self.apps.executable(self.apps.app_bundle(self.spec, "gpt", self.home)) + pid = self.apps.running(exe, self.spec) + if self.revision() != expected: + raise HostError("selection_changed") + if pid is None: + return False + # Recheck exact ownership immediately before requesting a normal quit. + if self.apps.running(exe, self.spec) != pid: + raise HostError("client_changed") + try: + subprocess.run(["/usr/bin/osascript", "-l", "JavaScript", "-", str(pid), str(exe)], + input=QUIT, text=True, check=True, capture_output=True, timeout=10) + except (OSError, subprocess.SubprocessError): + raise HostError("client_quit_refused") from None + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + current = self.apps.running(exe, self.spec) + if current is None: + return True + if current != pid: + raise HostError("client_changed") + time.sleep(0.1) + raise HostError("client_quit_timeout") + + def reopen(self, expected: str) -> dict: + value = self.status() + if value["selection_revision"] != expected or value["recovery_required"] or value["current_login_matches"] is not True: + raise HostError("selection_changed") + self.apps.open_app(self.home, "gpt", []) + return self.status() - def switch(self, slot: str, expected: str, *, reopen: bool) -> dict: + def switch(self, slot: str, expected: str, *, reopen: bool, restart_clients: bool = False, + not_after: float | None = None) -> dict: if sys.platform != "darwin": raise HostError("platform_unavailable") self.expected = expected - self.status() + self.not_after = not_after + before = self.status() + if before["selection_revision"] != expected or before["recovery_required"] or before["current_login_matches"] is not True: + raise HostError("selection_changed") # idle() is rechecked by the native owner under launch/account locks, # and immediately before its first mutation. This is the CAS fence, # including against manual selections outside LoopX. - result = self.manager.switch(slot) + try: + if restart_clients: + if not_after is not None and time.time() >= not_after: + raise HostError("quota_stale") + self.close_client(expected) + # Children may flush and exit just after their App root. An + # unrelated CLI/file owner remains a hold, never a kill target. + deadline = time.monotonic() + 10 + while True: + try: + self.manager.idle() + break + except HostError as error: + if error.code != "waiting_for_idle": + raise + if time.monotonic() >= deadline: + raise HostError("other_clients_busy") from None + time.sleep(0.2) + result = self.manager.switch(slot) + except Exception as error: + # A refused/failed transaction must not unnecessarily leave a + # normally closed source App down. Native preflight blocks opening + # an incomplete credential journal; a later manual choice wins. + if restart_clients and before.get("client_running") and getattr(error, "code", None) != "client_changed": + try: + if self.status().get("client_running") is False: + self.reopen(expected) + except (HostError, OSError, ValueError, subprocess.SubprocessError): + pass + raise value = self.status() if value["active_slot"] != slot or value["current_login_matches"] is not True: raise HostError("readback_failed") @@ -106,6 +189,10 @@ def switch(self, slot: str, expected: str, *, reopen: bool) -> dict: self.apps.open_app(self.home, "gpt", []) except (OSError, ValueError, subprocess.SubprocessError): launch_failed = True + after = self.status() + if after["selection_revision"] != value["selection_revision"]: + raise HostError("selection_changed") + value = after return value | {"history_untouched": result["history_untouched"], "launch_failed": launch_failed} def recover(self, rollback: bool, expected: str) -> dict: @@ -294,6 +381,10 @@ def call(index, method, params): def main() -> int: + if len(sys.argv) == 3 and sys.argv[1] == "--result-file": + from .native import SCHEMA, atomic + atomic(Path(sys.argv[2]).with_suffix(".pid.json"), + {"schema_version": SCHEMA, "pid": os.getpid()}) try: request = json.load(sys.stdin) host = NativeHost(request["adapter"]) @@ -303,16 +394,25 @@ def main() -> int: elif operation == "observe": value = host.observe(request["slots"], request["expected_revision"], request.get("auth_failures")) elif operation == "switch": - value = host.switch(request["slot"], request["expected_revision"], reopen=request["reopen"]) + value = host.switch(request["slot"], request["expected_revision"], reopen=request["reopen"], + restart_clients=request.get("restart_clients", False), not_after=request.get("not_after")) + elif operation == "reopen": + value = host.reopen(request["expected_revision"]) elif operation in ("recover", "rollback"): value = host.recover(operation == "rollback", request["expected_revision"]) else: raise HostError("unsupported_operation") - print(json.dumps({"ok": True, "result": value})) - return 0 + packet = {"ok": True, "result": value} except Exception as error: # Native diagnostics can contain paths/identities. - print(json.dumps({"ok": False, "code": error.code if isinstance(error, HostError) else "native_unavailable"})) - return 1 + packet = {"ok": False, "code": error.code if isinstance(error, HostError) else "native_unavailable"} + if len(sys.argv) == 3 and sys.argv[1] == "--result-file": + # A detached worker completes even if its calling Codex App goes away. + # The private receipt lets a restarted observer reconcile, not replay. + from .native import SCHEMA, atomic + atomic(Path(sys.argv[2]), {"schema_version": SCHEMA, **packet}) + else: + print(json.dumps(packet)) + return 0 if packet["ok"] else 1 if __name__ == "__main__": diff --git a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy.ts b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy.ts index 6c334bac9e..74de49ad5f 100644 --- a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy.ts +++ b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_policy.ts @@ -17,7 +17,7 @@ export type Account = { secondary_used: number | null; credits_available: boolean | null; }; -export type Policy = { enabled: boolean; slots: string[]; cooldown_seconds: number }; +export type Policy = { enabled: boolean; slots: string[]; cooldown_seconds: number; restart_clients?: boolean }; const number = (v: unknown): v is number => typeof v === "number" && Number.isFinite(v); const percent = (v: unknown): number | null => number(v) && v >= 0 && v <= 100 ? v : null; @@ -71,7 +71,11 @@ export function decide(input: { }) { const accounts = input.observations.map(o => account(o, input.now)); const output = (action: string, target: string | null = null, retry_at: number | null = null) => - ({ action, target, retry_at, accounts }); + ({ action, target, retry_at, accounts, + restart_clients: action === "switch" && input.policy.restart_clients === true, + valid_until: action === "switch" && !input.manual_slot + ? Math.min(...accounts.filter(a => a.slot === input.active || a.slot === target).map(a => a.observed_at + 120)) + : null }); if (input.recovery_required) return output("recovery_required"); if (!input.login_matches || !input.active) return output("selection_changed"); if (!input.manual_slot && !input.policy.enabled) return output("disabled"); diff --git a/tests/presentation/test_codex_accounts.py b/tests/presentation/test_codex_accounts.py index 8397b3ad8f..8f710f294f 100644 --- a/tests/presentation/test_codex_accounts.py +++ b/tests/presentation/test_codex_accounts.py @@ -7,7 +7,10 @@ import json import os from pathlib import Path +import subprocess +import sys import threading +import time from types import SimpleNamespace import pytest @@ -74,6 +77,9 @@ def __call__(self, adapter, operation, **parameters): assert parameters["expected_revision"] == self.revision self.pending = False return self(adapter, "status") + if operation == "reopen": + assert parameters["expected_revision"] == self.revision + return self(adapter, "status") | {"client_running": True} raise AssertionError(operation) @@ -275,3 +281,238 @@ def _send_json(self, payload, *, status=200): handler._codex_accounts_write() assert handler.code == 409 and handler.sent["code"] == "invalid_request" assert "synthetic-only" not in json.dumps(handler.sent) + + +def test_client_restart_requires_explicit_opt_in_and_old_policy_stays_off(native, tmp_path): + provider, transport, _ = configured(native, tmp_path) + assert provider.tick()["action"] == "selected" + first = next(args for op, args in transport.calls if op == "switch") + assert first["restart_clients"] is False and "handoff_receipt" not in first + assert first["not_after"] == 1120 + # Older saved policies without this new permission remain wait-only. + state = provider._load() + state["policy"].pop("restart_clients") + native.atomic(provider.path, state) + assert provider.configure(expected_revision=1, enabled=True, slots=["a", "b"])["policy"]["restart_clients"] is False + with pytest.raises(Exception, match="invalid_policy"): + provider.configure(expected_revision=2, enabled=True, slots=["a", "b"], restart_clients="yes") + + +def test_opted_in_handoff_has_private_receipt_and_no_replayed_switch(native, tmp_path): + provider, transport, clock = configured(native, tmp_path) + provider.configure(expected_revision=1, enabled=True, slots=["a", "b"], restart_clients=True) + original = transport.__call__ + effect = {} + + def pending(adapter, operation, **parameters): + if operation == "switch": + effect.update(parameters) + raise native.HostError("handoff_pending") + return original(adapter, operation, **parameters) + + provider.transport = pending + assert provider.tick()["action"] == "handoff_pending" + assert effect["restart_clients"] is True + assert Path(effect["handoff_receipt"]).parent.stat().st_mode & 0o077 == 0 + clock.now += 61 + assert provider.tick()["action"] == "restarting" + # Only the completed worker receipt can reconcile the pending operation. + transport.active, transport.revision = "b", "selected" + native.atomic(Path(effect["handoff_receipt"]), {"schema_version": native.SCHEMA, + "ok": True, "result": {"launch_failed": True}}) + result = provider.tick(refresh=True) + assert result["action"] == "selected" and result["launch_failed"] + before = len(transport.calls) + provider.transport = transport + assert provider.reopen(expected_selection="selected")["launch_failed"] is False + assert [op for op, _ in transport.calls[before:]] == ["reopen", "status"] + + +def test_unresolved_worker_never_replays_or_reconfigures_an_enabled_handoff(native, tmp_path): + provider, transport, clock = configured(native, tmp_path) + provider.configure(expected_revision=1, enabled=True, slots=["a", "b"], restart_clients=True) + original = transport.__call__ + switches = [] + + def pending(adapter, operation, **parameters): + if operation == "switch": + switches.append(parameters) + raise native.HostError("handoff_pending") + return original(adapter, operation, **parameters) + + provider.transport = pending + provider.tick() + clock.now += 181 + assert provider.tick(refresh=True)["recovery_required"] + assert len(switches) == 1 + with pytest.raises(Exception, match="handoff_pending"): + provider.configure(expected_revision=2, enabled=True, slots=["a", "b"], reconnect=True) + # Disabling cannot discard a worker that may be committing native state. + provider.configure(expected_revision=2, enabled=False, slots=["a", "b"]) + assert provider._load()["intent"]["handoff_receipt"] == switches[0]["handoff_receipt"] + assert provider.tick(refresh=True)["action"] == "handoff_interrupted" + with pytest.raises(Exception, match="handoff_pending"): + provider.recover(rollback=False, expected_revision=3, expected_selection="initial") + # Recovery can retire a proven exited worker without inventing a native + # credential rollback when the worker never began a credential journal. + child = subprocess.Popen([sys.executable, "-c", "pass"]) + child.wait(timeout=5) + marker = Path(switches[0]["handoff_receipt"]).with_suffix(".pid.json") + native.atomic(marker, {"schema_version": native.SCHEMA, "pid": child.pid}) + result = provider.recover(rollback=False, expected_revision=3, expected_selection="initial") + assert result["policy"]["enabled"] is False and provider._load()["intent"] is None + + +def test_refused_client_is_not_repeatedly_closed_in_the_background(native, tmp_path): + provider, transport, clock = configured(native, tmp_path) + provider.configure(expected_revision=1, enabled=True, slots=["a", "b"], restart_clients=True) + calls = [] + + def refused(adapter, operation, **parameters): + if operation == "switch": + calls.append(parameters) + raise native.HostError("client_quit_refused") + return transport(adapter, operation, **parameters) + + provider.transport = refused + assert provider.tick()["action"] == "client_quit_refused" + clock.now += 1000 + provider.tick() + assert len(calls) == 1 and transport.active == "a" + provider.tick(refresh=True) + assert len(calls) == 2 # A deliberate check authorizes one new attempt. + + +def test_disable_waits_for_owned_transaction_then_persists_off(native, tmp_path): + provider, transport, _ = configured(native, tmp_path) + transport.entered, transport.release = threading.Event(), threading.Event() + active = threading.Thread(target=provider.tick) + active.start() + assert transport.entered.wait(5) + result, errors = [], [] + + def disable(): + try: + result.append(provider.configure(expected_revision=1, enabled=False, slots=["a", "b"])) + except Exception as error: + errors.append(error) + + request = threading.Thread(target=disable) + request.start() + assert request.is_alive() + transport.release.set() + active.join(10) + request.join(10) + assert not errors and result[0]["policy"]["enabled"] is False + before = len(transport.calls) + assert provider.tick()["action"] == "disabled" and len(transport.calls) == before + + +def client_host(native, monkeypatch): + from loopx_codex_provider_routing import native_host as module + + monkeypatch.setattr(module.sys, "platform", "darwin") + adapter = module.NativeHost.__new__(module.NativeHost) + state = {"pid": 11, "active": "a", "revision": "initial", "quit": [], "switch": 0, "open": 0} + adapter.home, adapter.spec = Path("/synthetic"), {} + adapter.revision = lambda: state["revision"] + adapter.status = lambda: {"active_slot": state["active"], "selection_revision": state["revision"], + "current_login_matches": True, "recovery_required": False, + "client_running": state["pid"] is not None} + + def idle(): + if state["pid"] is not None: + raise module.HostError("waiting_for_idle") + if adapter.revision() != adapter.expected: + raise module.HostError("selection_changed") + + def switch(slot): + idle() + state.update(active=slot, revision="selected", switch=state["switch"] + 1) + return {"history_untouched": True} + + def reopen(*_): + state.update(pid=22, open=state["open"] + 1) + + def quit(command, **parameters): + state["quit"].append(command) + assert "app.terminate" in parameters["input"] and "forceTerminate" not in parameters["input"] + assert command[-2:] == ["11", "/synthetic/GPT.app/Contents/MacOS/GPT"] + state["pid"] = None + + adapter.manager = SimpleNamespace(switch=switch, idle=idle) + adapter.apps = SimpleNamespace(executable=lambda _: Path("/synthetic/GPT.app/Contents/MacOS/GPT"), + app_bundle=lambda *_: None, running=lambda *_: state["pid"], open_app=reopen) + monkeypatch.setattr(module.subprocess, "run", quit) + return adapter, state, module + + +def test_normal_quit_precedes_native_idle_transaction_and_same_route_reopen(native, monkeypatch): + adapter, state, _ = client_host(native, monkeypatch) + result = adapter.switch("b", "initial", reopen=True, restart_clients=True) + assert state["quit"] and state["switch"] == 1 and state["open"] == 1 + assert result["active_slot"] == "b" and result["client_running"] is True + + +def test_wait_only_mode_does_not_quit_a_client(native, monkeypatch): + adapter, state, _ = client_host(native, monkeypatch) + with pytest.raises(Exception, match="waiting_for_idle"): + adapter.switch("b", "initial", reopen=True) + assert not state["quit"] and state["active"] == "a" + + +def test_quit_refusal_and_timeout_do_not_mutate_credentials(native, monkeypatch): + adapter, state, module = client_host(native, monkeypatch) + + def refuse(*_, **__): + raise module.subprocess.CalledProcessError(1, "synthetic") + + monkeypatch.setattr(module.subprocess, "run", refuse) + with pytest.raises(Exception, match="client_quit_refused"): + adapter.switch("b", "initial", reopen=True, restart_clients=True) + assert state["switch"] == 0 and state["open"] == 0 + monkeypatch.setattr(module.subprocess, "run", lambda *_, **__: None) + with pytest.raises(Exception, match="client_quit_timeout"): + adapter.close_client("initial", timeout=0) + assert state["active"] == "a" + + +def test_manual_selection_and_new_client_prevent_closing_the_wrong_process(native, monkeypatch): + adapter, state, _ = client_host(native, monkeypatch) + with pytest.raises(Exception, match="selection_changed"): + adapter.switch("b", "stale", reopen=True, restart_clients=True) + assert not state["quit"] + owners = iter([11, 33]) + adapter.apps.running = lambda *_: next(owners) + with pytest.raises(Exception, match="client_changed"): + adapter.switch("b", "initial", reopen=True, restart_clients=True) + assert not state["quit"] and state["switch"] == 0 and state["open"] == 0 + + +def test_native_switch_failure_reopens_source_without_replaying_account_selection(native, monkeypatch): + adapter, state, module = client_host(native, monkeypatch) + adapter.manager.switch = lambda _: (_ for _ in ()).throw(module.HostError("readback_failed")) + with pytest.raises(Exception, match="readback_failed"): + adapter.switch("b", "initial", reopen=True, restart_clients=True) + assert state["active"] == "a" and state["open"] == 1 + + +def test_manual_selection_during_quit_wins_before_any_credential_write(native, monkeypatch): + adapter, state, module = client_host(native, monkeypatch) + quit = module.subprocess.run + + def manual_choice(*args, **kwargs): + quit(*args, **kwargs) + state.update(active="c", revision="manual") + + monkeypatch.setattr(module.subprocess, "run", manual_choice) + with pytest.raises(Exception, match="selection_changed"): + adapter.switch("b", "initial", reopen=True, restart_clients=True) + assert state["active"] == "c" and state["switch"] == 0 and state["open"] == 0 + + +def test_expired_automatic_evidence_does_not_even_quit_the_client(native, monkeypatch): + adapter, state, _ = client_host(native, monkeypatch) + with pytest.raises(Exception, match="quota_stale"): + adapter.switch("b", "initial", reopen=True, restart_clients=True, not_after=time.time() - 1) + assert not state["quit"] and not state["switch"] From 72909dea1ce93ae3aedc186507551513837743fb Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 18 Oct 2026 15:45:04 +0800 Subject: [PATCH 5/7] fix(accounts): wait for native app registration before normal quit Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../native_host.py | 13 +++++- tests/presentation/test_codex_accounts.py | 41 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py index ef9e89f43d..878e7d3b4c 100644 --- a/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py +++ b/packages/loopx-codex-provider-routing/src/loopx_codex_provider_routing/native_host.py @@ -31,8 +31,17 @@ def __init__(self, code: str): # terminate() requests the normal AppKit quit lifecycle and can be refused. QUIT = '''ObjC.import("AppKit"); function run(argv) { - var app = $.NSRunningApplication.runningApplicationWithProcessIdentifier(Number(argv[0])); - if (!app || app.isTerminated) return; + var app; + // Process discovery can precede Launch Services registration. Do not read + // executableURL.path until registration supplies the inspected executable. + var deadline = Date.now() + 5000; + do { + app = $.NSRunningApplication.runningApplicationWithProcessIdentifier(Number(argv[0])); + if (app && app.isTerminated) return; + if (app && app.executableURL && app.isFinishedLaunching) break; + delay(0.05); + } while (Date.now() < deadline); + if (!app || !app.executableURL || !app.isFinishedLaunching) throw Error("Client startup is still incomplete"); if (ObjC.unwrap(app.executableURL.path) !== argv[1]) throw Error("Client executable changed"); if (!app.terminate) throw Error("Client refused normal quit"); }''' diff --git a/tests/presentation/test_codex_accounts.py b/tests/presentation/test_codex_accounts.py index 8f710f294f..b13d4f6b82 100644 --- a/tests/presentation/test_codex_accounts.py +++ b/tests/presentation/test_codex_accounts.py @@ -6,6 +6,8 @@ import importlib import json import os +import plistlib +import shutil from pathlib import Path import subprocess import sys @@ -18,6 +20,45 @@ pytestmark = pytest.mark.skipif(os.name != "posix", reason="Native slot effects use the POSIX account owner") +@pytest.mark.skipif(sys.platform != "darwin" or shutil.which("swiftc") is None, + reason="Actual AppKit registration requires macOS and Swift") +def test_normal_quit_waits_for_owned_cold_app_registration(native, tmp_path): + """A PID can exist before NSRunningApplication supplies executableURL.""" + bundle = tmp_path / "ColdFixture.app" + executable = bundle / "Contents/MacOS/ColdFixture" + executable.parent.mkdir(parents=True) + (bundle / "Contents/Info.plist").write_bytes(plistlib.dumps({ + "CFBundleExecutable": "ColdFixture", "CFBundleIdentifier": "dev.loopx.cold-fixture", + "CFBundleName": "ColdFixture", "CFBundlePackageType": "APPL", + })) + source = tmp_path / "fixture.swift" + source.write_text('''import Cocoa +Thread.sleep(forTimeInterval: 1.0) +let app = NSApplication.shared +app.setActivationPolicy(.accessory) +app.run() +''') + subprocess.run(["swiftc", str(source), "-framework", "Cocoa", "-o", str(executable)], + check=True, capture_output=True, timeout=30) + host_type = importlib.import_module("loopx_codex_provider_routing.native_host").NativeHost + host = object.__new__(host_type) + host.home, host.spec = tmp_path, {} + host.revision = lambda: "fixture-selection" + host.apps = SimpleNamespace( + app_bundle=lambda *_: bundle, executable=lambda _: executable, + running=lambda *_: process.pid if process.poll() is None else None, + ) + process = subprocess.Popen([str(executable)], start_new_session=True) + try: + assert host.close_client("fixture-selection", timeout=10) is True + assert process.wait(timeout=5) == 0 + finally: + # Only this test's Popen child may be cleaned up after a failed oracle. + if process.poll() is None: + process.terminate() + process.wait(timeout=5) + + @pytest.fixture def native(monkeypatch): monkeypatch.syspath_prepend(str(Path(__file__).resolve().parents[2] / "packages" / From fe65471612b99bf868c08707dceacc116b46246b Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 18 Oct 2026 15:45:05 +0800 Subject: [PATCH 6/7] fix(chat): qualify composed account host type contracts Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- loopx/chat_completed_todos.py | 2 +- loopx/chat_loopx_mode.py | 7 +- loopx/chat_operator_provider_api.py | 2 +- loopx/chat_server.py | 75 ++++++++++++------- loopx/chat_session_open.py | 2 +- loopx/presentation/goal_direction_api.py | 4 +- .../presentation/workspace_preferences_api.py | 4 +- 7 files changed, 57 insertions(+), 39 deletions(-) diff --git a/loopx/chat_completed_todos.py b/loopx/chat_completed_todos.py index 5bcf20f468..335ab14f09 100644 --- a/loopx/chat_completed_todos.py +++ b/loopx/chat_completed_todos.py @@ -81,7 +81,7 @@ class CompletedTodoPages: ttl_seconds = 300 max_cache_bytes = 16 * 1024 * 1024 - def __init__(self): + def __init__(self) -> None: self._snapshots = OrderedDict() self._lock = Lock() diff --git a/loopx/chat_loopx_mode.py b/loopx/chat_loopx_mode.py index acc59af79a..bd1fe7fc3d 100644 --- a/loopx/chat_loopx_mode.py +++ b/loopx/chat_loopx_mode.py @@ -1138,7 +1138,8 @@ def pump_delegation_wakes( class DelegationWakeService: """Cheap local pump hosted by the existing Chat server, beside the return service.""" - def __init__(self, controller, *, goal_context=None, interval=WAKE_INTERVAL_SECONDS): + def __init__(self, controller: Any, *, goal_context: Callable[[dict[str, Any]], dict[str, Any]] | None = None, + interval: float = WAKE_INTERVAL_SECONDS) -> None: self.controller = controller self.goal_context = goal_context self.interval = interval @@ -1147,7 +1148,7 @@ def __init__(self, controller, *, goal_context=None, interval=WAKE_INTERVAL_SECO target=self.run, daemon=True, name="loopx-delegation-wakes" ) - def start(self): + def start(self) -> DelegationWakeService: self.thread.start() return self @@ -1163,6 +1164,6 @@ def run(self): _LOG.warning("Delegation wake receipts unavailable; retrying") self.stop.wait(self.interval) - def close(self): + def close(self) -> None: self.stop.set() self.thread.join(timeout=3) diff --git a/loopx/chat_operator_provider_api.py b/loopx/chat_operator_provider_api.py index 61dae4a837..f862c4d957 100644 --- a/loopx/chat_operator_provider_api.py +++ b/loopx/chat_operator_provider_api.py @@ -37,7 +37,7 @@ class OperatorProviderRequestMixin: server: _OperatorProviderServer - def _send_json(self, payload: dict, status: int = 200) -> None: ... + def _send_json(self, payload: dict, *, status: int = 200) -> None: ... def _send_error( self, message: str, *, status: int, error_code: str diff --git a/loopx/chat_server.py b/loopx/chat_server.py index 2bf7e063a4..0f53881790 100644 --- a/loopx/chat_server.py +++ b/loopx/chat_server.py @@ -11,7 +11,7 @@ import webbrowser from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path -from typing import Any, Literal +from typing import Any, Literal, cast from urllib.parse import parse_qs, urlparse from .presentation import configuration_api as config_api @@ -42,7 +42,6 @@ from .chat_status_api import ChatStatusRequestMixin from .chat_runtime import ( STEERING_NOT_DELIVERED_CODES, - TERMINAL_TURN_STATES, ChatRuntimeController, ChatTurnAcceptanceUnavailableError, ) @@ -52,12 +51,12 @@ ) from .chat_session_open import open_chat_session from .chat_ssh_source_api import SshSourceRequestMixin -from .chat_store import ChatSessionStore, normalize_agent_model_id -from .capabilities.native_chat.model_settings import normalize_agent_reasoning_effort +from .chat_store import ChatSessionStore, TERMINAL_TURN_STATES +from .capabilities.native_chat.model_settings import normalize_agent_reasoning_effort, normalize_agent_model_id from .extensions.lark.private_conversation_api import PrivateConversationRequestMixin, PRIVATE_CONVERSATIONS_PATH from .extensions.lark.conversation_identity import observe_lark_conversation_identity from .extensions.lark.private_conversations import LarkPrivateConversations -from .chat_loopx_mode import handle_loopx_request +from .chat_loopx_mode import DelegationWakeService, handle_loopx_request from .capabilities.manager_context.roundtrip import ( ReturnService, project_chat_session_snapshot, @@ -90,14 +89,13 @@ setup_lark_goal_channel, ) from .extensions.lark.goal_topic_connections import list_lark_apps -from .extensions.lark.goal_topic_runtime import LarkGoalTopicRuntimeService +from .extensions.lark.goal_topic_runtime_service import LarkGoalTopicRuntimeService from .extensions.lark.manager_routing import authorized_manager_goal_ids from .extensions.lark.cli_transport import CommandRunner from .extensions.runtime import ( default_extension_state_file, resolve_extension_activation, ) -from .history import load_registry from .chat_completed_todos import CompletedTodoPages, CompletedTodoRequestMixin from .presentation.explore_results_api import ExploreResultsRequestMixin from .presentation.research_analysis_api import RESEARCH_ANALYSIS_PATH, ResearchAnalysisRequestMixin @@ -105,6 +103,7 @@ from .kiro_cli_goal_mode import KIRO_CLI_BIN from .paths import resolve_runtime_root from .release_manifest import release_runtime_identity +from .control_plane.projects.registry_codec import load_registry from .registry import registry_goals, resolve_state_file from .state_projection import build_active_state_structured_projection from .status_server import ( @@ -260,7 +259,7 @@ def build_chat_status_projection( queue_items = queue.get("items") if isinstance(queue, dict) else [] queue_by_goal = { str(item.get("goal_id") or ""): item - for item in queue_items if isinstance(queue_items, list) and isinstance(item, dict) + for item in (queue_items if isinstance(queue_items, list) else []) if isinstance(item, dict) } goals: list[dict[str, Any]] = [] for raw_goal in registry_goals(registry): @@ -286,7 +285,8 @@ def build_chat_status_projection( latest_validation = asset.get("latest_validation") if isinstance(latest_validation, dict) and latest_validation.get("summary"): evidence.insert(0, _compact_text(latest_validation.get("summary"))) - quota = item.get("quota") if isinstance(item, dict) and isinstance(item.get("quota"), dict) else {} + raw_quota = item.get("quota") if isinstance(item, dict) else None + quota = raw_quota if isinstance(raw_quota, dict) else {} goals.append( { "goal_id": goal_id, @@ -442,6 +442,7 @@ class ChatHTTPServer(ThreadingHTTPServer): allow_reuse_address = True registry_path: Path + runtime_root: Path runtime_root_override: str | None codex_account_service: CodexAccountService scan_roots: list[Path] @@ -462,6 +463,8 @@ class ChatHTTPServer(ThreadingHTTPServer): lark_private_conversations: LarkPrivateConversations ssh_config_path: Path | None goal_subagent_configuration_enabled: bool + conversation_transports: Any + delegation_wake_service: DelegationWakeService def __init__(self, *args: Any, **kwargs: Any) -> None: # Freeze before serving: an in-place package upgrade must not retag the @@ -542,7 +545,12 @@ def _send_error( turn_replay_safe: bool = False, todo_receipt: dict[str, Any] | None = None, delivery_state: Literal["not_delivered", "unresolved"] | None = None, + **unsupported: Any, ) -> None: + # Legacy mixins expose **kwargs; keep unknown options rejected at the + # concrete boundary instead of silently widening the HTTP contract. + if unsupported: + raise TypeError("unsupported error response options") payload: dict[str, Any] = {"ok": False, "error": _compact_text(message)} if error_code: payload["error_code"] = _compact_text(error_code, limit=80) @@ -634,7 +642,7 @@ def _create_session(self) -> None: unknown = set(body) - {"goal_id", "agent_id", "agent_model_id", "agent_reasoning_effort", "mode", "context_kind", "project_ref"} if unknown: raise ValueError("unknown session field") - goal_id = _compact_text(body.get("goal_id"), limit=160) or self.server.selected_goal_id or "" + goal_id: str | None = _compact_text(body.get("goal_id"), limit=160) or self.server.selected_goal_id or "" # ``agent_id`` is the caller's explicit executor pick and stays empty # when the caller does not make one. Each channel then resolves its # own default through its own owner instead of inheriting whatever @@ -662,10 +670,10 @@ def _create_session(self) -> None: context = self._session_context({"goal_id": None, "channel_id": selected["channel_id"], "project_context": selected["context"]}) else: - registry, goal = self._registry_and_goal(goal_id) + registry, goal = self._registry_and_goal(goal_id or "") context = _goal_public_context(registry, goal) runtime_objective = str(context["objective"] or context["title"]) - project = context["project"] + project = cast(Path, context["project"]) if not project.is_dir(): raise CodexChatAgentError( "The Goal project root is unavailable.", @@ -825,14 +833,15 @@ def _session_turn(self, session_id: str) -> None: try: submit = (self.server.runtime_controller.enqueue_turn if body.get("delivery") == "queue" else self.server.runtime_controller.submit_turn) + origin_options: dict[str, Any] = {"origin": "web"} if body.get("delivery") == "queue" else {} turn, created = submit( session_id=session_id, client_turn_id=client_turn_id, message=message, attachments=attachments, - work_dir=context["project"], + work_dir=cast(Path, context["project"]), objective=runtime_objective, - **({"origin": "web"} if body.get("delivery") == "queue" else {}), + **origin_options, ) if body.get("client_turn_id"): turn_id = str(turn["turn_id"]) @@ -914,7 +923,8 @@ def _session_turn(self, session_id: str) -> None: def _session_snapshot(self, session_id: str) -> None: try: self.server.runtime_controller.recover_exited_turn(session_id) - self._send_json(project_chat_session_snapshot( + snapshot = cast(Callable[..., dict[str, Any]], project_chat_session_snapshot) + self._send_json(snapshot( self.server.runtime_root, self.server.chat_store, session_id, registry=self.server.registry_path)) except KeyError: @@ -947,7 +957,8 @@ def _turn_events(self, session_id: str, turn_id: str) -> None: last_event_id = self.headers.get("Last-Event-ID") query = parse_qs(urlparse(self.path).query) if not last_event_id: - last_event_id = (query.get("after") or [None])[0] + last_event_id = (query.get("after") or [""])[0] or None + turn: dict[str, Any] | None if str(last_event_id or "0") != "0": turn = self.server.chat_store.load_turn(session_id, turn_id) or {} self.server.chat_store.update_turn( @@ -1057,7 +1068,7 @@ def _resume_session(self, session_id: str) -> None: objective = str(context["objective"] or context["title"]) restored = self.server.runtime_controller.resume_session( session_id=session_id, - work_dir=context["project"], + work_dir=cast(Path, context["project"]), objective=objective, ) except KeyError: @@ -1407,6 +1418,7 @@ def _action_transition(self, proposal_id: str, transition: str) -> None: ) def _action_apply(self, proposal_id: str) -> None: + proposal: dict[str, Any] | None try: body = self._read_json() if body: @@ -1556,7 +1568,7 @@ def do_GET(self) -> None: "endpoints": self.server.runtime_controller.capabilities(), } ) - get_dispatch = { + get_dispatch: dict[str, Callable[[], None]] = { "/api/chat/todo/detail": self._todo_detail, "/api/chat/completed-todos": self._completed_todos, "/api/chat/goal-results": self._goal_results, @@ -1609,7 +1621,7 @@ def do_POST(self) -> None: path = urlparse(self.path).path if self._dispatch_zcode_goal(path, apply=True): return - post_dispatch = { + post_dispatch: dict[str, Callable[[], None]] = { RESEARCH_ANALYSIS_PATH: self._research_analysis_write, RESEARCH_ANALYSIS_PATH + "/cancel": self._research_analysis_write, CHAT_SESSIONS_PATH: self._create_session, @@ -1762,18 +1774,24 @@ def serve_chat( ) server.chat_store = ChatSessionStore(runtime_root) server.action_store = ChatActionStore(runtime_root / "chat" / "actions") + def manager_scope(session: dict[str, Any]) -> Any: + if isinstance(session.get("steward_context"), dict): + bindings = server.runtime_controller.project_contexts.conversation_bindings + if bindings is None: + raise ValueError("Steward conversation bindings are unavailable") + return bindings.steward_scope(session) + return authorized_manager_goal_ids( + build_lark_goal_topic_runtime_snapshot( + registry_path=server.registry_path, runtime_root_override=server.runtime_root_override, + ), session, runtime_root=runtime_root, registry_path=resolved_registry_path, + ) + server.runtime_controller = ChatRuntimeController( store=server.chat_store, registry_path=resolved_registry_path, project_contexts=ChatProjectContexts(resolved_scan_roots, workspace_grant=project_workspace_grant, filesystem_scope=project_filesystem_scope), - manager_scope_resolver=lambda session: ( - server.runtime_controller.project_contexts.conversation_bindings.steward_scope(session) - if isinstance(session.get("steward_context"), dict) else authorized_manager_goal_ids( - build_lark_goal_topic_runtime_snapshot( - registry_path=server.registry_path, runtime_root_override=server.runtime_root_override, - ), session, runtime_root=runtime_root, registry_path=resolved_registry_path, - )), + manager_scope_resolver=manager_scope, codex_bin=codex_bin, claude_bin=claude_bin, kiro_cli_bin=kiro_cli_bin, @@ -1793,7 +1811,7 @@ def serve_chat( server.lark_private_conversations = private_transport - def _lark_snapshot(): + def _lark_snapshot() -> dict[str, Any]: snapshot = build_lark_goal_topic_runtime_snapshot(registry_path=server.registry_path, runtime_root_override=server.runtime_root_override) snapshot["private_profiles"] = private_transport.profiles() @@ -1833,9 +1851,8 @@ def _lark_snapshot(): server.manager_return_service = start_return_service( server, server.runtime_controller.coordination_runtime_root, start_service=False ) - from .chat_loopx_mode import DelegationWakeService - def _wake_goal_context(session): + def _wake_goal_context(session: dict[str, Any]) -> dict[str, Any]: registry = load_registry(server.registry_path) goal = next( (item for item in registry_goals(registry) if str(item.get("id") or "") == str(session["goal_id"])), diff --git a/loopx/chat_session_open.py b/loopx/chat_session_open.py index 2326a650c1..658a9a517e 100644 --- a/loopx/chat_session_open.py +++ b/loopx/chat_session_open.py @@ -38,7 +38,7 @@ def open_chat_session( objective: str, mode: str, requested_endpoint: str = "", - agent_model_id: str = "", + agent_model_id: str | None = "", agent_reasoning_effort: str | None = None, project_ref: str | None = None, ) -> tuple[dict[str, Any], bool]: diff --git a/loopx/presentation/goal_direction_api.py b/loopx/presentation/goal_direction_api.py index 752282dce1..651e580adb 100644 --- a/loopx/presentation/goal_direction_api.py +++ b/loopx/presentation/goal_direction_api.py @@ -20,13 +20,13 @@ class GoalDirectionRequestMixin: server: Any path: str - def _send_json(self, value: dict[str, Any], **kwargs: Any) -> None: + def _send_json(self, payload: dict[str, Any], *, status: int = 200) -> None: raise NotImplementedError def _send_error(self, message: str, **kwargs: Any) -> None: raise NotImplementedError - def _read_json(self, **kwargs: Any) -> dict[str, Any]: + def _read_json(self, *, max_bytes: int = 256 * 1024) -> dict[str, Any]: raise NotImplementedError def _direction_route(self, goal_id: Any) -> tuple[Path, dict[str, str]]: diff --git a/loopx/presentation/workspace_preferences_api.py b/loopx/presentation/workspace_preferences_api.py index 2ffc602e99..952ee8854e 100644 --- a/loopx/presentation/workspace_preferences_api.py +++ b/loopx/presentation/workspace_preferences_api.py @@ -47,13 +47,13 @@ class WorkspacePreferencesRequestMixin: server: Any path: str - def _send_json(self, value: dict[str, Any], **kwargs: Any) -> None: + def _send_json(self, payload: dict[str, Any], *, status: int = 200) -> None: raise NotImplementedError def _send_error(self, message: str, **kwargs: Any) -> None: raise NotImplementedError - def _read_json(self, **kwargs: Any) -> dict[str, Any]: + def _read_json(self, *, max_bytes: int = 256 * 1024) -> dict[str, Any]: raise NotImplementedError def _sidebar_order_file(self) -> Path: From 4334f1ee0eb8920171f46071390cd801d5839ff9 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 18 Oct 2026 15:56:39 +0800 Subject: [PATCH 7/7] refactor(chat): retain typed branches without growing dynamic typing Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- loopx/chat_server.py | 49 ++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/loopx/chat_server.py b/loopx/chat_server.py index 0f53881790..02432b3763 100644 --- a/loopx/chat_server.py +++ b/loopx/chat_server.py @@ -11,11 +11,13 @@ import webbrowser from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path -from typing import Any, Literal, cast +from typing import TYPE_CHECKING, Any, Literal, cast from urllib.parse import parse_qs, urlparse from .presentation import configuration_api as config_api from .presentation.codex_accounts_api import CodexAccountService +if TYPE_CHECKING: + from .capabilities.native_chat.transports import ChatConversationTransports from .attached_session_api import AttachedSessionRequestMixin from .zcode_goal_mode.api import ZCodeGoalRequestMixin from .chat import ( @@ -463,7 +465,7 @@ class ChatHTTPServer(ThreadingHTTPServer): lark_private_conversations: LarkPrivateConversations ssh_config_path: Path | None goal_subagent_configuration_enabled: bool - conversation_transports: Any + conversation_transports: ChatConversationTransports delegation_wake_service: DelegationWakeService def __init__(self, *args: Any, **kwargs: Any) -> None: @@ -545,7 +547,7 @@ def _send_error( turn_replay_safe: bool = False, todo_receipt: dict[str, Any] | None = None, delivery_state: Literal["not_delivered", "unresolved"] | None = None, - **unsupported: Any, + **unsupported: object, ) -> None: # Legacy mixins expose **kwargs; keep unknown options rejected at the # concrete boundary instead of silently widening the HTTP contract. @@ -831,18 +833,18 @@ def _session_turn(self, session_id: str) -> None: self._send_error(str(exc), turn_replay_safe=True, delivery_state="not_delivered") return try: - submit = (self.server.runtime_controller.enqueue_turn if body.get("delivery") == "queue" - else self.server.runtime_controller.submit_turn) - origin_options: dict[str, Any] = {"origin": "web"} if body.get("delivery") == "queue" else {} - turn, created = submit( - session_id=session_id, - client_turn_id=client_turn_id, - message=message, - attachments=attachments, - work_dir=cast(Path, context["project"]), - objective=runtime_objective, - **origin_options, - ) + if body.get("delivery") == "queue": + turn, created = self.server.runtime_controller.enqueue_turn( + session_id=session_id, client_turn_id=client_turn_id, + message=message, attachments=attachments, + work_dir=cast(Path, context["project"]), objective=runtime_objective, origin="web", + ) + else: + turn, created = self.server.runtime_controller.submit_turn( + session_id=session_id, client_turn_id=client_turn_id, + message=message, attachments=attachments, + work_dir=cast(Path, context["project"]), objective=runtime_objective, + ) if body.get("client_turn_id"): turn_id = str(turn["turn_id"]) self._send_json( @@ -923,7 +925,7 @@ def _session_turn(self, session_id: str) -> None: def _session_snapshot(self, session_id: str) -> None: try: self.server.runtime_controller.recover_exited_turn(session_id) - snapshot = cast(Callable[..., dict[str, Any]], project_chat_session_snapshot) + snapshot = cast(Callable[..., dict[str, object]], project_chat_session_snapshot) self._send_json(snapshot( self.server.runtime_root, self.server.chat_store, session_id, registry=self.server.registry_path)) @@ -958,13 +960,12 @@ def _turn_events(self, session_id: str, turn_id: str) -> None: query = parse_qs(urlparse(self.path).query) if not last_event_id: last_event_id = (query.get("after") or [""])[0] or None - turn: dict[str, Any] | None if str(last_event_id or "0") != "0": - turn = self.server.chat_store.load_turn(session_id, turn_id) or {} + prior_turn = self.server.chat_store.load_turn(session_id, turn_id) or {} self.server.chat_store.update_turn( session_id, turn_id, - sse_reconnect_count=int(turn.get("sse_reconnect_count") or 0) + 1, + sse_reconnect_count=int(prior_turn.get("sse_reconnect_count") or 0) + 1, ) self.send_response(200) self.send_header("Content-Type", "text/event-stream; charset=utf-8") @@ -1418,7 +1419,7 @@ def _action_transition(self, proposal_id: str, transition: str) -> None: ) def _action_apply(self, proposal_id: str) -> None: - proposal: dict[str, Any] | None + proposal: dict[str, object] | None try: body = self._read_json() if body: @@ -1774,12 +1775,12 @@ def serve_chat( ) server.chat_store = ChatSessionStore(runtime_root) server.action_store = ChatActionStore(runtime_root / "chat" / "actions") - def manager_scope(session: dict[str, Any]) -> Any: + def manager_scope(session: dict[str, object]) -> list[str] | None: if isinstance(session.get("steward_context"), dict): bindings = server.runtime_controller.project_contexts.conversation_bindings if bindings is None: raise ValueError("Steward conversation bindings are unavailable") - return bindings.steward_scope(session) + return cast(list[str] | None, bindings.steward_scope(session)) return authorized_manager_goal_ids( build_lark_goal_topic_runtime_snapshot( registry_path=server.registry_path, runtime_root_override=server.runtime_root_override, @@ -1811,7 +1812,7 @@ def manager_scope(session: dict[str, Any]) -> Any: server.lark_private_conversations = private_transport - def _lark_snapshot() -> dict[str, Any]: + def _lark_snapshot() -> dict[str, object]: snapshot = build_lark_goal_topic_runtime_snapshot(registry_path=server.registry_path, runtime_root_override=server.runtime_root_override) snapshot["private_profiles"] = private_transport.profiles() @@ -1852,7 +1853,7 @@ def _lark_snapshot() -> dict[str, Any]: server, server.runtime_controller.coordination_runtime_root, start_service=False ) - def _wake_goal_context(session: dict[str, Any]) -> dict[str, Any]: + def _wake_goal_context(session: dict[str, object]) -> dict[str, object]: registry = load_registry(server.registry_path) goal = next( (item for item in registry_goals(registry) if str(item.get("id") or "") == str(session["goal_id"])),