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:
@@ -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);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user