Skip to content

Regression: headless SSH tasks lose thread messaging and delegation tools after Desktop update #42973

Open

Description

@suhailnajeeb

What version of the Codex App are you using (From “About Codex” dialog)?

26.901.31953 (build 7868); remote Codex CLI/app-server 0.153.4

What subscription do you have?

ChatGPT Pro 5x

What platform is your computer?

Desktop client: macOS. Remote execution host: headless Linux HPC node connected through SSH, running Codex CLI/app-server without the Codex desktop app.

What issue are you seeing?

Headless SSH tasks have lost send_message_to_thread, create_thread, fork_thread, and handoff_thread from their live tool catalog. list_threads still works. This workflow worked approximately one week ago and stopped working after a recent Codex update; I do not have the exact last working build.

Tasks on other computers that run the Codex app still have thread messaging when I connect to them. The affected case is specifically the headless SSH host.

Impact: Remote SSH threads cannot communicate or coordinate with each other. A remote thread acting as a coordinator cannot message another remote thread, and remote threads cannot exchange instructions, progress updates, or completion reports through send_message_to_thread. This affects coordination entirely among remote threads, as well as callbacks from remote workers to a local coordinator.

Using a local coordinator to wait or poll for completion only partially works around this: it does not restore direct remote-to-remote communication or allow remote threads to coordinate independently.

The operations are absent, rather than failing with a tool-call error. A fresh task reproduces this.

What steps can reproduce the bug?

Feedback ID: 01a070ce-3f7b-7181-8b37-7dd2bf6eaab7

  1. Connect Codex Desktop to a headless Linux host over SSH running Codex CLI/app-server 0.153.4.
  2. Open two tasks on the remote SSH host.
  3. Ask one remote task to message the other using send_message_to_thread, for example to coordinate work or share a status update.
  4. Observe that send_message_to_thread is absent from the calling remote task’s live tool catalog. The other remote task also lacks it, so neither can initiate messaging to the other.
  5. list_threads remains available, while create_thread, fork_thread, and handoff_thread are also absent.
  6. Compare with a local Desktop task, where these operations are exposed.

What is the expected behavior?

Headless SSH tasks should retain cross-task messaging and delegation support, as they did approximately one week ago. Remote threads should be able to call send_message_to_thread to coordinate directly with other remote threads, exchange instructions and status, and report completion or requests for attention to either a remote or local coordinator.

Please restore support through the SSH integration, or provide a supported codex_app MCP bridge for headless hosts.

Additional information

Read-only diagnosis of the installed Desktop bundle found a concrete exclusion path:

  • In webview/assets/app-initial-caa927532ffb.js, pPi.readInputs() assigns usesDesktopMcp = ik(hostId).
  • ik() requires the host to match the renderer host_config.id and have kind === "local"; its fallback checks hostId === "local". The SSH host does not qualify.
  • Local tasks use the codex_app MCP server and supply tool names through mcp_servers.codex_app.enabled_tools.
  • The alternative dynamic-tool path calls OOt(), whose AOt exclusion set contains automation_update, create_thread, send_message_to_thread, fork_thread, and handoff_thread.
  • GSa() also rejects these operations at execution time through the dynamic route with: "This app tool is no longer available through dynamic tools. Use the codex_app MCP server. If that server is unavailable on this host, task delegation is unavailable."

Initialization evidence (UTC, 2026-09-05):

  • SSH initialization succeeded; the affected thread/start completed without error at 08:54:28.233.
  • Remote list_threads reached the dynamic-tool execution path at 08:55:31.220.
  • No singular codex_app startup entry was found for the affected SSH task. The plural codex_apps server became ready at 08:54:28.841; it is a different server.
  • A comparison local task had singular codex_app ready at 09:02:40.877 and exposes all four operations.

This explains the current missing set, but we have not compared the bundle against the last working version, so the exact introducing update is unconfirmed. No configuration or installed files were modified during diagnosis. Credentials and raw logs are omitted.

Activity

  1. added
    appIssues related to the Codex desktop app
    on Sep 5, 2026
  2. added
    bugSomething isn't working
    subagentIssues involving subagents or multi-agent features
    mcpIssues related to the use of model context protocol (MCP) servers
    on Sep 5, 2026
  3. github-actions commented on Sep 5, 2026

    @github-actions
    Contributor

    Potential duplicates detected. Please review them and close your issue if it is a duplicate.

    Powered by Codex Action

  4. 84dnnvbdvp-debug commented on Sep 5, 2026

    @84dnnvbdvp-debug

    Current open-source Codex narrows this to a transport/capability-boundary regression rather than four independent missing-tool bugs.

    codex-rs/tui/src/dynamic_tools_mcp.rs makes the split explicit: ThreadToolTransport::Dynamic installs non_delegation_tool_specs(), while ThreadToolTransport::Mcp removes dynamic tools and configures an MCP server that exposes the full tool_specs(). In dynamic_tools.rs, the delegation set removed from Dynamic is currently create_thread, send_message_to_thread, and fork_thread; the MCP server exposes those with approval gating. So a headless SSH host that falls onto Dynamic is expected to retain read/list-style task tools while losing exactly that delegation trio.

    One useful regression would therefore be at transport selection, not just catalog presence: for a remote/headless host where delegation is supposed to be supported, initialization must either provision the delegation-capable MCP bridge and expose create/send/fork, or explicitly report delegation unavailable. Silently selecting Dynamic while the surrounding product surface/documentation still implies cross-task delegation is the bad state.

    There is one additional distinction worth preserving if this is merged into #41580: handoff_thread is not in the current public TUI tool_specs() at all, so its absence is not explained by the public Dynamic-vs-MCP filter. It appears to belong to the Desktop-specific codex_app surface described in this report. I’d test that separately from the create/send/fork trio so a fix to the public task-tool transport does not accidentally look like it restored the full Desktop delegation contract.

  5. wilson4ever commented on Sep 8, 2026

    @wilson4ever

    Additional reproduction on Desktop 26.901.51231 (build 8109), checked on 2026-09-08. This adds a successful one-way communication probe and another concrete Desktop injection call site to the report above.

    Environment

    • macOS Desktop client, installed as ChatGPT.app, connected to a headless Linux project through Desktop SSH.
    • Mac PATH CLI, Desktop bundled CLI, remote login-shell CLI, and both inspected running remote app-server executables: codex-cli 0.153.4.
    • Bundled/cached first-party codex-app-tools plugin: 0.1.3.

    Communication probe: local -> SSH works; SSH -> local has no callable sender

    1. In the Mac-local task, inspect the actual tool inventory. Both legacy codex_app__* descriptions and native mcp__codex_app__* tools are present.
    2. Call the native mcp__codex_app__send_message_to_thread exactly once, explicitly binding threadId: "<ssh-task-id>" and hostId: "remote-ssh-discovered:<alias>", with a unique harmless probe and an ACK request.
    3. The actual call returns isError: false, with text content {"threadId":"<ssh-task-id>"}.
    4. Perform one target-task read-back. The probe appears in the completed target turn, and the SSH task has written the matching ACK in its own response.
    5. The SSH task reports that it still has no native codex_app MCP send tool with which to send the ACK back to the local task. The retained legacy sender reports:
    This app tool is no longer available through dynamic tools. Use the codex_app MCP server. If that server is unavailable on this host, task delegation is unavailable.
    

    The ACK was obtained by reading the target's response; it was not delivered as an SSH-initiated message. This distinguishes successful local-to-remote transport from the missing remote-side capability. No polling scheduler or repeated sends were used.

    Additional installed-bundle evidence

    Read-only inspection of this build's app.asar, internal file .vite/build/main-BT6ViFC-.js, found:

    • The ek({hostConfig:e,resourcesPath:...}) function explicitly returns early for any non-local host (hostConfig.kind !== "local").
    • The same function reads the first-party desktop-mcp.json definition and constructs the mcp_servers.codex_app launch override for qualifying local hosts.
    • Core client construction supplies getConfigOverrides:()=>ek(e).

    This is consistent with the SSH exclusion described in the original issue. It explains the current injection asymmetry; it does not establish which release first introduced it.

    Configured MCP is not the same as Desktop-injected MCP

    The Mac CLI's configured MCP list does not contain codex_app, yet the native local-task call above succeeds. The remote CLI's project-cwd query currently lists openaiDeveloperDocs, but no codex_app. These observations should not be interpreted as "an empty/configured MCP list proves no injected tools."

    The same-version runtime checks and successful local-to-SSH probe make a simple CLI-version mismatch or unreachable SSH host an insufficient explanation here. The checked current project registrations and launch/config paths were also correct.

    Expected resolution / regression check

    Provide the supported, authenticated first-party task-control MCP bridge to SSH-backed tasks before retiring their dynamic delegation path. If this capability is intentionally unsupported, omit obsolete callable definitions and expose an explicit, actionable capability status.

    A useful regression check should validate an actual SSH-initiated callback, not only tool descriptions, local-to-SSH delivery, or the ability to read the target's ACK.

    No configuration, Hook, Git/project content, installed application files, automation, service, or network settings were modified for this diagnosis. Private project details, task IDs, host aliases, paths, credentials, and raw transcripts are intentionally omitted.

  6. jeffery777 commented on Sep 11, 2026

    @jeffery777

    補充 2026-09-09 的觀察:本機 Desktop 可操作 SSH 目標,SSH 呼叫者仍自報缺少 create/fork/send。

    這是保存的診斷結果,並非在更新版 Desktop 上的新重現。環境為 macOS Desktop 26.901.51231/build 8109,透過 Desktop SSH 連到 headless Linux project。另次 shell CLI 查核為 0.153.4;服務該遠端回合的實際 app-server 版本未確認。

    • 本機 Desktop 主控在隔離 SSH playground 成功建立任務、fork 已完成的新任務,並向原新任務傳送 probe、公開讀回預期目標與回覆。
    • 新 SSH 任務自報沒有 create_thread、fork_thread 或 send_message_to_thread。
    • 遠端 assistant final 轉交的 JSON 列出 23 項 codex_app 名稱;本機直接名稱查詢為 31 項。遠端仍列有 sidebar/archive 修改工具,因此不能概括為「遠端只有唯讀工具」。
    • 關鍵限制:公開 read_thread 沒有呈現遠端 functions.exec 的查詢原始輸出或完整 schema。23 項是轉述快照,不是獨立取得的原始 catalog;兩端名稱前綴也不同,不能當 schema 等價比較。

    本機→SSH 成功證明的是通往該目標的控制路徑,不能證明 SSH 呼叫者自身可發起委派或 callback。我們尚未確認 repository 可修的控制點或引入問題的 Desktop release。

    希望 OpenAI 協助釐清:

    1. 在支援委派的 SSH 情境,遠端呼叫者應取得哪些正式 create/fork/send 契約?若此 context 刻意不支援,請公開適用條件與明確 capability status。
    2. 哪個受支援的診斷可取得遠端當輪生效的工具清單、完整 schema、服務 runtime 版本與省略能力的原因?
    3. Regression check 能否涵蓋 SSH 呼叫者發起操作及正確 destination/readback,而不限於本機→SSH 成功?

    固定版本的公開證據:

    紀錄另保留部分 send completed 但 items=[]、歷史 TUI 來源 fork 失敗而新 Desktop 來源 fork 成功的現象,未將它們歸為同一根因。此次回報沒有新增遠端操作、讀取私人 runtime state、修改設定、安裝 bridge 或切換版本,也未附私人識別碼/主機路徑/完整 config。

    本觀察亦與 #41248、#40852 重疊;這裡僅補充一次,若另有 canonical tracker 請協助指向。

  7. chac4l commented on Sep 12, 2026

    @chac4l

    Additional reproduction on 2026-09-12, with the remote installed CLI reporting codex-cli 0.154.0.

    Environment and scope

    • Codex Desktop workflow connected to a remote Linux workspace over SSH.
    • Remote execution environment: Ubuntu 22.04, x86_64.
    • The directly inspected source session was a Desktop side conversation associated with the remote workspace.
    • Desktop About version and the running app-server build were not independently verified; the CLI version above should not be treated as either of those versions.
    • The user explicitly requested a message to an existing task and reports that they did not disable task messaging.

    Directly observed

    The source session's complete advertised tool catalog included:

    • list_threads, list_archived_threads, read_thread, wait_threads;
    • title/archive/share and sidebar helpers.

    However, send_message_to_thread, create_thread, fork_thread, and handoff_thread were absent. Searching the catalog by both names and descriptions found no alternate send operation or available tool-discovery entry point. In the Code Mode tool object:

    typeof tools.codex_app__send_message_to_thread
    // "undefined"

    read_thread successfully returned the intended target's history, and wait_threads successfully returned its active-turn status. The source could therefore inspect the destination but could not invoke the native send operation. No send call reached a destination authorization check or produced a delivery receipt.

    Reproduction steps

    1. Open a Codex Desktop workspace connected through SSH and an existing target task.
    2. Open a side conversation from a task associated with that remote workspace.
    3. Explicitly ask it to send a harmless status or scope instruction to the target task.
    4. Inspect the complete advertised tool inventory and attempt discovery by tool name/description.
    5. Observe that read/wait work while the native send operation is absent.

    This reproduction does not establish that the problem is specific to side conversations; ordinary remote tasks should also be compared.

    Local versus remote behavior

    The user reports that this workflow used to work and now appears asymmetric: local tasks can send to remote tasks, while remote tasks cannot send back. That is user-reported history, not a fresh bidirectional A/B test from this session. The exact last working build is unknown.

    Please verify local → remote, remote → local, and remote → remote messaging with the same account and explicit authorization, including ordinary tasks and side conversations. Restore the supported native messaging path, or expose an explicit capability reason when it is intentionally unavailable, rather than silently omitting the operation.

    Related: #44871 reports a removed dynamic-tool routing error on CLI/app-server 0.154.0. In this sample the operation is missing before invocation, so we cannot claim the same internal cause.

    Only a sanitized reproduction and tool names are included here. No private task IDs, messages, host identifiers, addresses, paths, repository details, credentials, or raw logs are attached.

  8. Stix01 commented on Sep 12, 2026

    @Stix01

    Additional diagnostic evidence for this existing issue, observed on September 12, 2026. This adds a fresh-task reproduction and an isolated clean-runtime control.

    What version of the Codex App are you using (From “About Codex” dialog)?

    The About dialog was not inspected.

    • Inspected Windows Desktop package: 26.908.4834.0.
    • Remote Linux CLI/app-server: 0.154.0.
    • Mac desktop and phone app versions were not recorded. The Windows package version should not be treated as their version.

    What subscription do you have?

    Not independently verified for this report.

    What platform is your computer?

    Remote execution host: Ubuntu 24.04.4 LTS, headless Linux.

    uname -mprs:

    Linux 6.8.0-138-generic x86_64 x86_64
    

    The task was viewed from a Mac desktop client and then a phone, while execution remained on the same remote Linux host. The Windows Desktop installation was inspected separately.

    What issue are you seeing?

    The retained task's callable tool inventory omits create_thread, fork_thread, send_message_to_thread, and handoff_thread.

    An actual call to its retained codex_app__read_thread tool returned:

    This app tool is no longer available through dynamic tools. Use the codex_app MCP server. If that server is unavailable on this host, task delegation is unavailable.
    

    Switching to a phone did not restore the tools.

    A fresh task's diagnostic also reported no callable creation/messaging tools, 146 connector tools under the separate codex_apps server, and unknown MCP server 'codex_app' from both MCP resource-discovery calls. Its complete callable-tool inventory was checked as well. No task was created or message sent. The fresh task's results were relayed to this diagnostic; its raw tool output was not independently captured.

    What steps can reproduce the bug?

    1. Open a Codex task whose execution host is a headless remote Linux machine.
    2. Inspect the actually callable tools for codex_app creation/messaging operations, distinguishing them from codex_apps connector tools.
    3. In a retained task that still advertises a legacy app tool, attempt the call and check for the migration rejection above.
    4. Open a fresh task on the same remote host.
    5. Explicitly authorize it to create a real sidebar task and send a harmless message.
    6. Check its callable inventory and MCP availability. In this reproduction, the requested tools and replacement service were absent, and neither operation occurred.

    Session identifiers, private project details, and raw logs are omitted for privacy.

    What is the expected behavior?

    Remote callers should receive a working task-control service for supported creation and messaging operations, with correct host/project association and existing approval handling. If the capability is unsupported in this context, expose an actionable capability status rather than directing the caller to an unavailable replacement.

    Additional information

    Clean-runtime control: A fresh official rust-v0.154.0 standalone package was downloaded and its published archive digest verified. All six compared package files matched the remote installation byte-for-byte.

    The fresh binary was started with isolated empty settings, without copying credentials or starting model turns:

    • A configured diagnostic MCP server connected, exposed create_thread and read_thread, and successfully handled a direct MCP call.
    • The fixture returned only a diagnostic receipt; it did not create a native Desktop task.
    • Setting only mcp_servers.codex_app.enabled and enabled_tools, without a server transport, failed with invalid transport.

    This argues against corrupt remote runtime files or a general inability to dispatch MCP calls. It does not establish that the real Desktop task service works remotely.

    Read-only Windows bundle inspection: In package 26.908.4834.0, Desktop MCP selection was restricted to the local host. The alternative dynamic-tool filter removed the four task operations above plus automation_update. Running the extracted filter in isolation reproduced that missing-name set.

    The bundled codex-app-tools adapter required the Desktop native pipe and caller metadata; the inspected native pipe handler supplied a local host ID. The Mac installation was not inspected, and the release that introduced the behavior has not been established.

    A regression check should verify an actual remote-initiated task operation and its visible result. Tool-name registration or local-to-remote delivery alone would not establish that remote callers can initiate these operations.

  9. zinego commented on Sep 18, 2026

    @zinego

    Additional independently verified reproduction on two remote Linux SSH hosts, observed on 2026-09-16 and reported on 2026-09-18.

    Environment

    • macOS Desktop bundle metadata: version 26.908.70816, build 9275 (Info.plist, not the About dialog).
    • Both remote CLI and running app-server versions were verified as 0.154.0 during the investigation.
    • Two ordinary remote tasks created by a local Desktop task, on two separate SSH hosts.

    Reproduction and results

    1. From the local Desktop task, create one task on each remote host and send a harmless diagnostic request.
    2. Have each remote task execute hostname, pwd, and date -u; confirm successful execution and retrieve its result from the local task.
    3. Explicitly authorize each remote task to send exactly one acknowledgment back to the local task using send_message_to_thread.
    4. Inspect the remote task's actual tool catalog and persisted session_meta.dynamic_tools.

    Local-to-remote creation and messages worked, and shell execution was verified on both hosts. Neither remote task could initiate the acknowledgment: send_message_to_thread was absent, and zero acknowledgments were sent.

    Both persisted manifests contained the codex_app namespace with list_threads, read_thread, wait_threads, title/archive and sidebar tools, but omitted all five of:

    • automation_update
    • create_thread
    • send_message_to_thread
    • fork_thread
    • handoff_thread

    The absence was present at task creation and was independently confirmed through live tool discovery. Explicit user permission did not change tool availability. A remote service restart restored a separate shell-process problem on one host, but did not restore messaging tools; the other host reproduced the same missing-tool set without that shell failure.

    Desktop routing evidence

    Read-only inspection of the installed bundle found this path:

    • .vite/build/main-DaMR-wdT.js: LCe sets usesDesktopMcp from hostId === "local".
    • When registering tools, the non-Desktop-MCP branch uses n.uc(r); the Desktop MCP branch configures the MCP enabled-tool list instead.
    • .vite/build/src-CCXHtyvY.js: export uc maps to Tx, which removes the exact five names above from dynamic function tools and from the codex_app namespace.

    A retained older bundle, 26.825.51511 (build 7377), also contains the same exclusion set and a non-Desktop-MCP filtering branch. This is a static comparison only: we have not established the last working release or proven which release introduced the regression.

    The public codex-rs/tui/src/dynamic_tools_mcp.rs also distinguishes Dynamic (non-delegation tool specs) from MCP, with prompt approval configured for create/send/fork. This is supporting architectural context, not proof of the Desktop product rationale or a reason to bypass approvals.

    Requested clarification / fix

    1. Is the remote SSH capability gap intentional, or is the delegation-capable MCP replacement missing from remote initialization?
    2. Please provide a supported remote MCP/tool-registration path that preserves approval handling and allows explicitly authorized remote-to-local and remote-to-remote messaging.
    3. If unsupported, expose an actionable capability reason rather than silently omitting these operations.
    4. Please add an end-to-end regression test that verifies a remote worker actually initiates and delivers an acknowledgment. Local-to-remote delivery and coordinator polling alone do not validate this.

    This report contains only sanitized versions, tool names, bundle code references and reproduction steps. No private hostnames, addresses, paths, task IDs, credentials, conversation contents or raw logs are included. No application patch or security/configuration change was performed.

  10. nanyeglm commented on Sep 19, 2026

    @nanyeglm

    Reproduction update — 2026-09-19

    I can still reproduce this Remote SSH task-delegation regression after updating both ends and fully restarting/reconnecting.

    Environment

    • Desktop client: Microsoft Store ChatGPT/Codex Desktop on Windows, version 26.915.31945 (About dialog; published 2026-09-18)
    • Execution host: Ubuntu Linux connected through the Desktop app's built-in SSH feature
    • Remote Codex CLI: 0.154.0
    • Remote managed App Server daemon reports CLI/App Server 0.154.0
    • Host projection: remote-ssh-discovered:<redacted>
    • No user-authored [mcp_servers.codex_app] configuration

    Direct tool-surface test in the same SSH-backed task

    The task's live tool registry contains the legacy codex_app__* thread tools. These calls succeeded:

    • list_threads: succeeded and returned local plus connected-host tasks
    • read_thread: succeeded for an existing task on the same Ubuntu host
    • wait_threads: succeeded and returned the target task's current status

    An explicitly authorized send_message_to_thread call to that same valid target failed immediately with:

    This app tool is no longer available through dynamic tools. Use the codex_app MCP server. If that server is unavailable on this host, task delegation is unavailable.
    

    The target task was read back after the rejected call; no new user/delegation input was delivered.

    The callable registry contains codex_app__send_message_to_thread, but there is no callable singular mcp__codex_app__send_message_to_thread (or other mcp__codex_app__* replacement). The plural hosted-app namespace is a different service.

    This matches the retained-task failure form in #40865 and the local-vs-SSH transport split documented in this issue. Updating the Windows Store app beyond the builds previously reported here, updating the remote CLI/App Server to 0.154.0, rebooting, and reconnecting did not restore the effectful bridge.

    No OpenCodeX/provider behavior is involved in this failure: list/read/wait complete before model-provider routing is relevant, while the send is rejected by the app-tool handler itself.

    Could a maintainer confirm whether provisioning the singular codex_app MCP bridge for SSH hosts is planned, or whether Remote SSH delegation is intentionally unsupported? The current guidance still tells the agent to use operations that the SSH path cannot execute.

  11. martinbcg commented on Sep 23, 2026

    @martinbcg

    Same issue here:

    Setup

    • Codex Desktop Version 26.917.51856 on macOS, connected to a remote Linux host over SSH (Tailscale)
    • Remote host: codex-cli 0.156.1, sessions have originator: "Codex Desktop"

    What's missing
    On the remote host, the codex_app namespace in dynamic_tools (from session_meta in the rollout files) has the read-only thread tools but not the ones that act on threads:

    • Present: list_threads, read_thread, wait_threads, list_archived_threads, set_thread_title, set_thread_archived, create_worktree, open_in_codex, and get_handoff_status
    • Missing: create_thread, handoff_thread, fork_thread, send_message_to_thread
    • No tool_search is available to load them either

    I checked all 15 Desktop sessions on this host from the same day. None of them had these tools, and none ever called them successfully. The tool list comes from the app (dynamic_tools), so the model or provider used by the session doesn't seem to matter here.

    Why it hurts

    • The Desktop system prompt still tells the agent to "search for create_thread / handoff_thread first", so the agent spends turns looking for tools that aren't there.
    • get_handoff_status is exposed, but it's useless without handoff_thread.
    • When asked to "open a new task to follow this in parallel", the agent falls back to spawn_agent. That creates an internal subagent instead of a task in the sidebar, which isn't what the user asked for. In one session, the agent searched ALL_TOOLS for create|handoff|fork|send_message, found nothing, spawned a subagent to run a production release, and only mentioned at the end that it couldn't create a task.
    • Tasks on the remote host can see each other but can't message each other, which breaks multi-task coordination on a shared checkout.

    Expected
    Either expose create_thread / handoff_thread / send_message_to_thread / fork_thread to remote SSH tasks, or stop telling the agent to use them (and hide get_handoff_status) when they're unavailable.

  12. wjlevan1 commented on Sep 25, 2026

    @wjlevan1

    I’m running into this too with macOS Codex Desktop connected to a headless Linux host over SSH:

    • Desktop: 26.917.71314 (build 10954)
    • Remote CLI/app-server: 0.157.0

    Fresh SSH tasks are missing create_thread, send_message_to_thread, fork_thread, and handoff_thread, while list_threads and read_thread still work. Investigation confirmed the same client-side exclusion path described in this issue.

    Coordinating work across remote tasks now requires switching between them and relaying context manually. That breaks the flow of working in Desktop and makes managing multiple remote tasks considerably more cumbersome.

    I’d appreciate seeing messaging and delegation restored for headless SSH hosts, whether through the SSH integration or a supported codex_app MCP bridge.

  13. dharamf commented on Sep 30, 2026

    @dharamf

    EDIT: see reply below, it's not fixed for me, but there's a workaround.

    I upgraded desktop versions twice today and randomly tried this and it worked (after weeks of being broken).
    desktop build: 26.928.20755
    remote: 0.159.2

    Can anyone else upgrade and confirm if it works for them as well?

  14. suhailnajeeb commented on Sep 30, 2026

    @suhailnajeeb
    Author

    @dharamf Lucky you!
    I'm on the exact same setup:

    desktop build: 26.928.20755 (Mac)
    remote: 0.159.2 (codex CLI over SSH)

    but still no thread messaging tools yet unfortunately.

  15. MtkN1 commented on Sep 30, 2026

    @MtkN1

    Following up on #42973 (comment): this is still reproducible in my remote SSH environment with the same versions.

    • Desktop: 26.928.20755, verified from the remote connection logs (app_server.client_name="Codex Desktop", app_server.client_version="26.928.20755").
    • Remote: the running app-server and proxy were both confirmed to be 0.159.2 after a restart.
    • Tested a newly created chat on the remote Linux SSH host, not just an existing chat.
    • list_threads is present in the live tool catalog.
    • send_message_to_thread, create_thread, fork_thread, and handoff_thread are all absent from the live tool catalog, including deferred tools.

    So the missing-tool behavior persists here even in a fresh remote chat with Desktop 26.928.20755 and remote 0.159.2. This check only inspected tool availability and connection logs; no thread messaging was attempted.

  16. dharamf commented on Sep 30, 2026

    @dharamf

    so upon deeper interrogation my codex had discovered a workaround.
    I still lack create_thread, send_message_to_thread, fork_thread, and handoff_thread.
    What worked was a lower-level workaround: the task launched the upstream experimental codex app-server over stdio and called JSON-RPC thread/start. Desktop then discovered the persisted session.
    Maybe the workaround helps other folks?

  17. rtol5 commented on Sep 30, 2026

    @rtol5

    Adding a September 30 result that distinguishes a native messaging workaround from lower-level thread/start or queue/steer adapters.

    Our baseline SSH-backed Desktop chats had read-side tools but lacked the callable native sender. Local macOS chats could send natively, including a tested Mac-to-SSH message. We then ran the official, unmodified Linux Desktop alongside the existing remote app-server and exposed its genuine bundled app-tools MCP server through a narrow user-configured binding.

    Tested versions:

    • Existing remote CLI/app-server: 0.159.1.
    • Linux Desktop sidecar: 26.928.21956, bundled CLI 0.159.2.
    • Tested agent model: gpt-6.1-sol.

    The Linux Desktop connects to the existing app-server's Unix control socket using CODEX_APP_SERVER_WS_URL. We did not start a replacement app-server or migrate the original threads. Codex core supplies the real caller/turn metadata to the unmodified app-tools implementation.

    Observed result:

    • A fresh executor inherited the global MCP binding without per-thread overrides.
    • Genuine send_message_to_thread reached an existing original Desktop owner that had been reported as notLoaded.
    • That same owner returned a native message to the original coordinator under its original UUID.
    • The coordinator received an actual codex_delegation event with the correct source-thread identity.
    • The owner's model, reasoning effort and approval policy matched before/after; no model/thinking overrides were passed.
    • Supported config/mcpServer/reload made the binding discoverable without restarting the shared app-server. An older owner and the existing coordinator subsequently used it.

    This restores a tested same-VM native exchange through a manually installed Desktop sidecar; it does not mean the standard SSH integration now exposes the sender. VM-to-Mac-local sending, concurrent owners, restart-during-call behavior and graphical source-link clicking remain unqualified.

    The use case is a release coordinator contacting existing independent feature-owner chats and returning integration findings to those same owners, preserving their accumulated implementation context.

    Could the SSH integration provide a supported remote app-tools bridge or equivalent native sender, without requiring a full Desktop sidecar on the execution host? A capability diagnostic separating app-tool registration, routing and stale catalogs would also help. We can supply a small sanitized reproduction privately.

  18. laz-jamesfuller commented on Oct 7, 2026

    @laz-jamesfuller

    Additional Windows + WSL reproduction, verified October 7, 2026:

    • Windows Desktop package: 26.930.7945.0
    • WSL execution host connected through Desktop SSH
    • Installed remote CLI: 0.159.2

    Two existing top-level tasks advertise list_threads, read_thread, and wait_threads, but omit send_message_to_thread, create_thread, fork_thread, and handoff_thread.

    A retained app-tool call returned the instruction to use the codex_app MCP server because delegation is unavailable through dynamic tools.

    Inspection of the installed Desktop bundle confirms local-only Desktop MCP selection and the five-operation exclusion filter on the alternative dynamic path.

    Historical evidence: a WSL task's two outbound messaging calls returned success on August 25. Newly created WSL sessions mostly lacked the tool on August 26, with the same CLI version, 0.147.0. The exact introducing Desktop release remains unknown.

    Is there a supported way to provision the native app-tools MCP bridge for SSH-backed WSL tasks, preserving sender identity and approval handling?

  19. devbotnatanael-hub commented on Oct 10, 2026

    @devbotnatanael-hub

    Additional Windows Desktop → Linux SSH / Linux SSH → Windows Desktop comparison, verified on 2026-10-10. Is there a supported way to provision the native, approval-gated codex_app sender for SSH-backed tasks while preserving source-thread identity?

    • Windows Desktop package: 26.1007.2314.0; bundled runtime: 0.162.0-alpha.17.2. Remote Linux CLI reports 0.162.0.
    • One explicitly user-authorized native send_message_to_thread from Windows to an existing SSH-backed task succeeded. Target readback confirmed receipt and completion.
    • The SSH task can list/read the Windows destination, but its callable catalog and tool discovery do not expose send_message_to_thread. It could not initiate a native return message. Reading its reply from Windows is not a reverse-send success.
    • Read-only inspection of the installed Desktop bundle still shows local-only app-tools MCP activation and exclusion of send_message_to_thread, create_thread, fork_thread, handoff_thread, and automation_update on the alternative dynamic-tool path.
    • A separate, temporary official App Server canary successfully accepted an SSH-side request and produced a model reply on Windows. It did not target normal Desktop-owned conversations and is not a fix for this issue. The temporary processes and remote transport were closed.

    The required workflow is an SSH-hosted Codex sending prompts directly to ordinary Windows Desktop conversations, including newly created ones. Polling, internal subagents and separate API-owned conversations are not equivalent. The same-VM Linux Desktop sidecar result above is useful, but does not yet establish this cross-host route. Please clarify the supported provisioning/routing path, or whether this remains unavailable. No application binaries, existing configuration, keys or permissions were modified, and no existing services were restarted. Private host/user/project names, conversation IDs, paths and credentials are omitted.

  20. KalebCole commented on Oct 15, 2026

    @KalebCole

    Additional reproduction on 2026-10-15 with a Mac-to-Mac setup:

    • Controller: Codex Desktop on a local Mac.
    • Execution host: a connected Mac mini reached through the Desktop remote SSH project workflow.
    • In a chat running on the remote Mac mini, list_projects, list_threads, and read_thread are callable. The project is discoverable, but create_thread (and handoff_thread) are absent from the live callable tool registry: typeof tools.codex_app__create_thread === "undefined".
    • In a separate local Desktop chat on the controller Mac, create_thread is present and callable. That local chat can see the same remote project and has previously used create_thread to create a chat in a remote project.
    • The user explicitly asked the remote chat to create two separate project chats. It could only list the project and existing chats, not create them. A CLI-created session was not an equivalent app project chat and was rejected as a workaround.

    This extends the reported local-vs-remote difference to an Apple Silicon macOS SSH host, rather than only a headless Linux host. I have not established the exact app build or whether this is an intended policy gate. Expected behavior: an authorized remote project chat can create another user-visible chat in that project, or receives an explicit explanation and supported route when the capability is intentionally unavailable. Project names, paths, and thread IDs are omitted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    appIssues related to the Codex desktop appbugSomething isn't workingmcpIssues related to the use of model context protocol (MCP) serversremotesubagentIssues involving subagents or multi-agent features

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions