v0.5.0: Binary-Free Mode - No OpenCode binary required

 Major Features:
- Native session management without OpenCode binary
- Provider routing: OpenCode Zen (free), Qwen OAuth, Z.AI
- Streaming chat with tool execution loop
- Mode detection API (/api/meta/mode)
- MCP integration fix (resolved infinite loading)
- NomadArch Native option in UI with comparison info

🆓 Free Models (No API Key):
- GPT-5 Nano (400K context)
- Grok Code Fast 1 (256K context)
- GLM-4.7 (205K context)
- Doubao Seed Code (256K context)
- Big Pickle (200K context)

📦 New Files:
- session-store.ts: Native session persistence
- native-sessions.ts: REST API for sessions
- lite-mode.ts: UI mode detection client
- native-sessions.ts (UI): SolidJS store

🔧 Updated:
- All installers: Optional binary download
- All launchers: Mode detection display
- Binary selector: Added NomadArch Native option
- README: Binary-Free Mode documentation
This commit is contained in:
Gemini AI
2025-12-26 02:08:13 +04:00
Unverified
parent 8dddf4d0cf
commit 4bd2893864
83 changed files with 10678 additions and 1290 deletions

View File

@@ -29,9 +29,14 @@ function cloneInstanceData(data?: InstanceData | null): InstanceData {
}
}
// Track instance IDs that we are currently saving - ignore SSE echoes
const pendingSaveIds = new Set<string>()
function attachSubscription(instanceId: string) {
if (instanceSubscriptions.has(instanceId)) return
const unsubscribe = storage.onInstanceDataChanged(instanceId, (data) => {
// Skip SSE echo from our own save
if (pendingSaveIds.has(instanceId)) return
setInstanceData(instanceId, data)
})
instanceSubscriptions.set(instanceId, unsubscribe)
@@ -83,12 +88,15 @@ async function updateInstanceConfig(instanceId: string, mutator: (draft: Instanc
const current = instanceDataMap().get(instanceId) ?? DEFAULT_INSTANCE_DATA
const draft = cloneInstanceData(current)
mutator(draft)
setInstanceData(instanceId, draft)
pendingSaveIds.add(instanceId)
try {
await storage.saveInstanceData(instanceId, draft)
} catch (error) {
log.warn("Failed to persist instance data", error)
} finally {
setTimeout(() => pendingSaveIds.delete(instanceId), 1000)
}
setInstanceData(instanceId, draft)
}
function getInstanceConfig(instanceId: string): InstanceData {