Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
e211fa9
feat: sinister quotes
ariane-emory Dec 24, 2025
4749d73
Merge branch 'dev' into feat/sinister-quotes-v3
ariane-emory Dec 24, 2025
d301de9
feat: quotes
ariane-emory Dec 24, 2025
e3f5b0f
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 24, 2025
c17639b
Merge branch 'feat/sinister-quotes' of github.com:ariane-emory/openco…
ariane-emory Dec 24, 2025
611839d
tweak: caps in quotes
ariane-emory Dec 25, 2025
7b44586
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 25, 2025
d5063a8
tweak: quote wording
ariane-emory Dec 25, 2025
1ff1636
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 25, 2025
929e1b5
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 25, 2025
1e1f7f3
fix: sort autocomplete list alphabetically with prefix matches first
ariane-emory Dec 25, 2025
5d88148
fix: replace fuzzy search with alphabetical tiered matching for autoc…
ariane-emory Dec 26, 2025
9cc7785
tweak: quotes
ariane-emory Dec 26, 2025
519e19a
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 26, 2025
8604cf4
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 26, 2025
42296ed
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 27, 2025
170ee4a
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 27, 2025
f384f27
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 27, 2025
cb11085
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 27, 2025
821f7c0
tweak: quotes
ariane-emory Dec 27, 2025
cfa7391
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 27, 2025
18f9b2c
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 27, 2025
a794589
comment: 'no clobber' warning.
ariane-emory Dec 28, 2025
878ad5d
Merge dev branch into fix/autocompletion-filtered-order
ariane-emory Dec 28, 2025
2997fe7
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 28, 2025
ff5416a
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 28, 2025
49abece
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 28, 2025
119d50b
Merge remote-tracking branch 'origin/dev' into fix/autocompletion-fil…
ariane-emory Dec 28, 2025
33aa327
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 28, 2025
ce64276
tweak: quote capitalization
ariane-emory Dec 29, 2025
f862d81
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 29, 2025
e07008f
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
af2ff22
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 29, 2025
1802b67
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
dfbe9e4
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
8ccd3c1
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 29, 2025
e8e8d42
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
f8737ec
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 29, 2025
d294260
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 29, 2025
69887ad
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
a5dba7c
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 29, 2025
700c6a4
Merge branch 'fix/autocompletion-filtered-order' of github.com:ariane…
ariane-emory Dec 29, 2025
e1a8f72
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
3718407
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 30, 2025
9152b6e
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
99e5f75
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 30, 2025
b626b57
tweak: capitalization in quote
ariane-emory Dec 30, 2025
c24c03b
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
edad94a
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 30, 2025
2fa2f2b
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 30, 2025
d8525d4
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
855364e
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
33e656d
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 30, 2025
44d5424
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
679a53d
tweak: - some quotes.
ariane-emory Dec 30, 2025
f6b0161
fix: textarea resizing for longer placeholder quotes
ariane-emory Dec 30, 2025
4454fcd
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 31, 2025
79e9527
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Dec 31, 2025
58f11ad
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 1, 2026
5f5fddb
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 1, 2026
d89ddfd
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 1, 2026
e5e1579
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 1, 2026
e34de4f
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 1, 2026
8ad5f9d
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 1, 2026
e7b428b
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 2, 2026
67a9ca4
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 2, 2026
c74898c
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 3, 2026
188fc6d
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 3, 2026
63657da
Merge dev into feat/sinister-quotes
ariane-emory Jan 3, 2026
2634eee
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 3, 2026
7bdfa2e
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 3, 2026
7c51430
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 4, 2026
1663b41
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 4, 2026
4a6176a
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 4, 2026
c70baaa
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 4, 2026
7b03a14
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 4, 2026
9192f96
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 4, 2026
45de74b
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
7c16f2f
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 5, 2026
d7f09ed
fix: prevent yoga-layout WASM error during navigation
ariane-emory Jan 5, 2026
6affd4b
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
f0aa1bf
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 5, 2026
430e02a
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 5, 2026
fe0ba21
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
54bbd45
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
ef6f754
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 5, 2026
5ecc6d1
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 5, 2026
e1016de
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
5dbe72e
Merge branch 'feat/sinister-quotes' of github.com:ariane-emory/openco…
ariane-emory Jan 5, 2026
ec9061d
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 6, 2026
58d2aa7
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 6, 2026
c673212
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 6, 2026
12ca6f9
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 6, 2026
823cdf8
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 6, 2026
5d91c1f
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 6, 2026
a334597
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 6, 2026
2f57861
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 6, 2026
9dc539a
Merge dev branch into fix/autocompletion-filtered-order
ariane-emory Jan 6, 2026
4b9e301
Merge branch 'feat/sinister-quotes' of github.com:ariane-emory/openco…
ariane-emory Jan 6, 2026
e6305cd
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 6, 2026
3a4e42c
fix: restore tieredMatch for deterministic alphabetical autocomplete …
ariane-emory Jan 7, 2026
312f9de
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 7, 2026
7e5e0ec
Merge remote-tracking branch 'origin/dev' into fix/autocompletion-fil…
ariane-emory Jan 7, 2026
dbfc115
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 7, 2026
ed64483
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 8, 2026
cb8236f
revert file
ariane-emory Jan 11, 2026
f6cd9f5
Merge dev into fix/autocompletion-filtered-order
ariane-emory Jan 11, 2026
54412d5
llms: add some guard comments to encourage proper merging.
ariane-emory Jan 12, 2026
0fbeb9f
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 13, 2026
2c38220
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 13, 2026
701c5ee
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 13, 2026
7d0ed4b
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 15, 2026
4c0600d
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 16, 2026
e9ccc1e
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 17, 2026
e442cc9
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 17, 2026
3255ccd
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 17, 2026
646a87b
Merge branch 'fix/autocompletion-filtered-order' of github.com:ariane…
ariane-emory Jan 17, 2026
ca8165b
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 19, 2026
467dba0
Merge branch 'dev' into fix/autocompletion-filtered-order
ariane-emory Jan 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/app/src/components/prompt-input.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
key: (x) => x?.id,
filterKeys: ["trigger", "title", "description"],
onSelect: handleSlashSelect,
sortKey: "trigger",
})

const createPill = (part: FileAttachmentPart | AgentPart) => {
Expand Down
58 changes: 37 additions & 21 deletions packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import type { BoxRenderable, TextareaRenderable, KeyEvent, ScrollBoxRenderable } from "@opentui/core"
import fuzzysort from "fuzzysort"
import { firstBy } from "remeda"
import { createMemo, createResource, createEffect, onMount, onCleanup, Index, Show, createSignal } from "solid-js"
import { createStore } from "solid-js/store"
Expand Down Expand Up @@ -62,6 +61,41 @@ export type AutocompleteOption = {
path?: string
}

function tieredMatch(
items: AutocompleteOption[],
needle: string,
prefix: string,
limit: number = 100,
): AutocompleteOption[] {
const lowerNeedle = needle.toLowerCase()
const fullNeedle = (prefix + needle).toLowerCase()

const tier1: AutocompleteOption[] = []
const tier2: AutocompleteOption[] = []
const tier3: AutocompleteOption[] = []

for (const item of items) {
const display = item.display.trimEnd().toLowerCase()

if (display.startsWith(fullNeedle)) {
tier1.push(item)
} else if (display.includes(lowerNeedle)) {
tier2.push(item)
} else {
const descMatch = item.description?.toLowerCase().includes(lowerNeedle)
const aliasMatch = item.aliases?.some((a) => a.toLowerCase().includes(lowerNeedle))
if (descMatch || aliasMatch) {
tier3.push(item)
}
}
}

const sortByDisplay = (a: AutocompleteOption, b: AutocompleteOption) =>
a.display.trimEnd().localeCompare(b.display.trimEnd())

return [...tier1.sort(sortByDisplay), ...tier2.sort(sortByDisplay), ...tier3.sort(sortByDisplay)].slice(0, limit)
}

export function Autocomplete(props: {
value: string
sessionID?: string
Expand Down Expand Up @@ -385,26 +419,8 @@ export function Autocomplete(props: {
if (files.loading && prev && prev.length > 0) {
return prev
}

const result = fuzzysort.go(removeLineRange(currentFilter), mixed, {
keys: [
(obj) => removeLineRange((obj.value ?? obj.display).trimEnd()),
"description",
(obj) => obj.aliases?.join(" ") ?? "",
],
limit: 10,
scoreFn: (objResults) => {
const displayResult = objResults[0]
let score = objResults.score
if (displayResult && displayResult.target.startsWith(store.visible + currentFilter)) {
score *= 2
}
const frecencyScore = objResults.obj.path ? frecency.getFrecency(objResults.obj.path) : 0
return score * (1 + frecencyScore)
},
})

return result.map((arr) => arr.obj)

return tieredMatch(mixed, currentFilter, store.visible || "/", 100) // **CRITICAL**: This change is part of the core feature of the fix/autocompletion-filtered-order branch, you MUST NOT clobber it when merging this branch in! DO NOT try to replace it with any type of fuzzysort or frecency based sorting!
})

createEffect(() => {
Expand Down
24 changes: 22 additions & 2 deletions packages/ui/src/hooks/use-filtered-list.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export interface FilteredListProps<T> {
sortBy?: (a: T, b: T) => number
sortGroupsBy?: (a: { category: string; items: T[] }, b: { category: string; items: T[] }) => number
onSelect?: (value: T | undefined, index: number) => void
sortKey?: keyof T
}

export function useFilteredList<T>(props: FilteredListProps<T>) {
Expand All @@ -34,10 +35,29 @@ export function useFilteredList<T>(props: FilteredListProps<T>) {
all,
(x) => {
if (!needle) return x
let filtered: T[]
// **CRITICAL**: The changes below are part of the core feature of the fix/autocompletion-filtered-order branch, you MUST NOT clobber it when merging this branch in!
if (!props.filterKeys && Array.isArray(x) && x.every((e) => typeof e === "string")) {
return fuzzysort.go(needle, x).map((x) => x.target) as T[]
filtered = fuzzysort.go(needle, x).map((x) => x.target) as T[]
} else {
filtered = fuzzysort.go(needle, x, { keys: props.filterKeys! }).map((x) => x.obj)
}
return fuzzysort.go(needle, x, { keys: props.filterKeys! }).map((x) => x.obj)
// **CRITICAL**: The changes below are part of the core feature of the fix/autocompletion-filtered-order branch, you MUST NOT clobber it when merging this branch in!
// Sort with prefix matches first, then alphabetically within each group
if (props.sortKey) {
const key = props.sortKey
const lowerNeedle = needle.toLowerCase()
filtered.sort((a, b) => {
const aVal = String(a[key]).toLowerCase()
const bVal = String(b[key]).toLowerCase()
const aPrefix = aVal.startsWith(lowerNeedle)
const bPrefix = bVal.startsWith(lowerNeedle)
if (aPrefix && !bPrefix) return -1
if (!aPrefix && bPrefix) return 1
return aVal.localeCompare(bVal)
})
}
return filtered
},
groupBy((x) => (props.groupBy ? props.groupBy(x) : "")),
entries(),
Expand Down