feat: remove legacy OpenCode runtime

Cut product flows over to Coding/Pi and retain only the migration-owned v1 boundary. Promote supported native optional packages because electron-builder omitted pnpm transitive optional closure from the packaged ASAR.
This commit is contained in:
2026-08-24 12:17:43 +08:00
parent 61fede2b4d
commit 5a275b93a7
199 changed files with 1330 additions and 64725 deletions

View File

@@ -16,6 +16,12 @@ export interface CodingProjectStoreData {
activeProjectId: string | null;
}
export type CodingProjectStoreChange =
| { type: 'upsert'; project: CodingProject }
| { type: 'remove'; projectId: string };
export type CodingProjectStoreListener = (change: CodingProjectStoreChange) => void;
export interface CodingProjectStorage {
read(): Promise<CodingProjectStoreData | undefined>;
write(data: CodingProjectStoreData): Promise<void>;
@@ -67,8 +73,7 @@ export function createCodingProjectStorageFromStore(
export async function createElectronCodingProjectStorage(): Promise<CodingProjectStorage> {
const Store = (await import('electron-store')).default;
const store = new Store<{ projects?: CodingProjectStoreData }>({
// Preserve the installed-user storage identity while replacing the
// OpenCode-owned service and types with the product-owned store.
// Legacy installed-user storage identity. Renaming it would orphan projects.
name: 'opencode-projects',
});
return createCodingProjectStorageFromStore(store, 'projects');
@@ -88,6 +93,17 @@ export function createCodingProjectStore(
const createId = options.createId ?? randomUUID;
const now = options.now ?? (() => new Date().toISOString());
let mutationTail = Promise.resolve();
const listeners = new Set<CodingProjectStoreListener>();
function emit(change: CodingProjectStoreChange): void {
for (const listener of listeners) {
try {
listener(change);
} catch {
// Persistence must not fail because an observer failed.
}
}
}
async function readData(): Promise<CodingProjectStoreData> {
return (await storage.read()) ?? emptyStoreData();
@@ -124,6 +140,7 @@ export function createCodingProjectStore(
data.projects[project.id] = project;
if (activate) data.activeProjectId = project.id;
await storage.write(data);
emit({ type: 'upsert', project });
return project;
});
}
@@ -164,8 +181,14 @@ export function createCodingProjectStore(
delete data.projects[projectId];
if (data.activeProjectId === projectId) data.activeProjectId = null;
await storage.write(data);
emit({ type: 'remove', projectId });
});
},
subscribe(listener: CodingProjectStoreListener): () => void {
listeners.add(listener);
return () => listeners.delete(listener);
},
};
}