Skip to content

Workspace picker confirm loops instead of attaching selected directory #671

Description

@yuhua0731

Environment

  • Product: Codex Remote Feishu
  • Version: v1.8.4
  • Platform: macOS
  • Surface: Feishu group chat, bot mentioned with /workspace new dir

What happened

In a Feishu group chat, I tried to attach an existing local directory as a workspace:

  1. Mention the bot in a group chat: @bot /workspace new dir
  2. Choose an existing local directory, for example /Users/<local-user>/codex-remote-hh
  3. Leave the optional "create new directory under this directory" field empty
  4. Click "接入并继续"

Nothing visibly happens in Feishu. The card remains on the same picker state, and no workspace conversation is entered.

The same also happens if I enter a new directory name and click "创建并继续".

Expected behavior

After choosing a directory and clicking the confirm button, the group chat surface should attach to the selected workspace and enter a new Codex conversation.

Actual behavior

The button callback reaches the daemon, but it only re-renders the target picker card repeatedly. The workspace is not attached.

Relevant local log pattern:

surface action: ... kind=surface.target_picker.confirm ...
ui event: ... kind=target.picker
surface action: ... kind=surface.target_picker.confirm ...
ui event: ... kind=target.picker

No permission or Feishu callback failure was observed. The gateway stayed connected, and manually editing surface-resume-state.json to bind the same group surface to the same local directory made the group chat work immediately.

Possible cause

This looks related to applyTargetPickerDraftAnswers in internal/core/orchestrator/service_target_picker_add_workspace.go.

When the callback contains FeishuTargetPickerLocalDirectoryNameFieldName, the code resets:

record.LocalDirectoryName = strings.TrimSpace(value)
record.LocalDirectoryChecked = false
record.LocalDirectoryFinalPath = ""

On confirm callbacks, Feishu appears to send the input field value again, even if it is unchanged or empty. That clears LocalDirectoryChecked before the confirm path can complete, so the UI returns to target.picker instead of attaching the workspace.

Workaround used

I manually inserted a resume-state entry for the group surface with:

{
  "resumeWorkspaceKey": "/Users/<local-user>/codex-remote-hh",
  "resumeRouteMode": "new_thread_ready"
}

After restarting the service, the daemon started a headless instance for that workspace and the group chat worked.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions