<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.muskapi.cc/en/blog</id>
    <title>MuskAI Documentation Blog</title>
    <updated>2026-05-20T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.muskapi.cc/en/blog"/>
    <subtitle>MuskAI Documentation Blog</subtitle>
    <icon>https://docs.muskapi.cc/en/img/logo.svg</icon>
    <entry>
        <title type="html"><![CDATA[Codex mobile terminal uses third-party transfer stations]]></title>
        <id>https://docs.muskapi.cc/en/blog/2026/05/20/codex-移动端使用第三方中转站</id>
        <link href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-移动端使用第三方中转站"/>
        <updated>2026-05-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Core Principles]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="core-principles">Core Principles<a href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#core-principles" class="hash-link" aria-label="Direct link to Core Principles" title="Direct link to Core Principles" translate="no">​</a></h2>
<p>Utilize the <strong>decoupling</strong> design of the Codex client <strong>Auth layer</strong> (responsible for account verification and rights) and <strong>Model layer</strong> (responsible for actual conversation requests).</p>
<ul>
<li class="">
<p><strong>Auth layer</strong>: Continue to log in with your ChatGPT account to obtain its account identity and all functional benefits.</p>
</li>
<li class="">
<p><strong>Model layer</strong>: Through configuration, direct its requests to a third-party transit service that supports the OpenAI <code>responses</code> API.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="preparation">Preparation<a href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#preparation" class="hash-link" aria-label="Direct link to Preparation" title="Direct link to Preparation" translate="no">​</a></h2>
<ol>
<li class=""><strong>Account</strong>: A valid ChatGPT account (the free version is sufficient).</li>
<li class=""><strong>Transfer service</strong>: a [transfer station account] (<a href="https://muskapi.cc/" target="_blank" rel="noopener noreferrer" class="">https://muskapi.cc</a>) that supports OpenAI <code>responses</code> API mode</li>
<li class=""><strong>Configuration files</strong>: Find two local configuration files in Codex and prepare to modify them:</li>
</ol>
<p>​    *   <code>~/.codex/auth.json</code></p>
<p>​    *   <code>~/.codex/config.toml</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="detailed-configuration-steps">Detailed configuration steps<a href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#detailed-configuration-steps" class="hash-link" aria-label="Direct link to Detailed configuration steps" title="Direct link to Detailed configuration steps" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Kmfy" id="step-1-log-in-normally">Step 1: Log in normally<a href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#step-1-log-in-normally" class="hash-link" aria-label="Direct link to Step 1: Log in normally" title="Direct link to Step 1: Log in normally" translate="no">​</a></h3>
<p>First, in the Codex client, log in to your ChatGPT account as usual, and make sure the login is successful and the status is normal.</p>
<h3 class="anchor anchorTargetStickyNavbar_Kmfy" id="step-2-modify-authentication-configuration-authjson">Step 2: Modify authentication configuration (<code>auth.json</code>)<a href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#step-2-modify-authentication-configuration-authjson" class="hash-link" aria-label="Direct link to step-2-modify-authentication-configuration-authjson" title="Direct link to step-2-modify-authentication-configuration-authjson" translate="no">​</a></h3>
<p>Find and edit file <code>~/.codex/auth.json</code>.</p>
<p><strong>Key modifications:</strong></p>
<ul>
<li class="">
<p>Change the value of <code>"auth_mode"</code> to <code>"chatgpt"</code>.</p>
</li>
<li class="">
<p>Set the value of <code>"OPENAI_API_KEY"</code> to <code>null</code>.</p>
</li>
</ul>
<p><strong>Purpose</strong>: Ensure that clients use the ChatGPT method for authentication and do not use the official OpenAI API Key, thus paving the way for switching model request layers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Kmfy" id="step-3-modify-model-provider-configuration-configtoml">Step 3: Modify model provider configuration (<code>config.toml</code>)<a href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#step-3-modify-model-provider-configuration-configtoml" class="hash-link" aria-label="Direct link to step-3-modify-model-provider-configuration-configtoml" title="Direct link to step-3-modify-model-provider-configuration-configtoml" translate="no">​</a></h3>
<p>Find and edit the file <code>~/.codex/config.toml</code>, and append the following configuration paragraph at the end of the file:</p>
<div class="language-text codeBlockContainer_xJ04 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kSFy"><pre tabindex="0" class="prism-code language-text codeBlock_k3oC thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_L8jx"><div class="token-line" style="color:#393A34"><span class="token plain">[[providers]]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">id = "MuskAI" # Provider ID; customize as needed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name = "MuskAI" # Provider display name; customize as needed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">base_url = "Copy the Base URL from User Center &gt; API Keys"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">models = [] # Keep this empty; the model list is fetched dynamically</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">experimental_bearer_token = "sk-xxxxxxxxxxxx" # Replace with your API Key</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">wire_api = "responses" # Must be set to "responses"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">requires_openai_auth = true # Must be true to pass the client's authentication checks</span><br></div></code></pre></div></div>
<p><strong>Explanation of configuration items:</strong></p>
<ul>
<li class=""><code>base_url</code>: After logging in to the official website, copy the Base URL on the User Center - [API Key] page.</li>
<li class=""><code>experimental_bearer_token</code>: Your API Key for this transit service.</li>
<li class=""><strong><code>wire_api</code></strong>: <strong>This is the most critical item</strong> and must be set to <code>"responses"</code>. This instructs Codex to send requests using OpenAI's <code>/v1/responses</code> endpoint format instead of the common <code>/v1/chat/completions</code>. Most transit services require special configuration to support this endpoint.</li>
<li class=""><strong><code>requires_openai_auth</code></strong>: Must be set to <code>true</code>. This will make the client think that OpenAI's authentication is still being used, thus successfully passing the internal check and maintaining the login status and functionality of the ChatGPT account.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Kmfy" id="step-4-verify-configuration">Step 4: Verify configuration<a href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#step-4-verify-configuration" class="hash-link" aria-label="Direct link to Step 4: Verify configuration" title="Direct link to Step 4: Verify configuration" translate="no">​</a></h3>
<ol>
<li class=""><strong>Restart the Codex client</strong> to make the configuration take effect.</li>
<li class="">Send a test message in the client.</li>
<li class="">Log in to the <a href="https://muskapi.cc/" target="_blank" rel="noopener noreferrer" class="">MuskAI</a> service console and view "Usage" or "Request Log". If you can see the API call record generated by the test conversation just now, the configuration is successful and the request has been forwarded to the third-party service.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="important-notes">Important Notes<a href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#important-notes" class="hash-link" aria-label="Direct link to Important Notes" title="Direct link to Important Notes" translate="no">​</a></h2>
<ol>
<li class=""><strong>History Lost</strong>: After switching model providers, <strong>all previous conversation history will disappear</strong>. Because the conversation record is bound to a specific model provider, the previous record cannot be read after the change.</li>
<li class=""><strong>Model name format</strong>: When configuring available models in a transfer station (such as MuskAi), the model name <strong>needs to include the provider prefix</strong>. For example, if you want to use GPT-5.4, the model name should be configured as <code>openai/gpt-5.4</code>, not just <code>gpt-5.4</code>.</li>
<li class=""><strong>API endpoint requirements</strong>: The key to the success of this method is that the third-party transit service you choose <strong>must support OpenAI's <code>/v1/responses</code> endpoint</strong>. If the relay only supports the common <code>/v1/chat/completions</code> endpoint, the codex request will fail.</li>
<li class=""><strong>Multi-terminal synchronization</strong>: After this configuration is modified, the functions and status of the desktop and mobile terminals of Codex will remain synchronized.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Kmfy" id="final-effect">Final effect<a href="https://docs.muskapi.cc/en/blog/2026/05/20/codex-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E4%B8%AD%E8%BD%AC%E7%AB%99#final-effect" class="hash-link" aria-label="Direct link to Final effect" title="Direct link to Final effect" translate="no">​</a></h2>
<p>With the above configuration, you achieve:</p>
<ul>
<li class=""><strong>Identity and Functionality</strong>: The client interface, account benefits (such as Plus logo, plug-ins, mobile version unlocking) are still provided by your original ChatGPT account.</li>
<li class=""><strong>Computing power and model</strong>: The computing resources and models actually processed for all dialogue requests you initiate come from the third-party transfer API service you configured.</li>
</ul>
<p>This allows you to flexibly choose more economical, faster or customized model services while enjoying the ChatGPT official client experience.</p>
<h1>Replenish</h1>
<p>I saw many people writing to modify the configuration file, but they cannot connect to the codex on the windows side because the codex on the windows side deletes the configuration fields by default. Changing the configuration file to read-only will prevent codex from modifying the configuration file. In this way, you can access codex with your mobile phone. Post pictures:
Change to read-only configuration:</p>
<p><img decoding="async" loading="lazy" src="https://cdn3.ldstatic.com/optimized/4X/f/8/3/f8392a5121e939f923884932e72e6ad87c3a4e53_2_512x500.png" alt="image" class="img_iDrr"></p>
<p>Complete picture of connection:</p>
<p><img decoding="async" loading="lazy" src="https://cdn3.ldstatic.com/optimized/4X/a/c/1/ac1a433a58042dada906398fa29b31a2f1f5496f_2_225x500.jpeg" alt="a6feb854e2e87ca443b89020d02cc460" class="img_iDrr"></p>
<p>Script file, change to ps1 suffix</p>
<div class="language-text codeBlockContainer_xJ04 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kSFy"><pre tabindex="0" class="prism-code language-text codeBlock_k3oC thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_L8jx"><div class="token-line" style="color:#393A34"><span class="token plain">$ErrorActionPreference = "Stop"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$workspace = "C:\Users\11854\Documents\Codex\2026-05-16\chatgpt-codex"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$package = Get-AppxPackage OpenAI.Codex</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if (-not $package) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  throw "OpenAI.Codex package not found."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$asar = Join-Path $package.InstallLocation "app\resources\app.asar"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$patched = Join-Path $workspace ("app.asar.patched-" + $package.Version)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$backup = Join-Path $workspace ("app.asar.backup-" + $package.Version + "-" + (Get-Date -Format "yyyyMMdd-HHmmss"))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$log = Join-Path $workspace "patch-current-codex-asar.log"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$config = "C:\Users\11854\.codex\config.toml"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function Log($message) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "$(Get-Date -Format o) $message" | Add-Content -LiteralPath $log -Encoding UTF8</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function IndexOfBytes([byte[]]$haystack, [byte[]]$needle, [int]$start) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  for ($i = $start; $i -le $haystack.Length - $needle.Length; $i++) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $ok = $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    for ($j = 0; $j -lt $needle.Length; $j++) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      if ($haystack[$i + $j] -ne $needle[$j]) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        $ok = $false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        break</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    if ($ok) { return $i }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  return -1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function New-PatchedAsar {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $bytes = [System.IO.File]::ReadAllBytes($asar)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $encoding = [System.Text.Encoding]::UTF8</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $text = $encoding.GetString($bytes)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $pattern = "function xV(e){return Object.hasOwn(e,``remote_control``)||SV(e.features)&amp;&amp;Object.hasOwn(e.features,``remote_control``)}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $patchedPattern = "function xV(e){return Object.hasOwn(e,``remote_xontrol``)||SV(e.features)&amp;&amp;Object.hasOwn(e.features,``remote_xontrol``)}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $needle = "remote_control"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $replacement = [System.Text.Encoding]::UTF8.GetBytes("remote_xontrol")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $idx = $text.IndexOf($pattern, [System.StringComparison]::Ordinal)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($idx -lt 0) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    if ($text.IndexOf($patchedPattern, [System.StringComparison]::Ordinal) -ge 0) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Log "Installed app.asar already appears patched."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      return $false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    throw "Target xV function pattern not found."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $positions = @()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $pos = $idx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $end = $idx + $pattern.Length</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  while (($pos = $text.IndexOf($needle, $pos, [System.StringComparison]::Ordinal)) -ge 0 -and $pos -lt $end) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $positions += $encoding.GetByteCount($text.Substring(0, $pos))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $pos += $needle.Length</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($positions.Count -ne 2) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    throw "Expected 2 remote_control occurrences in target xV function, found $($positions.Count)."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  foreach ($p in $positions) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    [Array]::Copy($replacement, 0, $bytes, $p, $replacement.Length)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  [System.IO.File]::WriteAllBytes($patched, $bytes)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Created patched asar: $patched offsets=$($positions -join ',')"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  return $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function Ensure-ConfigFlag {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $bytes = [System.IO.File]::ReadAllBytes($config)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $text = [System.Text.Encoding]::UTF8.GetString($bytes)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($text.Length -gt 0 -and [int][char]$text[0] -eq 0xFEFF) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $text = $text.Substring(1)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $changed = $false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($text -match '(?m)^\s*remote_control\s*=') {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    if (($bytes.Length -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF)) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      $encoding = [System.Text.UTF8Encoding]::new($false)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      [System.IO.File]::WriteAllText($config, $text, $encoding)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Log "Removed UTF-8 BOM from config.toml."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    return</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($text -match '(?m)^\s*remote_connections\s*=\s*true\s*$') {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $text = $text -replace '(?m)^(\s*remote_connections\s*=\s*true\s*)$', "`$1`r`nremote_control = true"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $changed = $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  } elseif ($text -match '(?m)^\s*\[features\]\s*$') {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $text = $text -replace '(?m)^(\s*\[features\]\s*)$', "`$1`r`nremote_control = true"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $changed = $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  } else {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $text += "`r`n[features]`r`nremote_control = true`r`n"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $changed = $true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($changed) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    $encoding = [System.Text.UTF8Encoding]::new($false)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    [System.IO.File]::WriteAllText($config, $text, $encoding)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Log "Added remote_control to config.toml."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function Get-CodexPackageProcesses {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Get-CimInstance Win32_Process |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Where-Object {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      $_.ExecutablePath -and</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      $_.ExecutablePath.StartsWith($package.InstallLocation, [System.StringComparison]::OrdinalIgnoreCase) -and</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      ($_.Name -eq "Codex.exe" -or $_.Name -eq "codex.exe")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Package version: $($package.Version)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Target asar: $asar"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">New-PatchedAsar | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Ensure-ConfigFlag</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Waiting for Codex package processes to exit."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">while ($true) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $running = @(Get-CodexPackageProcesses)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  if ($running.Count -eq 0) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    break</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Still waiting for Codex processes: $($running.ProcessId -join ',')"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Start-Sleep -Seconds 2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">try {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  &amp; takeown /F $asar | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  &amp; icacls $asar /grant "$($currentUser):(F)" | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Granted temporary app.asar permission."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $cipherOutput = &amp; cipher /d $asar 2&gt;&amp;1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Requested app.asar decryption/unprotect exit=$LASTEXITCODE output=$($cipherOutput -join ' | ')"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">} catch {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Failed to grant temporary app.asar permission: $($_.Exception.Message)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  throw</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if (-not (Test-Path -LiteralPath $backup)) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  [System.IO.File]::WriteAllBytes($backup, [System.IO.File]::ReadAllBytes($asar))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Created backup: $backup"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">try {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $stream = [System.IO.File]::Open($asar, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $stream.Close()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">} catch {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "app.asar is still not writable: $($_.Exception.Message)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  throw</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Copy-Item -LiteralPath $patched -Destination $asar -Force</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Installed patched app.asar."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">try {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  $currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  &amp; icacls $asar /remove:g $currentUser | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  &amp; icacls $asar /setowner "NT SERVICE\TrustedInstaller" | Out-Null</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Restored app.asar owner/temporary grant."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">} catch {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Log "Failed to restore app.asar owner/temporary grant: $($_.Exception.Message)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Ensure-ConfigFlag</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Log "Done."</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://cdn3.ldstatic.com/optimized/4X/a/3/9/a3966d04a7cf2730849b6f05a410f08aefb077da_2_407x499.png" alt="fc8096305d35df25d48fcc912568c632" class="img_iDrr"></p>
<p>The official has not yet promoted the app_control link for windows
I wrote a script. The principle is to start codex.exe through UAC-weighted cmd -&gt; add statements to the configuration file and set it to read-only (before this, you must manually add it to the configuration file
[features]
js_repl = true
goals = true
remote_connections = true
remote_control = true
)
-&gt;Restore readability after 90 seconds, and the program can write parameters</p>
<p><img decoding="async" loading="lazy" src="https://cfpic.999194.xyz/file/pc/1779296003947_5c8b9ac9ebbc9514cc3bdcfb62008f90971683ea.zip" alt="5c8b9ac9ebbc9514cc3bdcfb62008f90971683ea.zip" class="img_iDrr"></p>]]></content>
        <author>
            <name>MuskAI</name>
            <uri>https://muskapi.cc</uri>
        </author>
        <category label="Codex" term="Codex"/>
    </entry>
</feed>