Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
164 commits
Select commit Hold shift + click to select a range
befbeda
fix(session): subagents not being clickable (#20263)
thdxr Mar 31, 2026
b1e89c3
release: v1.3.10
Mar 31, 2026
1fcb920
upgrade opentui to 0.1.93 (#19950)
kommander Mar 31, 2026
2e78fde
ensure pinned plugin versions and do not run package scripts on insta…
kommander Mar 31, 2026
85c1692
chore: use paid zen model in e2e
adamdotdevin Mar 31, 2026
25a2b73
warn only and ignore plugins without entrypoints, default config via …
kommander Mar 31, 2026
8c2e2ec
chore: e2e model
adamdotdevin Mar 31, 2026
7342e65
chore: update nix node_modules hashes
opencode-agent[bot] Mar 31, 2026
2daf4b8
feat: add a dedicated system prompt for Kimi models (#20259)
Yuxin-Dong Mar 31, 2026
6e61a46
chore: skip 2 tests
adamdotdevin Mar 31, 2026
2929774
chore: rm harcoded model definition from codex plugin (#20294)
rekram1-node Mar 31, 2026
434d82b
test: update model test fixture (#20182)
rekram1-node Mar 31, 2026
567a911
refactor(session): simplify LLM stream by replacing queue with fromAs…
thdxr Mar 31, 2026
beab4cc
release: v1.3.11
Mar 31, 2026
4dd866d
fix: rm exclusion of ai-sdk/azure in transform.ts, when we migrated t…
rekram1-node Mar 31, 2026
26cc924
feat: enable prompt caching and cache token tracking for google-verte…
major Mar 31, 2026
d6d4446
Update VOUCHED list
github-actions[bot] Mar 31, 2026
1812130
upgrade opentui to 0.1.94 (#20357)
kommander Mar 31, 2026
892bdeb
release: v1.3.12
Mar 31, 2026
53330a5
Update VOUCHED list
github-actions[bot] Mar 31, 2026
0c03a3e
test: migrate prompt tests to HTTP mock LLM server (#20304)
kitlangton Mar 31, 2026
954a6ca
refactor(session): effectify SessionSummary service (#20142)
kitlangton Mar 31, 2026
3fc0367
refactor(session): effectify SessionRevert service (#20143)
kitlangton Mar 31, 2026
9b09a7e
chore: generate
opencode-agent[bot] Mar 31, 2026
4280307
chore: update nix node_modules hashes
opencode-agent[bot] Mar 31, 2026
4b4b783
upgrade opentui to 0.1.95 (#20369)
kommander Mar 31, 2026
6314f09
release: v1.3.13
Apr 1, 2026
181b5f6
refactor(prompt): use Provider service in effect layers (#20167)
kitlangton Apr 1, 2026
7532d99
test: finish HTTP mock processor coverage (#20372)
kitlangton Apr 1, 2026
ca376a4
chore: update nix node_modules hashes
opencode-agent[bot] Apr 1, 2026
c8ecd64
test(app): add mock llm e2e fixture (#20375)
kitlangton Apr 1, 2026
506dd75
electron: port mergeShellEnv logic from tauri (#20192)
Brendonovich Apr 1, 2026
1df5ad4
app: try to hide autofill popups in prompt input (#20197)
Brendonovich Apr 1, 2026
47a6761
fix(session): add keyboard support to question dock (#20439)
nexxeln Apr 1, 2026
a3a6cf1
feat(comments): support file mentions (#20447)
nexxeln Apr 1, 2026
9a1c9ae
test(app): route prompt e2e through mock llm (#20383)
kitlangton Apr 1, 2026
44f8301
perf(review): defer offscreen diff mounts (#20469)
nexxeln Apr 1, 2026
5fd833a
refactor: standardize InstanceState variable name to state (#20267)
kitlangton Apr 1, 2026
d58004a
fall back to first agent if last used agent is not available
thdxr Apr 1, 2026
38d2276
test(e2e): isolate prompt tests with per-worker backend (#20464)
kitlangton Apr 1, 2026
0a125e5
chore: generate
opencode-agent[bot] Apr 1, 2026
897d83c
refactor(init): tighten AGENTS guidance (#20422)
nexxeln Apr 1, 2026
a9c85b7
refactor(shell): use Effect ChildProcess for shell command execution …
kitlangton Apr 1, 2026
2f405da
refactor: use Effect services instead of async facades in provider, a…
kitlangton Apr 1, 2026
ef538c9
chore: generate
opencode-agent[bot] Apr 1, 2026
f9e71ec
chore: update nix node_modules hashes
opencode-agent[bot] Apr 1, 2026
d1e0a46
Update VOUCHED list
github-actions[bot] Apr 1, 2026
c559af5
test(app): migrate more e2e suites to isolated backend (#20505)
kitlangton Apr 1, 2026
c619cae
fix(account): coalesce concurrent console token refreshes (#20503)
kitlangton Apr 1, 2026
f3f728e
test(app): fix isolated backend follow-ups (#20513)
kitlangton Apr 1, 2026
d7481f4
wip: zen
fwang Apr 1, 2026
c9326fc
refactor: replace BunProc with Npm module using @npmcli/arborist (#18…
thdxr Apr 1, 2026
eabf3ca
zen: sync
fwang Apr 1, 2026
880c0a7
fix: normalize filepath in FileTime to prevent Windows path mismatch …
JosXa Apr 1, 2026
cc30bfc
resolve subpath only packages for plugins (#20555)
kommander Apr 1, 2026
fa96cb9
Fix selection expansion by retaining focused input selections during …
Hona Apr 1, 2026
1fcfb69
feat: add new provider plugin hook for resolving models and sync mode…
rekram1-node Apr 1, 2026
f7f41dc
fix(tui): apply scroll configuration uniformly across all scrollboxes…
Hona Apr 1, 2026
802d165
chore(tui): clean up scroll config follow-up (#20561)
Hona Apr 1, 2026
48db7cf
fix(opencode): batch snapshot revert without reordering (#20564)
kitlangton Apr 1, 2026
d9d4f89
fix(test): auto-acknowledge tool-result follow-ups in mock LLM server…
kitlangton Apr 1, 2026
4214ae2
chore: generate
opencode-agent[bot] Apr 1, 2026
26fb6b8
refactor: add Effect-returning versions of MessageV2 functions (#20374)
kitlangton Apr 1, 2026
e4ff1ea
refactor(bash): use Effect ChildProcess for bash tool execution (#20496)
kitlangton Apr 1, 2026
854484b
chore: generate
opencode-agent[bot] Apr 1, 2026
f6fd43e
Refactor plugin/config loading, add theme-only plugin package support…
kommander Apr 1, 2026
92f8e03
fix(test): use effect helper in snapshot race test (#20567)
kitlangton Apr 2, 2026
b1c0748
refactor(revert): yield SessionSummary.Service directly (#20541)
kitlangton Apr 2, 2026
c526caa
fix: show model display name in message footer and transcript (#20539)
kitlangton Apr 2, 2026
8a8f7b3
flock npm.add (#20557)
kommander Apr 2, 2026
00d6841
fix(account): refresh console tokens before expiry (#20558)
kitlangton Apr 2, 2026
0cad775
chore: add User-Agent headers for Cloudflare providers (#20538)
mchenco Apr 2, 2026
e148b31
fix(build): replace require() with dynamic import() in cross-spawn-sp…
kitlangton Apr 2, 2026
789d86f
chore: generate
opencode-agent[bot] Apr 2, 2026
df1c6c9
tui: add consent dialog when sharing for the first time (#20525)
rekram1-node Apr 2, 2026
a09b086
test(app): block real llm calls in e2e prompts (#20579)
kitlangton Apr 2, 2026
0bae38c
refactor(instruction): migrate to Effect service pattern (#20542)
kitlangton Apr 2, 2026
2e8e278
fix(cli): use simple logo in CLI (#20585)
kitlangton Apr 2, 2026
733a3bd
fix(core): prevent agent loop from stopping after tool calls with Ope…
valenvivaldi Apr 2, 2026
5daf2fa
fix(session): compaction agent responds in same language as conversat…
aaron-he-zhu Apr 2, 2026
916afb5
refactor(account): share token freshness helper (#20591)
kitlangton Apr 2, 2026
336d28f
fix(cli): restore colored help logo (#20592)
kitlangton Apr 2, 2026
d66e6dc
feat(opencode): Add Venice AI package as dependency (#20570)
dpuyosa Apr 2, 2026
ebaa99a
chore: generate
opencode-agent[bot] Apr 2, 2026
811c7e2
cli: update usage exceeded error
fwang Apr 2, 2026
a6f524c
chore: update nix node_modules hashes
opencode-agent[bot] Apr 2, 2026
0f48899
fix(node): set OPENCODE_CHANNEL during build (#20616)
Brendonovich Apr 2, 2026
db93891
zen: friendly trial ended message
fwang Apr 2, 2026
d540d36
refactor: simplify solid reactivity across app and web (#20497)
nexxeln Apr 2, 2026
327f625
use solid-primitives/resize-observer across web code (#20613)
Brendonovich Apr 2, 2026
69d047a
cleanup event listeners with solid-primitives/event-listener (#20619)
Brendonovich Apr 2, 2026
ec3ae17
chore: update nix node_modules hashes
opencode-agent[bot] Apr 2, 2026
23c8656
refactor: split up models.dev and config model definitions to prevent…
rekram1-node Apr 2, 2026
57a5236
chore: generate
opencode-agent[bot] Apr 2, 2026
291a857
feat: add optional messageID to ShellInput (#20657)
noamzbr Apr 2, 2026
159ede2
chore: generate
opencode-agent[bot] Apr 2, 2026
510a1e8
ignore: fix typecheck in dev (#20702)
rekram1-node Apr 2, 2026
c3dfd08
fix(format): use biome format instead of check to prevent import remo…
BYK Apr 2, 2026
10ca1ac
tweak: add abort signal timeout to the github copilot model fetch to …
rekram1-node Apr 2, 2026
93a1393
Add MiMo-V2 models to Go UI and docs (#20709)
MrMushrooooom Apr 2, 2026
3faabda
refactor(format): update formatter interface to return command from e…
thdxr Apr 2, 2026
c4b3971
app: unify auto scroll ref handling (#20716)
Brendonovich Apr 2, 2026
92e820f
go: add mimo
fwang Apr 2, 2026
966d9cf
electron: add basic context menu for inspect element (#20723)
Brendonovich Apr 2, 2026
7e32f80
feat: add macOS managed preferences support for enterprise MDM deploy…
lennyvaknine43 Apr 2, 2026
f0a9ebf
chore: generate
opencode-agent[bot] Apr 2, 2026
1989704
feat(acp): Add messageID and emit user_message_chunk on prompt/comman…
noamzbr Apr 2, 2026
3638911
chore: generate
opencode-agent[bot] Apr 2, 2026
c3ef69c
test(app): add a golden path for mocked e2e prompts (#20593)
kitlangton Apr 2, 2026
f151c66
chore: update nix node_modules hashes
opencode-agent[bot] Apr 2, 2026
ae7b49b
docs(effect): refresh migration status (#20665)
kitlangton Apr 2, 2026
b5b5f7e
test(opencode): remove temporary e2e url repro (#20729)
kitlangton Apr 2, 2026
6dfb304
refactor(app): unexport internal e2e helpers (#20730)
kitlangton Apr 2, 2026
f549fde
test(app): emit junit artifacts for playwright (#20732)
kitlangton Apr 2, 2026
5e1b513
refactor(todo): effectify session todo (#20595)
kitlangton Apr 2, 2026
29f7dc0
Adds TUI prompt traits, refs, and plugin slots (#20741)
kommander Apr 2, 2026
bf26c08
chore: update nix node_modules hashes
opencode-agent[bot] Apr 2, 2026
6e1400f
dialog aware prompt cursor (#20753)
kommander Apr 2, 2026
7f45943
fix(opencode): honor model limit.input overrides (#16306)
ykswang Apr 3, 2026
8942fc2
refactor(effect): prune unused facades (#20748)
kitlangton Apr 3, 2026
38014fe
fix: rm dynamic part from bash tool description again to restore cach…
rekram1-node Apr 3, 2026
8e9e79d
refactor(share): effectify share next (#20596)
kitlangton Apr 3, 2026
eb6f1da
fix: call models.dev once instead of twice on start (#20765)
Hona Apr 3, 2026
81d3ac3
fix: prevent Tool.define() wrapper accumulation on object-defined too…
jpcarranza94 Apr 3, 2026
8daeacc
chore: generate
opencode-agent[bot] Apr 3, 2026
aa2239d
add automatic heap snapshots for high-memory cli processes (#20788)
thdxr Apr 3, 2026
e89527c
feat: Send x-session-affinity and x-parent-session-id headers (#20744)
kflansburg Apr 3, 2026
7b8dc80
fix(sdk): handle Windows opencode spawn and shutdown (#20772)
Hona Apr 3, 2026
500dcfc
chore: update nix node_modules hashes
opencode-agent[bot] Apr 3, 2026
b969066
electron: better menus (#20878)
Brendonovich Apr 3, 2026
6359d00
fix(core): fix restoring earlier messages in a reverted chain (#20780)
natewill Apr 3, 2026
c307505
fix(session): delay jump-to-bottom button (#20853)
nexxeln Apr 3, 2026
2002f08
fix(prompt): unmount model controls in shell mode (#20886)
nexxeln Apr 3, 2026
3deee3a
fix(session): disable todo dock auto-scroll (#20840)
nexxeln Apr 3, 2026
9d57f21
feat(ui): redesign modified files section in session turn (#20348)
nexxeln Apr 3, 2026
fbfa148
fix(app): hide default session timestamps (#20892)
nexxeln Apr 3, 2026
7994dce
refactor(effect): resolve built tools through the registry (#20787)
kitlangton Apr 3, 2026
263dcf7
fix: restore prompt focus after footer selection (#20841)
nexxeln Apr 3, 2026
35350b1
feat: restore git-backed review modes (#20845)
nexxeln Apr 3, 2026
a4e75a0
chore: generate
opencode-agent[bot] Apr 3, 2026
a32ffab
fix(app): show correct submit icon when typing follow up
adamdotdevin Apr 3, 2026
ae7e2eb
chore(app): remove queued follow-ups for now
adamdotdevin Apr 3, 2026
f2d4ced
refactor(effect): build todowrite tool from Todo service (#20789)
kitlangton Apr 3, 2026
c72642d
test(ci): publish unit reports in actions (#20547)
kitlangton Apr 3, 2026
fff9863
chore: rm models snapshot (#20929)
rekram1-node Apr 3, 2026
a5ec741
notes on v2 (#20941)
kommander Apr 3, 2026
650d0db
chore: generate
opencode-agent[bot] Apr 3, 2026
59ca454
refactor(provider): stop custom loaders using facades (#20776)
kitlangton Apr 4, 2026
288eb04
perf(opencode): batch snapshot diffFull blob reads (#20752)
kitlangton Apr 4, 2026
00fa68b
fix(ci): create JUnit output dirs before tests (#20959)
kitlangton Apr 4, 2026
cc50b77
release: v1.3.14
Apr 4, 2026
c08fa56
refactor: remove redundant Kimi skill section (#20393)
Yuxin-Dong Apr 4, 2026
629e866
fix(npm): Arborist reify fails on compiled binary — Bun pre-resolves …
thdxr Apr 4, 2026
930e94a
release: v1.3.15
Apr 4, 2026
280eb16
fix: ensure reasoning tokens arent double counted when calculating us…
rekram1-node Apr 4, 2026
6ea108a
feat(tui): show console-managed providers (#20956)
kitlangton Apr 4, 2026
c796b9a
refactor(effect): move read tool onto defineEffect (#21016)
kitlangton Apr 4, 2026
9856636
chore: generate
opencode-agent[bot] Apr 4, 2026
c6ebc7f
fix(tui): only show org switch affordances when useful (#21054)
kitlangton Apr 4, 2026
6253ef0
chore: generate
opencode-agent[bot] Apr 4, 2026
8b8d4fa
test: add regression test for double counting bug (#21053)
rekram1-node Apr 4, 2026
66b4e5e
doc: udpate doc
fwang Apr 5, 2026
3a0e00d
tweak: add newline between <content> and first line of read tool outp…
rekram1-node Apr 5, 2026
7756294
fix: guard session_diff with Array.isArray() to prevent diffs.map cra…
openhands-agent Apr 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 4 additions & 1 deletion .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ adamdotdevin
-agusbasari29 AI PR slop
ariane-emory
-atharvau AI review spamming literally every PR
-borealbytes
-danieljoshuanazareth
-danieljoshuanazareth
edemaine
Expand All @@ -21,8 +22,10 @@ jayair
kitlangton
kommander
-opencode2026
-opencodeengineer bot that spams issues
r44vc0rp
rekram1-node
-robinmordasiewicz
-spider-yamet clawdbot/llm psychosis, spam pinging the team
thdxr
-OpenCodeEngineer bot that spams issues
-toastythebot
38 changes: 36 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ concurrency:

permissions:
contents: read
checks: write

jobs:
unit:
Expand Down Expand Up @@ -45,8 +46,39 @@ jobs:
git config --global user.email "bot@opencode.ai"
git config --global user.name "opencode"

- name: Cache Turbo
uses: actions/cache@v4
with:
path: node_modules/.cache/turbo
key: turbo-${{ runner.os }}-${{ hashFiles('turbo.json', '**/package.json') }}-${{ github.sha }}
restore-keys: |
turbo-${{ runner.os }}-${{ hashFiles('turbo.json', '**/package.json') }}-
turbo-${{ runner.os }}-

- name: Run unit tests
run: bun turbo test
run: bun turbo test:ci
env:
OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: ${{ runner.os == 'Windows' && 'true' || 'false' }}

- name: Publish unit reports
if: always()
uses: mikepenz/action-junit-report@v6
with:
report_paths: packages/*/.artifacts/unit/junit.xml
check_name: "unit results (${{ matrix.settings.name }})"
detailed_summary: true
include_time_in_summary: true
fail_on_failure: false

- name: Upload unit artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: unit-${{ matrix.settings.name }}-${{ github.run_attempt }}
include-hidden-files: true
if-no-files-found: ignore
retention-days: 7
path: packages/*/.artifacts/unit/junit.xml

e2e:
name: e2e (${{ matrix.settings.name }})
Expand Down Expand Up @@ -100,15 +132,17 @@ jobs:
run: bun --cwd packages/app test:e2e:local
env:
CI: true
PLAYWRIGHT_JUNIT_OUTPUT: e2e/junit-${{ matrix.settings.name }}.xml
timeout-minutes: 30

- name: Upload Playwright artifacts
if: failure()
if: always()
uses: actions/upload-artifact@v4
with:
name: playwright-${{ matrix.settings.name }}-${{ github.run_attempt }}
if-no-files-found: ignore
retention-days: 7
path: |
packages/app/e2e/junit-*.xml
packages/app/e2e/test-results
packages/app/e2e/playwright-report
60 changes: 53 additions & 7 deletions .opencode/plugins/tui-smoke.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -653,31 +653,77 @@ const home = (api: TuiPluginApi, input: Cfg) => ({
const skin = look(ctx.theme.current)
type Prompt = (props: {
workspaceID?: string
visible?: boolean
disabled?: boolean
onSubmit?: () => void
hint?: JSX.Element
right?: JSX.Element
showPlaceholder?: boolean
placeholders?: {
normal?: string[]
shell?: string[]
}
}) => JSX.Element
if (!("Prompt" in api.ui)) return null
const view = api.ui.Prompt
if (typeof view !== "function") return null
const Prompt = view as Prompt
type Slot = (
props: { name: string; mode?: unknown; children?: JSX.Element } & Record<string, unknown>,
) => JSX.Element | null
const ui = api.ui as TuiPluginApi["ui"] & { Prompt: Prompt; Slot: Slot }
const Prompt = ui.Prompt
const Slot = ui.Slot
const normal = [
`[SMOKE] route check for ${input.label}`,
"[SMOKE] confirm home_prompt slot override",
"[SMOKE] verify api.ui.Prompt rendering",
"[SMOKE] verify prompt-right slot passthrough",
]
const shell = ["printf '[SMOKE] home prompt\n'", "git status --short", "bun --version"]
const Hint = (
const hint = (
<box flexShrink={0} flexDirection="row" gap={1}>
<text fg={skin.muted}>
<span style={{ fg: skin.accent }}>•</span> smoke home prompt
</text>
</box>
)

return <Prompt workspaceID={value.workspace_id} hint={Hint} placeholders={{ normal, shell }} />
return (
<Prompt
workspaceID={value.workspace_id}
hint={hint}
right={
<box flexDirection="row" gap={1}>
<Slot name="home_prompt_right" workspace_id={value.workspace_id} />
<Slot name="smoke_prompt_right" workspace_id={value.workspace_id} label={input.label} />
</box>
}
placeholders={{ normal, shell }}
/>
)
},
home_prompt_right(ctx, value) {
const skin = look(ctx.theme.current)
const id = value.workspace_id?.slice(0, 8) ?? "none"
return (
<text fg={skin.muted}>
<span style={{ fg: skin.accent }}>{input.label}</span> home:{id}
</text>
)
},
session_prompt_right(ctx, value) {
const skin = look(ctx.theme.current)
return (
<text fg={skin.muted}>
<span style={{ fg: skin.accent }}>{input.label}</span> session:{value.session_id.slice(0, 8)}
</text>
)
},
smoke_prompt_right(ctx, value) {
const skin = look(ctx.theme.current)
const id = typeof value.workspace_id === "string" ? value.workspace_id.slice(0, 8) : "none"
const label = typeof value.label === "string" ? value.label : input.label
return (
<text fg={skin.muted}>
<span style={{ fg: skin.accent }}>{label}</span> custom:{id}
</text>
)
},
home_bottom(ctx) {
const skin = look(ctx.theme.current)
Expand Down
Loading
Loading