Skip to content

feat(desktop): open attachments in active project#31192

Merged
Hona merged 10 commits into
anomalyco:devfrom
Hona:fix/desktop-picker-project-directory
Jun 7, 2026
Merged

feat(desktop): open attachments in active project#31192
Hona merged 10 commits into
anomalyco:devfrom
Hona:fix/desktop-picker-project-directory

Conversation

@Hona

@Hona Hona commented Jun 7, 2026

Copy link
Copy Markdown
Member

TLDR;

  • Desktop file attachments now open from the project you are currently working in.
  • Project folder selection consistently uses the native picker for local desktop projects and the server picker for web and remote projects.

Changelog

Fixed

  • Choosing Add files in the desktop app with a local server now opens the native file picker in the active project instead of reusing a previously visited project folder.
  • Switching projects before choosing Add files now updates the file picker's starting folder to match the newly selected project.
  • Native attachment picker failures now show an error instead of surfacing as an unhandled rejection.
  • Starting another attachment selection while earlier files are still processing no longer invalidates the earlier selection.

Changed

  • Project folder selection now follows one consistent routing path across the home screen, project sidebar, and new-session project selector.
  • Desktop attachments are read and processed one at a time, with selections limited to 20 MB total to keep memory use bounded.

Copilot AI review requested due to automatic review settings June 7, 2026 04:52
@Hona Hona requested a review from adamdotdevin as a code owner June 7, 2026 04:52

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the desktop attachment workflow so that “Add files” (when connected to a local server) opens a native file picker rooted at the currently active project directory, avoiding reuse of a previously visited folder.

Changes:

  • Added a desktop-only native attachment picker (open-attachment-picker) that reads selected files and returns them to the renderer.
  • Extended the app Platform interface with openAttachmentPickerDialog and wired PromptInput to use it for local servers (with fallback to the browser file input when unavailable).
  • Added a small helper (pickAttachmentFiles) plus tests to ensure the picker’s defaultPath is re-evaluated on each invocation (e.g., after switching projects).

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
packages/desktop/src/renderer/index.tsx Adds openAttachmentPickerDialog to the desktop Platform implementation and converts IPC results into File objects.
packages/desktop/src/preload/types.ts Extends the preload API typings with openAttachmentPicker.
packages/desktop/src/preload/index.ts Exposes openAttachmentPicker via ipcRenderer.invoke.
packages/desktop/src/main/ipc.ts Implements open-attachment-picker IPC handler using Electron’s open dialog + file reads.
packages/app/src/context/platform.tsx Adds openAttachmentPickerDialog to the shared Platform type.
packages/app/src/components/prompt-input/files.ts Introduces pickAttachmentFiles helper used by PromptInput to pass defaultPath per invocation.
packages/app/src/components/prompt-input/attachments.test.ts Adds unit tests for pickAttachmentFiles behavior and fallback.
packages/app/src/components/prompt-input.tsx Switches local-server attach flow to native picker (with fallback) and adds attachments from returned files.
Comments suppressed due to low confidence (1)

packages/desktop/src/main/ipc.ts:142

  • open-attachment-picker reads each selected file with readFile inside Promise.all(...) but does not handle per-file read failures. If the user selects a file that can't be read (permissions, transient FS errors), the entire IPC invoke will reject and can bubble up as an unhandled rejection in the renderer. Consider catching read errors per file and returning null (or filtering unreadable files) instead of rejecting the whole request.
        defaultPath: opts?.defaultPath,
      })
      if (result.canceled) return null
      return result.filePath ?? null
    },
  )

  ipcMain.on("open-link", (_event: IpcMainEvent, url: string) => {
    void shell.openExternal(url)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +469 to +476
const pick = async () => {
if (server.isLocal()) {
fileInputRef?.click()
const files = await pickAttachmentFiles({
picker: platform.openAttachmentPickerDialog,
directory: () => sdk.directory,
fallback: () => fileInputRef?.click(),
})
if (files) await addAttachments(files)
@Hona Hona enabled auto-merge (squash) June 7, 2026 05:02
@Hona Hona disabled auto-merge June 7, 2026 05:08
@Hona Hona enabled auto-merge (squash) June 7, 2026 05:41
@Hona Hona merged commit 2181472 into anomalyco:dev Jun 7, 2026
11 of 12 checks passed
aiand-atul added a commit to aiandlabs/aiand-code that referenced this pull request Jun 8, 2026
* feat(app): improve desktop multi-server support (anomalyco#30678)

Co-authored-by: Brendan Allan <git@brendonovich.dev>

* chore: generate

* fix(app): handle tab overflow and scrolling in titlebar (anomalyco#30886)

* fix(app): tab overflow (anomalyco#30894)

* tui: guard path formatting inputs (anomalyco#30469)

Fixes anomalyco#27726, anomalyco#25216, anomalyco#24856, anomalyco#24294, anomalyco#17071, anomalyco#29164, anomalyco#24837, anomalyco#16865, anomalyco#14279, anomalyco#29895

* opencode/run: refresh themes after terminal reloads (anomalyco#30917)

* chore: generate

* fix(tui): fall back to local cwd when editor spawns in attach mode (anomalyco#30583)

* docs: update Go Qwen tiered pricing (anomalyco#30936)

* chore: generate

* feat(tui): add diff hunk navigation (anomalyco#30935)

* chore: rm fuzzy search on references (anomalyco#30931)

* fix: use mapError instead of orDie for context snapshot decoding (anomalyco#30905)

Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>

* fix(core): recover corrupted models cache (anomalyco#30947)

* chore: bun install (anomalyco#30968)

* fix(opencode): resolve Bedrock hang by using node build conditions (anomalyco#30873)

* fix(workflows): retry nix-hashes compute-hash on transient failure (anomalyco#30743)

* fix(stats): scroll model charts to latest on mobile

* fix(opencode): prevent destructive edit matches (anomalyco#30932)

* chore: generate

* fix(core): respect v2 default agents (anomalyco#30969)

* chore: generate

* test(opencode): remove disposal event wait race (anomalyco#30971)

* test(opencode): remove shell timeout output race (anomalyco#30974)

* fix(opencode): gate reasoning summaries by provider (anomalyco#30973)

* feat(core): admit v2 skill guidance (anomalyco#30843)

* fix(workflows): serialize desktop release uploads (anomalyco#30978)

* fix(stats): add mobile chart end spacing

* chore: generate

* sync release versions for v1.16.2

* feat(core): interrupt v2 session execution (anomalyco#30850)

* chore: generate

* feat(core): honor default session models (anomalyco#30982)

* fix(core): harden model selection edges (anomalyco#30987)

* fix(tui): show current location in working copies; order by created; change shortcut; tab to cycle actions in dialog select (anomalyco#30989)

* chore: generate

* feat(core): compact v2 session context (anomalyco#30986)

* fix(opencode): terminate help output with newline (anomalyco#30992)

* fix(opencode): honor Bedrock Mantle config (anomalyco#31001)

* fix(core): preserve model request semantics (anomalyco#30990)

* chore: generate

* feat(core): bound v2 tool output (anomalyco#30999)

* chore: generate

* fix(core): scope Vertex provider transforms (anomalyco#31004)

* feat(core): expose session model switching (anomalyco#31011)

* fix(tui): update tool spacing before layout

* fix(core): recover v2 context overflow (anomalyco#31005)

* fix(core): validate public session model switches (anomalyco#31012)

* feat(tui): delete working copies from move dialog (anomalyco#31017)

* chore: generate

* fix(tui): bootstrap new project copies (anomalyco#31019)

* fix(opencode): limit generated project copy names (anomalyco#31022)

* fix(tui): inject reminder after moving session (anomalyco#31027)

* fix(session): respect directory filter with workspaces (anomalyco#30804)

* feat(app): improve servers UI (anomalyco#30961)

* chore: generate

* feat(app): updates to project avatar (anomalyco#30964)

* chore: generate

* feat(app): sessions list improvements (anomalyco#30941)

* chore: generate

* fix(core): scope v2 prompt cache by session (anomalyco#31036)

Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>

* fix(stats): filter market share to go

* fix(app): increase project session limit and add scrolling (anomalyco#31035)

* fix(core): make V2 reads media-aware and binary-safe (anomalyco#31038)

* chore: update nix node_modules hashes

* feat(opencode): add search to auth logout command (anomalyco#31053)

* feat(opencode): support non-interactive MCP add (anomalyco#31054)

* feat(http-recorder): prepare public beta release (anomalyco#31018)

* refactor(core): simplify filesystem mutation protocol (anomalyco#31059)

* refactor(core): simplify filesystem read protocol (anomalyco#31058)

* chore: update nix node_modules hashes

* refactor(core): simplify search root protocol (anomalyco#31060)

* feat: desktop v2 everything WSL (anomalyco#23407)

* chore: generate

* fix(core): bound prompt cache session keys (anomalyco#31062)

* fix(core): enforce V2 tool permissions (anomalyco#31061)

* feat(opencode): fff search tools (anomalyco#27802)

Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>

* chore: generate

* chore: update nix node_modules hashes

* fix: background agent prompting, lets kill this sleep behavior oml (anomalyco#31162)

* test: fix tool test (anomalyco#31163)

* docs: fix MCP header interpolation example to {env:VAR} (anomalyco#31078)

Co-authored-by: wujunchen <wujunchen@baidu.com>

* chore(http-recorder): disable release automation (anomalyco#31160)

* refactor(core): unify v2 tool architecture (anomalyco#31168)

* fix(core): use static tool type imports (anomalyco#31170)

* docs(v2): update permission rule naming (anomalyco#31167)

* fix(core): isolate image normalization (anomalyco#31165)

* fix(test): release Windows search handles (anomalyco#31172)

* fix(core): harden unified tool runtime (anomalyco#31171)

* test(core): cover managed output read permissions (anomalyco#31166)

* fix(core): preserve session failure causes

* refactor(server): canonicalize service API (anomalyco#31049)

* chore: generate

* chore: update nix node_modules hashes

* fix(tui): sort connect providers alphabetically (anomalyco#30891)

Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>

* feat(desktop): make updates persistent and responsive (anomalyco#31191)

* chore: generate

* refactor(tui): extract standalone package (anomalyco#31193)

* chore: generate

* chore: update nix node_modules hashes

* fix(app): refresh directory MCP status (anomalyco#31194)

* feat(desktop): open attachments in active project (anomalyco#31192)

* chore: generate

* fix(desktop): style home session scrollbar (anomalyco#31202)

* fix(desktop): disable hidden agent cycling (anomalyco#31207)

* test(core): cover skill directory output (anomalyco#31263)

* fix(opencode): avoid duplicate skill catalog (anomalyco#31269)

* chore(opencode): update MCP SDK to 1.29.0 (anomalyco#31268)

* chore: generate

* chore: update nix node_modules hashes

* run: make minimal mode more minimal (anomalyco#31227)

* chore: generate

---------

Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Brendan Allan <git@brendonovich.dev>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Simon Klee <hello@simonklee.dk>
Co-authored-by: pcadena-lila <pcadena@lila.ai>
Co-authored-by: Jack <jack@anoma.ly>
Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com>
Co-authored-by: weiconghe <46336277+weiconghe@users.noreply.github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Co-authored-by: alberto <914199+alblez@users.noreply.github.com>
Co-authored-by: Jérôme Benoit <jerome.benoit@sap.com>
Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com>
Co-authored-by: Kit Langton <kit.langton@gmail.com>
Co-authored-by: opencode <opencode@sst.dev>
Co-authored-by: James Long <longster@gmail.com>
Co-authored-by: mridul <65942753+rexdotsh@users.noreply.github.com>
Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com>
Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Dmitriy Kovalenko <dmitriy@iusevimbtw.com>
Co-authored-by: fancivez <384514351@qq.com>
Co-authored-by: wujunchen <wujunchen@baidu.com>
Co-authored-by: Dax <mail@thdxr.com>
Co-authored-by: Robert Douglass <rob@robshouse.net>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
avion23 pushed a commit to avion23/opencode that referenced this pull request Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants