Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
00603d3
fix(codex): write refresh tokens to openai id
shuv1337 Jan 14, 2026
78fff0a
fix(auth): fallback to legacy codex entry
shuv1337 Jan 14, 2026
5667123
feat(config): add openai multi-account flag
shuv1337 Jan 14, 2026
7e7acc2
feat(plugin): add optional oauth email field
shuv1337 Jan 14, 2026
a660b76
fix(auth): migrate legacy codex oauth entry
shuv1337 Jan 14, 2026
8cb16e3
feat(plugin): add optional oauth name field
shuv1337 Jan 14, 2026
8bedb9a
feat(auth): add email field to OAuth schema
shuv1337 Jan 14, 2026
67002a1
feat(auth): add name field to OAuth schema
shuv1337 Jan 14, 2026
aa9aaf9
feat(auth): add plan field to OAuth schema
shuv1337 Jan 14, 2026
578d8b8
feat(auth): add orgName field to OAuth schema
shuv1337 Jan 14, 2026
af70e14
feat(auth): persist OAuth metadata fields in ProviderAuth.callback
shuv1337 Jan 14, 2026
d7496e3
test(auth): add codex-migration.test.ts with 5 tests
shuv1337 Jan 14, 2026
624d2ec
docs(agents): add testing notes for running tests from packages/opencode
shuv1337 Jan 14, 2026
4263482
test(auth): add token refresh migration test for openai provider ID
shuv1337 Jan 14, 2026
88bbc1a
docs(prd): mark migration tests as complete
shuv1337 Jan 14, 2026
ccbecb6
feat(codex): extract user info from id_token claims
shuv1337 Jan 14, 2026
7b4e652
docs(plugin): add JSDoc comments for OAuth metadata fields
shuv1337 Jan 14, 2026
5ac4b59
feat(codex): add ChatGPT user info fetch and plan normalization
shuv1337 Jan 14, 2026
96956f0
feat(codex): spawn background task to fetch ChatGPT user info
shuv1337 Jan 14, 2026
4043d10
feat(server): add GET /auth/info/:providerID endpoint
shuv1337 Jan 14, 2026
bf7f23f
feat(tui): load auth info during bootstrap
shuv1337 Jan 14, 2026
968112f
feat(tui): create AccountBadge component
shuv1337 Jan 14, 2026
07ccfce
feat(tui): integrate AccountBadge in footer
shuv1337 Jan 14, 2026
82311f3
feat(tui): show auth status in provider dialog
shuv1337 Jan 14, 2026
5cc3f96
feat(config): add skills registry configuration schema
shuv1337 Jan 14, 2026
df300ff
feat(skill): create skill registry module
shuv1337 Jan 14, 2026
5b136fe
Sync upstream v1.1.20 (#301)
shuv1337 Jan 15, 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
2 changes: 1 addition & 1 deletion .github/last-synced-tag
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v1.1.19
v1.1.20
Empty file added .ralph-done
Empty file.
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

- Avoid testing logic directly inside Solid.js `.tsx` files if they import JSX runtimes, as `bun test` may fail with `jsxDEV` errors.
- Separate pure logic into `.ts` files (e.g., `theme-utils.ts`) and test those instead.
- Run tests from `packages/opencode` directory - the repo root has a guard file that prevents test execution.
- `bun run lint` in `packages/opencode` runs the full test suite with coverage.

## Upstream Merge Operations

Expand Down
1 change: 1 addition & 0 deletions STATS.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,3 +200,4 @@
| 2026-01-11 | 2,836,394 (+204,371) | 1,530,479 (+26,809) | 4,366,873 (+231,180) |
| 2026-01-12 | 3,053,594 (+217,200) | 1,553,671 (+23,192) | 4,607,265 (+240,392) |
| 2026-01-13 | 3,297,078 (+243,484) | 1,595,062 (+41,391) | 4,892,140 (+284,875) |
| 2026-01-14 | 3,568,928 (+271,850) | 1,645,362 (+50,300) | 5,214,290 (+322,150) |
6 changes: 3 additions & 3 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions infra/console.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ const ZEN_MODELS = [
]
const ZEN_BLACK = new sst.Secret("ZEN_BLACK")
const STRIPE_SECRET_KEY = new sst.Secret("STRIPE_SECRET_KEY")
const STRIPE_PUBLISHABLE_KEY = new sst.Secret("STRIPE_PUBLISHABLE_KEY")
const AUTH_API_URL = new sst.Linkable("AUTH_API_URL", {
properties: { value: auth.url.apply((url) => url!) },
})
Expand Down Expand Up @@ -177,6 +178,7 @@ new sst.cloudflare.x.SolidStart("Console", {
//VITE_DOCS_URL: web.url.apply((url) => url!),
//VITE_API_URL: gateway.url.apply((url) => url!),
VITE_AUTH_URL: auth.url.apply((url) => url!),
VITE_STRIPE_PUBLISHABLE_KEY: STRIPE_PUBLISHABLE_KEY.value,
},
transform: {
server: {
Expand Down
4 changes: 2 additions & 2 deletions nix/hashes.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"nodeModules": {
"x86_64-linux": "sha256-x6A/XT1i3bjakfAj0A1wV4n2s9rpflMDceTeppdP6tE=",
"aarch64-darwin": "sha256-RkamQYbpjJqpHHf76em9lPgeI9k4/kaCf7T+4xHaizY="
"x86_64-linux": "sha256-wENwhwRVfgoVyA9YNGcG+fAfu46JxK4xvNgiPbRt//s=",
"aarch64-darwin": "sha256-vm1DYl1erlbaqz5NHHlnZEMuFmidr/UkS84nIqLJ96Q="
}
}
2 changes: 1 addition & 1 deletion packages/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.1.19",
"version": "1.1.20",
"description": "",
"type": "module",
"exports": {
Expand Down
12 changes: 9 additions & 3 deletions packages/app/src/context/global-sync.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ type State = {
config: Config
path: Path
session: Session[]
sessionTotal: number
session_status: {
[sessionID: string]: SessionStatus
}
Expand Down Expand Up @@ -110,6 +111,7 @@ function createGlobalSync() {
agent: [],
command: [],
session: [],
sessionTotal: 0,
session_status: {},
session_diff: {},
todo: {},
Expand All @@ -131,8 +133,10 @@ function createGlobalSync() {

async function loadSessions(directory: string) {
const [store, setStore] = child(directory)
globalSDK.client.session
.list({ directory })
const limit = store.limit

return globalSDK.client.session
.list({ directory, roots: true })
.then((x) => {
const fourHoursAgo = Date.now() - 4 * 60 * 60 * 1000
const data = Array.isArray(x.data) ? x.data : []
Expand All @@ -143,10 +147,12 @@ function createGlobalSync() {
.sort((a, b) => a.id.localeCompare(b.id))
// Include up to the limit, plus any updated in the last 4 hours
const sessions = nonArchived.filter((s, i) => {
if (i < store.limit) return true
if (i < limit) return true
const updated = new Date(s.time?.updated ?? s.time?.created).getTime()
return updated > fourHoursAgo
})
// Store total session count (used for "load more" pagination)
setStore("sessionTotal", nonArchived.length)
setStore("session", reconcile(sessions, { key: "id" }))
})
.catch((err) => {
Expand Down
2 changes: 1 addition & 1 deletion packages/app/src/pages/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -955,7 +955,7 @@ export default function Layout(props: ParentProps) {
.toSorted(sortSessions),
)
const rootSessions = createMemo(() => sessions().filter((s) => !s.parentID))
const hasMoreSessions = createMemo(() => store.session.length >= store.limit)
const hasMoreSessions = createMemo(() => store.sessionTotal > store.session.length)
const loadMoreSessions = async () => {
setProjectStore("limit", (limit) => limit + 5)
await globalSync.project.loadSessions(props.project.worktree)
Expand Down
6 changes: 4 additions & 2 deletions packages/console/app/package.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"name": "@opencode-ai/console-app",
"version": "1.1.19",
"version": "1.1.20",
"type": "module",
"license": "MIT",
"scripts": {
"typecheck": "tsgo --noEmit",
"dev": "vite dev --host 0.0.0.0",
"dev:remote": "VITE_AUTH_URL=https://auth.dev.opencode.ai bun sst shell --stage=dev bun dev",
"dev:remote": "VITE_AUTH_URL=https://auth.dev.opencode.ai VITE_STRIPE_PUBLISHABLE_KEY=pk_test_51RtuLNE7fOCwHSD4mewwzFejyytjdGoSDK7CAvhbffwaZnPbNb2rwJICw6LTOXCmWO320fSNXvb5NzI08RZVkAxd00syfqrW7t bun sst shell --stage=dev bun dev",
"build": "./script/generate-sitemap.ts && vite build && ../../opencode/script/schema.ts ./.output/public/config.json",
"start": "vite start"
},
Expand All @@ -23,10 +23,12 @@
"@solidjs/meta": "catalog:",
"@solidjs/router": "catalog:",
"@solidjs/start": "catalog:",
"@stripe/stripe-js": "8.6.1",
"chart.js": "4.5.1",
"nitro": "3.0.1-alpha.1",
"solid-js": "catalog:",
"solid-list": "0.3.0",
"solid-stripe": "0.8.1",
"vite": "catalog:",
"zod": "catalog:"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useAuthSession } from "~/context/auth"

export async function GET(input: APIEvent) {
const url = new URL(input.request.url)

try {
const code = url.searchParams.get("code")
if (!code) throw new Error("No code found")
Expand All @@ -27,7 +28,7 @@ export async function GET(input: APIEvent) {
current: id,
}
})
return redirect("/auth")
return redirect(url.pathname === "/auth/callback" ? "/auth" : url.pathname.replace("/auth/callback", ""))
} catch (e: any) {
return new Response(
JSON.stringify({
Expand Down
5 changes: 4 additions & 1 deletion packages/console/app/src/routes/auth/authorize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import type { APIEvent } from "@solidjs/start/server"
import { AuthClient } from "~/context/auth"

export async function GET(input: APIEvent) {
const result = await AuthClient.authorize(new URL("./callback", input.request.url).toString(), "code")
const url = new URL(input.request.url)
const cont = url.searchParams.get("continue") ?? ""
const callbackUrl = new URL(`./callback${cont}`, input.request.url)
const result = await AuthClient.authorize(callbackUrl.toString(), "code")
return Response.redirect(result.url, 302)
}
Loading