Repository navigation
Commit 5898181
committed
Merge remote-tracking branch 'upstream/dev' into dev
Brings in 721 upstream commits (merge base d93568f, upstream tip
5f1f8d0 "test: deflake shutdown-deadline cleanup and PowerShell
permission timeout (anomalyco#59667)") on top of 63 fork commits.
The guiding rule for every conflict: keep fork behavior documented in
PATCH.md (session roots instead of session move, GitHub-hosted runners,
fork release workflow, vertical tabs, provider colors, etc.) and take
upstream's changes everywhere else.
Conflict resolutions
====================
CI workflows
------------
- .github/workflows/check.yml, check-test.yml (upstream renamed test.yml
to check-test.yml): took upstream's new `if: !pull_request.draft`
guard, kept the fork's `runs-on: ubuntu-latest` for the typecheck and
"affected packages" jobs. The unit test matrices already used
ubuntu-latest/windows-latest; the e2e jobs stay on Blacksmith, as they
were in the fork.
- .github/workflows/release.yml (add/add): kept the fork's datever
GitHub Release workflow. Upstream's signing/publishing pipeline is
gated on `github.repository == 'anomalyco/opencode'` and depends on
secrets this fork does not have.
Session move removal vs upstream move improvements
--------------------------------------------------
The fork removed session move in favor of session roots and recovers a
missing directory by forking. Upstream kept iterating on move; those
changes are dropped where they only concern move, and the unrelated
parts are kept.
- packages/app/src/session/composer/location-missing.tsx: took
upstream's redesigned recovery dock (Loader, per-button pending state,
searchable worktree list once there are 10+, accessible group/
description, location-footer slot) but kept the fork's action: the
mutation is `fork` and calls `session.fork({ directory })`, remembers
the new session and navigates to it. The `source` field from upstream
is kept so each button shows its own pending state.
- packages/app/src/runtime/i18n/en.ts: kept the fork's
"Fork this session..." / "Forking session..." strings, added
upstream's new `session.rewind.toast.*` keys.
- packages/app/e2e/regression/session-location-sync.spec.ts and
session-summary.spec.ts: kept the fork's removal of the move-only
tests (move-to-worktree recovery, live session.moved follow, tabs kept
across a move, reconnect after a move, details following a move).
- packages/core/test/session-runner.test.ts: kept the fork's removal of
the two `move` inbox-item scenarios (upstream only changed
`s.llm.gate` to `s.llm.gate()` inside them).
- packages/client/src/solid/data.ts: kept the fork's
`session.root.added` / `session.root.removed` reducers in place of
upstream's refactored `session.moved` reducer.
- packages/plugin-browser/src/connection.ts: took upstream's
`subscribe({ types })` filter API, subscribed only to
`session.deleted` (no `session.moved`).
- services/www/src/docs/content/cli/keybinds.mdx: added upstream's
`session.copy.id` row, kept `session.move` removed.
Protocol / server
-----------------
- packages/protocol/src/groups/session.ts: upstream dropped
`sessionLocationMiddleware` from `session.fork` and `session.update`
(a missing directory must not block them). Took that, and kept the
fork's `directory` payload field and its description on
`session.fork`. `session.root.add` / `session.root.remove` keep their
middleware.
Core
----
- packages/core/src/session/prompt.ts: upstream flattened `prepare`
(no `instances.provide(...)` wrapper) and added blob attachments
(SessionBlob/SessionStored, RESIZABLE_IMAGE_MIMES). Took that shape
and kept the fork's skill resolution through
`SessionRoots.skill(sessionID, id)` instead of `Skill.Service.get`.
- packages/core/src/file-access.ts: upstream replaced FSUtil with
Environment; deps are now
[Environment, Location, Permission, SessionStore] (SessionStore from
the fork, for root-aware access).
- packages/core/test/session-skill.test.ts: took upstream's org-policy
setup through `Config.testLayer(...)` (ManagedPolicy is gone) and
re-added the fork's `SessionRoots.node` plus the `SessionStore`
replacement, wrapping the LayerMap in `Effect.gen` to read the store.
Database migrations
-------------------
- packages/core/src/database/migration.gen.ts: the fork's
20261016185441_session_roots is m50; upstream's session_allowance,
drop_session_allowance, blob and drop_session_pending follow as
m51-m54, in timestamp order.
- packages/core/schema.json: both branches advanced the drizzle
snapshot. The merged snapshot has a new id with
`prevIds: [fork 05ce65d9..., upstream 44bd8ca5...]`. Its DDL is
upstream's plus the fork's `session.roots` column.
`bun script/migration.ts --check` reports no pending changes.
App settings
------------
- packages/app/src/settings/model.tsx and model.test.ts: kept the fork's
default `tabLayout: "vertical"` and added upstream's new
`reduceMotion: "system"`.
TUI
---
- packages/tui/src/component/dialog-model.tsx: kept the fork's theme and
`model_keywords` lookup and added upstream's usage limits (`dialog`,
`useUsageLimits`, per-model "$ left" / "No limit" badges).
- packages/tui/src/component/prompt/index.tsx: kept the fork's agent
cycle tab strip and provider/keyword colors on PromptMetadataRow, and
passed upstream's new `limit={limit()}` prop.
gui-extensions -> gui-plugins rename
-----------------------------------
Upstream renamed packages/gui-extensions to packages/gui-plugins and
redesigned the session details panel (location menu, location
workspace, new panel.tsx).
- details/workspace-menu.tsx: took upstream's `items()` structure (used
by both the standalone menu and the new `sub` submenu mode) and
carried over the fork's change: `add()` calls
`session.root.add`, labels use `root.menu` / `root.failed`, and there
is no `blocked()` running-session guard.
- details/i18n/en.ts: replaced `move.title|menu|failed` with
`root.menu` / `root.failed`. Upstream's panel no longer has the
"Move to worktree" row, so `root.title` is gone.
- gui-extensions/src/details/{panel.tsx,i18n/en.ts} (modify/delete):
accepted upstream's deletion; the fork's change is ported above.
Generated files
---------------
- services/www/openapi.json, services/www/public/openapi.json
(modify/delete): accepted upstream's deletion. The spec now lives in
packages/protocol/openapi.json.
- Regenerated packages/protocol/openapi.json (`bun run generate`),
packages/client generated promise/effect clients and types
(`bun run generate`, which also resolves the types.ts conflict), and
services/www generated docs, then ran prettier on the outputs. The
client exposes `session.root.add/remove` and `session.fork({ directory })`,
and no `session.move`.
Follow-up fixes required by the merge
=====================================
- packages/core/src/plugin/custom/auto-load-skills.ts and
packages/core/src/tool/plugin/cancel.ts: upstream turned the
`@opencode/ai` root into a promise-first entrypoint, and the Effect
API (SystemPart, ToolFailure, ...) moved to `@opencode/ai/effect`.
Updated both fork imports.
- packages/app/src/runtime/server/data.ts: removed `session.moved` from
SESSION_ACTIVITY. Upstream added it, but the fork does not publish it
as a public event.
Verification
============
- `bun install` (picked up new upstream dependencies)
- `bun turbo typecheck --continue`: 35/35 packages pass
- `bun run lint`: 0 errors
- `bun script/migration.ts --check` in packages/core: clean3,778 files changed
Lines changed: 172099 additions & 129518 deletions
File tree
- .github
- actions/setup-bun
- nix-hashes
- release
- download
- entitlements
- upload
- workflows
- .opencode
- agent
- skills
- app-e2e-tests
- component-tests
- opencode-dev
- tui-tests
- unit-tests
- github
- script
- infra
- nix
- packages
- ai
- example
- script
- src
- experimental
- protocols
- utils
- providers
- alibaba
- azure
- baseten
- cloudflare-ai-gateway
- cloudflare-workers-ai
- digitalocean
- google-vertex
- google
- openai-compatible
- openai
- opencode
- openrouter
- typesafe-ai
- vercel-ai-gateway
- xai
- zai
- route
- transport
- schema
- utils
- test
- fixtures/recordings
- alibaba-images
- baseten-decision
- bedrock-converse-options
- cloudflare-ai-gateway-decision
- cloudflare-workers-ai-decision
- cloudflare-workers-ai-extraction
- cloudflare-workers-ai-images
- digitalocean-decision
- openai-decision
- opencode-decision
- opencode-evaluation
- openrouter-decision
- openrouter-evaluation
- typesafe-decision
- typesafe-evaluation
- vercel-ai-gateway-images
- provider-options
- provider
- app
- component-tests
- e2e
- performance
- devex
- terminals
- timeline-stability
- timeline
- unit
- regression
- user-story
- utils
- public/assets
- src
- components-lab
- composer
- attachments
- editor
- history
- suggestions
- home
- projects
- sessions
- start
- new-session
- location
- project
- workspace
- providers
- catalog
- connect
- credentials
- models
- runtime
- extension
- i18n
- persistence
- platform
- plugin
- server
- global-sync
- servers
- connect
- registry
- session
- commands
- composer
- header
- requests
- timeline
- settings
- about
- notices
- appearance
- experimental
- general
- keybinds
- models
- notifications
- providers
- servers
- workspaces
- shell
- commands
- errors
- layout
- notifications
- routes
- state
- tabs
- titlebar
- usage
- voice
- fixtures
- workspaces
- files
- selection
- test-browser
- fixtures
- client
- script
- src
- effect
- api
- generated
- promise
- generated
- solid
- test
- cli
- script
- src
- commands
- handlers
- auth
- debug
- plugin
- session
- framework
- services
- test
- fixture
- run
- codemode
- script
- src
- interpreter
- stdlib
- test
- test262
- console/app
- src
- component
- i18n
- lib
- routes
- go
- oauth/opencode
- test
- containers
- base
- bun-node
- publish
- rust
- script
- tauri-linux
- core
- script
- src
- codemode
- config
- plugin
- database
- migration
- effect
- environment
- filesystem
- formatter
- image
- instance
- mcp
- models-dev
- plugin
- custom
- provider
- vcs
- project
- ripgrep
- session
- runner
- tool
- plugin
- util
- v1/config
- test
- config
- effect
- filesystem
- fixture
- plugin
- fixtures
- util
- desktop
- resources
- linux
- windows
- scripts
- script
- fixtures/picker
- src
- main
- diagnostics
- extension
- ipc-handlers
- lifecycle
- native
- plugin
- service
- storage
- migration
- 20261013231314_drop-extension-files
- 20261014210000_rename-extension-to-plugin
- windows
- preload
- renderer
- onboarding
- platform
- window
- function
- src
- gui-extensions
- src
- browser
- i18n
- btw
- context
- debug
- i18n
- details
- i18n
- file
- i18n
- microsoft-office
- pairing
- review
- i18n
- sdk
- ssh
- terminal
- i18n
- updater
- i18n
- wsl
- gui-plugins
- src
- browser
- i18n
- btw
- i18n
- context
- i18n
- debug
- i18n
- details
- i18n
- file
- i18n
- microsoft-office
- i18n
- pairing
- i18n
- review
- i18n
- sources
- i18n
- ssh
- i18n
- terminal
- i18n
- updater
- i18n
- wsl
- i18n
- http-recorder
- httpapi-codegen
- src
- test
- latex
- merman
- patchmark
- scripts
- src
- test
- plugin-browser
- script
- src
- plugins/figma
- plugin
- script
- src
- effect
- gui
- promise
- test
- posts
- protocol
- script
- src
- groups
- schema
- script
- src
- config
- script
- src
- sdk
- script
- src
- internal
- test
- server
- script
- src
- handlers
- middleware
- test
- session-ui
- component-tests
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
4 | 10 | | |
5 | 11 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
61 | 64 | | |
62 | 65 | | |
63 | 66 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
20 | 27 | | |
21 | 28 | | |
22 | 29 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
File renamed without changes.
File renamed without changes.
0 commit comments