Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 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
9cc7785
tweak: quotes
ariane-emory Dec 26, 2025
4c08119
feat: add 'r' hotkey to repeat timeline messages in prompt
ariane-emory Dec 26, 2025
b77f61e
restore
ariane-emory Dec 26, 2025
37cbf5f
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 27, 2025
aa4b77e
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 27, 2025
65db1ed
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 27, 2025
a1b9212
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 28, 2025
bc8955d
Merge remote-tracking branch 'origin/dev' into feat/session-timeline-…
ariane-emory Dec 28, 2025
c47bbd1
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 28, 2025
c983a75
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 29, 2025
f411619
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 29, 2025
196892f
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 29, 2025
c749173
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 29, 2025
a2d8465
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 29, 2025
a2d014b
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 30, 2025
8d5dab1
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 30, 2025
ad1dee1
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 30, 2025
e26a697
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 30, 2025
19928c5
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 30, 2025
2c58a07
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 30, 2025
1cd3c3c
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 31, 2025
84d2fa8
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Dec 31, 2025
537c5e2
Fix import paths and type errors from dev merge
ariane-emory Dec 31, 2025
cf9801a
Merge branch 'feat/session-timeline-repeat' of github.com:ariane-emor…
ariane-emory Dec 31, 2025
1e183db
Remove unrelated prompter files from session-timeline-repeat branch
ariane-emory Dec 31, 2025
64fd169
Merge branch 'feat/session-timeline-repeat' of github.com:ariane-emor…
ariane-emory Dec 31, 2025
f00d053
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 1, 2026
c38ffcc
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 1, 2026
f146107
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 1, 2026
0555c89
revert a file
ariane-emory Jan 1, 2026
166bd17
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 2, 2026
c3a08b6
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 3, 2026
de83ae1
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 3, 2026
c0954df
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 4, 2026
83f7bbb
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 4, 2026
a3ef1bc
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 4, 2026
a43eb58
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 5, 2026
5312a9e
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 5, 2026
c70f948
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 5, 2026
d53e5c8
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 5, 2026
7edc5a8
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 6, 2026
7aaf7ac
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 6, 2026
1f6c059
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 6, 2026
162d551
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 6, 2026
45e606b
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 6, 2026
d350ea1
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 7, 2026
1fb0b96
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 7, 2026
c84b0fa
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 7, 2026
3ea17fb
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 7, 2026
1c9c66b
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 8, 2026
24d8af9
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 11, 2026
6112af1
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 13, 2026
c8fb553
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 13, 2026
38c4044
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 13, 2026
b7c39bf
Merge branch 'feat/session-timeline-repeat' of github.com:ariane-emor…
ariane-emory Jan 13, 2026
eb3f860
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 15, 2026
4d8352b
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 16, 2026
8685bb3
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 17, 2026
75a8ae5
Fix test failures introduced by dev merge
ariane-emory Jan 17, 2026
696d76f
Fix: restore synthetic/ignored filtering in timeline
ariane-emory Jan 17, 2026
c445ed0
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 17, 2026
03e9647
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 19, 2026
01ae61d
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 19, 2026
c33dd60
Merge branch 'dev' into feat/session-timeline-repeat
ariane-emory Jan 22, 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
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useSync } from "@tui/context/sync"
import { DialogSelect, type DialogSelectOption } from "@tui/ui/dialog-select"
import type { TextPart } from "@opencode-ai/sdk/v2"
import { Locale } from "@/util/locale"
import { Keybind } from "@/util/keybind"
import { DialogMessage } from "./dialog-message"
import { useDialog } from "../../ui/dialog"
import type { PromptInfo } from "../../component/prompt/history"
Expand All @@ -19,14 +20,34 @@ export function DialogTimeline(props: {
dialog.setSize("large")
})

const keybinds = createMemo(() => {
if (!props.setPrompt) return []
return [
{
keybind: Keybind.parse("r")[0],
title: "repeat",
onTrigger: (option: DialogSelectOption<string>) => {
const messageID = option.value
const allParts = sync.data.part[messageID] ?? []
const relevantParts = allParts
const textPart = relevantParts.find((x) => x.type === "text" && !x.synthetic && !x.ignored) as TextPart | undefined
const input = textPart?.text ?? ""
const parts = relevantParts.filter((x) => x.type === "file" || x.type === "agent")
props.setPrompt!({ input, parts })
dialog.clear()
},
},
]
})

const options = createMemo((): DialogSelectOption<string>[] => {
const messages = sync.data.message[props.sessionID] ?? []
const result = [] as DialogSelectOption<string>[]
for (const message of messages) {
if (message.role !== "user") continue
const part = (sync.data.part[message.id] ?? []).find(
(x) => x.type === "text" && !x.synthetic && !x.ignored,
) as TextPart
) as TextPart | undefined
if (!part) continue
result.push({
title: part.text.replace(/\n/g, " "),
Expand All @@ -43,5 +64,12 @@ export function DialogTimeline(props: {
return result
})

return <DialogSelect onMove={(option) => props.onMove(option.value)} title="Timeline" options={options()} />
return (
<DialogSelect
onMove={(option) => props.onMove(option.value)}
title="Timeline"
options={options()}
keybind={keybinds()}
/>
)
}
9 changes: 5 additions & 4 deletions packages/opencode/test/project/project.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,11 @@ describe("Project.fromDirectory with worktrees", () => {
test("should accumulate multiple worktrees in sandboxes", async () => {
await using tmp = await tmpdir({ git: true })

const worktree1 = path.join(tmp.path, "..", "worktree-1")
const worktree2 = path.join(tmp.path, "..", "worktree-2")
await $`git worktree add ${worktree1} -b branch-1`.cwd(tmp.path).quiet()
await $`git worktree add ${worktree2} -b branch-2`.cwd(tmp.path).quiet()
const timestamp = Date.now()
const worktree1 = path.join(tmp.path, "..", `worktree-${timestamp}-1`)
const worktree2 = path.join(tmp.path, "..", `worktree-${timestamp}-2`)
await $`git worktree add ${worktree1} -b branch-${timestamp}-1`.cwd(tmp.path).quiet()
await $`git worktree add ${worktree2} -b branch-${timestamp}-2`.cwd(tmp.path).quiet()

await Project.fromDirectory(worktree1)
const { project } = await Project.fromDirectory(worktree2)
Expand Down