mirror of
https://github.com/hanzoai/opencode-openai-codex-auth.git
synced 2026-09-24 17:01:02 +00:00
## 🎯 Overview Complete TypeScript rewrite with comprehensive testing, modular architecture, and enhanced user experience. Adds 9 pre-configured model variants matching Codex CLI presets and a beautiful OAuth success page. ## ✨ New Features ### Configuration System - **9 Model Variants**: Pre-configured reasoning levels (Low/Medium/High) for both gpt-5-codex and gpt-5, plus Minimal variants - **Full Config Example**: `config/full-opencode.json` with all variants ready to use - **Minimal Config Example**: `config/minimal-opencode.json` for basic setup - **Config Documentation**: Comprehensive guide in `config/README.md` ### OAuth Enhancement - **Animated Success Page**: Beautiful terminal-style UI with matrix rain effect, animated checkmark, and glowing effects - **Interactive Elements**: Mouse-responsive matrix rain and parallax effects - **Professional Branding**: OpenCode logo with pulse animations ### Developer Experience - **TypeScript Rewrite**: Complete migration from .mjs to .ts with strict typing - **93 Comprehensive Tests**: Full test coverage using Vitest - **Modular Architecture**: 10 focused helper functions, each < 40 lines - **Centralized Constants**: All magic values in `lib/constants.ts` - **CI/CD Pipeline**: GitHub Actions workflow for automated testing ### Documentation - **AGENTS.md**: Complete guide for AI assistants maintaining the codebase - **Enhanced README**: Updated with new configuration options and examples - **Inline JSDoc**: Comprehensive documentation for all public functions ## 🏗️ Technical Changes ### Architecture Improvements - Extracted 10 focused helper functions from monolithic fetch() - Centralized all constants and error messages - Separated concerns: auth, browser, codex, server, etc. - Type-safe discriminated unions for result types ### Build System - TypeScript compilation with declarations and source maps - Automatic HTML asset copying in build process - Test files excluded from distribution bundle - Clean dist/ output with only production code ### Testing Infrastructure - Vitest test runner with UI mode - 93 tests across 7 test files - Mock-based testing for external dependencies - Coverage reporting capability ## 📁 New Structure ``` opencode-openai-codex-auth/ ├── index.ts # Main plugin (TypeScript) ├── lib/ │ ├── auth.ts # OAuth logic │ ├── browser.ts # Platform-specific browser opening │ ├── codex.ts # Codex instructions │ ├── server.ts # OAuth callback server │ ├── fetch-helpers.ts # 10 focused helpers │ ├── constants.ts # All magic values │ ├── types.ts # TypeScript types │ ├── oauth-success.html # Animated success page │ └── ... ├── config/ │ ├── full-opencode.json # Complete config with variants │ ├── minimal-opencode.json # Basic config │ └── README.md # Config docs ├── test/ # 93 comprehensive tests ├── AGENTS.md # AI maintenance guide └── tsconfig.json # TypeScript config ``` ## 🔄 Migration Notes ### Breaking Changes - Plugin now requires TypeScript compilation (dist/ folder) - Configuration structure enhanced (backward compatible) - OAuth success page replaces plain HTML response ### Upgrade Path 1. Use new config from `config/full-opencode.json` for best experience 2. Or continue with minimal config (uses plugin defaults) 3. Rebuild plugin: `npm run build` ## 📊 Metrics - **Lines of Code**: Modular design with functions < 70 lines - **Test Coverage**: 93 tests covering all functionality - **Type Safety**: Strict TypeScript with no `any` types - **Dependencies**: Still minimal (only @openauthjs/openauth) - **Model Variants**: 9 pre-configured options for users ## 🎨 User Experience - **Codex CLI Parity**: Match official CLI reasoning presets - **Beautiful OAuth**: Professional animated success page - **Clear Documentation**: Step-by-step guides and examples - **Flexible Config**: From minimal to comprehensive setups Co-authored-by: Hanzo Dev <[email protected]>
159 lines
2.7 KiB
TypeScript
159 lines
2.7 KiB
TypeScript
import type { Auth, Provider, Model } from "@opencode-ai/sdk";
|
|
|
|
/**
|
|
* User configuration structure from opencode.json
|
|
*/
|
|
export interface UserConfig {
|
|
global: ConfigOptions;
|
|
models: {
|
|
[modelName: string]: {
|
|
options?: ConfigOptions;
|
|
};
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Configuration options for reasoning and text settings
|
|
*/
|
|
export interface ConfigOptions {
|
|
reasoningEffort?: "minimal" | "low" | "medium" | "high";
|
|
reasoningSummary?: "auto" | "concise" | "detailed";
|
|
textVerbosity?: "low" | "medium" | "high";
|
|
include?: string[];
|
|
}
|
|
|
|
/**
|
|
* Reasoning configuration for requests
|
|
*/
|
|
export interface ReasoningConfig {
|
|
effort: "minimal" | "low" | "medium" | "high";
|
|
summary: "auto" | "concise" | "detailed";
|
|
}
|
|
|
|
/**
|
|
* OAuth server information
|
|
*/
|
|
export interface OAuthServerInfo {
|
|
port: number;
|
|
close: () => void;
|
|
waitForCode: (state: string) => Promise<{ code: string } | null>;
|
|
}
|
|
|
|
/**
|
|
* PKCE challenge and verifier
|
|
*/
|
|
export interface PKCEPair {
|
|
challenge: string;
|
|
verifier: string;
|
|
}
|
|
|
|
/**
|
|
* Authorization flow result
|
|
*/
|
|
export interface AuthorizationFlow {
|
|
pkce: PKCEPair;
|
|
state: string;
|
|
url: string;
|
|
}
|
|
|
|
/**
|
|
* Token exchange success result
|
|
*/
|
|
export interface TokenSuccess {
|
|
type: "success";
|
|
access: string;
|
|
refresh: string;
|
|
expires: number;
|
|
}
|
|
|
|
/**
|
|
* Token exchange failure result
|
|
*/
|
|
export interface TokenFailure {
|
|
type: "failed";
|
|
}
|
|
|
|
/**
|
|
* Token exchange result
|
|
*/
|
|
export type TokenResult = TokenSuccess | TokenFailure;
|
|
|
|
/**
|
|
* Parsed authorization input
|
|
*/
|
|
export interface ParsedAuthInput {
|
|
code?: string;
|
|
state?: string;
|
|
}
|
|
|
|
/**
|
|
* JWT payload with ChatGPT account info
|
|
*/
|
|
export interface JWTPayload {
|
|
"https://api.openai.com/auth"?: {
|
|
chatgpt_account_id?: string;
|
|
};
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
/**
|
|
* Message input item
|
|
*/
|
|
export interface InputItem {
|
|
id?: string;
|
|
type: string;
|
|
role: string;
|
|
content?: unknown;
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
/**
|
|
* Request body structure
|
|
*/
|
|
export interface RequestBody {
|
|
model: string;
|
|
store?: boolean;
|
|
stream?: boolean;
|
|
instructions?: string;
|
|
input?: InputItem[];
|
|
tools?: unknown;
|
|
reasoning?: Partial<ReasoningConfig>;
|
|
text?: {
|
|
verbosity?: "low" | "medium" | "high";
|
|
};
|
|
include?: string[];
|
|
max_output_tokens?: number;
|
|
max_completion_tokens?: number;
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
/**
|
|
* SSE event data structure
|
|
*/
|
|
export interface SSEEventData {
|
|
type: string;
|
|
response?: unknown;
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
/**
|
|
* Cache metadata for Codex instructions
|
|
*/
|
|
export interface CacheMetadata {
|
|
etag: string | null;
|
|
tag: string;
|
|
lastChecked: number;
|
|
url: string;
|
|
}
|
|
|
|
/**
|
|
* GitHub release data
|
|
*/
|
|
export interface GitHubRelease {
|
|
tag_name: string;
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
// Re-export SDK types for convenience
|
|
export type { Auth, Provider, Model };
|