Skip to content

feat(opencode): fff search tools#27802

Merged
nexxeln merged 5 commits into
anomalyco:devfrom
dmtrKovalenko:feat/fff-search-tools
Jun 6, 2026
Merged

feat(opencode): fff search tools#27802
nexxeln merged 5 commits into
anomalyco:devfrom
dmtrKovalenko:feat/fff-search-tools

Conversation

@dmtrKovalenko

Copy link
Copy Markdown
Contributor

Issue for this PR

Closes #<you guys know right?>

Type of change

  • Bug fix
  • New feature
  • Refactor / code improvement
  • Documentation

What does this PR do?

This implements fff pickers for the all file search operation - file search, content search, directories & mixed search.

If you paste a large clearly AI generated description here your PR may be IGNORED or CLOSED!

How did you verify your code works?

bun test
bun dev .
bun run bench-fff.ts

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

If you do not follow this template your PR will be automatically rejected.

@github-actions github-actions Bot added needs:compliance This means the issue will auto-close after 2 hours. needs:title labels May 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Hey! Your PR title Feat/fff search tools doesn't follow conventional commit format.

Please update it to start with one of:

  • feat: or feat(scope): new feature
  • fix: or fix(scope): bug fix
  • docs: or docs(scope): documentation changes
  • chore: or chore(scope): maintenance tasks
  • refactor: or refactor(scope): code refactoring
  • test: or test(scope): adding or updating tests

Where scope is the package name (e.g., app, desktop, opencode).

See CONTRIBUTING.md for details.

@github-actions

Copy link
Copy Markdown
Contributor

The following comment was made by an LLM, it may be inaccurate:

Based on the search results, I found 2 potentially related PRs that address similar fff search functionality:

  1. PR feat: switch file search to fff #18419 - feat: switch file search to fff

  2. PR feat(search): add runtime-aware search service with fff #23890 - feat(search): add runtime-aware search service with fff

Why they're related: All three PRs focus on integrating fff (a fuzzy file finder) with the search functionality. PR #27802 implements fff pickers for file search, content search, directories, and mixed search - which could potentially be addressing the same feature set as the earlier PRs.

You may want to check if these earlier PRs were completed, merged, or abandoned to determine if #27802 is a duplicate effort or a continuation/improvement of prior work.

@dmtrKovalenko dmtrKovalenko changed the title Feat/fff search tools feat: fff search tools May 15, 2026
@github-actions github-actions Bot removed needs:title needs:compliance This means the issue will auto-close after 2 hours. labels May 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for updating your PR! It now meets our contributing guidelines. 👍

@dmtrKovalenko dmtrKovalenko changed the title feat: fff search tools feat(opencode): fff search tools May 15, 2026
@dmtrKovalenko dmtrKovalenko force-pushed the feat/fff-search-tools branch 5 times, most recently from 359023d to c53db50 Compare May 16, 2026 00:33
)
}

if (result.hasNextPage) {

@dmtrKovalenko dmtrKovalenko May 16, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

this is replaces the truncated message above. Needed because fff doesn't perform the full search once it found requested amount (there could be a bit more if certain file contains a ton of results as the internal pagination is happening over files)

This saves a ton of system resources on large directories when we can reduce amount of syscalls spent on opening and reading files

@Hona Hona left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I struggled far more than I should have trying to manually test this, so what is intended here anyway?

I wanted to make a cool post that worst-case agent scans of my whole hard drive are now faster, but I couldn't get those results:

  • C:\ fell back to ripgrep.
  • ~ with **/opencode.json{,c} fell back to ripgrep.
  • ~ with missing **/opencode.jsonc fell back to ripgrep and failed.
  • The TUI @ file picker does not use FFF.

~ with **/opencode.json was fast through FFF, but it was the only path I could get working.

const id = key(dir)
const made = yield* fffSync("create picker", () =>
Fff.create({
basePath: dir,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

C:\ cannot use FFF here: FFF rejects filesystem roots, so worst-case broad searches immediately fall back to ripgrep.

Comment thread packages/opencode/src/file/search.ts Outdated

if (pick) {
const out = yield* fffSync("glob file search", () =>
pick.fileSearch(include(input.pattern), {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

**/opencode.json{,c} fell back to ripgrep while **/opencode.json used FFF. Common glob syntax appears to miss the new path.

Comment thread packages/opencode/src/file/search.ts Outdated
),
)

if (rows.length > 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Shouldn't a successful FFF search with no matches return []? **/opencode.jsonc under ~ fell back to ripgrep and then failed on an inaccessible directory.

Comment thread packages/opencode/src/file/index.ts Outdated
yield* ensure()
const { cache } = yield* InstanceState.get(state)

if (query && kind === "file") {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The TUI @ picker does not hit this branch: it calls find.files({ query, workspace }), which resolves to kind === "all". I verified this headlessly against the PR checkout. On Windows, even an explicit type: "file" call still returned mode=cache because FFF results use / while the cached paths use \.

opencode-agent Bot added a commit that referenced this pull request Jun 6, 2026
@dmtrKovalenko dmtrKovalenko force-pushed the feat/fff-search-tools branch from 0805457 to bb3e65b Compare June 6, 2026 07:07
opencode-agent Bot added a commit that referenced this pull request Jun 6, 2026
opencode-agent Bot added a commit that referenced this pull request Jun 6, 2026
opencode-agent Bot added a commit that referenced this pull request Jun 6, 2026
opencode-agent Bot added a commit that referenced this pull request Jun 6, 2026
@nexxeln nexxeln merged commit 7d3d80f into anomalyco:dev Jun 6, 2026
7 of 9 checks passed
opencode-agent Bot added a commit that referenced this pull request Jun 6, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants